Remove leading zeros in SCEP certificate serialNumbers
This commit is contained in:
+19
-13
@@ -151,8 +151,7 @@ void scep_generate_transaction_id(public_key_t *key, chunk_t *transID,
|
|||||||
chunk_t digest = chunk_alloca(HASH_SIZE_MD5);
|
chunk_t digest = chunk_alloca(HASH_SIZE_MD5);
|
||||||
chunk_t keyEncoding = chunk_empty, keyInfo;
|
chunk_t keyEncoding = chunk_empty, keyInfo;
|
||||||
hasher_t *hasher;
|
hasher_t *hasher;
|
||||||
bool msb_set;
|
int zeros = 0, msb_set = 0;
|
||||||
u_char *pos;
|
|
||||||
|
|
||||||
key->get_encoding(key, PUBKEY_ASN1_DER, &keyEncoding);
|
key->get_encoding(key, PUBKEY_ASN1_DER, &keyEncoding);
|
||||||
|
|
||||||
@@ -168,20 +167,27 @@ void scep_generate_transaction_id(public_key_t *key, chunk_t *transID,
|
|||||||
DESTROY_IF(hasher);
|
DESTROY_IF(hasher);
|
||||||
free(keyInfo.ptr);
|
free(keyInfo.ptr);
|
||||||
|
|
||||||
/* is the most significant bit of the digest set? */
|
/* the serialNumber should be valid ASN1 integer content:
|
||||||
msb_set = (*digest.ptr & 0x80) == 0x80;
|
* remove leading zeros, add one if MSB is set (two's complement) */
|
||||||
|
while (zeros < digest.len)
|
||||||
/* allocate space for the serialNumber */
|
{
|
||||||
serialNumber->len = msb_set + digest.len;
|
if (digest.ptr[zeros])
|
||||||
serialNumber->ptr = malloc(serialNumber->len);
|
{
|
||||||
|
if (digest.ptr[zeros] & 0x80)
|
||||||
/* the serial number as the two's complement of the digest */
|
{
|
||||||
pos = serialNumber->ptr;
|
msb_set = 1;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
zeros++;
|
||||||
|
}
|
||||||
|
*serialNumber = chunk_alloc(digest.len - zeros + msb_set);
|
||||||
if (msb_set)
|
if (msb_set)
|
||||||
{
|
{
|
||||||
*pos++ = 0x00;
|
serialNumber->ptr[0] = 0x00;
|
||||||
}
|
}
|
||||||
memcpy(pos, digest.ptr, digest.len);
|
memcpy(serialNumber->ptr + msb_set, digest.ptr + zeros,
|
||||||
|
digest.len - zeros);
|
||||||
|
|
||||||
/* the transaction id is the serial number in hex format */
|
/* the transaction id is the serial number in hex format */
|
||||||
*transID = chunk_to_hex(digest, NULL, TRUE);
|
*transID = chunk_to_hex(digest, NULL, TRUE);
|
||||||
|
|||||||
Reference in New Issue
Block a user