BouncyCastle を使用して SHA1withECDSA アルゴリズムで署名された自己署名証明書があります。BC では簡単に確認できますが、JavaCard で実行すると、毎回 false が送信されます (NIST の曲線 secp192r1)。プレーンな証明書保留サイン (非 X9.62 はタグなしの r+s のみを意味します)。
それを検証するための私のコードがあります(値は定数として設定されています-もちろんテスト用です)。
バイト[]証明書データ= {...}
Signature signature = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);
ECPublicKey ecpk = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC, KeyBuilder.LENGTH_EC_FP_192, true);
ecpk.setA(new byte[]{...}, (short)0, (short)0x0018);
ecpk.setB(new byte[]{...}, (short)0, (short)0x0018);
ecpk.setG(new byte[]{...}, (short)0, (short)0x0031);
//Point format: uncompressed tag(0x04), x, y
ecpk.setK((short)0x0001);
ecpk.setR(new byte[]{}, (short)0, (short)0x0018);
ecpk.setW(new byte[]{}, (short)0, (short)0x31);
ecpk.setFieldFP(new byte[]{}, (short)0, (short)0x0018);
signature.init(ecpk, Signature.MODE_VERIFY);
boolean result = signature.verify(certdata, (short)0, (short)certdata.length, signtab, (short)0, (short)signtab.length);
if(result) ISOException.throwIt((short)0x0001);
else ISOException.throwIt((short)0x0002);
}
明確な表示のためにバイトの代わりに「...」(192ビットの曲線は大きな混乱を招く可能性があります)。
Pastebin の TAGS 説明付きの証明書:
助けてくれてありがとう
セヴァル
編集: 新しいテスト: すべてのテストは同じデータ (PublicKey、PrivateKey、署名するメッセージ) に基づいています。符号はランダム化されているため、2 つの符号を使用します (signT - ターミナル (BC) によって生成された符号、signC - チップによって生成された符号)
signT は CHIP では検証できませんが、ターミナルでは検証できます。signC は CHIP と端末で検証されます
だから私はAPI間のクロスをチェックしました
BC 向けのクロス リレーションがうまく機能する
CHIP へのクロス リレーションが機能しない
BCによって生成されたPrivateKeyとPublicKeyをCHIPに配置すると、CHIPで生成された署名がCHIPによって検証できるため、キーのペアが適切に生成されます。
- KeyPair が適切に生成されました
今何をチェックすればいいのかわからない。問題は、ECDSA ステップ e = SHA1(Message) で配列を埋めることである可能性があります。ハッシュ後の配列で何が起こるか (ハッシュは曲線よりも短く、カードはコピー前に配列のサイズを宣言する必要があります)