123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265 |
- #include <string.h>
- #include "optiga_backend_utils.h"
- #include "nrf_crypto_error.h"
- ret_code_t asn1_to_ecdsa_rs(uint8_t const * p_asn1,
- size_t asn1_len,
- uint8_t * p_rs,
- size_t * p_rs_len)
- {
- uint8_t const * p_cur = p_asn1;
- uint8_t const * p_end = p_asn1 + asn1_len;
- uint8_t r_len;
- uint8_t s_len;
- if (p_asn1 == NULL || p_rs == NULL || p_rs_len == NULL)
- {
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- if (asn1_len == 0 || *p_rs_len == 0)
- {
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- if (*p_cur != DER_TAG_INTEGER)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- if ((p_cur + 2) >= p_end)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
-
- p_cur++;
- r_len = *p_cur;
- if (r_len > DER_INTEGER_MAX_LEN)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
-
- p_cur++;
-
- if (*p_cur == 0x00)
- {
- p_cur++;
- r_len--;
- }
-
- if ((p_cur + r_len) >= p_end)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
-
- if ((p_rs + r_len) > (p_rs + *p_rs_len))
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
-
- memcpy(p_rs, p_cur, r_len);
-
- p_cur += r_len;
- if (*p_cur != DER_TAG_INTEGER)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- if ((p_cur + 2) >= p_end)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- p_cur++;
- s_len = *p_cur;
- if (s_len > DER_INTEGER_MAX_LEN)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- p_cur++;
- if (*p_cur == 0x00)
- {
- p_cur++;
- s_len--;
- }
-
- if ((p_cur + s_len) > p_end)
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
-
- if ((p_rs + r_len + s_len) > (p_rs + *p_rs_len))
- {
-
- return NRF_ERROR_CRYPTO_INTERNAL;
- }
- memcpy(p_rs + r_len, p_cur, s_len);
- *p_rs_len = r_len + s_len;
- return NRF_SUCCESS;
- }
- bool ecdsa_rs_to_asn1(uint8_t const * p_r,
- size_t r_len,
- uint8_t const * p_s,
- size_t s_len,
- uint8_t * p_asn_sig,
- size_t * p_asn_sig_len)
- {
- size_t index = 0;
-
- if (p_r == NULL || p_s == NULL || p_asn_sig_len == NULL)
- {
- return false;
- }
- if (r_len == 0 || r_len > DER_INTEGER_MAX_LEN || s_len == 0 || s_len > DER_INTEGER_MAX_LEN)
- {
- return false;
- }
- if (*p_asn_sig_len < (r_len + s_len + DER_OVERHEAD))
- {
-
- return false;
- }
-
-
- p_asn_sig[index] = DER_TAG_INTEGER;
- index++;
-
- p_asn_sig[index] = r_len;
-
- if (p_r[0] & 0x80)
- {
-
- p_asn_sig[index] += 1;
- index++;
-
- p_asn_sig[index] = 0;
- }
- index++;
- memcpy(&p_asn_sig[index], p_r, r_len);
- index += r_len;
-
-
- p_asn_sig[index] = DER_TAG_INTEGER;
- index++;
-
- p_asn_sig[index] = s_len;
- if (p_s[0] & 0x80)
- {
-
- p_asn_sig[index] += 1;
- index++;
-
- p_asn_sig[index] = 0;
- }
- index++;
- memcpy(&p_asn_sig[index], p_s, s_len);
- index += s_len;
-
- *p_asn_sig_len = index;
- return true;
- }
|