Проверить SHA1 с подписью ECDSA на javacard

у меня есть самоподписанный сертификат, подписанный алгоритмом SHA1withECDSA с использованием BouncyCastle. Под BC я могу легко это проверить, но когда я делаю это на JavaCard, он каждый раз отправляет мне false (Curve secp192r1 из NIST). Знак удержания сертификата в обычном виде (не X9.62 означает просто r+s без каких-либо тегов).

Есть мой код для проверки (со значениями, указанными как константы - для тестов, конечно).

байт [] certdata = {...}

    Signature signature = Signature.getInstance(Signature.ALG_ECDSA_SHA, false);
    ECPublicKey ecpk = (ECPublicKey) KeyBuilder.buildKey(KeyBuilder.TYPE_EC_FP_PUBLIC,      KeyBuilder.LENGTH_EC_FP_192, true);

    ecpk.setA(new byte[]{...}, (short)0, (short)0x0018); 
    ecpk.setB(new byte[]{...}, (short)0, (short)0x0018);
    ecpk.setG(new byte[]{...}, (short)0, (short)0x0031);
    //Point format: uncompressed tag(0x04), x, y
    ecpk.setK((short)0x0001);
    ecpk.setR(new byte[]{}, (short)0, (short)0x0018);
    ecpk.setW(new byte[]{}, (short)0, (short)0x31);
    ecpk.setFieldFP(new byte[]{}, (short)0, (short)0x0018);

    signature.init(ecpk, Signature.MODE_VERIFY);

    boolean result = signature.verify(certdata, (short)0, (short)certdata.length, signtab, (short)0, (short)signtab.length);
    if(result) ISOException.throwIt((short)0x0001);
    else ISOException.throwIt((short)0x0002);    
}

'...' вместо байтов для четкого представления (192-битная кривая может привести к большому беспорядку).

Сертификат с объяснением TAGS на pastebin:

http://pastebin.com/gvqYzm2g

Спасибо за любую помощь

севар

редактировать: Новые тесты: Все тесты повторяют одни и те же данные (PublicKey, PrivateKey, Message to be sign), знак рандомизирован, поэтому я буду использовать 2 знака (signT - знак, сгенерированный терминалом (BC), signC - знак, сгенерированный чипом)

signT не может быть проверен на ЧИПе, но может быть проверен на Терминале. signC проверен на ЧИПЕ и Терминале

поэтому я проверил пересечение API

  • Перекрестная связь, направленная на Британскую Колумбию, работает хорошо

  • Перекрестная связь, направленная на CHIP, не работает

пара ключей сгенерирована хорошо, потому что, когда я помещаю PrivateKey и PublicKey, сгенерированные BC, в CHIP, тогда подпись, сгенерированная на CHIP, может быть проверена CHIP.

  • KeyPair сгенерирован хорошо

Я понятия не имею, что я должен проверить сейчас. Проблема, вероятно, может быть связана с заполнением массива в шаге ECDSA e = SHA1 (сообщение). Что происходит с массивом после хеша (хэш короче кривой, и карта должна объявить размер массива перед копированием)


person sevar    schedule 05.12.2012    source источник
comment
Как у тебя дела с этим севаром? Было бы неплохо, если бы вы предоставили обратную связь для комментариев/ответов и т.д.   -  person Maarten Bodewes    schedule 15.12.2012


Ответы (2)


Подписание и проверка ECDSAwithSHA-1 с Prime192v1 от Bouncy Castle до JavaCard у меня отлично работает.

Ваша проблема, вероятно, заключается в формате самой подписи.

Подпись представляет собой структуру в кодировке DER, представляющую собой последовательность (тег 0x30) двух целых чисел (тег 0x02). В JavaCard всегда ожидается 56 байт: две координаты длиной 25 плюс 6 байт заголовков DER. JavaCard всегда ожидает начальные нули в каждой координате. Однако БК часто выдает подписи без начальных нулей в координатах, поэтому подпись может быть короче 56 байт и поэтому JavaCard путается.

Обратное направление всегда допустимо, потому что BC может обрабатывать начальные нули, хотя и не добавляет их при создании подписи.

Что вы должны сделать: оберните механизм подписи BC своим собственным кодом и ВСЕГДА добавляйте ведущие нули к координатам в вашей подписи BC. Если вы это сделаете, вы сможете проверить подпись как в BC, так и в JavaCard.

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

person vojta    schedule 17.12.2014

У меня возникла проблема с проверкой подписи ECDSA (сгенерированной на JavaCard 192r1) с помощью BouncyCastle, и я нашел решение. Я надеюсь, что это будет полезно

Проверьте подпись javacard ALG_ECDSA_SHA в надувном замке

person TajnosAgentos    schedule 05.03.2015