dstucrypt / jkurwa

Ecliptic curves cryptography standard DSTU 4145 in JS
https://www.gitbook.io/content/book/muromec/jkuwra/
75 stars 36 forks source link

fix a Message.signedWithCerts property content #45

Open zavla opened 1 year ago

zavla commented 1 year ago

Доброго здоров'я. Маю один p7s файл і щось не перевіряється підпис, помилки не виводиться, в ньому коли використовую ваш github.com/dstucrypt/agent. Перевіряю в режимі --verify --ocsp lax. З'ясував що саме перевірка --ocsp викликає помилку, яка є коли в об'єкт Message, в поле signedWithCerts, що є масивом, записувалось три об'єкта що представляють сертифікати, які читаються з цього p7s файла. Першій 'сертифікат' був з полем serialNumber, інші два об'єкта були тільки з полем keyId. Я пошукав що там в поле keyId зачиталось з p7s файла. Використав http://lapo.it/asn1js щоб подивитись байти з keyId у файлі p7s. Маю картинку де видно ці байти в файлі і які ідентифікатори asn1 їм відповідають. Я так зробив висновок що то пакет asn1.js помилково розбирає p7s. В цьому PR я пропоную корекцію к полю signedWithCerts що б взагалі відсікати такі прочитані сертифікати в яких немає поля serialNumber. Тести проходять ті що в вас є в jkurwa. Але я не впевнений що зроблено вірно для всіх, але мою помилку виправило і також коректно перевіряє p7s файли ті що раніше і так перевірялись.

zavla commented 1 year ago

то что в keyId

muromec commented 1 year ago

То воно получається не буде перевіряти один з сертифікатів, так? Це нехорошо.

muromec commented 1 year ago

Я так зробив висновок що то пакет asn1.js помилково розбирає p7s.

Я файла не бачив, але підозрюю що розбирає він все правильно і там дійсно вказан keyid, а serial не вказан. Це нормально. Треба дивитись на ctx.jsL317~318 чого воно не може знайти той сертифікат по keyid.

zavla commented 1 year ago

То воно получається не буде перевіряти один з сертифікатів, так? Це нехорошо.

В даному проблемному p7s, доречи сертифікат виданий uakey.com.ua АЦСК Україна, вказано що дані підписано одним сертифікатом. Тобто в групі байтів що відповідають по asn1 идентифікатору certificates є тілки один елемент. Це можна бачити на малюнку, зверху приблизно 9-тий рядок. А от jkurwa після розбору даних в Message вважає що дані підписано трьома сертифікатами. Другий и третій елементи масиву signedWithCerts jkurwa каже мають лише одне поле keyId і воно однаково у цих двох елементів. Але це поле, 32 байти, можно бачити на малюнку, обведено червоним, воно належить ідентификатору asn1 contentTimestamp і знаходиться воно, тобто ці байти що вважаються keyId, знаходяться в полях SignerInfos/SignerInfo/signedAttrs п'ятй атрибут той що contentTimestamp. Я сам не знаю, але хіба це keyId? contentTimestamp - може це якесь значення часу а не keyId? Оці 32 байти що зайшли в jkurwa в список сертифікатів що підписали, вони на малюнку окреслені червоним.

muromec commented 1 year ago

Я сам не знаю, але хіба це keyId? contentTimestamp - може це якесь значення часу а не keyId?

Це просто ще один p7s контейнер, а в ньому позначка часу пидписана TSP сервером, тому функція і рекурсивна.