Является asn1 целое число является asn1 строку

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

EDIT: я использую openssl, скомпилированный для iOS, так как у меня есть проект iOS. Вот код, который я использую для извлечения серийный номер сертификата:

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

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

EDIT 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 ответов


преобразование ASCII hex выполняется более просто с помощью встроенной функции bn_bn2hex (BIGNUM*)

ASN1_INTEGER *serial = X509_get_serialNumber(certificateX509);
BIGNUM *bnser = ASN1_INTEGER_to_BN(serial, NULL);
char *asciiHex = BN_bn2hex(bnser);

одна из возможностей заключается в том, что вы можете извлечь значение 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.

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

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

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


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

 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]];
}

Если вам просто нужна читаемая NSString,BN_bn2dec больше consize, чем 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];

Ура.