我正在尝试使用我自己的派生密钥 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小程序中。
提前谢谢。
答案 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
}
}