unit-tests: Check encoding/retrieval of serial numbers

This commit is contained in:
Andreas Steffen
2022-12-05 20:18:24 +01:00
parent 18082ce2b0
commit 0d88c76abc
4 changed files with 985 additions and 0 deletions
+2
View File
@@ -48,6 +48,8 @@ libstrongswan_tests_SOURCES = tests.h tests.c \
suites/test_rsa_oaep_sha512.c \
suites/test_certpolicy.c \
suites/test_certnames.c \
suites/test_serial_gen.c \
suites/test_serial_parse.c \
suites/test_host.c \
suites/test_auth_cfg.c \
suites/test_hasher.c \
@@ -0,0 +1,708 @@
/*
* Copyright (C) 2022 Andreas Steffen, strongSec GmbH
*
* Copyright (C) secunet Security Networks AG
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "test_suite.h"
#include <credentials/certificates/x509.h>
#include <credentials/certificates/crl.h>
#include <credentials/certificates/ocsp_response.h>
#include <credentials/certificates/ac.h>
#include <time.h>
/**
* RSA private key, so we don't have to generate one
*/
static char keydata[] = {
0x30,0x82,0x02,0x5e,0x02,0x01,0x00,0x02,0x81,0x81,0x00,0xb1,0x9b,0xd4,0x51,0x24,
0xfc,0x56,0x1d,0x3d,0xfb,0xa2,0xea,0x37,0x02,0x70,0x72,0x87,0x84,0x2f,0x3b,0x2d,
0x6e,0x22,0xef,0x3f,0x37,0x04,0xb2,0x6f,0xb7,0xe7,0xd8,0x58,0x05,0xde,0x34,0xbf,
0x99,0xe6,0x40,0x7a,0x56,0xa7,0x73,0xf5,0x98,0xcb,0xb0,0x37,0x90,0x5e,0xd1,0x3f,
0xf4,0x73,0x50,0x7f,0x53,0x8e,0xf1,0x04,0x25,0xb4,0x77,0x22,0x4e,0x8a,0x9d,0x27,
0x8f,0x6f,0xaf,0x59,0xbd,0xb0,0x0f,0xf0,0xaa,0x11,0x94,0x66,0x16,0x10,0x58,0xad,
0x77,0xa1,0xac,0x58,0xb4,0xd0,0x0d,0xbc,0x11,0xe0,0xc0,0xe9,0x29,0xdc,0x42,0x63,
0x01,0x23,0x4f,0x28,0x41,0x6d,0x34,0x9e,0x0c,0x4a,0xc8,0x62,0x83,0xb5,0x71,0x71,
0x0b,0x51,0xc0,0x4c,0x37,0xd4,0x68,0x19,0x52,0x9a,0x8b,0x02,0x03,0x01,0x00,0x01,
0x02,0x81,0x81,0x00,0x82,0xca,0x33,0x16,0xb2,0x3a,0xd4,0x1b,0x62,0x9a,0x9c,0xc5,
0x07,0x4f,0x57,0x89,0x2f,0x7c,0x4a,0xdf,0xb4,0x3b,0xc7,0xa4,0x11,0x14,0x2d,0xf4,
0x4c,0xca,0xcc,0x03,0x88,0x06,0x82,0x34,0xab,0xe7,0xe4,0x24,0x15,0x33,0x1c,0xcb,
0x0a,0xcf,0xc3,0x27,0x78,0x33,0x6b,0x6f,0x82,0x3e,0x3c,0x70,0xc9,0xe2,0xb9,0x7f,
0x88,0xc3,0x4f,0x59,0xb5,0x8e,0xa3,0x81,0xd9,0x88,0x1f,0xc0,0x38,0xbc,0xc8,0x93,
0x40,0x0f,0x43,0xd8,0x72,0x12,0xb4,0xcc,0x6d,0x76,0x0a,0x6f,0x01,0x05,0xa8,0x88,
0xf4,0x57,0x44,0xd2,0x05,0xc4,0x77,0xf5,0xfb,0x1b,0xf3,0xb2,0x0d,0x90,0xb8,0xb4,
0x63,0x62,0x70,0x2c,0xe4,0x28,0xd8,0x20,0x10,0x85,0x4a,0x5e,0x63,0xa9,0xb0,0xdd,
0xba,0xd0,0x32,0x49,0x02,0x41,0x00,0xdb,0x77,0xf1,0xdd,0x1a,0x12,0xc5,0xfb,0x2b,
0x5b,0xb2,0xcd,0xb6,0xd0,0x4c,0xc4,0xe5,0x93,0xd6,0xf8,0x88,0xfc,0x18,0x40,0x21,
0x9c,0xf7,0x2d,0x60,0x6f,0x91,0xf5,0x73,0x3c,0xf7,0x7f,0x67,0x1d,0x5b,0xb5,0xee,
0x29,0xc1,0xd4,0xc6,0xdb,0x44,0x4c,0x40,0x05,0x63,0xaa,0x71,0x95,0x18,0x14,0xa7,
0x23,0x9f,0x7a,0xee,0x7f,0xb5,0xc7,0x02,0x41,0x00,0xcf,0x2c,0x24,0x50,0x65,0xf4,
0x94,0x7b,0xe9,0xf3,0x13,0x77,0xea,0x27,0x3c,0x6f,0x03,0x84,0xa7,0x7d,0xa2,0x54,
0x40,0x97,0x82,0x0e,0xd9,0x09,0x9f,0x4a,0xa6,0x75,0xe5,0x66,0xe4,0x9c,0x59,0xd9,
0x3a,0xe6,0xf7,0xd8,0x8b,0x68,0xb0,0x21,0x52,0x31,0xb3,0x4a,0xa0,0x2c,0x41,0xd7,
0x1f,0x7b,0xe2,0x0f,0x15,0xc9,0x6e,0xc0,0xe5,0x1d,0x02,0x41,0x00,0x9c,0x1a,0x61,
0x9f,0x89,0xc7,0x26,0xa9,0x33,0xba,0xe2,0xa0,0x6d,0xd3,0x15,0x77,0xcb,0x6f,0xef,
0xad,0x12,0x0a,0x75,0xd9,0x4f,0xcf,0x4d,0x05,0x2a,0x9d,0xd1,0x2c,0xcb,0xcd,0xe6,
0xa0,0xe9,0x20,0x39,0xb6,0x5a,0xf3,0xba,0x99,0xf4,0xe3,0xcb,0x5d,0x8d,0x00,0x08,
0x57,0x18,0xb9,0x1a,0xca,0xbd,0xe3,0x99,0xb1,0x1f,0xe9,0x18,0xcb,0x02,0x40,0x65,
0x35,0x1b,0x48,0x6b,0x86,0x60,0x43,0x68,0xb6,0xe6,0xfb,0xdd,0xd7,0xed,0x1e,0x0e,
0x89,0xef,0x88,0xe0,0x94,0x68,0x39,0x9b,0xbf,0xc5,0x27,0x7e,0x39,0xe9,0xb8,0x0e,
0xa9,0x85,0x65,0x1c,0x3f,0x93,0x16,0xe2,0x5d,0x57,0x3d,0x7d,0x4d,0xc9,0xe9,0x9d,
0xbd,0x07,0x22,0x97,0xc7,0x90,0x09,0xe5,0x15,0x99,0x7f,0x1e,0x2b,0xfd,0xc1,0x02,
0x41,0x00,0x92,0x78,0xfe,0x04,0xa0,0x53,0xed,0x36,0x97,0xbd,0x16,0xce,0x91,0x9b,
0xbe,0x1f,0x8e,0x40,0x00,0x99,0x0c,0x49,0x15,0xca,0x59,0xd3,0xe3,0xd4,0xeb,0x71,
0xcf,0xda,0xd7,0xc8,0x99,0x74,0xfc,0x6b,0xe8,0xfd,0xe5,0xe0,0x49,0x61,0xcb,0xda,
0xe3,0xe7,0x8b,0x72,0xb5,0x69,0x73,0x2b,0x8b,0x54,0xcb,0xd9,0x48,0x6d,0x61,0x02,
0x49,0xe8,
};
/**
* Issue a certificate with a given serial number
*/
static certificate_t* create_cert(chunk_t serial)
{
private_key_t *privkey;
public_key_t *pubkey;
certificate_t *cert;
identification_t *id;
privkey = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_RSA,
BUILD_BLOB_ASN1_DER, chunk_from_thing(keydata),
BUILD_END);
ck_assert(privkey);
pubkey = privkey->get_public_key(privkey);
ck_assert(pubkey);
id = identification_create_from_string("C=CH, O=strongSwan, CN=test");
cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509,
BUILD_SIGNING_KEY, privkey,
BUILD_PUBLIC_KEY, pubkey,
BUILD_SUBJECT, id,
BUILD_SERIAL, serial,
BUILD_END);
ck_assert(cert);
id->destroy(id);
privkey->destroy(privkey);
pubkey->destroy(pubkey);
return cert;
}
CALLBACK(filter, bool,
void *data, enumerator_t *orig, va_list args)
{
crl_revoked_t *revoked;
crl_reason_t *reason;
chunk_t *serial;
time_t *date;
VA_ARGS_VGET(args, serial, date, reason);
if (orig->enumerate(orig, &revoked))
{
*serial = revoked->serial;
*date = revoked->date;
*reason = revoked->reason;
return TRUE;
}
return FALSE;
}
/**
* Revoke a certificate with a given serial number
*/
static certificate_t* create_crl(chunk_t serial, certificate_t *cert)
{
private_key_t *privkey;
certificate_t *crl;
linked_list_t *list;
enumerator_t *enumerator;
crl_revoked_t *revoked;
time_t date = time(NULL);
privkey = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_RSA,
BUILD_BLOB_ASN1_DER, chunk_from_thing(keydata),
BUILD_END);
ck_assert(privkey);
INIT(revoked,
.serial = serial,
.reason = CRL_REASON_KEY_COMPROMISE,
.date = date
);
list = linked_list_create();
list->insert_last(list, revoked);
enumerator = enumerator_create_filter(list->create_enumerator(list),
filter, NULL, NULL);
crl = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509_CRL,
BUILD_SIGNING_KEY, privkey,
BUILD_NOT_BEFORE_TIME, date,
BUILD_NOT_AFTER_TIME, date + 30 * 24 * 3600,
BUILD_SIGNING_CERT, cert,
BUILD_REVOKED_ENUMERATOR, enumerator,
BUILD_SERIAL, serial,
BUILD_BASE_CRL, serial,
BUILD_END);
ck_assert(crl);
enumerator->destroy(enumerator);
list->destroy(list);
free(revoked);
privkey->destroy(privkey);
return crl;
}
/**
* Create an OCSP request for a given serial number
*/
static certificate_t* create_ocsp_request(certificate_t *cert)
{
certificate_t *ocsp_req;
ocsp_req = lib->creds->create(lib->creds,
CRED_CERTIFICATE, CERT_X509_OCSP_REQUEST,
BUILD_CA_CERT, cert,
BUILD_CERT, cert,
BUILD_END);
ck_assert(ocsp_req);
return ocsp_req;
}
/**
* Parse an ASN.1 encoded OCSP response
*/
static certificate_t* parse_ocsp_response(chunk_t encoding)
{
certificate_t *ocsp_rsp;
ocsp_rsp = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509_OCSP_RESPONSE,
BUILD_BLOB_ASN1_DER, encoding,
BUILD_END);
ck_assert(ocsp_rsp);
return ocsp_rsp;
}
/**
* Issue an attribute certificate with a given serial number
*/
static certificate_t* create_acert(chunk_t serial, certificate_t *cert)
{
private_key_t *privkey;
public_key_t *pubkey;
certificate_t *acert;
linked_list_t *groups = linked_list_create();
time_t date = time(NULL);
privkey = lib->creds->create(lib->creds, CRED_PRIVATE_KEY, KEY_RSA,
BUILD_BLOB_ASN1_DER, chunk_from_thing(keydata),
BUILD_END);
ck_assert(privkey);
pubkey = privkey->get_public_key(privkey);
ck_assert(pubkey);
groups->insert_last(groups, "research");
acert = lib->creds->create(lib->creds,
CRED_CERTIFICATE, CERT_X509_AC,
BUILD_NOT_BEFORE_TIME, date,
BUILD_NOT_AFTER_TIME, date + 30 * 24 * 3600,
BUILD_CERT, cert,
BUILD_SERIAL, serial,
BUILD_AC_GROUP_STRINGS, groups,
BUILD_SIGNING_CERT, cert,
BUILD_SIGNING_KEY, privkey,
BUILD_END);
ck_assert(acert);
groups->destroy(groups);
privkey->destroy(privkey);
pubkey->destroy(pubkey);
return acert;
}
/**
* Parse an ASN.1 encoded attribute certificate
*/
static certificate_t* parse_acert(chunk_t encoding)
{
certificate_t *acert;
acert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509_AC,
BUILD_BLOB_ASN1_DER, encoding,
BUILD_END);
ck_assert(acert);
return acert;
}
typedef struct {
chunk_t serial;
chunk_t serial_asn1;
} serial_number_t;
static serial_number_t serial_numbers[] = {
{ chunk_from_chars(0x00),
chunk_from_chars(0x01,0x00) },
{ chunk_from_chars(0x01),
chunk_from_chars(0x01,0x01) },
{ chunk_from_chars(0x7f),
chunk_from_chars(0x01,0x7f) },
{ chunk_from_chars(0x80),
chunk_from_chars(0x02,0x00,0x80) },
{ chunk_from_chars(0xff),
chunk_from_chars(0x02,0x00,0xff) },
{ chunk_from_chars(0x01,0x00),
chunk_from_chars(0x02,0x01,0x00) },
{ chunk_from_chars(0x7f,0xff),
chunk_from_chars(0x02,0x7f,0xff) },
{ chunk_from_chars(0x80,0x00),
chunk_from_chars(0x03,0x00,0x80,0x00) },
{ chunk_from_chars(0xff,0xff),
chunk_from_chars(0x03,0x00,0xff,0xff) },
{ chunk_from_chars(0x01,0x00,0x00),
chunk_from_chars(0x03,0x01,0x00,0x00) },
{ chunk_from_chars(0x7f,0xff,0xff),
chunk_from_chars(0x03,0x7f,0xff,0xff) },
{ chunk_from_chars(0x80,0x00,0x00),
chunk_from_chars(0x04,0x00,0x80,0x00,0x00) },
{ chunk_from_chars(0xff,0xff,0xff),
chunk_from_chars(0x04,0x00,0xff,0xff,0xff) },
{ chunk_from_chars(0x01,0x00,0x00,0x00),
chunk_from_chars(0x04,0x01,0x00,0x00,0x00) },
{ chunk_from_chars(0x7f,0xff,0xff,0xff),
chunk_from_chars(0x04,0x7f,0xff,0xff,0xff) },
{ chunk_from_chars(0x80,0x00,0x00,0x00),
chunk_from_chars(0x05,0x00,0x80,0x00,0x00,0x00) },
{ chunk_from_chars(0xff,0xff,0xff,0xff),
chunk_from_chars(0x05,0x00,0xff,0xff,0xff,0xff) },
};
static chunk_t ocsp_responses[] = {
chunk_from_chars(
0x30,0x82,0x01,0x85,0x0a,0x01,0x00,0xa0,0x82,0x01,0x7e,0x30,0x82,0x01,0x7a,0x06,
0x09,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x01,0x01,0x04,0x82,0x01,0x6b,0x30,0x82,
0x01,0x67,0x30,0x81,0xd1,0xa1,0x33,0x30,0x31,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,
0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0a,0x13,
0x0a,0x73,0x74,0x72,0x6f,0x6e,0x67,0x53,0x77,0x61,0x6e,0x31,0x0d,0x30,0x0b,0x06,
0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,0x73,0x74,0x18,0x0f,0x32,0x30,0x32,0x32,
0x31,0x31,0x32,0x32,0x30,0x39,0x31,0x36,0x34,0x37,0x5a,0x30,0x64,0x30,0x62,0x30,
0x3a,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x05,0x00,0x04,0x14,0xbd,0x25,
0xa0,0xdf,0xc3,0x21,0xf2,0xd8,0xed,0x19,0x63,0x0a,0x4b,0x90,0x6d,0xc3,0x0f,0xe7,
0x79,0x20,0x04,0x14,0xe2,0x6d,0x1e,0xdf,0x83,0x8e,0xa2,0x1f,0xc3,0x00,0xdd,0x44,
0x6f,0x8a,0x4d,0x70,0x0c,0x02,0xe3,0x1f,0x02,0x01,0x7f,0x80,0x00,0x18,0x0f,0x32,
0x30,0x32,0x32,0x31,0x31,0x32,0x32,0x30,0x39,0x31,0x36,0x34,0x37,0x5a,0xa0,0x11,
0x18,0x0f,0x32,0x30,0x32,0x32,0x31,0x31,0x32,0x32,0x31,0x39,0x31,0x36,0x34,0x37,
0x5a,0xa1,0x23,0x30,0x21,0x30,0x1f,0x06,0x09,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,
0x01,0x02,0x04,0x12,0x04,0x10,0x86,0x45,0x82,0x11,0xe6,0x62,0x43,0x83,0xbc,0x01,
0xe4,0x5c,0x48,0x87,0xcd,0x2e,0x30,0x0d,0x06,0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,
0x01,0x01,0x0b,0x05,0x00,0x03,0x81,0x81,0x00,0x42,0x32,0xa9,0x24,0x97,0x8c,0xc5,
0x35,0x37,0xe7,0x14,0xf0,0x84,0x7e,0x69,0xf1,0x99,0xf8,0xf0,0x02,0x7d,0xe4,0xd8,
0x25,0x78,0x65,0x86,0x40,0xf6,0x30,0xc1,0x50,0x57,0x16,0x13,0xe9,0xe5,0xbc,0xa9,
0xbb,0x87,0xce,0xb8,0x0d,0x35,0x5d,0xad,0x68,0x3b,0x34,0x9f,0x82,0x2b,0xe5,0x1f,
0xcc,0xd5,0x54,0x8a,0xe3,0xd7,0xed,0xc9,0x7d,0xb6,0x50,0xd2,0xcb,0xc2,0xff,0x03,
0x24,0x8c,0xcf,0x49,0x40,0xd4,0x7f,0xcb,0xc0,0x20,0x75,0x78,0x45,0xb8,0x50,0x3c,
0x84,0xdd,0xdc,0xb7,0xfc,0xcd,0x64,0xc3,0x81,0xc6,0xb6,0xcd,0xc5,0xe9,0xc4,0x70,
0x31,0x30,0x7c,0xff,0x93,0xc3,0x9d,0x55,0x7b,0x32,0x77,0x53,0x07,0x45,0xc2,0x80,
0x7b,0x9b,0xfb,0x0e,0x45,0x27,0xf2,0xc5,0x16),
chunk_from_chars(
0x30,0x82,0x01,0x9c,0x0a,0x01,0x00,0xa0,0x82,0x01,0x95,0x30,0x82,0x01,0x91,0x06,
0x09,0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x01,0x01,0x04,0x82,0x01,0x82,0x30,0x82,
0x01,0x7e,0x30,0x81,0xe8,0xa1,0x33,0x30,0x31,0x31,0x0b,0x30,0x09,0x06,0x03,0x55,
0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0a,0x13,
0x0a,0x73,0x74,0x72,0x6f,0x6e,0x67,0x53,0x77,0x61,0x6e,0x31,0x0d,0x30,0x0b,0x06,
0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,0x73,0x74,0x18,0x0f,0x32,0x30,0x32,0x32,
0x31,0x31,0x32,0x32,0x30,0x39,0x32,0x32,0x32,0x34,0x5a,0x30,0x7b,0x30,0x79,0x30,
0x3b,0x30,0x09,0x06,0x05,0x2b,0x0e,0x03,0x02,0x1a,0x05,0x00,0x04,0x14,0xbd,0x25,
0xa0,0xdf,0xc3,0x21,0xf2,0xd8,0xed,0x19,0x63,0x0a,0x4b,0x90,0x6d,0xc3,0x0f,0xe7,
0x79,0x20,0x04,0x14,0xe2,0x6d,0x1e,0xdf,0x83,0x8e,0xa2,0x1f,0xc3,0x00,0xdd,0x44,
0x6f,0x8a,0x4d,0x70,0x0c,0x02,0xe3,0x1f,0x02,0x02,0x00,0x80,0xa1,0x16,0x18,0x0f,
0x32,0x30,0x32,0x32,0x31,0x31,0x31,0x35,0x31,0x38,0x34,0x30,0x35,0x34,0x5a,0xa0,
0x03,0x0a,0x01,0x01,0x18,0x0f,0x32,0x30,0x32,0x32,0x31,0x31,0x32,0x32,0x30,0x39,
0x32,0x32,0x32,0x34,0x5a,0xa0,0x11,0x18,0x0f,0x32,0x30,0x32,0x32,0x31,0x31,0x32,
0x32,0x31,0x39,0x32,0x32,0x32,0x34,0x5a,0xa1,0x23,0x30,0x21,0x30,0x1f,0x06,0x09,
0x2b,0x06,0x01,0x05,0x05,0x07,0x30,0x01,0x02,0x04,0x12,0x04,0x10,0xf2,0x47,0xbd,
0xd2,0xdd,0x6d,0x58,0xba,0xa4,0x6f,0xa5,0xed,0x31,0xb1,0x37,0x89,0x30,0x0d,0x06,
0x09,0x2a,0x86,0x48,0x86,0xf7,0x0d,0x01,0x01,0x0b,0x05,0x00,0x03,0x81,0x81,0x00,
0x17,0x96,0x3b,0x5a,0x4d,0x4e,0x90,0x8a,0xdf,0xe9,0x2b,0x1c,0x48,0x15,0x5d,0x8e,
0xed,0xf0,0xa6,0x42,0x3a,0x9c,0x71,0xd9,0x6a,0xa6,0xc1,0xfd,0xef,0xe8,0x0a,0xa1,
0x61,0x46,0xe4,0x04,0x5c,0x64,0xaf,0x47,0x95,0xdd,0x4c,0xba,0x8e,0x53,0xf6,0x9b,
0xbc,0x16,0xcb,0xeb,0xfe,0x80,0x6a,0x70,0x54,0x10,0x59,0x40,0x5b,0xa0,0x2b,0xb3,
0x62,0x27,0x9e,0x5d,0xd2,0xd6,0x15,0x2a,0x9d,0xa3,0xb1,0xcb,0x44,0x09,0xd8,0x29,
0xb5,0x55,0xd9,0x63,0x86,0xd5,0xb3,0x3c,0x4b,0x78,0x14,0x5a,0x27,0x37,0x3a,0x28,
0xd8,0xae,0x69,0x51,0x2e,0x7d,0xf1,0x06,0xc1,0xac,0x4e,0x5d,0x25,0x7a,0xd2,0xf4,
0x41,0xfd,0x9f,0xbf,0x05,0xc1,0x70,0xa5,0x3f,0x7a,0x53,0x06,0x85,0x7b,0xeb,0x94)
};
START_TEST(test_gen_serial_numbers)
{
chunk_t encoding, serial, serial_asn1;
certificate_t *cert, *crl, *ocsp_req, *acert, *acert1;
enumerator_t *enumerator;
crl_t *x509_crl;
x509_t *x509;
ac_t *ac;
size_t offset;
u_char *pos;
/**
* Use serial number with canonical encoding (no leading zeroes)
*/
/* create X.509 certificate */
cert = create_cert(serial_numbers[_i].serial);
/* retrieve configured serial number */
x509 = (x509_t*)cert;
ck_assert_chunk_eq(x509->get_serial(x509), serial_numbers[_i].serial);
/* the ASN.1 TLV (Type-Length-Value) encoding of an X.509 certificate is
*
* 0 "x509", ASN1_SEQUENCE
* 1 "tbsCertificate", ASN1_SEQUENCE
* 2 "DEFAULT v1", ASN1_CONTEXT_C_0
* 3 "version", ASN1_INTEGER
* 4 "serialNumber", ASN1_INTEGER
* ...
*
* The one octet length field of the serialNumber (4) is at
* pos = 4 (TL0) + 4 (TL1) + 2 (TL2) + 3 (TLV3) + 1 (T4) = 14
*/
ck_assert(cert->get_encoding(cert, CERT_ASN1_DER, &encoding));
DBG2(DBG_LIB, "cert: %B", &encoding);
/* check ASN.1 integer encoding of serial number */
pos = encoding.ptr + 14;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
chunk_free(&encoding);
/* create X.509 crl */
crl = create_crl(serial_numbers[_i].serial, cert);
/* retrieve configured serial number */
x509_crl = (crl_t*)crl;
ck_assert_chunk_eq(x509_crl->get_serial(x509_crl), serial_numbers[_i].serial);
enumerator = x509_crl->create_enumerator(x509_crl);
ck_assert(enumerator->enumerate(enumerator, &serial, NULL, NULL));
ck_assert_chunk_eq(serial, serial_numbers[_i].serial);
enumerator->destroy(enumerator);
/* retrieve configured base crl number */
ck_assert(x509_crl->is_delta_crl(x509_crl, &serial));
ck_assert_chunk_eq(x509_crl->get_serial(x509_crl), serial_numbers[_i].serial);
/* the ASN.1 TLV (Type-Length-Value) encoding of an X.509 crl is
*
* 0 "certificateList", ASN1_SEQUENCE
* 1 "tbsCertList", ASN1_SEQUENCE
* 2 "version", ASN1_INTEGER
* 3 "signature", ASN1_SEQUENCE
* 4 "issuer", ASN1_SEQUENCE
* 5 "thisUpdate" ASN1_UTCTIME
* 6 "nextUpdate" ASN1_UTCTIME
* 7 "revokedCertificates", ASN1_SEQUENCE
* 8 "certList", ASN1_SEQUENCE
* 9 "userCertificate", ASN1_INTEGER
* 10 "revocationDate", ASN1_UTCTIME
* 11 "crlEntryExtensions", ASN1_SEQUENCE
* 12 "optional extensions", ASN1_CONTEXT_C_0
* 13 "crlExtensions", ASN1_SEQUENCE
* 14 "extension", ASN1_SEQUENCE
* 15 "extnID", ASN1_OID
* 16 "critical", ASN1_BOOLEAN
* 17 "extnValue", ASN1_OCTET_STRING
* 18 "authorityKeyIdentifier", ASN1_SEQUENCE
* 19 "extension", ASN1_SEQUENCE
* 20 "extnID", ASN1_OID
* 21 "critical", ASN1_BOOLEAN
* 22 "extnValue", ASN1_OCTET_STRING
* 23 "crlNumber" ASN1_INTEGER
* 24 "extension", ASN1_SEQUENCE
* 25 "extnID", ASN1_OID
* 26 "critical", ASN1_BOOLEAN
* 27 "extnValue", ASN1_OCTET_STRING
* 28 "baseCrlNumber" ASN1_INTEGER
* ...
*
* The one octet length field of the revoked userCertificate (9) is at
* pos = 4 (TL0) + 3 (TL1) + 3 (TLV2) + 15 (TLV3) + 51 (TLV4) + 15 (TLV5) +
* 15 (TLV6) + 2 (TL7) + 2 (TL8) + 1 (T9) = 111
*
* The one octet length field of the crlNumber extension (19) is at
* offset = pos - 1 (T9) + *L8 + 2 (TL12) + 2 (TL13) + 33 (TLV14) + 1 (T19)
* = 110 + *L8 + 38
*
* The one octet length field of the crlNumber (23) is at
* pos = offset + 1 (L19) + 5 (TLV20) + 0 (TLV21) + 2 (TL22) + 1 (T23)
* = offset + 9
*
* The one octet length field of the baseCrlNumber (28) is at
* pos = offset + 1 (L19) + *L19 + 2 (TL24) + 5 (TLV25) + 3 (TLV26)
* + 2 (TL27) + 1 (T28)
* = offset + *L19 + 14
*/
ck_assert(crl->get_encoding(crl, CERT_ASN1_DER, &encoding));
DBG2(DBG_LIB, "crl: %B", &encoding);
/* check ASN.1 integer encoding of revoked number */
pos = encoding.ptr + 111;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* check ASN.1 integer encoding of crlNumber */
offset = 110 + encoding.ptr[109] + 38;
pos = encoding.ptr + offset + 9;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* check ASN.1 integer encoding of baseCrlNumber */
pos = encoding.ptr + offset + encoding.ptr[offset] + 14;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
chunk_free(&encoding);
/* create ocsp request */
ocsp_req = create_ocsp_request(cert);
/* the ASN.1 TLV (Type-Length-Value) encoding of an OCSP request is
*
* 0 "OCSPRequest", ASN1_SEQUENCE
* 1 "tbsRequest", ASN1_SEQUENCE
* 2 "requestList", ASN1_SEQUENCE
* 3 "request", ASN1_SEQUENCE
* 4 "reqCert", ASN1_SEQUENCE,
* 5 "hashAlgorithm", ASN1_SEQUENCE
* 6 "issuerNameHash", ASN1_OCTET STRING
* 7 "issuerKeyHash", ASN1_OCTET STRING
* 8 "serialNumber", ASN1_INTEGER
* ...
*
* The one octet length field of the serialNumber (8) is at
* pos = 3 (TL0) + 3 (TL1) + 2 (TL2) + 2 (TL3) + 2 (TL4) + 11 (TLV5) +
22 (TLV6) + 22 (TLV7) + 1 (T8) = 68
*/
ck_assert(ocsp_req->get_encoding(ocsp_req, CERT_ASN1_DER, &encoding));
DBG2(DBG_LIB, "ocsp request: %B", &encoding);
/* check ASN.1 integer encoding of requested serial number */
pos = encoding.ptr + 68;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
chunk_free(&encoding);
/* test ocsp response */
if (_i == 2 || _i == 3)
{
certificate_t *ocsp_rsp;
ocsp_response_t *ocsp_resp;
cert_validation_t status;
crl_reason_t revocation_reason;
time_t revocation_time, this_update, next_update;
enumerator_t *enumerator;
ocsp_rsp = parse_ocsp_response(ocsp_responses[_i-2]);
ocsp_resp = (ocsp_response_t*)ocsp_rsp;
status = ocsp_resp->get_status(ocsp_resp, x509, x509, &revocation_time,
&revocation_reason, &this_update, &next_update);
if (_i == 2)
{
ck_assert(status == VALIDATION_GOOD);
}
else
{
ck_assert(status == VALIDATION_REVOKED);
ck_assert(revocation_reason == CRL_REASON_KEY_COMPROMISE);
}
enumerator = ocsp_resp->create_response_enumerator(ocsp_resp);
ck_assert(enumerator->enumerate(enumerator, &serial, &status,
&revocation_time, &revocation_reason));
ck_assert_chunk_eq(serial, serial_numbers[_i].serial);
if (_i == 2)
{
ck_assert(status == VALIDATION_GOOD);
}
else
{
ck_assert(status == VALIDATION_REVOKED);
ck_assert(revocation_reason == CRL_REASON_KEY_COMPROMISE);
}
enumerator->destroy(enumerator);
ocsp_rsp->destroy(ocsp_rsp);
}
/* create attribute certificate */
acert = create_acert(serial_numbers[_i].serial, cert);
/* retrieve configured serial number */
ac = (ac_t*)acert;
ck_assert_chunk_eq(ac->get_serial(ac), serial_numbers[_i].serial);
/* retrieve configured holderSerial number */
ck_assert_chunk_eq(ac->get_holderSerial(ac), serial_numbers[_i].serial);
/* the ASN.1 TLV (Type-Length-Value) encoding of an attribute certificate is
*
* 0 "AttributeCertificate", ASN1_SEQUENCE
* 1 "AttributeCertificateInfo", ASN1_SEQUENCE
* 2 "version", ASN1_INTEGER
* 3 "holder", ASN1_SEQUENCE
* 4 "baseCertificateID", ASN1_CONTEXT_C_0
* 5 "issuer", ASN1_SEQUENCE
* 6 "serial", ASN1_INTEGER
* 7 "issuerUID", ASN1_BIT_STRING
* 8 "entityName", ASN1_CONTEXT_C_1
* 9 "objectDigestInfo", ASN1_CONTEXT_C_2
* 10 "v2Form", ASN1_CONTEXT_C_0
* 11 "signature", ASN1_SEQUENCE
* 12 "serialNumber" ASN1_INTEGER
* 13 "attrCertValidityPeriod", ASN1_SEQUENCE
* 14 "attributes", ASN1_SEQUENCE
* 15 "extensions", ASN1_SEQUENCE
* 16 "extension", ASN1_SEQUENCE
* 17 "extnID", ASN1_OID
* 18 "critical", ASN1_BOOLEAN
* 19 "extnValue", ASN1_OCTET_STRING
* 20 "authorityKeyIdentifier", ASN1_SEQUENCE
* 21 "keyIdentifier", ASN1_CONTEXT_S_0
* 22 "authorityCertIssuer", ASN1_CONTEXT_C_1
* 23 "authorityCertSerialNumber", ASN1_CONTEXT_S_2
* ...
*
* The one octet length field of the holder serial number (6) is at
* pos = 4 (TL0) + 4 (TL1) + 3 (TLV2) + 2 (TL3) + 2 (TL4) + 55 (TLV5) +
* 1 (T6) = 71
*
* The one octet length field of the serialNumber (12) is at
* offset = 4 (TL0) + 4 (TL1) + 3 (TLV2) + 2 (TL3) + *L3 + 57 (TLV10) +
* 15 (TLV11) + 1 (T12)
* = 13 + *L3 + 73
*
* The one octet length field of the authorityCertSerialNumber (23) is at
* pos = offset + *L12 + 1 (L12) + 36 (TLV13) + 30 (TLV14) + 2 (TL15)
* + 2 (TL16) + 5 (TLV17) + 0 (TLV18) + 2 (TL19) + 2 (TL20)
* + 22 (TLV21) + 55 (TLV22) + 1 (T23)
* pos = offset + *L12 + 158
*/
ck_assert(acert->get_encoding(acert, CERT_ASN1_DER, &encoding));
DBG2(DBG_LIB, "acert: %B", &encoding);
/* check ASN.1 integer encoding of holder serial number */
pos = encoding.ptr + 71;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* check ASN.1 integer encoding of the AC serialNumber */
offset = 13 + encoding.ptr[12] + 73;
pos = encoding.ptr + offset;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* check ASN.1 integer encoding of serial number */
pos = encoding.ptr + offset + encoding.ptr[offset] + 158;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* parse ASN.1 encoded attribute certificate */
acert1 = parse_acert(encoding);
ac = (ac_t*)acert1;
/* check serial number */
ck_assert_chunk_eq(ac->get_serial(ac), serial_numbers[_i].serial);
/* check holderSerial number */
ck_assert_chunk_eq(ac->get_holderSerial(ac), serial_numbers[_i].serial);
chunk_free(&encoding);
cert->destroy(cert);
crl->destroy(crl);
ocsp_req->destroy(ocsp_req);
acert->destroy(acert);
acert1->destroy(acert1);
/**
* Use serial number with two's complement encoding
*/
serial = chunk_skip(serial_numbers[_i].serial_asn1, 1);
/* create certificate */
cert = create_cert(serial);
/* retrieve configured serial number */
x509 = (x509_t*)cert;
ck_assert_chunk_eq(x509->get_serial(x509), serial_numbers[_i].serial);
/* check ASN.1 integer encoding */
ck_assert(cert->get_encoding(cert, CERT_ASN1_DER, &encoding));
pos = encoding.ptr + 14;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
chunk_free(&encoding);
/* create crl */
crl = create_crl(serial, cert);
/* retrieve configured serial number */
x509_crl = (crl_t*)crl;
ck_assert_chunk_eq(x509_crl->get_serial(x509_crl), serial_numbers[_i].serial);
enumerator = x509_crl->create_enumerator(x509_crl);
if (enumerator->enumerate(enumerator, &serial, NULL, NULL))
{
ck_assert_chunk_eq(serial, serial_numbers[_i].serial);
}
enumerator->destroy(enumerator);
/* check ASN.1 integer encoding of revoked number */
ck_assert(crl->get_encoding(crl, CERT_ASN1_DER, &encoding));
pos = encoding.ptr + 111;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* check ASN.1 integer encoding of crlNumber */
offset = 110 + encoding.ptr[109] + 38;
pos = encoding.ptr + offset + 9;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
/* check ASN.1 integer encoding of baseCrlNumber */
pos = encoding.ptr + offset + encoding.ptr[offset] + 14;
serial_asn1 = chunk_create(pos, 1 + *pos);
ck_assert_chunk_eq(serial_asn1, serial_numbers[_i].serial_asn1);
chunk_free(&encoding);
cert->destroy(cert);
crl->destroy(crl);
}
END_TEST
Suite *serial_gen_suite_create()
{
Suite *s;
TCase *tc;
s = suite_create("serial_gen");
tc = tcase_create("generate serial numbers");
tcase_add_loop_test(tc, test_gen_serial_numbers, 0, countof(serial_numbers));
suite_add_tcase(s, tc);
return s;
}
@@ -0,0 +1,272 @@
/*
* Copyright (C) 2022 Andreas Steffen, strongSec GmbH
*
* Copyright (C) secunet Security Networks AG
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version. See <http://www.fsf.org/copyleft/gpl.txt>.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
* or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
* for more details.
*/
#include "test_suite.h"
#include <credentials/certificates/x509.h>
#include <credentials/certificates/crl.h>
static certificate_t* parse_cert(chunk_t encoding)
{
certificate_t *cert;
cert = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509,
BUILD_BLOB_ASN1_DER, encoding,
BUILD_END);
ck_assert(cert);
return cert;
}
static certificate_t* parse_crl(chunk_t encoding)
{
certificate_t *crl;
crl = lib->creds->create(lib->creds, CRED_CERTIFICATE, CERT_X509_CRL,
BUILD_BLOB_ASN1_DER, encoding,
BUILD_END);
ck_assert(crl);
return crl;
}
typedef struct {
chunk_t serial;
chunk_t cert_encoding;
chunk_t crl_encoding;
} serial_number_t;
static serial_number_t serial_numbers[] = {
{ chunk_from_chars(0x00),
chunk_from_chars(
0x30,0x82,0x01,0xD6,0x30,0x82,0x01,0x3F,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x00,
0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,
0x31,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,
0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,0x6E,0x67,0x53,
0x77,0x61,0x6E,0x31,0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,
0x73,0x74,0x30,0x1E,0x17,0x0D,0x32,0x32,0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,
0x34,0x34,0x5A,0x17,0x0D,0x32,0x33,0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,
0x34,0x5A,0x30,0x31,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,
0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,
0x6E,0x67,0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,0x13,
0x04,0x74,0x65,0x73,0x74,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02,0x81,
0x81,0x00,0xB1,0x9B,0xD4,0x51,0x24,0xFC,0x56,0x1D,0x3D,0xFB,0xA2,0xEA,0x37,0x02,
0x70,0x72,0x87,0x84,0x2F,0x3B,0x2D,0x6E,0x22,0xEF,0x3F,0x37,0x04,0xB2,0x6F,0xB7,
0xE7,0xD8,0x58,0x05,0xDE,0x34,0xBF,0x99,0xE6,0x40,0x7A,0x56,0xA7,0x73,0xF5,0x98,
0xCB,0xB0,0x37,0x90,0x5E,0xD1,0x3F,0xF4,0x73,0x50,0x7F,0x53,0x8E,0xF1,0x04,0x25,
0xB4,0x77,0x22,0x4E,0x8A,0x9D,0x27,0x8F,0x6F,0xAF,0x59,0xBD,0xB0,0x0F,0xF0,0xAA,
0x11,0x94,0x66,0x16,0x10,0x58,0xAD,0x77,0xA1,0xAC,0x58,0xB4,0xD0,0x0D,0xBC,0x11,
0xE0,0xC0,0xE9,0x29,0xDC,0x42,0x63,0x01,0x23,0x4F,0x28,0x41,0x6D,0x34,0x9E,0x0C,
0x4A,0xC8,0x62,0x83,0xB5,0x71,0x71,0x0B,0x51,0xC0,0x4C,0x37,0xD4,0x68,0x19,0x52,
0x9A,0x8B,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x81,0x81,0x00,0x0D,0x3E,0x13,0x3D,0x58,0x72,
0x90,0x21,0x06,0x29,0xBD,0xA5,0x06,0x87,0x67,0x80,0x2C,0xE0,0x61,0xF5,0x66,0x76,
0x63,0xAB,0x97,0xD5,0x45,0x9B,0x2B,0x3C,0x6B,0xA7,0xB0,0xB4,0x31,0x52,0xC6,0xD9,
0x72,0xFC,0xC5,0x37,0xE5,0xFF,0xD0,0x80,0x63,0x09,0xD2,0x1E,0xC1,0x77,0x92,0xCC,
0x07,0x08,0x5D,0xD0,0x30,0x67,0x9A,0x6B,0x82,0x19,0x89,0x0E,0x10,0xC7,0xA4,0xA7,
0x7C,0x96,0x76,0x8C,0x72,0xDB,0x73,0x13,0x49,0xE5,0x8B,0xAC,0x0B,0x1E,0xEB,0x31,
0x74,0xEB,0xE4,0xA0,0x5D,0x49,0x9A,0x76,0x3C,0xA5,0xEF,0x55,0xE2,0x32,0x25,0x1A,
0xE3,0x05,0x37,0xAC,0xFF,0x9F,0x94,0x92,0xE6,0x0E,0x53,0xC0,0xFC,0x52,0xB8,0xD0,
0xFA,0x66,0x0B,0xCE,0xCA,0x88,0x66,0x3B,0x83,0x48),
chunk_from_chars(
0x30,0x82,0x01,0x5D,0x30,0x81,0xC7,0x02,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,
0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x31,0x31,0x0B,0x30,0x09,0x06,
0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,
0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,0x6E,0x67,0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,
0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,0x73,0x74,0x17,0x0D,0x32,0x32,
0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,0x17,0x0D,0x32,0x32,0x31,
0x32,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,0x30,0x22,0x30,0x20,0x02,0x01,
0x00,0x17,0x0D,0x32,0x32,0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,
0x30,0x0C,0x30,0x0A,0x06,0x03,0x55,0x1D,0x15,0x04,0x03,0x0A,0x01,0x01,0xA0,0x3E,
0x30,0x3C,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xE2,
0x6D,0x1E,0xDF,0x83,0x8E,0xA2,0x1F,0xC3,0x00,0xDD,0x44,0x6F,0x8A,0x4D,0x70,0x0C,
0x02,0xE3,0x1F,0x30,0x0A,0x06,0x03,0x55,0x1D,0x14,0x04,0x03,0x02,0x01,0x00,0x30,
0x0D,0x06,0x03,0x55,0x1D,0x1B,0x01,0x01,0xFF,0x04,0x03,0x02,0x01,0x00,0x30,0x0D,
0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x81,0x81,
0x00,0x35,0x72,0x26,0x38,0x87,0x21,0xA2,0x5C,0xED,0x5C,0x04,0xD9,0x49,0xC0,0xB6,
0x75,0x7C,0x5A,0xEA,0x46,0x6E,0x1E,0xED,0x3C,0x9B,0x41,0x31,0x37,0x3F,0xAA,0xE7,
0x16,0x39,0x17,0x48,0x5F,0x84,0x48,0x6F,0xA4,0xF6,0x9D,0x79,0xDE,0xC3,0xE9,0x82,
0x87,0xEE,0xD4,0xD0,0x2F,0xBF,0x8B,0x74,0x1E,0xA7,0x21,0x63,0xB6,0x5A,0x39,0xFF,
0xDE,0xD0,0x6E,0xE3,0xB5,0x3B,0x0C,0x42,0x46,0x97,0x43,0x2E,0x6B,0x4D,0xF8,0x54,
0x59,0x8F,0xD8,0x72,0xB3,0xB0,0x29,0xCB,0x56,0xA7,0x8A,0x01,0xD6,0xEA,0xE0,0x69,
0xF7,0x36,0xC4,0x06,0xE6,0x05,0xC0,0x10,0xD2,0xB7,0x43,0x46,0xCC,0x8A,0x53,0xA1,
0xA6,0xD3,0x88,0x73,0x53,0x29,0x10,0xC2,0xC6,0xCE,0x24,0xC3,0xCE,0x14,0xED,0xB0,
0x64)
},
{ chunk_from_chars(0x7f),
chunk_from_chars(
0x30,0x82,0x01,0xD6,0x30,0x82,0x01,0x3F,0xA0,0x03,0x02,0x01,0x02,0x02,0x01,0x7F,
0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,
0x31,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,
0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,0x6E,0x67,0x53,
0x77,0x61,0x6E,0x31,0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,
0x73,0x74,0x30,0x1E,0x17,0x0D,0x32,0x32,0x31,0x31,0x31,0x38,0x31,0x33,0x30,0x37,
0x32,0x31,0x5A,0x17,0x0D,0x32,0x33,0x31,0x31,0x31,0x38,0x31,0x33,0x30,0x37,0x32,
0x31,0x5A,0x30,0x31,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,
0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,
0x6E,0x67,0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,0x13,
0x04,0x74,0x65,0x73,0x74,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02,0x81,
0x81,0x00,0xB1,0x9B,0xD4,0x51,0x24,0xFC,0x56,0x1D,0x3D,0xFB,0xA2,0xEA,0x37,0x02,
0x70,0x72,0x87,0x84,0x2F,0x3B,0x2D,0x6E,0x22,0xEF,0x3F,0x37,0x04,0xB2,0x6F,0xB7,
0xE7,0xD8,0x58,0x05,0xDE,0x34,0xBF,0x99,0xE6,0x40,0x7A,0x56,0xA7,0x73,0xF5,0x98,
0xCB,0xB0,0x37,0x90,0x5E,0xD1,0x3F,0xF4,0x73,0x50,0x7F,0x53,0x8E,0xF1,0x04,0x25,
0xB4,0x77,0x22,0x4E,0x8A,0x9D,0x27,0x8F,0x6F,0xAF,0x59,0xBD,0xB0,0x0F,0xF0,0xAA,
0x11,0x94,0x66,0x16,0x10,0x58,0xAD,0x77,0xA1,0xAC,0x58,0xB4,0xD0,0x0D,0xBC,0x11,
0xE0,0xC0,0xE9,0x29,0xDC,0x42,0x63,0x01,0x23,0x4F,0x28,0x41,0x6D,0x34,0x9E,0x0C,
0x4A,0xC8,0x62,0x83,0xB5,0x71,0x71,0x0B,0x51,0xC0,0x4C,0x37,0xD4,0x68,0x19,0x52,
0x9A,0x8B,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,
0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x81,0x81,0x00,0xA4,0x92,0x32,0x35,0xD2,0xC7,
0x67,0x12,0x1E,0x5E,0x7C,0x0C,0x08,0x92,0x95,0xEE,0xD4,0x43,0x59,0xEF,0x0C,0x0A,
0x73,0x2C,0xB4,0x6C,0xB6,0x4A,0x98,0x85,0xD5,0xA2,0x96,0x6B,0x90,0xBA,0xB7,0xC2,
0x67,0x5F,0x0D,0xCD,0x9E,0xB3,0x5B,0xDE,0xA0,0xF4,0x5C,0x49,0x80,0x66,0x7B,0x33,
0x08,0x7F,0xCB,0x65,0xE6,0xCB,0x4F,0x50,0x59,0x16,0x23,0xEA,0xB6,0x70,0xFD,0x98,
0xD3,0x65,0x2A,0x94,0x65,0x2E,0x77,0x93,0x48,0x99,0x12,0xC3,0x95,0xDE,0x56,0xA8,
0xFE,0x33,0x1E,0x36,0x62,0x29,0x0A,0x5A,0x07,0xF9,0x19,0xF6,0x04,0x86,0xB5,0x43,
0x2C,0x49,0x4B,0xC2,0x98,0x3F,0x96,0x95,0x61,0x96,0xF8,0x22,0x4C,0xFB,0x45,0x41,
0x27,0x06,0x0E,0x44,0x36,0x19,0x7F,0x51,0x96,0x20),
chunk_from_chars(
0x30,0x82,0x01,0x5D,0x30,0x81,0xC7,0x02,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,
0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x31,0x31,0x0B,0x30,0x09,0x06,
0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,
0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,0x6E,0x67,0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,
0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,0x73,0x74,0x17,0x0D,0x32,0x32,
0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,0x17,0x0D,0x32,0x32,0x31,
0x32,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,0x30,0x22,0x30,0x20,0x02,0x01,
0x7F,0x17,0x0D,0x32,0x32,0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,
0x30,0x0C,0x30,0x0A,0x06,0x03,0x55,0x1D,0x15,0x04,0x03,0x0A,0x01,0x01,0xA0,0x3E,
0x30,0x3C,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,0xE2,
0x6D,0x1E,0xDF,0x83,0x8E,0xA2,0x1F,0xC3,0x00,0xDD,0x44,0x6F,0x8A,0x4D,0x70,0x0C,
0x02,0xE3,0x1F,0x30,0x0A,0x06,0x03,0x55,0x1D,0x14,0x04,0x03,0x02,0x01,0x7F,0x30,
0x0D,0x06,0x03,0x55,0x1D,0x1B,0x01,0x01,0xFF,0x04,0x03,0x02,0x01,0x7F,0x30,0x0D,
0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x81,0x81,
0x00,0x00,0x93,0xAD,0x02,0x09,0x74,0x97,0x3C,0xBE,0x82,0x3D,0x39,0xCC,0xD0,0x55,
0x8F,0xBA,0xE4,0xB5,0x53,0x83,0xF0,0x11,0x29,0xE8,0x2B,0x77,0x8D,0xC5,0xA2,0x0F,
0x86,0x31,0x87,0x4D,0xAA,0x4B,0x78,0x44,0xFB,0x42,0xDB,0x81,0xC7,0xF0,0xA6,0x65,
0x68,0x36,0xC9,0x2D,0x37,0xA7,0x1C,0x23,0xD3,0xA4,0x75,0x85,0x0B,0x09,0xF1,0x1E,
0x24,0x19,0xB7,0xEE,0x5A,0x89,0x1C,0xF9,0x98,0xE7,0x6F,0xB8,0xF2,0x9A,0xB2,0x5E,
0xC5,0x47,0xE3,0x6D,0x50,0x9D,0x13,0x61,0x85,0x71,0x0A,0xF2,0xF3,0xBC,0x03,0xE6,
0xB8,0x1F,0x32,0x92,0x4C,0x95,0x31,0xF0,0xF4,0x85,0x41,0x97,0x1F,0x43,0xC7,0x51,
0xD9,0x90,0xBE,0xA6,0xE5,0x06,0x92,0xEF,0xF6,0x81,0xC7,0xD4,0xB3,0xF7,0x1B,0xA3,
0x1C),
},
{ chunk_from_chars(0x80),
chunk_from_chars(
0x30,0x82,0x01,0xD7,0x30,0x82,0x01,0x40,0xA0,0x03,0x02,0x01,0x02,0x02,0x02,0x00,
0x80,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,
0x30,0x31,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48,0x31,
0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,0x6E,0x67,
0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x74,
0x65,0x73,0x74,0x30,0x1E,0x17,0x0D,0x32,0x32,0x31,0x31,0x31,0x38,0x31,0x33,0x30,
0x37,0x32,0x31,0x5A,0x17,0x0D,0x32,0x33,0x31,0x31,0x31,0x38,0x31,0x33,0x30,0x37,
0x32,0x31,0x5A,0x30,0x31,0x31,0x0B,0x30,0x09,0x06,0x03,0x55,0x04,0x06,0x13,0x02,
0x43,0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,0x0A,0x13,0x0A,0x73,0x74,0x72,
0x6F,0x6E,0x67,0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,0x0B,0x06,0x03,0x55,0x04,0x03,
0x13,0x04,0x74,0x65,0x73,0x74,0x30,0x81,0x9F,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,
0x86,0xF7,0x0D,0x01,0x01,0x01,0x05,0x00,0x03,0x81,0x8D,0x00,0x30,0x81,0x89,0x02,
0x81,0x81,0x00,0xB1,0x9B,0xD4,0x51,0x24,0xFC,0x56,0x1D,0x3D,0xFB,0xA2,0xEA,0x37,
0x02,0x70,0x72,0x87,0x84,0x2F,0x3B,0x2D,0x6E,0x22,0xEF,0x3F,0x37,0x04,0xB2,0x6F,
0xB7,0xE7,0xD8,0x58,0x05,0xDE,0x34,0xBF,0x99,0xE6,0x40,0x7A,0x56,0xA7,0x73,0xF5,
0x98,0xCB,0xB0,0x37,0x90,0x5E,0xD1,0x3F,0xF4,0x73,0x50,0x7F,0x53,0x8E,0xF1,0x04,
0x25,0xB4,0x77,0x22,0x4E,0x8A,0x9D,0x27,0x8F,0x6F,0xAF,0x59,0xBD,0xB0,0x0F,0xF0,
0xAA,0x11,0x94,0x66,0x16,0x10,0x58,0xAD,0x77,0xA1,0xAC,0x58,0xB4,0xD0,0x0D,0xBC,
0x11,0xE0,0xC0,0xE9,0x29,0xDC,0x42,0x63,0x01,0x23,0x4F,0x28,0x41,0x6D,0x34,0x9E,
0x0C,0x4A,0xC8,0x62,0x83,0xB5,0x71,0x71,0x0B,0x51,0xC0,0x4C,0x37,0xD4,0x68,0x19,
0x52,0x9A,0x8B,0x02,0x03,0x01,0x00,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,
0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x03,0x81,0x81,0x00,0x54,0xC6,0x85,0x31,0x85,
0x17,0x86,0xCB,0xFF,0x63,0x09,0x2A,0x90,0xDD,0x2C,0xC8,0x7E,0xD7,0x8B,0xE0,0x37,
0xF7,0x2D,0xE2,0xCF,0x7E,0x57,0x26,0x4C,0x1D,0x3D,0x57,0xF0,0x6D,0x0D,0x18,0xA3,
0xAB,0x49,0xD3,0x4E,0x08,0x70,0x4D,0xAE,0x05,0xF7,0xC5,0x47,0x99,0x89,0xFA,0xCA,
0x15,0x36,0x3F,0xDA,0xA7,0x64,0xEE,0xE6,0x1C,0x6E,0x6E,0x9D,0x39,0x61,0xCB,0x5E,
0x8F,0xAD,0x5C,0x90,0xD6,0xAE,0xCD,0xE9,0xBB,0x62,0xB9,0xCB,0x0E,0x51,0xDD,0x27,
0xAF,0xF3,0xE2,0xD0,0xAC,0x9E,0x99,0x55,0xB5,0x2F,0x46,0x99,0xDB,0x2F,0xEC,0x23,
0x76,0x0E,0x82,0xE3,0xA7,0xC3,0xF6,0xA2,0x61,0x32,0xC7,0x1F,0xD6,0x22,0x9B,0xFA,
0xD8,0xFD,0x8F,0xB2,0xB7,0x6B,0x71,0xF0,0x92,0x1F,0x44),
chunk_from_chars(
0x30,0x82,0x01,0x60,0x30,0x81,0xCA,0x02,0x01,0x01,0x30,0x0D,0x06,0x09,0x2A,0x86,
0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,0x30,0x31,0x31,0x0B,0x30,0x09,0x06,
0x03,0x55,0x04,0x06,0x13,0x02,0x43,0x48,0x31,0x13,0x30,0x11,0x06,0x03,0x55,0x04,
0x0A,0x13,0x0A,0x73,0x74,0x72,0x6F,0x6E,0x67,0x53,0x77,0x61,0x6E,0x31,0x0D,0x30,
0x0B,0x06,0x03,0x55,0x04,0x03,0x13,0x04,0x74,0x65,0x73,0x74,0x17,0x0D,0x32,0x32,
0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,0x17,0x0D,0x32,0x32,0x31,
0x32,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,0x5A,0x30,0x23,0x30,0x21,0x02,0x02,
0x00,0x80,0x17,0x0D,0x32,0x32,0x31,0x31,0x32,0x30,0x31,0x30,0x31,0x37,0x34,0x34,
0x5A,0x30,0x0C,0x30,0x0A,0x06,0x03,0x55,0x1D,0x15,0x04,0x03,0x0A,0x01,0x01,0xA0,
0x40,0x30,0x3E,0x30,0x1F,0x06,0x03,0x55,0x1D,0x23,0x04,0x18,0x30,0x16,0x80,0x14,
0xE2,0x6D,0x1E,0xDF,0x83,0x8E,0xA2,0x1F,0xC3,0x00,0xDD,0x44,0x6F,0x8A,0x4D,0x70,
0x0C,0x02,0xE3,0x1F,0x30,0x0B,0x06,0x03,0x55,0x1D,0x14,0x04,0x04,0x02,0x02,0x00,
0x80,0x30,0x0E,0x06,0x03,0x55,0x1D,0x1B,0x01,0x01,0xFF,0x04,0x04,0x02,0x02,0x00,
0x80,0x30,0x0D,0x06,0x09,0x2A,0x86,0x48,0x86,0xF7,0x0D,0x01,0x01,0x0B,0x05,0x00,
0x03,0x81,0x81,0x00,0x7D,0x98,0x63,0x80,0x7B,0x43,0xE6,0x56,0xCD,0x59,0x0E,0xEC,
0xD7,0x45,0x93,0xE5,0xD1,0x97,0x3E,0x47,0x87,0xFD,0x6F,0x8D,0x10,0xB0,0xDA,0x7C,
0x5D,0xDC,0x0B,0x1B,0xC8,0x63,0x5D,0x8D,0x02,0xDE,0xD0,0xC7,0xBB,0xE4,0x50,0xEA,
0xA7,0x2E,0x06,0xBC,0xF2,0x36,0x8D,0x7A,0xA2,0xE5,0x67,0x0F,0x03,0x9A,0x75,0x1D,
0x18,0x0E,0x57,0x39,0x86,0xF3,0xEF,0x29,0xED,0xDE,0x24,0x50,0x9E,0x1F,0xC7,0x90,
0x51,0x95,0xA0,0xD5,0x11,0x5E,0x96,0x0A,0xA5,0x4A,0x4D,0xFE,0x97,0xE4,0x1A,0xEA,
0xC3,0x56,0x2A,0x21,0xA6,0x6E,0xE5,0xBA,0xAC,0x70,0xA5,0xE5,0x90,0x9A,0x3C,0x36,
0xFF,0xD6,0x8B,0xC2,0x09,0x19,0xF4,0x21,0x68,0x50,0xEC,0x83,0xF8,0xF6,0xB5,0x24,
0x8F,0x2B,0x77,0xB2)
}
};
START_TEST(test_parse_serial_numbers)
{
enumerator_t *enumerator;
certificate_t *cert, *crl;
crl_t *x509_crl;
x509_t *x509;
chunk_t serial;
/* parse ASN.1 DER encoded certificate */
cert = parse_cert(serial_numbers[_i].cert_encoding);
/* check parsed serial number */
x509 = (x509_t*)cert;
ck_assert_chunk_eq(x509->get_serial(x509), serial_numbers[_i].serial);
cert->destroy(cert);
/* parse ASN.1 DER encoded crl */
crl = parse_crl(serial_numbers[_i].crl_encoding);
/* check parsed serial number */
x509_crl = (crl_t*)crl;
ck_assert_chunk_eq(x509_crl->get_serial(x509_crl), serial_numbers[_i].serial);
enumerator = x509_crl->create_enumerator(x509_crl);
if (enumerator->enumerate(enumerator, &serial, NULL, NULL))
{
ck_assert_chunk_eq(serial, serial_numbers[_i].serial);
}
enumerator->destroy(enumerator);
crl->destroy(crl);
}
END_TEST
Suite *serial_parse_suite_create()
{
Suite *s;
TCase *tc;
s = suite_create("serial_parse");
tc = tcase_create("parse serial numbers");
tcase_add_loop_test(tc, test_parse_serial_numbers, 0, countof(serial_numbers));
suite_add_tcase(s, tc);
return s;
}
+3
View File
@@ -1,5 +1,6 @@
/*
* Copyright (C) 2013 Tobias Brunner
* Copyright (C) 2022 Andreas Steffen
*
* Copyright (C) secunet Security Networks AG
*
@@ -42,6 +43,8 @@ TEST_SUITE_DEPEND(rsa_oaep_sha384_suite_create, PRIVKEY_DECRYPT, ENCRYPT_RSA_OAE
TEST_SUITE_DEPEND(rsa_oaep_sha512_suite_create, PRIVKEY_DECRYPT, ENCRYPT_RSA_OAEP_SHA512)
TEST_SUITE_DEPEND(certpolicy_suite_create, CERT_ENCODE, CERT_X509)
TEST_SUITE_DEPEND(certnames_suite_create, CERT_ENCODE, CERT_X509)
TEST_SUITE_DEPEND(serial_gen_suite_create, CERT_ENCODE, CERT_X509)
TEST_SUITE(serial_parse_suite_create)
TEST_SUITE(host_suite_create)
TEST_SUITE(printf_suite_create)
TEST_SUITE(auth_cfg_suite_create)