ASN1_INTEGER - ASN1_STRING - PullRequest
       16

ASN1_INTEGER - ASN1_STRING

7 голосов
/ 10 марта 2012

Я использую openssl для получения данных о сертификате x509.Есть ли способ конвертировать ASN1_INTEGER в ASN1_STRING, который можно легко преобразовать в массив символов?Есть ли способ конвертировать его в любой другой читаемый человеком формат?

РЕДАКТИРОВАТЬ: я использую openssl для iOS, так как у меня есть проект iOS.Вот код, который я использую для извлечения серийного номера из сертификата:

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
long value = ASN1_INTEGER_get(serial);
NSLog(@"Serial %ld", value);

certificateX509 является допустимым объектом X509, и мне удалось получить некоторые другие поля из него (имя эмитента, дата истечения срока действия)и так далее)

РЕДАКТИРОВАТЬ 2:
Я наконец-то пришел к решению, которое может быть не самым простым:

 ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
 BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
 int n = BN_num_bytes(bnser);
 unsigned char outbuf[n];
 int bin = BN_bn2bin(bnser, outbuf);
 char *hexbuf = (char*) outbuf;

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

NSMutableString *str = [[NSMutableString alloc] init];
for (int i=0; i<n; i++) {
    NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]];
    [str appendString:[NSString stringWithFormat:@"%@ ", temp]];
}

Если есть более простой способ, я действительно хотел бы знать это.

Ответы [ 4 ]

10 голосов
/ 13 июня 2013

Преобразование в шестнадцатеричный код ascii можно сделать проще, используя встроенную функцию BN_bn2hex (BIGNUM *)

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
char *asciiHex = BN_bn2hex(bnser);
5 голосов
/ 10 марта 2012

Одна возможность состоит в том, что вы можете извлечь значение ASN1_INTEGER как обычное целое число C:

#include <openssl/asn1.h>
#include <stdio.h>

int main(int argc, char** argv) {
  long value;
  ASN1_INTEGER asn1int = {0};

  ASN1_INTEGER_set(&asn1int, 42);
  value = ASN1_INTEGER_get(&asn1int);
  printf("The value is %ld.\n", value);

  return 0;
}

Скомпилировано так:

gcc -Wall -o sploots sploots.c -lcrypto

это производит вывод:

The value is 42.

Чтобы иметь значение в виде строки в массиве char, используйте snprintf.

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

Способ, которым я пришел к этому ответу, состоит в том, что я просматривал заголовки OpenSSL для ASN1_INTEGER. Осмотрев подходящие API для решения на основе BIO, я заметил функцию ASN1_INTEGER_get.

Просмотр заголовочных файлов OpenSSL - это, как правило, способ узнать, как использовать OpenSSL, поскольку большая часть API недокументирована, неправильно или не полностью задокументирована.

2 голосов
/ 14 марта 2012

Я наконец-то пришел к решению, которое может быть не самым простым:

 ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
 BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
 int n = BN_num_bytes(bnser);
 unsigned char outbuf[n];
 int bin = BN_bn2bin(bnser, outbuf);
 char *hexBuf = (char*) outbuf;

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

 NSMutableString *str = [[NSMutableString alloc] init];
    for (int i=0; i<n; i++) {
    NSString *temp = [NSString stringWithFormat:@"%.6x", hexbuf[i]];
    [str appendString:[NSString stringWithFormat:@"%@ ", temp]];
}
1 голос
/ 20 декабря 2017

Если вам просто нужна читаемая строка NSString, BN_bn2dec больше, чем BN_bn2hex или BN_bn2bin.
Не нужно связываться с шестнадцатеричной кодировкой.

Вот мой способ, в iOS / ObjC, использовать pod 'OpenSSL-Universal', '1.0.2.10':

ASN1_INTEGER *serialAsn1 = X509_get_serialNumber(certX509);
BIGNUM *serialBigNumber = ASN1_INTEGER_to_BN(serialAsn1, NULL);
char *serialChar = BN_bn2dec(serialBigNumber);

NSString *serialString = [NSString stringWithCString:(const char *) serialChar
                                            encoding:NSUTF8StringEncoding];

Приветствие.

...