電子署名検証処理(ダイジェスト[ハッシュ値]を入力する場合)


電子署名検証処理(ダイジェスト[ハッシュ値]を入力する場合)は、以下のように処理します。

    byte certificate[] = null;  //証明書データを設定する
    byte hash[] = null;         //ダイジェストデータを設定する
    byte signature[] = null;    //署名値データを設定する
			
    JPKICryptSignJNI jpkiCryptSign = new JPKICryptSignJNI();

    //(1)プロバイダハンドルを取得
    long hProv = jpkiCryptSign.cryptAcquireContext(JPKICryptSignJNI.JPKI_VERIFYCONTEXT);

    //(2)証明書ハンドルを取得
    long hCert = jpkiCryptSign.certCreateCertificateContext(certificate);

    //(3)証明書の公開鍵を取得
    byte[] pubkey = jpkiCryptSign.certGetPublicKeyInfo(hCert);

    //(4)公開鍵への鍵ハンドルを生成しハンドルを取得
    long hKey = jpkiCryptSign.cryptImportPublicKey(hProv, pubkey);

    //(5)証明書ハンドルを解放
    jpkiCryptSign.certFreeCertificateContext(hCert);

    //(6)ハッシュハンドルを生成しハンドルを取得(※注)
    long hHash = jpkiCryptSign.cryptCreateHash(hProv, JPKICryptSignJNI.JPKI_CALG_SHA_256);

    //(7)ハッシュ値をセット
    jpkiCryptSign.cryptSetHashValue(hHash, hash);

    //(8)署名値を検証
    if (jpkiCryptSign.cryptVerifySignature(hHash, signature, hKey) == true) {
      //検証成功
    } else {
      //検証失敗
    }

    //(9)ハッシュを解放
    jpkiCryptSign.cryptDestroyHash(hHash);

    //(10)公開鍵ハンドルを解放
    jpkiCryptSign.cryptDestroyKey(hKey);

    //(11)プロバイダハンドルを解放
    jpkiCryptSign.cryptReleaseContext(hProv);

※繰り返して電子署名を検証する場合は、(6)から(9)を繰り返して呼び出します。
 (但し、すべての電子署名が同一の秘密鍵で生成された場合とします。)
※注:ハッシュアルゴリズム「SHA1」を利用した電子署名を検証する場合は、(6)を以下のように呼び出してください。
   long hHash = jpkiCryptSign.cryptCreateHash(hProv, JPKICryptSignJNI.JPKI_CALG_SHA1);