19 / 14 / 2
Регистрация: 24.06.2016
Сообщений: 127
Записей в блоге: 2

Объединение данных в формате ASN.1 штатными средствами

16.02.2019, 05:23. Показов 1109. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый день. Возникла у меня такая задача: на входе строка с данными об издателе сертификата. Нужно получить массив байт в формате ASN.1. Все бы ничего, но: строка приходит в следующем виде:
Code
1
issuer:CN="Тестовый УЦ ООО \"КРИПТО-ПРО\"", O="ООО \"КРИПТО-ПРО\"", C=RU, EMAILADDRESS=info@cryptopro.ru, L=Москва, ST=77 г. Москва, STREET="ул. Сущёвский вал, д. 18", OID.1.2.643.3.131.1.1=#120C303037373137313037393931, OID.1.2.643.100.1=#120D31303337373030303835343434
Соответственно мы видим Х509 строку и две строки с OID'ами. Ага, что делать? 1) Парсим строку. 2) Перегоняем в ASN.1 вызовом
C++
1
CertStrToNameW/*и ударом в бубен*/
. На выходе получаем 3 массива в нужном нам формате. А вот тут и начинаются проблемы. Строки нужно объединить, но объединить так, чтобы при этом изменился (правильно пересчитался) заголовок сообщения. И здесь, что называется, нашла коса на камень. Как это грамотно сделать - не придумаю. Может кто сталкивался с подобным? Ниже код тестовый.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include <cstdio>
#include <cstdlib> 
#include <iostream>
#include <string>
#include <wtypes.h>
#include <wincrypt.h>
#include <fstream>
#pragma comment(lib, "crypt32.lib")
#include <Windows.h>
#include <vector>
 
#define MY_ENCODING_TYPE (PKCS_7_ASN_ENCODING | X509_ASN_ENCODING)
#define MY_STRING_TYPE (CERT_SIMPLE_NAME_STR)
using ByteArray = std::vector<uint8_t>;
 
static std::vector<uint8_t> read_file(const std::string& path)
{
    std::ifstream file(path, std::ifstream::binary);
    if (!file)
        throw std::runtime_error("Couldn't open file: " + path);
 
 
    file.seekg(0, std::ios::end);
    std::vector<uint8_t> data(static_cast<size_t>(file.tellg()));
 
    file.seekg(0, std::ios::beg);
    file.read(reinterpret_cast<char*>(data.data()), data.size());
    if (!file)
        throw std::runtime_error("Couldn't read file: " + path);
 
    file.close();
    return data;
}// read_file
 
 
static ByteArray wstring2asn1(LPCWSTR pszString, int str_type)
{
    ByteArray result;
    DWORD cbSize;
    CERT_NAME_BLOB blobEncodedIssuerName;
 
 
    if (!(CertStrToNameW(
        MY_ENCODING_TYPE,
        pszString,
        str_type,
        NULL,
        NULL,
        &cbSize,
        NULL)))
    {
        std::cout << "\nCould not get the length of the BLOB.";
        return  result;
    }
 
    if (!(blobEncodedIssuerName.pbData = (LPBYTE)malloc(cbSize)))
    {
        std::cout << "\nMemory Allocation for the BLOB failed.";
        return  result;
    }
    blobEncodedIssuerName.cbData = cbSize;
 
    if (!(CertStrToNameW(
        MY_ENCODING_TYPE | CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG,
        pszString,
        str_type,
        NULL,
        blobEncodedIssuerName.pbData,
        &blobEncodedIssuerName.cbData,
        NULL)))
    {
        std::cout << "\nCould not write the blob.";
        return  result;
    }
    return ByteArray(blobEncodedIssuerName.pbData, blobEncodedIssuerName.pbData + blobEncodedIssuerName.cbData);
}// wstring2asn1
 
int main(int argc, char* argv[])
{
    LPCWSTR oid1 = L"OID.1.2.643.3.131.1.1=#120C303037373137313037393931";
    LPCWSTR oid2 = L"OID.1.2.643.100.1=#120D31303337373030303835343434";
    LPCWSTR issuer = L"CN = \"Тестовый УЦ ООО КРИПТО-ПРО\", O = ООО КРИПТО-ПРО, C = RU, E = info@cryptopro.ru, L = Москва, ST = 77 г.Москва, STREET=\"ул.Сущёвский вал, д. 18\"";
    ByteArray result;
    auto b_issuer = wstring2asn1(issuer, CERT_X500_NAME_STR);
    auto b_oid1 = wstring2asn1(oid1, CERT_OID_NAME_STR);
    auto b_oid2 = wstring2asn1(oid2, CERT_OID_NAME_STR);
    
    result.insert(result.end(), b_issuer.begin(), b_issuer.end());
    result.insert(result.end(), b_oid1.begin(), b_oid1.end());
    result.insert(result.end(), b_oid2.begin(), b_oid2.end());
 
    CERT_ISSUER_SERIAL_NUMBER cert_issuer_serial_number;
    auto serial_orig = read_file("C:\\test\\serial.txt");// здесь оригинальный серийник
    cert_issuer_serial_number.Issuer.pbData = result.data();
    cert_issuer_serial_number.Issuer.cbData = static_cast<DWORD>(result.size());
    cert_issuer_serial_number.SerialNumber.pbData = const_cast<BYTE*>(serial_orig.data());
    cert_issuer_serial_number.SerialNumber.cbData = static_cast<DWORD>(serial_orig.size());
    CERT_ID cert_id;
    cert_id.dwIdChoice = 1;
    cert_id.IssuerSerialNumber = cert_issuer_serial_number;
    HCERTSTORE store_handle;
    // Открываем хранилище сертификатов
    if (!(store_handle = CertOpenStore(
        CERT_STORE_PROV_SYSTEM,
        0,
        NULL,
        CERT_SYSTEM_STORE_CURRENT_USER,
        L"MY")))
    {
        std::cout << "cert not found";
    }
 
    PCCERT_CONTEXT pCertCtx = CertFindCertificateInStore(
        store_handle,
        MY_ENCODING_TYPE,
        0,
        CERT_FIND_CERT_ID,
        &cert_id,
        nullptr);
    if (!pCertCtx)
    {
        std::cout << "cert not found\n";
        system("pause");
        return 0;
    }
    std::cout << "cert found\n";
    system("pause");
    return 0;
}
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
16.02.2019, 05:23
Ответы с готовыми решениями:

Синхронизация данных по сети организации штатными средствами Windows Server 2008 R2
Доброго всем дня или ночи, у кого как) В организации стоит задача автоматизировать получение новых файлов (к примеру обновлений по...

Работа с __closure штатными средствами
Подскажите плиз есть ли штатные средства обработки __closure? т.е. штатные процедуры макросы позволяющие разложить __closure на два...

Как ограничить антивирус штатными средствами Window 7 ?
Как ограничить антивирус штатными средствами Window 7 ? Ну или какими нибудь дополнительными средствами. Антивирус требует выполнения...

1
19 / 14 / 2
Регистрация: 24.06.2016
Сообщений: 127
Записей в блоге: 2
16.02.2019, 21:26  [ТС]
Проблема оказалась совсем не там, где ее искали. CertStrToNameW не хочет работать с кавычками. Точнее в документации сказано:
Quotation marks ("") are supported. A quotation can be included in a quoted value by using two sets of quotation marks, for example, CN="User ""one""".
. Но видимо я чего-то недопонял.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
16.02.2019, 21:26
Помогаю со студенческими работами здесь

Как загрузить ОЗУ штатными средствами Windows?
Для лабораторной работы необходимо съэмитировать полную загрузку ОЗУ и подключение файла подкачки при различном объёме ОЗУ. Какими...

Архивирование Windows штатными средствами в сервер на Ubuntu
Здравствуйте. Есть компьютер под управлением Windows 8.1 и есть сервер под управлением Ubuntu 13.10. Задача - штатными средствами...

Замена текста в Word с подстановочными знаками штатными средствами
Всем участникам форума добрый день и здравствуйте) Подскажите, пожалуйста, возможно ли штатными средствами Word-Replace осуществить...

Можно ли штатными средствами С++ замерять количество тиков процессора?
Хочу узнать, сколько тактов процессора прошло с начала запуска приложения. Возможно? В WinApi для этих целей есть...

Ошибка при восстановлении системы штатными средствами Windows
Произошла неопознанная ошибка при восстановлении системы: Сигнатура проблемы Имя проблемного события: SystemRestore Версия: 6.0.6002 ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

Новые блоги и статьи
Валидация и контроль данных табличной части документа перед записью
Maks 22.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в КА2. Задача: контроль и валидация данных табличной части документа перед записью с учетом регламента компании. . .
Отчёт о затраченных материалах за определенный период с макетом печатной формы
Maks 21.04.2026
Отчёт из решения ниже размещён в конфигурации КА2. Задача: разработка отчёта по затраченным материалам за определённый период, с возможностью вывода печатной формы отчёта с шапкой и подвалом. В. . .
Отчёт о спецтехнике находящейся в ремонте
Maks 20.04.2026
Отчёт из решения ниже размещен в конфигурации КА2. Задача: отобразить спецтехнику, которая на данный момент находится в ремонте. Есть нетиповой документ "Заявка на ремонт спецтехники" который. . .
Памятка для бота и "визитка" для читателей "Semantic Universe Layer (Слой семантической вселенной)"
Hrethgir 19.04.2026
Сгенерировано для краткого описания по случаю сборки и компиляции скелета серверного приложения. И пусть после этого скажут, что статьи сгенерированные AI - туфта и не интересно. И это не реклама -. . .
Запрет удаления строк ТЧ документа при определённом условии
Maks 19.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "Аккумуляторы", разработанного в конфигурации КА2. У данного документа есть ТЧ, в которой в зависимости от прав доступа. . .
Модель заражения группы наркоманов
alhaos 17.04.2026
Условия задачи сформулированы тут Суть: - Группа наркоманов из 10 человек. - Только один инфицирован ВИЧ. - Колются одной иглой. - Колются раз в день. - Колются последовательно через. . .
Мысли в слух. Про "навсегда".
kumehtar 16.04.2026
Подумалось тут, что наверное очень глупо использовать во всяких своих установках понятие "навсегда". Это очень сильное понятие, и я только начинаю понимать край его смысла, не смотря на то что давно. . .
My Business CRM
MaGz GoLd 16.04.2026
Всем привет, недавно возникла потребность создать CRM, для личных нужд. Собственно программа предоставляет из себя базу данных клиентов, в которой можно фиксировать звонки, стадии сделки, а также. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru