Merge pull request #377 from JacobBarthelmeh/master

add wc_EccPublicKeyToDer function
This commit is contained in:
toddouska
2016-04-07 12:20:05 -07:00
5 changed files with 68 additions and 7 deletions

1
.gitignore vendored
View File

@@ -71,6 +71,7 @@ ntru-cert.pem
ntru-key.raw ntru-key.raw
key.der key.der
key.pem key.pem
ecc-public-key.der
ecc-key.der ecc-key.der
ecc-key.pem ecc-key.pem
certreq.der certreq.der

View File

@@ -5877,14 +5877,13 @@ static int SetSerial(const byte* serial, byte* output)
return length + CTC_SERIAL_SIZE; return length + CTC_SERIAL_SIZE;
} }
#endif /* defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA) */
#ifdef HAVE_ECC #if defined(HAVE_ECC) && (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN))
/* Write a public ECC key to output */ /* Write a public ECC key to output */
static int SetEccPublicKey(byte* output, ecc_key* key, int with_header) 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 algoSz;
int curveSz; int curveSz;
int lenSz; int lenSz;
@@ -5942,7 +5941,7 @@ static int SetEccPublicKey(byte* output, ecc_key* key, int with_header)
#endif #endif
algoSz = SetAlgoID(ECDSAk, algo, oidKeyType, curveSz); algoSz = SetAlgoID(ECDSAk, algo, oidKeyType, curveSz);
lenSz = SetLength(pubSz + 1, len); lenSz = SetLength(pubSz + TRAILING_ZERO, len);
len[lenSz++] = 0; /* trailing 0 */ len[lenSz++] = 0; /* trailing 0 */
/* write, 1 is for ASN_BIT_STRING */ /* write, 1 is for ASN_BIT_STRING */
@@ -5978,8 +5977,44 @@ static int SetEccPublicKey(byte* output, ecc_key* key, int with_header)
} }
#endif /* HAVE_ECC */ /* returns the size of buffer used, the public ECC key in DER format is stored
in output buffer
with_AlgCurve is a flag for when to include a header that has the Algorithm
and Curve infromation */
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) {
/* buffer space for algorithm/curve */
infoSz += MAX_SEQ_SZ;
infoSz += 2 * MAX_ALGO_SZ;
/* buffer space for public key sequence */
infoSz += MAX_SEQ_SZ;
infoSz += TRAILING_ZERO;
}
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);
}
#endif /* HAVE_ECC && (WOLFSSL_CERT_GEN || WOLFSSL_KEY_GEN) */
#if defined(WOLFSSL_CERT_GEN) && !defined(NO_RSA)
static INLINE byte itob(int number) static INLINE byte itob(int number)
{ {

View File

@@ -5001,6 +5001,7 @@ int rsa_test(void)
free(tmp); free(tmp);
return -5415; return -5415;
} }
fclose(pemFile); fclose(pemFile);
free(pem); free(pem);
free(derCert); free(derCert);
@@ -6486,6 +6487,25 @@ static int ecc_test_key_gen(WC_RNG* rng, int keySize)
return -1029; return -1029;
} }
/* test export of public key */
derSz = wc_EccPublicKeyToDer(&userA, der, FOURK_BUF, 1);
if (derSz <= 0) {
return -5516;
}
#ifdef FREESCALE_MQX
keyFile = fopen("a:\\certs\\ecc-public-key.der", "wb");
#else
keyFile = fopen("./ecc-public-key.der", "wb");
#endif
if (!keyFile) {
return -5417;
}
ret = (int)fwrite(der, 1, derSz, keyFile);
fclose(keyFile);
if (ret != derSz) {
return -5418;
}
wc_ecc_free(&userA); wc_ecc_free(&userA);
return 0; return 0;

View File

@@ -195,7 +195,8 @@ enum Misc_ASN {
EIGHTK_BUF = 8192, /* Tmp buffer size */ EIGHTK_BUF = 8192, /* Tmp buffer size */
MAX_PUBLIC_KEY_SZ = MAX_NTRU_ENC_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2, MAX_PUBLIC_KEY_SZ = MAX_NTRU_ENC_SZ + MAX_ALGO_SZ + MAX_SEQ_SZ * 2,
/* use bigger NTRU size */ /* 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 */
}; };

View File

@@ -259,6 +259,10 @@ WOLFSSL_API int wc_SetCertificatePolicies(Cert *cert, const char **input);
/* public key helper */ /* public key helper */
WOLFSSL_API int wc_EccPublicKeyDecode(const byte*, word32*, WOLFSSL_API int wc_EccPublicKeyDecode(const byte*, word32*,
ecc_key*, word32); ecc_key*, word32);
#if (defined(WOLFSSL_CERT_GEN) || defined(WOLFSSL_KEY_GEN))
WOLFSSL_API int wc_EccPublicKeyToDer(ecc_key*, byte* output,
word32 inLen, int with_AlgCurve);
#endif
#endif #endif
/* DER encode signature */ /* DER encode signature */