|
|
|
|
@ -37,6 +37,7 @@
|
|
|
|
|
#include "util-decode-der.h"
|
|
|
|
|
#include "util-decode-der-get.h"
|
|
|
|
|
|
|
|
|
|
static const uint8_t SEQ_IDX_SERIAL[] = { 0, 0 };
|
|
|
|
|
static const uint8_t SEQ_IDX_ISSUER[] = { 0, 2 };
|
|
|
|
|
static const uint8_t SEQ_IDX_VALIDITY[] = { 0, 3 };
|
|
|
|
|
static const uint8_t SEQ_IDX_SUBJECT[] = { 0, 4 };
|
|
|
|
|
@ -241,6 +242,50 @@ validity_error:
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int Asn1DerGetSerial(const Asn1Generic *cert, char *buffer, uint32_t length,
|
|
|
|
|
uint32_t *errcode)
|
|
|
|
|
{
|
|
|
|
|
const Asn1Generic *node;
|
|
|
|
|
uint32_t node_len, i;
|
|
|
|
|
int rc = -1;
|
|
|
|
|
|
|
|
|
|
if (errcode)
|
|
|
|
|
*errcode = ERR_DER_MISSING_ELEMENT;
|
|
|
|
|
|
|
|
|
|
buffer[0] = '\0';
|
|
|
|
|
|
|
|
|
|
node = Asn1DerGet(cert, SEQ_IDX_SERIAL, sizeof(SEQ_IDX_SERIAL), errcode);
|
|
|
|
|
if ((node == NULL) || node->type != ASN1_INTEGER || node->str == NULL)
|
|
|
|
|
goto serial_error;
|
|
|
|
|
|
|
|
|
|
node_len = strlen(node->str);
|
|
|
|
|
|
|
|
|
|
/* make sure the buffer is big enough */
|
|
|
|
|
if (node_len + (node_len / 2) > length)
|
|
|
|
|
goto serial_error;
|
|
|
|
|
|
|
|
|
|
/* format serial number (e.g. XX:XX:XX:XX:XX) */
|
|
|
|
|
for (i = 0; i < node_len; i++) {
|
|
|
|
|
char c[3];
|
|
|
|
|
/* insert separator before each even number */
|
|
|
|
|
if (((i % 2) == 0) && (i != 0)) {
|
|
|
|
|
snprintf(c, sizeof(c), ":%c", node->str[i]);
|
|
|
|
|
} else {
|
|
|
|
|
snprintf(c, sizeof(c), "%c", node->str[i]);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
strlcat(buffer, c, length);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (errcode)
|
|
|
|
|
*errcode = 0;
|
|
|
|
|
|
|
|
|
|
rc = 0;
|
|
|
|
|
|
|
|
|
|
serial_error:
|
|
|
|
|
return rc;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
int Asn1DerGetIssuerDN(const Asn1Generic *cert, char *buffer, uint32_t length,
|
|
|
|
|
uint32_t *errcode)
|
|
|
|
|
{
|
|
|
|
|
|