在JavaCard Applet中生成HMAC_SHA256签名

时间:2012-11-07 15:06:59

标签: digital-signature smartcard javacard symmetric-key

我正在尝试使用我自己的派生密钥 S (也是字节数组)在 inBuffer 字节数组中签名一条消息。下面给出了来自javacard(jc)applet模块的函数片段。我正在使用javacard2.2.2库来开发jc applet。我正在使用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小程序中。

提前谢谢。

2 个答案:

答案 0 :(得分: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

中记录的测试向量进行比较来测试您的实施

答案 1 :(得分: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
    }
}