Цитата:Вот keyBytes перед импортом
Мне кажется (на первый взгляд, глубоко не вникал) что структура неправильная: заголовок правдоподобный на первый взгляд, потом недекодированные параметры 21 байт, потом судя по сертификату "голый" открытый ключ 64 байт, не указано самого алгоритма ключа. Сами данные ключа на месте, но обертка бывшая в сертификате исчезла в процессе. Ключ вполне мог импортироваться как гост-2001 вместо гост-2012, ведь алгоритм не указан, а длина совпадает. Для справки контекст создавали с типом 80?
Предполагаю (хотя точно не уверен), после заголовка как минимум должна идти вся часть сертификата об открытом ключе:
Код:3066
301F
06082A85030701010101
3013
06072A850302022400
06082A85030701010202
034300
04401B63870B4C85D1F3AB70193A912799175A2580C0BF680BEB36E0F950F30320D36788FF06DC54DECF93EFDBE603623AE081BBA95753B65E3D0E1C355CDF201647
Зато из данных keyBytes легко можно собрать структуру SubjectPublicKeyInfo.
Пусть все данные будут в одном блоке памяти Block (массив байт), тогда если делать с выравниванием на двойное слово, размером структуры SubjectPublicKeyInfo 24 байта, алгоритмом гост-2012 256, указатель на Block будем передавать в CryptImportPublicKeyInfoA:
Код:в Block[0-3] пишем указатель на Block[24]
в Block[4-7] пишем 21, длина параметров
в Block[8-11] пишем указатель на Block[44] // 24 + 17+1 + выравнивание 2
в Block[12-15] пишем 66, длина ключа
в Block[16-19] пишем указатель на Block[68] // 44 + 21 + выравнивание 3
в Block[20-23] пишем нули
в Block[24] пишем "1.2.643.7.1.1.1.1"#0 // длина 17 + #0
в Block[44] пишем параметры = 30 13 ... // длина 21
в Block[68] пишем ключ = 04 40 [1B 63 87]... // длина 66
Размер нужный для Block 136 байт = 68+66+выравнивание 2, в CryptImportPublicKeyInfo можно передать длину без последнего выравнивания, то есть 68+66=134 байта
Цитата:Вот SubjectPublicKeyInfo. Ровно 100 байт получается
На мой взгляд SubjectPublicKeyInfo не похожа на правильную структуру. Согласно тому что у меня программа показывает и по справке с течнет первым должен идти указатель на строку, а складывается впечатление у Вас там ASN структура 30 82 01 5B (то есть последовательность длиной 15B = 347 байт, никак не 100 байт. Допустим, что первые 4 байта все же указатель случайно напомнивший структуру, тогда следующие 4 байта должны быть количество байт, но там 3120301E - непонятно что, так как 1E не должно быть в строках, а 31 не очень похоже на выравнивание указателей. зато если разбить как 3120 потом 301E потом 0609 очень похоже на продолжение ASN структуры. То есть это недекодированная ASN структура, а не структура SubjectPublicKeyInfo. Затем 2A864886F70D010901 какой-то странный оид. Дальше наверно нет смысла рассматривать, как уже выяснили длина в начале не совпадает значит структура будет "битая".
Хорошо, по длине прикинем, у меня 20-24 байта сама стуктура SubjectPublicKeyInfo. Пусть данные на которые ссылка в структуре идут сразу после нее, тогда: + 66 байт ключ + 21 байт параметры + 17 байт строка алгоритма + #0 в конце строки = 125 байт минимум, 136 байт с выравниванием указателей на двойное слово, 154 байта если Юникод с выравниванием. То есть 100 байт маловато если все данные "в одном куске памяти" даже если выкинуть параметры. Однако параметры в сертификате присутствуют, так что нет причин их выкидывать.
Цитата:Я ничего не менял, так, что да включен.
По умолчанию контроль ключей в положении "1", то есть "нормальный". Усиленный это "2", без контроля "0". Если стандартная установка КС1/КС2 и ничего не меняли - усиленный контроль изначально должен быть выключен.
Цитата:Я нашел проблемы при маршаллинге. И получаю новую ошибку.
К сожалению, я про маршаллинг вообще ничего не знаю, так как такой термин не встречал в моем языке/среде программирования. Изменилось ли содержание получаемых структур после исправлений? Если да, то наверно нужно новую версию.
Встречено неверное значение тега ASN1. Надо полагать, передаваемые данные неверные.
Отредактировано пользователем 4 июля 2019 г. 7:32:22(UTC)
| Причина: Не указана