0

独自の派生キーS (バイト配列も)を使用して、 inBufferバイト配列に含まれるメッセージに署名しようとしています。javacard (jc) アプレット モジュールの関数の抜粋を以下に示します。jcアプレットの開発にjavacard2.2.2ライブラリを使用しています。プロセスリクエストを送信するためにAndroidアプリケーションを使用しています。「機能がサポートされていません」という意味の戻りコード「6A81 」を受け取りました。さて、サポートされていない HMAC_SHA256 について言及されているか、関数に間違いがあることを理解できなかったため、どのように進めればよいかわかりません。助けてください。

    Signature m_sessionMAC = null;
    HMACKey keyType = null;
    Sign = new byte[64];

    bytesRead = apdu.setIncomingAndReceive();

    // Create HMAC Key Used in Mac
    m_sessionMAC = Signature.getInstance(Signature.ALG_HMAC_SHA_256, false);

    // Create HMAC Key Used in Mac
    keyType = (HMACKey) KeyBuilder.buildKey(KeyBuilder.TYPE_HMAC, KeyBuilder.LENGTH_HMAC_SHA_256_BLOCK_64, false); 
    keyType.setKey(S,(short) 0, (short) S.length);
    m_sessionMAC.init(keyType, Signature.MODE_SIGN);

    //Generate Signature on inBuffer (received data to sign)
    echoOffset = m_sessionMAC.sign(inBuffer, ISO7816.OFFSET_CDATA, ISO7816.OFFSET_LC, Sign , (short)0); 
    Util.arrayCopyNonAtomic(Sign, ( short ) 0, inBuffer, ( short ) 0, echoOffset); 
    apdu.setOutgoingAndSend( ( short ) 0, (short) echoOffset );

この点で私を助けてください。または、HMAC_SHA256 または HMAC_SHA1 対称暗号を実装するための指針も提供してください。javacardアプレットで。

前もって感謝します。

4

2 に答える 2

2

ほとんどの暗号化アルゴリズムは、JavaCard ではオプションです。したがって、カードが Signature.ALG_HMAC_SHA_256 をサポートしていない可能性があります。ただし、HMAC アルゴリズムはそれほど複雑ではないため、カードが MessageDigest.ALG_SHA_256 をサポートしているかどうかを確認する必要があります。

サポートされている場合は、RFC2104 に従って HMAC を自分で実装できます

K = HMAC key of length 32
ipad = the byte 0x36 repeated 32 times
opad = the byte 0x5C repeated 32 times.

To compute HMAC over the data `text' we perform

H(K XOR opad, H(K XOR ipad, text))

RFC 4231に記載されているテスト ベクトルと結果を比較することで、実装をテストできます。

于 2012-11-08T08:45:05.833 に答える
1

ロバートの回答に加えて、 getInstance() メソッドを呼び出すときに CryptoException をチェックする必要があることを強調したいと思います。ロバートがすでに述べたように、アルゴリズムはオプションである可能性があるため、次のように事前に確認することをお勧めします。

try {
    Signature.getInstance(Signature.ALG_HMAC_SHA_256, false);
} catch (CryptoException e) {
    if (e.getReason() == CryptoException.NO_SUCH_ALGORITHM) {
        // Do something to treat algorithm absebce
    }
}
于 2012-11-08T09:07:26.313 に答える