Генерация подписи HMAC_SHA256 в апплете JavaCard

Я пытаюсь подписать сообщение, содержащееся в массиве байтов inBuffer, используя мой собственный производный ключ S (также массив байтов). Фрагмент функции из модуля апплета 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.

Заранее спасибо.


person iankits    schedule 07.11.2012    source источник


Ответы (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.

person Robert    schedule 08.11.2012
comment
Спасибо. Это работало, но я чувствовал, что это медленно. Но не могу больше комментировать производительность, так как я не могу запустить встроенный алгоритм hmac sha256, чтобы проверить производительность или сравнить ее с написанным вручную кодом. - person iankits; 08.11.2012

В дополнение к ответу Роберта я хотел бы подчеркнуть, что вы должны проверять CryptoException, когда вы вызываете метод getInstance(). Как уже упоминал Роберт, алгоритмы могут быть необязательными, поэтому рекомендуется проверять их перед тем, как:

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
    }
}
person Nodir Gulyamov    schedule 08.11.2012
comment
Спасибо, Нодир. Это был полезный совет. :-) - person iankits; 08.11.2012