Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline valerkambt  
#21 Оставлено : 31 марта 2021 г. 8:23:19(UTC)
valerkambt

Статус: Участник

Группы: Участники
Зарегистрирован: 24.10.2020(UTC)
Сообщений: 17
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
Прошу прощения, не было информации про то, что работа на iOS.
PP_USER_CERTSTORE на Unix работает только при указании флага CP_CRYPT_SERIALIZED_STORE, и целом, оно вам не очень поможет. С нулевым кодом ошибки хотелось бы разобраться - включите пожалуйста аудит в config.ini:
Код:
[debug]
csp=63
capi10=63
capi20=63

Это для CSP 5.0.11998

Я всё-таки буду просить подготовить законченный пример приложения, чтобы мы смогли найти ошибку.


я обновил фреймворк CryptoPro

у меня появилась проблема откуда не ждали - я хочу считать контекст сертификата с Рутокен. Раньше я делала это путем перебора контейнеров на всех ридерах

Код:
- (NSDictionary <NSString*, NSArray*>*) getContainerList{
    NSMutableDictionary<NSString*, NSArray*>* result =  (NSMutableDictionary<NSString*, NSArray*>*) [NSMutableDictionary new];
    
    DWORD error = ERROR_SUCCESS;
    HCRYPTPROV  hCryptProv = 0;
    CSP_BOOL    bResult = 0;
    DWORD       dwLen = 0;
    
    bResult = CryptAcquireContext(&hCryptProv, NULL, NULL, kGostProvType, CRYPT_VERIFYCONTEXT);
    if (!bResult) {
        error = CSP_GetLastError();
        NSLog(@"CryptAcquireContext(CRYPT_VERIFYCONTEXT): %x\n", error);
    }
    
    if(0 == hCryptProv) {
        NSLog(@"Invalid HCRYPTPROV");
        return nil;
    }
    
    BYTE cryptFirst = CRYPT_FIRST;
    
    for (;1;) {
        
        CSP_SetLastError(ERROR_SUCCESS);
        bResult = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, NULL, &dwLen, cryptFirst);
        error = CSP_GetLastError();
        if (error == ERROR_NO_MORE_ITEMS)
            break;
        if (!bResult)
        {
            printf("CryptGetProvParam(PP_ENUMREADERS, LEN): %x\n", error);
            break;
        }
        
        
        LPBYTE pbContainerName;
        pbContainerName = (LPBYTE)malloc(dwLen);
        bResult = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, pbContainerName, &dwLen, cryptFirst);
        
        HCRYPTPROV  hContainer = 0;
        if (CryptAcquireContext(&hContainer,(LPCSTR)pbContainerName, NULL, PROV_GOST_2012_256, 0)) {
            
            BYTE pbData[1000];     
            
            DWORD cbData = 1000;    
            
            CryptGetProvParam(hContainer, PP_FQCN, pbData, &cbData, CRYPT_FQCN);
            
            NSString *urlStr = [NSString stringWithUTF8String:(const char *)pbData];
            NSArray *components = [urlStr componentsSeparatedByString:@"\\"];
            NSString *readerName = components [components.count - 2];
            NSString *containerName = components [components.count - 1];
            
            if (result[readerName] == nil) {
                result[readerName] = [NSArray new];
            }
            
            NSMutableArray *ar = [result[readerName] mutableCopy];
            [ar addObject:containerName];
            
            result[readerName] = ar;
        }
        
        cryptFirst = 0;
        error = CSP_GetLastError();
        if (error == ERROR_NO_MORE_ITEMS)
            break;
        
        if (!bResult){
            printf("CryptGetProvParam(PP_ENUMREADERS, NAME): %x\n", error);
            break;
        }
    }
    
    return result;
}


теперь считывает только с  HDIMAGE

Рутокен подключен ТОЧНО. Если сделать CryptGetProvParam(PP_ENUMREADERS), то он будет в списке.

как считать контекст сертефиката с Рутокен теперь?

Отредактировано пользователем 31 марта 2021 г. 9:30:23(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#22 Оставлено : 31 марта 2021 г. 10:54:48(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
А библиотеку Рутокена прилинковали? Подробности в Readers.txt
Знания в базе знаний, поддержка в техподдержке
Offline valerkambt  
#23 Оставлено : 31 марта 2021 г. 12:39:30(UTC)
valerkambt

Статус: Участник

Группы: Участники
Зарегистрирован: 24.10.2020(UTC)
Сообщений: 17
Российская Федерация

Автор: Максим Коллегин Перейти к цитате
А библиотеку Рутокена прилинковали? Подробности в Readers.txt


RtPcsc.framework эту? да она есть. Просто меняю Фреймворк со старой версии на новую одна версия работает другая нет. Флаг dynamic_readers = 1 везде проставлен. я обратил внимание что в прошлом Readers.txt нужно было добавлять еще RDRRtSupCp и rtpkcs11ecp, а в новом таких указанной нет. удаление этих либ из проекта не помогло. Бог с ним. Старая версия КриптоПро читает серты. Так что вернемся к расшифровке пожалуйста.
Offline valerkambt  
#24 Оставлено : 31 марта 2021 г. 12:43:55(UTC)
valerkambt

Статус: Участник

Группы: Участники
Зарегистрирован: 24.10.2020(UTC)
Сообщений: 17
Российская Федерация

вот весь код одной страницей. старт с

-
Код:
 (NSData*)decodeData:(NSData*)data.


Включил логи, куда смотреть?


Код:
static const int kGostProvType = 75;

@interface ExampleDecoder()
@property (nonatomic, assign) HCERTSTORE hMemStore;
@end

@implementation ExampleDecoder

- (NSData*)decodeData:(NSData*)data{
    [self initCryptoStore];
    
    NSDictionary *containers = [self getContainers];
    NSArray *certs = [self convertCertsFromContainers:containers];
    
    CryptoCertWrapper *rutokenCert = nil;
    for (CryptoCertWrapper *cert in certs) {
        if ([cert.readerName containsString:@"Aktiv Rutoken"]) {
            rutokenCert = cert;
            break;
        }
    }
    
    if ([self importCertCtx:rutokenCert.cryptoProCert.cert toStore:self.hMemStore]){
        NSError *er = nil;
        NSData *decryptedData = [self privateDecryptData:data rghCertStore:self.hMemStore error:&er];
        
        NSLog(@"decryptedData %@", decryptedData);
    }
    
    return nil;
}

- (void)initCryptoStore{
     HCRYPTPROV  hCryptProv = 0;
    _hMemStore = CertOpenSystemStore(hCryptProv,
                                      [@"MY" cStringUsingEncoding:NSASCIIStringEncoding]);
}

- (BOOL)importCertCtx:(PCCERT_CONTEXT)cert toStore:(HCERTSTORE) hCertStore{
 
    DWORD dwAddDisposition = CERT_STORE_ADD_ALWAYS;
    
    BOOL result = CertAddCertificateContextToStore(hCertStore,
                                                   cert,
                                                   dwAddDisposition,
                                                   NULL);
    DWORD error = ERROR_SUCCESS;
    if (!result) {
        error = CSP_GetLastError();
    }

    return result;
}

- (NSDictionary <NSString*, NSArray*>*)getContainers{
    NSMutableDictionary<NSString*, NSArray*>* result =  (NSMutableDictionary<NSString*, NSArray*>*) [NSMutableDictionary new];
    
    DWORD error = ERROR_SUCCESS;
    HCRYPTPROV  hCryptProv = 0;
    CSP_BOOL    bResult = 0;
    DWORD       dwLen = 0;
    
    bResult = CryptAcquireContext(&hCryptProv, NULL, NULL, kGostProvType, CRYPT_VERIFYCONTEXT);
    if (!bResult) {
        error = CSP_GetLastError();
        NSLog(@"CryptAcquireContext(CRYPT_VERIFYCONTEXT): %x\n", error);
    }
    
    if(0 == hCryptProv) {
        NSLog(@"Invalid HCRYPTPROV");
        return nil;
    }
    
    BYTE cryptFirst = CRYPT_FIRST;
    
    for (;1;) {
        
        CSP_SetLastError(ERROR_SUCCESS);
        bResult = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, NULL, &dwLen, cryptFirst);
        error = CSP_GetLastError();
        if (error == ERROR_NO_MORE_ITEMS)
            break;
        if (!bResult)
        {
            printf("CryptGetProvParam(PP_ENUMREADERS, LEN): %x\n", error);
            break;
        }
        
        
        LPBYTE pbContainerName;
        pbContainerName = (LPBYTE)malloc(dwLen);
        bResult = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, pbContainerName, &dwLen, cryptFirst);
    
        if (bResult == 0) break;
        HCRYPTPROV hContainer = 0;
        
        if (CryptAcquireContext(&hContainer,(LPCSTR)pbContainerName, NULL, PROV_GOST_2012_256, 0)) {
            
            BYTE pbData[1000];       // 1000 will hold the longest
            
            DWORD cbData = 1000;     // key container name.
            
            CryptGetProvParam(hContainer, PP_FQCN, pbData, &cbData, CRYPT_FQCN);
            
            NSString *urlStr = [NSString stringWithUTF8String:(const char *)pbData];
            NSArray *components = [urlStr componentsSeparatedByString:@"\\"];
            NSString *readerName = components [components.count - 2];
            NSString *containerName = components [components.count - 1];
            
            if (result[readerName] == nil) {
                result[readerName] = [NSArray new];
            }
            
            NSMutableArray *ar = [result[readerName] mutableCopy];
            [ar addObject:containerName];
            
            result[readerName] = ar;
        }
        
        cryptFirst = 0;
        error = CSP_GetLastError();
        if (error == ERROR_NO_MORE_ITEMS)
            break;
        
        if (!bResult){
            printf("CryptGetProvParam(PP_ENUMREADERS, NAME): %x\n", error);
            break;
        }
    }
    
    return result;
}

- (CryptoCertWrapper*)certFromContainerName:(NSString*)containerName{
        HCRYPTPROV hContainer = 0;
        
        if (CryptAcquireContext(&hContainer, (LPCSTR)containerName.UTF8String, NULL, kGostProvType, 0)) {
        
            HCRYPTKEY key = 0;
            DWORD pdwCertLen = 0;
            CSP_BOOL bResult = 0;
            
            DWORD keyType = AT_KEYEXCHANGE;
            
            CryptGetUserKey(hContainer, keyType, &key);
            
            CryptGetKeyParam(key, KP_CERTIFICATE, 0, &pdwCertLen, 0);
            
            BYTE *pbDecoded = (BYTE *) malloc(pdwCertLen);
            
            bResult = CryptGetKeyParam(key,
                                       KP_CERTIFICATE,
                                       pbDecoded,
                                       &pdwCertLen,
                                       0);
            
            NSData *datacert = [NSData dataWithBytes:pbDecoded length:pdwCertLen];
            
            BYTE *pbCertEncoded = (BYTE*) [datacert bytes];
            DWORD cbCertEncoded = (DWORD) [datacert length];
            DWORD dwCertEncodingType = X509_ASN_ENCODING |
            PKCS_7_ASN_ENCODING;
            
            PCCERT_CONTEXT cert = CertCreateCertificateContext(/*IN DWORD*/ dwCertEncodingType,
                                                               /*IN const BYTE * */ pbCertEncoded,
                                                               /*IN DWORD*/ cbCertEncoded);
            
            DWORD rv = ERROR_SUCCESS;
              
            DWORD cbProvName;
           // LPWSTR pbProvName = NULL;
           
            if(!CryptGetDefaultProviderW(
                kGostProvType,
                NULL,
                CRYPT_MACHINE_DEFAULT,
                NULL,
                &cbProvName)){
                printf("Error getting the length of the default provider name.");
                rv = CSP_GetLastError();
                //goto free_cert_context;
            }
            
             wchar_t pbProvName[cbProvName];
            if(!CryptGetDefaultProviderW(
                kGostProvType,
                NULL,
                CRYPT_MACHINE_DEFAULT,
                pbProvName,
                &cbProvName))
            {
                printf("Error getting the length of the default provider name.");
                rv = CSP_GetLastError();
               // goto free_prov_name;
            }
            
            LPWSTR wContName = NULL;
            LPCSTR cName = (LPCSTR)containerName.UTF8String;
            
            wchar_t wcstring[100];
            mbstowcs (wcstring, cName, strlen(cName)+1);
            
            CRYPT_KEY_PROV_INFO KeyProvInfo;
            
            KeyProvInfo.pwszContainerName = wContName;
            KeyProvInfo.pwszProvName = pbProvName;
            KeyProvInfo.dwProvType = kGostProvType;
            KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
            KeyProvInfo.dwFlags = 0;
            KeyProvInfo.cProvParam = 0;
            KeyProvInfo.rgProvParam = NULL;
            
            if (!CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, NULL, (void *) &KeyProvInfo)) {
                printf("CertSetCertificateContextProperty error");
                rv = CSP_GetLastError();
            }
            
            CryptoCertWrapper *certObjc = [[CryptoCertWrapper alloc] init];
          
            certObjc.cryptoProCert = [[CryptoProCertInfo alloc] initWithCert:cert
                                                                       prov:hContainer
                                                                       type:keyType]; // просто структура с полями
            certObjc.containerName = containerName;
            
            return certObjc;
        }
        
        return nil;
}


- (NSArray*)convertCertsFromContainers:(NSDictionary<NSString*, NSArray*>*)dictContainers{
   
    NSMutableArray *certsResults = [@[] mutableCopy];
    
    for (NSString *keyReader in dictContainers.allKeys) {
        NSArray *containers = dictContainers[keyReader];
        for (NSString *containerName in containers) {
                 CryptoCertWrapper *wraper = [self certFromContainerName:containerName];
                 wraper.readerName = keyReader;
                 [certsResults addObject:wraper];
        }
    }
    
    return certsResults;
}

- (NSData *)privateDecryptData:(NSData *)data
           rghCertStore:(HCERTSTORE)store
                  error:(NSError**) error {
    
    CRYPT_DECRYPT_MESSAGE_PARA decryptPara;
    
    decryptPara.cbSize = sizeof(PCRYPT_DECRYPT_MESSAGE_PARA);
    decryptPara.dwMsgAndCertEncodingType = PKCS_7_ASN_ENCODING | X509_ASN_ENCODING;
    decryptPara.cCertStore = 1;
    decryptPara.rghCertStore = &store;
    
    BYTE *pbDecrypted;
    DWORD cbDecrypted = 0;
    
    BOOL res = CryptDecryptMessage(&decryptPara,
                                   [data bytes],
                                   (DWORD) [data length],
                                   NULL,
                                   &cbDecrypted,
                                   NULL);
    
    if (!res) {
        DWORD err = CSP_GetLastError();
        
        NSString *errorStr = [NSString stringWithFormat: @"Cannot decrypt message: %d", err];
        
        *error = [NSError errorWithDomain:@""
                                    code:err
                                userInfo:@{NSLocalizedDescriptionKey:errorStr}];
    
        return nil;
    }
    
    pbDecrypted = calloc(1, cbDecrypted);
    res = CryptDecryptMessage(&decryptPara,
                              [data bytes],
                              (DWORD) [data length],
                              pbDecrypted,
                              &cbDecrypted,
                              NULL);
    
    if (!res) {
        DWORD err = CSP_GetLastError();
        NSString *errorStr = [NSString stringWithFormat: @"Cannot decrypt message: %d", err];
        
        *error = [NSError errorWithDomain:@""
                                    code:err
                                userInfo:@{NSLocalizedDescriptionKey:errorStr}];
        return nil;
    }
    
    NSData *decryptedData = [NSData dataWithBytes:pbDecrypted length:cbDecrypted];
    
    free(pbDecrypted);
    
    return decryptedData;
}

@end

Отредактировано пользователем 31 марта 2021 г. 12:44:49(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#25 Оставлено : 31 марта 2021 г. 13:16:52(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Логи можно смотреть в консоли xcode или в приложении Console.
А на рутокене один контейнер? Можно было бы добавить все сертификаты из контейнеров рутокена в хранилище для надёжности.
Проверить, что контекст сертификата создался правильным, можно с помощью функции CryptAcquireCertificatePrivateKey.
И всё же я рекомендовал бы получать тип и имя криптопровайдера с помощью GetProvParam PP_NAME и PP_PROVTYPE.
Знания в базе знаний, поддержка в техподдержке
Offline Максим Коллегин  
#26 Оставлено : 31 марта 2021 г. 13:21:43(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Такого изощренного способа перечисления контейнеров еще никогда не видел.
Вынесите этот вызов из цикла.
Код:
        bResult = CryptGetProvParam(hCryptProv, PP_ENUMCONTAINERS, NULL, &dwLen, cryptFirst);
        error = CSP_GetLastError();
        if (error == ERROR_NO_MORE_ITEMS)
            break;
        if (!bResult)
        {
            printf("CryptGetProvParam(PP_ENUMREADERS, LEN): %x\n", error);
            break;
        }


А полученную длину используйте для каждого malloc.
Знания в базе знаний, поддержка в техподдержке
Offline Сергей Фролов  
#27 Оставлено : 31 марта 2021 г. 13:44:52(UTC)
Сергей Фролов

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 20.11.2018(UTC)
Сообщений: 2
Российская Федерация
Откуда: Moscow

Автор: valerkambt Перейти к цитате
Автор: Максим Коллегин Перейти к цитате
А библиотеку Рутокена прилинковали? Подробности в Readers.txt


RtPcsc.framework эту? да она есть. Просто меняю Фреймворк со старой версии на новую одна версия работает другая нет. Флаг dynamic_readers = 1 везде проставлен. я обратил внимание что в прошлом Readers.txt нужно было добавлять еще RDRRtSupCp и rtpkcs11ecp, а в новом таких указанной нет. удаление этих либ из проекта не помогло. Бог с ним. Старая версия КриптоПро читает серты. Так что вернемся к расшифровке пожалуйста.

Добрый день.
Попробуйте, пожалуйста, в секцию [Parameters] файла config.ini прописать параметры
Код:
EnableNativeTokenCryptMode = 1 
EnableNativeTokenPkcsMode = 1

В новой версии фреймворка мы по умолчанию отключили работу Рутокена в режимах rutoken_crypt_* и rutoken_pkcs_*.

Отредактировано пользователем 31 марта 2021 г. 13:49:23(UTC)  | Причина: Не указана

С уважением,
Фролов Сергей,
Инженер-программист 1 категории.
Offline valerkambt  
#28 Оставлено : 31 марта 2021 г. 21:58:41(UTC)
valerkambt

Статус: Участник

Группы: Участники
Зарегистрирован: 24.10.2020(UTC)
Сообщений: 17
Российская Федерация

Цитата:
Логи можно смотреть в консоли xcode или в приложении Console.

я имел ввиду что вам залогировать чтобы вы помогли разобраться в проблеме.


Цитата:
А на рутокене один контейнер? Можно было бы добавить все сертификаты из контейнеров рутокена в хранилище для надёжности.

Так я и пытаюсь это сделать, добавить контекст из Рутокен в локальный стор.


Цитата:
И всё же я рекомендовал бы получать тип и имя криптопровайдера с помощью GetProvParam PP_NAME и PP_PROVTYPE

Сделал это не помогло

Отредактировано пользователем 31 марта 2021 г. 21:59:48(UTC)  | Причина: Не указана

Offline valerkambt  
#29 Оставлено : 31 марта 2021 г. 22:23:48(UTC)
valerkambt

Статус: Участник

Группы: Участники
Зарегистрирован: 24.10.2020(UTC)
Сообщений: 17
Российская Федерация

Сделал CryptAcquireCertificatePrivateKey после генераации контекста. Видимо что то не так с приватным ключом все таки. Отметил участок комментарием. Что может быть не так?


Код:

- (CryptoCertWrapper*)certFromContainerName:(NSString*)containerName{
        HCRYPTPROV hContainer = 0;
        DWORD error = ERROR_SUCCESS;
    
        if (CryptAcquireContext(&hContainer, (LPCSTR)containerName.UTF8String, NULL, kGostProvType, 0)) {
        
            HCRYPTKEY key = 0;
            DWORD pdwCertLen = 0;
            CSP_BOOL bResult = 0;
            
            DWORD keyType = AT_KEYEXCHANGE;
            
            CryptGetUserKey(hContainer, keyType, &key);
            
            CryptGetKeyParam(key, KP_CERTIFICATE, 0, &pdwCertLen, 0);
            
            BYTE *pbDecoded = (BYTE *) malloc(pdwCertLen);
            
            bResult = CryptGetKeyParam(key,
                                       KP_CERTIFICATE,
                                       pbDecoded,
                                       &pdwCertLen,
                                       0);
            
            NSData *datacert = [NSData dataWithBytes:pbDecoded length:pdwCertLen];
            
            BYTE *pbCertEncoded = (BYTE*) [datacert bytes];
            DWORD cbCertEncoded = (DWORD) [datacert length];
            DWORD dwCertEncodingType = X509_ASN_ENCODING |
            PKCS_7_ASN_ENCODING;
            
            PCCERT_CONTEXT cert = CertCreateCertificateContext(dwCertEncodingType,                                                pbCertEncoded,
                                                               cbCertEncoded);
            
            DWORD cbProvName;
            bResult = CryptGetProvParam(hContainer, PP_NAME, NULL, &cbProvName, 0);
            
            if (!bResult){
                printf ("error get PP_NAME");
                return nil;
            }
          
            LPBYTE pbProvName;
            pbProvName = (LPBYTE)malloc(cbProvName);
           
            bResult = CryptGetProvParam(hContainer, PP_NAME, pbProvName, &cbProvName, 0);
            
            if (!bResult){
                printf("error get PP_NAME");
                return nil;
            }
            
            
          
            bResult = CryptGetProvParam(hContainer, PP_NAME, NULL, &cbProvName, 0);
            
            if (!bResult){
                printf ("error get PP_NAME");
                return nil;
            }
          
          
            pbProvName = (LPBYTE)malloc(cbProvName);
           
            bResult = CryptGetProvParam(hContainer, PP_NAME, pbProvName, &cbProvName, 0);
            
            if (!bResult){
                printf("error get PP_NAME");
                return nil;
            }
            
            DWORD pProviderType = 0;
            DWORD cbProviderType = 32;
            
            bResult = CryptGetProvParam(hContainer, PP_PROVTYPE, &pProviderType, &cbProviderType, 0);
          
            CRYPT_KEY_PROV_INFO KeyProvInfo;
            
            KeyProvInfo.pwszContainerName = convertLPCSTRtoLPWSTR((LPCSTR)containerName.UTF8String);;
            KeyProvInfo.pwszProvName = convertLPCSTRtoLPWSTR((LPCSTR)pbProvName);
            KeyProvInfo.dwProvType = pProviderType;
            KeyProvInfo.dwKeySpec = AT_KEYEXCHANGE;
            KeyProvInfo.dwFlags = 0;
            KeyProvInfo.cProvParam = 0;
            KeyProvInfo.rgProvParam = NULL;
            
            if (!CertSetCertificateContextProperty(cert, CERT_KEY_PROV_INFO_PROP_ID, 0, (void *) &KeyProvInfo)) {
                printf("CertSetCertificateContextProperty error");
                error = CSP_GetLastError();
            }
            
            DWORD dwKeySpec;
            
///////!!!!!!!!!!
          if (CryptAcquireCertificatePrivateKey(
                                                 cert,
                                                 0,
                                                 NULL,
                                                 &hContainer,
                                                 &dwKeySpec,
                                                 NULL))
            {
                printf("The CSP handle has been acquired. \n");
            }
            else {
                error = CSP_GetLastError();
                printf("Error during CryptAcquireCertificatePrivateKey.");
            }
////!!!!!!
            
            CryptoCertWrapper *certObjc = [[CryptoCertWrapper alloc] init];
          
            certObjc.cryptoProCert = [[CryptoProCertInfo alloc] initWithCert:cert
                                                                       prov:hContainer
                                                                       type:keyType]; // просто структура с полями
            certObjc.containerName = containerName;
            
            return certObjc;
        }
        
        return nil;
}



Логи

Код:
2021-04-01 01:18:52.986735+0600 MailCrypto[41664:2248278] <cpcsp>0x105f138c0:OpenContainer!OpenContainer kcar_open fail (0x80004001) (:924)
2021-04-01 01:18:52.987081+0600 MailCrypto[41664:2248278] <cpcsp>0x105f138c0:CPCAcquireContext (pszContainer=null, dwFlags=0x0). Result=0, Err=0x80004001. hProv=0x0. (:503)
2021-04-01 01:18:52.987262+0600 MailCrypto[41664:2248278] <capi20>0x105f138c0:CryptAcquireContextA!failed: LastError = 0x0 (:795)
2021-04-01 01:18:52.987405+0600 MailCrypto[41664:2248278] <capi20>0x105f138c0:CryptAcquireContextW!failed: LastError = 0x0 (:867)
<capi20>0x105f138c0:CryptAcquireCertificatePrivateKey () AcquireContext failed! (:190)
<capi20>0x105f138c0:CryptAcquireCertificatePrivateKey (failed: LastError = 0x0) (:312)

Отредактировано пользователем 1 апреля 2021 г. 5:47:57(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#30 Оставлено : 1 апреля 2021 г. 9:18:19(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,374
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 32 раз
Поблагодарили: 704 раз в 613 постах
Судя по отсутствию кода ошибок, вы не полностью выполнили рекомендации из readme.
Знания в базе знаний, поддержка в техподдержке
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
4 Страницы<1234>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.