Получение ключей PKCS11 с помощью CMAC

Я хотел бы знать, можно ли произвести вывод ключа с помощью механизма AES_CMAC.

У меня есть главный ключ (ключ) AES, и я хочу сгенерировать ключ AES: key2 = AES_CMAC (ключ, данные). И, конечно же, я хочу получить только держатель key2, а не ценность.

когда мне это нравится:

public long derive_key(long key, byte[] data, String label) {
         long p_key = -1L;
         CK_MECHANISM mec = new CK_MECHANISM();
         mec.mechanism = PKCS11Constants.CKM_AES_CMAC;
         SecretKey keyTemplate = new AESSecretKey();
         
         fill(keyTemplate, label);
         ((AESSecretKey) keyTemplate).getValueLen().setLongValue(16L);
         ((AESSecretKey) keyTemplate).getValue().setByteArrayValue(data);
         
         CK_ATTRIBUTE[] attr = iaik.pkcs.pkcs11.objects.Object.getSetAttributes(keyTemplate);
         return cryptoki.C_DeriveKey(ckiSession, mec, key, attr, true);

Я получаю ошибку CKR_MECHANISM_INVALID.

И я не могу использовать cryptoki.C_Sign (...), потому что он выводит значение ключа.

Спасибо!


person zero    schedule 09.02.2021    source источник


Ответы (2)


Механизм CKM_AES_CMAC нельзя использовать для получения ключа (см. Таблицу здесь).

На мой взгляд, невозможно реализовать получение ключа CMAC с помощью стандартных механизмов PKCS # 11 без предоставления какого-либо промежуточного результата (см. Ниже метод, который передает несколько промежуточных результатов в SW).

Учитывая, как работает CMAC, у вас нет возможности выполнить вывод подключа (условное XOR и побитовый сдвиг) и настройка последнего входного блока.

На мой взгляд, у вас есть следующие варианты:

  • использовать другой алгоритм получения ключа

  • реализовать этот механизм в виде специального кода внутри HSM (см., например, здесь)

  • использовать другую технологию (например, индивидуальную смарт-карту)

Удачи с вашим проектом!


Теоретически, если вы не против выставить E (k, 0), подключи и один промежуточный результат в SW, вы можете:

  • вычислить E (k, 0) через CKM_AES_ECB

  • вычислить подключи в SW

  • вычислить CBC-MAC блоков входных данных m_ {1} .. m_ {n-1} через CKM_AES_MAC

  • настроить последний блок входных данных m_ {n} с помощью соответствующего подключа (и ISO 9797-1 Метод заполнения 2, если блок не завершен) в SW

  • используйте CKM_AES_CBC_ENCRYPT_DATA с IV, равным вычисленному CBC-MAC, и данными, равными настроенному последнему блоку, чтобы получить ключ

Не делайте этого! (хотя, наверное, это лучше, чем делать все это в SW).

Отказ от ответственности: я не эксперт в области криптографии, поэтому, пожалуйста, подтвердите мои мысли.

person vlp    schedule 10.02.2021
comment
Спасибо за все эти объяснения. Я просто хотел убедиться, что стандарт PKCS11 не существует. Я также думал о повторной реализации CMAC, однако результат вычисления последнего блока AES-ECB Enc (K, m_n XOR cipher_n-1 XOR K_i) возвращается HSM, поэтому он раскрывается. - person zero; 10.02.2021

PKCS # 11 действительно определяет CKM_SP800-108_COUNTER_KDF (и _FEEDBACK_KDF и DOUBLE_PIPELINE_KDF), что позволяет вам использовать AES_CMAC в качестве основного используемого алгоритма. Это соответствует вашим потребностям? Могут быть и другие механизмы получения ключей, которые также могут позволить вам использовать CMAC.

Но более общий вопрос заключается в том, чего вы пытаетесь достичь. Обычно вывод выполняется в соответствии с требованиями более крупной схемы с дополнительными требованиями. Если вы запрашиваете CMAC специально, я подозреваю, что у вас есть другие требования?

person Darren Johnson    schedule 28.05.2021