From 4f0893bda5af3c4bbb68f5a6db88a3cc79486c89 Mon Sep 17 00:00:00 2001 From: Jacob Barthelmeh Date: Mon, 7 May 2018 14:16:27 -0600 Subject: [PATCH] fix ecc public key print with X509 print function --- src/ssl.c | 73 ++++++++++++++++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 25 deletions(-) diff --git a/src/ssl.c b/src/ssl.c index 2d33b4d7a..d4239b138 100644 --- a/src/ssl.c +++ b/src/ssl.c @@ -16300,8 +16300,10 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509) != 0) { return WOLFSSL_FAILURE; } - if (wc_ecc_import_x963(x509->pubKey.buffer, - x509->pubKey.length, &ecc) != 0) { + + i = 0; + if (wc_EccPublicKeyDecode(x509->pubKey.buffer, &i, + &ecc, x509->pubKey.length) != 0) { wc_ecc_free(&ecc); return WOLFSSL_FAILURE; } @@ -16315,41 +16317,62 @@ WOLFSSL_EVP_PKEY* wolfSSL_X509_get_pubkey(WOLFSSL_X509* x509) return WOLFSSL_FAILURE; } XSNPRINTF(tmp, sizeof(tmp) - 1," "); - for (i = 0; i < x509->pubKey.length; i++) { - char val[5]; - int valSz = 5; + { + word32 derSz; + byte* der; - if (i == 0) { - XSNPRINTF(val, valSz - 1, "%02x", - x509->pubKey.buffer[i]); + derSz = wc_ecc_size(&ecc) * WOLFSSL_BIT_SIZE; + der = XMALLOC(derSz, x509->heap, + DYNAMIC_TYPE_TMP_BUFFER); + if (der == NULL) { + wc_ecc_free(&ecc); + return WOLFSSL_FAILURE; } - else if ((i % 15) == 0) { - tmp[sizeof(tmp) - 1] = '\0'; - if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) - <= 0) { - wc_ecc_free(&ecc); - return WOLFSSL_FAILURE; + + if (wc_ecc_export_x963(&ecc, der, &derSz) != 0) { + wc_ecc_free(&ecc); + XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER); + return WOLFSSL_FAILURE; + } + for (i = 0; i < derSz; i++) { + char val[5]; + int valSz = 5; + + if (i == 0) { + XSNPRINTF(val, valSz - 1, "%02x", der[i]); } - XSNPRINTF(tmp, sizeof(tmp) - 1, + else if ((i % 15) == 0) { + tmp[sizeof(tmp) - 1] = '\0'; + if (wolfSSL_BIO_write(bio, tmp, + (int)XSTRLEN(tmp)) <= 0) { + wc_ecc_free(&ecc); + XFREE(der, x509->heap, + DYNAMIC_TYPE_TMP_BUFFER); + return WOLFSSL_FAILURE; + } + XSNPRINTF(tmp, sizeof(tmp) - 1, ":\n "); - XSNPRINTF(val, valSz - 1, "%02x", - x509->pubKey.buffer[i]); + XSNPRINTF(val, valSz - 1, "%02x", der[i]); + } + else { + XSNPRINTF(val, valSz - 1, ":%02x", der[i]); + } + XSTRNCAT(tmp, val, valSz); } - else { - XSNPRINTF(val, valSz - 1, ":%02x", - x509->pubKey.buffer[i]); - } - XSTRNCAT(tmp, val, valSz); - } - /* print out remaning modulus values */ - if ((i > 0) && (((i - 1) % 15) != 0)) { + /* print out remaning modulus values */ + if ((i > 0) && (((i - 1) % 15) != 0)) { tmp[sizeof(tmp) - 1] = '\0'; if (wolfSSL_BIO_write(bio, tmp, (int)XSTRLEN(tmp)) <= 0) { wc_ecc_free(&ecc); + XFREE(der, x509->heap, + DYNAMIC_TYPE_TMP_BUFFER); return WOLFSSL_FAILURE; } + } + + XFREE(der, x509->heap, DYNAMIC_TYPE_TMP_BUFFER); } XSNPRINTF(tmp, sizeof(tmp) - 1, "\n%s%s: %s\n", " ", "ASN1 OID",