From 665fb3076ce9b8a6f26c50a422570252f8a24849 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 4 Apr 2016 17:47:11 -0600 Subject: [PATCH] add trailing zero enum and correct call for export key size --- wolfcrypt/src/asn.c | 28 +++++++++++++++++----------- wolfssl/wolfcrypt/asn.h | 3 ++- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/wolfcrypt/src/asn.c b/wolfcrypt/src/asn.c index 53c84c198..c68d5c645 100644 --- a/wolfcrypt/src/asn.c +++ b/wolfcrypt/src/asn.c @@ -5883,7 +5883,7 @@ static int SetSerial(const byte* serial, byte* output) /* Write a public ECC key to output */ static int SetEccPublicKey(byte* output, ecc_key* key, int with_header) { - byte len[MAX_LENGTH_SZ + 1]; /* trailing 0 */ + byte len[MAX_LENGTH_SZ + TRAILING_ZERO]; int algoSz; int curveSz; int lenSz; @@ -5941,7 +5941,7 @@ static int SetEccPublicKey(byte* output, ecc_key* key, int with_header) #endif algoSz = SetAlgoID(ECDSAk, algo, oidKeyType, curveSz); - lenSz = SetLength(pubSz + 1, len); + lenSz = SetLength(pubSz + TRAILING_ZERO, len); len[lenSz++] = 0; /* trailing 0 */ /* write, 1 is for ASN_BIT_STRING */ @@ -5985,24 +5985,30 @@ int wc_EccPublicKeyToDer(ecc_key* key, byte* output, word32 inLen, int with_AlgCurve) { word32 infoSz = 0; + word32 keySz = 0; + int ret; if (output == NULL || key == NULL) { return BAD_FUNC_ARG; } if (with_AlgCurve) { - int maxSetLength = 4; /* max buffer space needed for SetLength */ - int asnBit = 1; /* buffer space needed for asn bit string macro */ + /* buffer space for algorithm/curve */ + infoSz += MAX_SEQ_SZ; + infoSz += 2 * MAX_ALGO_SZ; - infoSz += asnBit; - infoSz += maxSetLength + asnBit; /* SetSequence buffer needed */ - infoSz += 2 * MAX_ALGO_SZ; /* buffer space for algorithm/curve */ - infoSz += asnBit; - infoSz += maxSetLength; + /* buffer space for public key sequence */ + infoSz += MAX_SEQ_SZ; + infoSz += TRAILING_ZERO; } - if (inLen < wc_ecc_size(key) + infoSz) { - return BAD_FUNC_ARG; + if ((ret = wc_ecc_export_x963(key, NULL, &keySz)) != LENGTH_ONLY_E) { + WOLFSSL_MSG("Error in getting ECC public key size"); + return ret; + } + + if (inLen < keySz + infoSz) { + return BUFFER_E; } return SetEccPublicKey(output, key, with_AlgCurve); diff --git a/wolfssl/wolfcrypt/asn.h b/wolfssl/wolfcrypt/asn.h index 50d0c6c4f..dd54ffb5b 100644 --- a/wolfssl/wolfcrypt/asn.h +++ b/wolfssl/wolfcrypt/asn.h @@ -195,7 +195,8 @@ enum Misc_ASN { EIGHTK_BUF = 8192, /* Tmp buffer size */ MAX_PUBLIC_KEY_SZ = MAX_NTRU_ENC_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2, /* use bigger NTRU size */ - HEADER_ENCRYPTED_KEY_SIZE = 88 /* Extra header size for encrypted key */ + HEADER_ENCRYPTED_KEY_SIZE = 88,/* Extra header size for encrypted key */ + TRAILING_ZERO = 1 /* Used for size of zero pad */ };