diff options
author | Rob Austein <sra@hactrn.net> | 2015-09-06 13:46:41 -0400 |
---|---|---|
committer | Rob Austein <sra@hactrn.net> | 2015-09-06 13:46:41 -0400 |
commit | 12fd92723d71325b74a6c94eee4ca504773ad9da (patch) | |
tree | 9babd4f2fe503493be80ca1ec477cbe208bad952 /asn1.c | |
parent | 89cf9108af7ec93471f76510663ca1218133c6a2 (diff) |
Add ECPoint I/O functions. ASN.1 cleanup.
Diffstat (limited to 'asn1.c')
-rw-r--r-- | asn1.c | 24 |
1 files changed, 16 insertions, 8 deletions
@@ -58,8 +58,18 @@ #include "asn1_internal.h" /* - * Encode tag and length fields of an ASN.1 object. If der is NULL, - * just return the size that would be encoded. + * Encode tag and length fields of an ASN.1 object. + * + * Sets *der_len to the size of of the ASN.1 header (tag and length + * fields); caller supplied length of value field, so presumably + * already knows it. + * + * If der is NULL, just return the size of the header that would be + * encoded and returns HAL_OK. + * + * If der isn't NULL, returns HAL_ERROR_RESULT_TOO_LONG unless full + * header plus value will fit; this is a bit weird, but is useful when + * using this to construct encoders for complte ASN.1 objects. */ hal_error_t hal_asn1_encode_header(const uint8_t tag, @@ -126,17 +136,15 @@ hal_error_t hal_asn1_encode_integer(const fp_int * const bn, hal_error_t err; size_t hlen; - if ((err = hal_asn1_encode_header(ASN1_INTEGER, vlen, der, &hlen, der_max)) != HAL_OK) - return err; + err = hal_asn1_encode_header(ASN1_INTEGER, vlen, der, &hlen, der_max); if (der_len != NULL) *der_len = hlen + vlen; - if (der == NULL) - return HAL_OK; + if (der == NULL || err != HAL_OK) + return err; - if (hlen + vlen > der_max) - return HAL_ERROR_RESULT_TOO_LONG; + assert(hlen + vlen <= der_max); der += hlen; if (leading_zero) |