From 6d8161de7353ecb636f895656d1c1f3610fb7f99 Mon Sep 17 00:00:00 2001 From: Pol Henarejos Date: Wed, 8 Jun 2022 17:34:17 +0200 Subject: [PATCH] Added functions to retrieve CAR and CHR from certs. Signed-off-by: Pol Henarejos --- src/hsm/cvc.c | 31 +++++++++++++++++++++++++++++++ src/hsm/cvc.h | 3 +++ 2 files changed, 34 insertions(+) diff --git a/src/hsm/cvc.c b/src/hsm/cvc.c index da5539d..8ab2682 100644 --- a/src/hsm/cvc.c +++ b/src/hsm/cvc.c @@ -240,3 +240,34 @@ size_t asn1_cvc_aut(void *rsa_ecdsa, uint8_t key_type, uint8_t *buf, size_t buf_ mbedtls_mpi_free(&s); return p-buf; } + +uint8_t *cvc_get_field(uint8_t *data, size_t len, size_t *olen, uint16_t tag) { + uint8_t *rdata = NULL; + if (data == NULL || len == 0) + return NULL; + if (asn1_find_tag(data, len, tag, olen, &rdata) == false) + return NULL; + return rdata; +} + +uint8_t *cvc_get_car(uint8_t *data, size_t len, size_t *olen) { + uint8_t *bkdata = data; + if ((data = cvc_get_field(data, len, olen, 0x67)) == NULL) /* Check for CSR */ + data = bkdata; + if ((data = cvc_get_field(data, len, olen, 0x7F21)) != NULL) { + if ((data = cvc_get_field(data, len, olen, 0x7F4E)) != NULL) + return cvc_get_field(data, len, olen, 0x42); + } + return NULL; +} + +uint8_t *cvc_get_chr(uint8_t *data, size_t len, size_t *olen) { + uint8_t *bkdata = data; + if ((data = cvc_get_field(data, len, olen, 0x67)) == NULL) /* Check for CSR */ + data = bkdata; + if ((data = cvc_get_field(data, len, olen, 0x7F21)) != NULL) { + if ((data = cvc_get_field(data, len, olen, 0x7F4E)) != NULL) + return cvc_get_field(data, len, olen, 0x5F20); + } + return NULL; +} diff --git a/src/hsm/cvc.h b/src/hsm/cvc.h index 9cef0fd..2f13c1c 100644 --- a/src/hsm/cvc.h +++ b/src/hsm/cvc.h @@ -23,5 +23,8 @@ extern size_t asn1_cvc_cert(void *rsa_ecdsa, uint8_t key_type, uint8_t *buf, size_t buf_len); extern size_t asn1_cvc_aut(void *rsa_ecdsa, uint8_t key_type, uint8_t *buf, size_t buf_len); +extern uint8_t *cvc_get_field(uint8_t *data, size_t len, size_t *olen, uint16_t tag); +extern uint8_t *cvc_get_car(uint8_t *data, size_t len, size_t *olen); +extern uint8_t *cvc_get_chr(uint8_t *data, size_t len, size_t *olen); #endif