0

我正在尝试使用我自己的派生密钥S(也是字节数组)对包含inBuffer字节数组的消息进行签名。javacard (jc) 小程序模块的函数片段如下所示。我正在使用 javacard2.2.2 库来开发 jc 小程序。我正在使用 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

除了 Robert 的回答,我想强调一下,当您调用 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 回答