Remove leading zeros in SCEP certificate serialNumbers

This commit is contained in:
Martin Willi
2013-02-14 16:56:32 +01:00
parent 96a2d2077b
commit 46ae05dd17
+19 -13
View File
@@ -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);