mirror of
https://github.com/wolfSSL/wolfssl.git
synced 2025-07-30 18:57:27 +02:00
Merge pull request #4871 from wolfSSL/small-leak
Fix Small Memory Leaks
This commit is contained in:
@ -34947,6 +34947,12 @@ int wolfSSL_DSA_generate_key(WOLFSSL_DSA* dsa)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (rng) {
|
if (rng) {
|
||||||
|
/* These were allocated above by SetDsaInternal(). They should
|
||||||
|
* be cleared before wc_MakeDsaKey() which reinitializes
|
||||||
|
* x and y. */
|
||||||
|
mp_clear(&((DsaKey*)dsa->internal)->x);
|
||||||
|
mp_clear(&((DsaKey*)dsa->internal)->y);
|
||||||
|
|
||||||
if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
|
if (wc_MakeDsaKey(rng, (DsaKey*)dsa->internal) != MP_OKAY)
|
||||||
WOLFSSL_MSG("wc_MakeDsaKey failed");
|
WOLFSSL_MSG("wc_MakeDsaKey failed");
|
||||||
else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
|
else if (SetDsaExternal(dsa) != WOLFSSL_SUCCESS)
|
||||||
|
@ -8024,6 +8024,7 @@ static int PrintPubKeyRSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
|
|||||||
int indent, int bitlen, ASN1_PCTX* pctx)
|
int indent, int bitlen, ASN1_PCTX* pctx)
|
||||||
{
|
{
|
||||||
byte buff[8] = { 0 };
|
byte buff[8] = { 0 };
|
||||||
|
int res = WOLFSSL_FAILURE;
|
||||||
word32 inOutIdx = 0;
|
word32 inOutIdx = 0;
|
||||||
word32 nSz; /* size of modulus */
|
word32 nSz; /* size of modulus */
|
||||||
word32 eSz; /* size of public exponent */
|
word32 eSz; /* size of public exponent */
|
||||||
@ -8047,90 +8048,97 @@ static int PrintPubKeyRSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
|
|||||||
if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
|
if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
|
||||||
indent = EVP_PKEY_PRINT_INDENT_MAX;
|
indent = EVP_PKEY_PRINT_INDENT_MAX;
|
||||||
}
|
}
|
||||||
/* parse key to get modulus and exponent */
|
|
||||||
if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, pkeySz,
|
|
||||||
&n, &nSz, &e, &eSz) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* print out public key elements */
|
do {
|
||||||
idx = 0;
|
/* parse key to get modulus and exponent */
|
||||||
XMEMSET(buff, 0, sizeof(buff));
|
if (wc_RsaPublicKeyDecode_ex(pkey, &inOutIdx, pkeySz,
|
||||||
Indent(out, indent);
|
&n, &nSz, &e, &eSz) != 0) {
|
||||||
XSTRNCPY(line, "RSA Public-Key: (", sizeof(line));
|
break;
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (mp_set_int(&a, bitlen) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (mp_todecimal(&a, (char*)buff) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
wsz = (int)XSTRLEN((const char*)buff);
|
|
||||||
|
|
||||||
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
/* print out public key elements */
|
||||||
return WOLFSSL_FAILURE;
|
idx = 0;
|
||||||
}
|
XMEMSET(buff, 0, sizeof(buff));
|
||||||
XSTRNCPY(line, " bit)\n", sizeof(line));
|
Indent(out, indent);
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
XSTRNCPY(line, "RSA Public-Key: (", sizeof(line));
|
||||||
return WOLFSSL_FAILURE;
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
}
|
break;
|
||||||
/* print Modulus */
|
}
|
||||||
Indent(out, indent);
|
if (mp_set_int(&a, bitlen) != 0) {
|
||||||
XSTRNCPY(line, "Modulus:\n", sizeof(line));
|
break;
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (mp_todecimal(&a, (char*)buff) != 0) {
|
||||||
}
|
break;
|
||||||
|
}
|
||||||
|
wsz = (int)XSTRLEN((const char*)buff);
|
||||||
|
|
||||||
/* print modulus with leading zero if exists */
|
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
||||||
if (*n & 0x80 && *(n-1) == 0) {
|
break;
|
||||||
n--;
|
}
|
||||||
nSz++;
|
XSTRNCPY(line, " bit)\n", sizeof(line));
|
||||||
}
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
if (PrintHexWithColon(out, n, nSz, indent + 4) != WOLFSSL_SUCCESS) {
|
break;
|
||||||
return WOLFSSL_FAILURE;
|
}
|
||||||
}
|
/* print Modulus */
|
||||||
/* print public Exponent */
|
Indent(out, indent);
|
||||||
idx = 0;
|
XSTRNCPY(line, "Modulus:\n", sizeof(line));
|
||||||
Indent(out, indent);
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
XSTRNCPY(line, "Exponent: ", sizeof(line));
|
break;
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
for (i = 0; i < eSz; i++) {
|
|
||||||
exponent <<= 8;
|
|
||||||
exponent += e[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
XMEMSET(buff, 0, sizeof(buff));
|
/* print modulus with leading zero if exists */
|
||||||
if (mp_set_int(&a, exponent) != 0) {
|
if (*n & 0x80 && *(n-1) == 0) {
|
||||||
return WOLFSSL_FAILURE;
|
n--;
|
||||||
}
|
nSz++;
|
||||||
if (mp_todecimal(&a, (char*)buff) != 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (PrintHexWithColon(out, n, nSz, indent + 4) != WOLFSSL_SUCCESS) {
|
||||||
}
|
break;
|
||||||
wsz = (int)XSTRLEN((const char*)buff);
|
}
|
||||||
|
/* print public Exponent */
|
||||||
|
idx = 0;
|
||||||
|
Indent(out, indent);
|
||||||
|
XSTRNCPY(line, "Exponent: ", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
for (i = 0; i < eSz; i++) {
|
||||||
|
exponent <<= 8;
|
||||||
|
exponent += e[i];
|
||||||
|
}
|
||||||
|
|
||||||
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
XMEMSET(buff, 0, sizeof(buff));
|
||||||
return WOLFSSL_FAILURE;
|
if (mp_set_int(&a, exponent) != 0) {
|
||||||
}
|
break;
|
||||||
XSTRNCPY(line, " (0x", sizeof(line));
|
}
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
if (mp_todecimal(&a, (char*)buff) != 0) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
XMEMSET(buff, 0, sizeof(buff));
|
wsz = (int)XSTRLEN((const char*)buff);
|
||||||
if (mp_tohex(&a, (char*)buff) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
||||||
}
|
break;
|
||||||
if (wolfSSL_BIO_write(out, buff, (int)XSTRLEN((const char*)buff)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
XSTRNCPY(line, " (0x", sizeof(line));
|
||||||
}
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
XSTRNCPY(line, ")\n", sizeof(line));
|
break;
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
XMEMSET(buff, 0, sizeof(buff));
|
||||||
}
|
if (mp_tohex(&a, (char*)buff) != 0) {
|
||||||
return WOLFSSL_SUCCESS;
|
break;
|
||||||
|
}
|
||||||
|
if (wolfSSL_BIO_write(out, buff, (int)XSTRLEN((char*)buff)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
XSTRNCPY(line, ")\n", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = WOLFSSL_SUCCESS;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
mp_free(&a);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
#endif /* !NO_RSA */
|
#endif /* !NO_RSA */
|
||||||
|
|
||||||
@ -8316,7 +8324,7 @@ static int PrintPubKeyDSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
|
|||||||
|
|
||||||
byte buff[8] = { 0 };
|
byte buff[8] = { 0 };
|
||||||
int length;
|
int length;
|
||||||
int res;
|
int res = WOLFSSL_FAILURE;
|
||||||
word32 inOutIdx = 0;
|
word32 inOutIdx = 0;
|
||||||
word32 oid;
|
word32 oid;
|
||||||
byte tagFound;
|
byte tagFound;
|
||||||
@ -8339,151 +8347,157 @@ static int PrintPubKeyDSA(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
|
|||||||
if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
|
if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
|
||||||
indent = EVP_PKEY_PRINT_INDENT_MAX;
|
indent = EVP_PKEY_PRINT_INDENT_MAX;
|
||||||
}
|
}
|
||||||
if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
res = GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, pkeySz);
|
|
||||||
if (res != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
/* find P */
|
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (tagFound != ASN_INTEGER) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
p = (byte*)(pkey + inOutIdx);
|
|
||||||
pSz = length;
|
|
||||||
|
|
||||||
if (bitlen == 0) {
|
do {
|
||||||
if (*p == 0) {
|
if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) {
|
||||||
bitlen = (pSz - 1) * 8; /* remove leading zero */
|
break;
|
||||||
}
|
}
|
||||||
else {
|
if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) {
|
||||||
bitlen = pSz * 8;
|
break;
|
||||||
}
|
}
|
||||||
}
|
if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, pkeySz) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetSequence(pkey, &inOutIdx, &length, pkeySz) < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* find P */
|
||||||
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (tagFound != ASN_INTEGER) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
p = (byte*)(pkey + inOutIdx);
|
||||||
|
pSz = length;
|
||||||
|
|
||||||
inOutIdx += length;
|
if (bitlen == 0) {
|
||||||
/* find Q */
|
if (*p == 0) {
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
bitlen = (pSz - 1) * 8; /* remove leading zero */
|
||||||
return WOLFSSL_FAILURE;
|
}
|
||||||
}
|
else {
|
||||||
if (tagFound != ASN_INTEGER) {
|
bitlen = pSz * 8;
|
||||||
return WOLFSSL_FAILURE;
|
}
|
||||||
}
|
}
|
||||||
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
q = (byte*)(pkey + inOutIdx);
|
|
||||||
qSz = length;
|
|
||||||
inOutIdx += length;
|
|
||||||
|
|
||||||
/* find G */
|
inOutIdx += length;
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
/* find Q */
|
||||||
return WOLFSSL_FAILURE;
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
}
|
break;
|
||||||
if (tagFound != ASN_INTEGER) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (tagFound != ASN_INTEGER) {
|
||||||
}
|
break;
|
||||||
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
||||||
}
|
break;
|
||||||
g = (byte*)(pkey + inOutIdx);
|
}
|
||||||
gSz = length;
|
q = (byte*)(pkey + inOutIdx);
|
||||||
inOutIdx += length;
|
qSz = length;
|
||||||
/* find Y */
|
inOutIdx += length;
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (tagFound != ASN_BIT_STRING) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
inOutIdx++; /* skip the first byte( unused byte number)*/
|
|
||||||
|
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
/* find G */
|
||||||
return WOLFSSL_FAILURE;
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
}
|
break;
|
||||||
if (tagFound != ASN_INTEGER) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (tagFound != ASN_INTEGER) {
|
||||||
}
|
break;
|
||||||
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
||||||
}
|
break;
|
||||||
y = (byte*)(pkey + inOutIdx);
|
}
|
||||||
ySz = length;
|
g = (byte*)(pkey + inOutIdx);
|
||||||
|
gSz = length;
|
||||||
|
inOutIdx += length;
|
||||||
|
/* find Y */
|
||||||
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (tagFound != ASN_BIT_STRING) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
inOutIdx++; /* skip the first byte( unused byte number)*/
|
||||||
|
|
||||||
idx = 0;
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
XMEMSET(buff, 0, sizeof(buff));
|
break;
|
||||||
Indent(out, indent);
|
}
|
||||||
XSTRNCPY(line, "DSA Public-Key: (", sizeof(line));
|
if (tagFound != ASN_INTEGER) {
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
break;
|
||||||
return WOLFSSL_FAILURE;
|
}
|
||||||
}
|
if (GetLength(pkey, &inOutIdx, &length, pkeySz) <= 0) {
|
||||||
if (mp_set_int(&a, bitlen) != 0) {
|
break;
|
||||||
return WOLFSSL_FAILURE;
|
}
|
||||||
}
|
y = (byte*)(pkey + inOutIdx);
|
||||||
if (mp_todecimal(&a, (char*)buff) != 0) {
|
ySz = length;
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
idx = 0;
|
||||||
wsz = (int)XSTRLEN((const char*)buff);
|
XMEMSET(buff, 0, sizeof(buff));
|
||||||
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
Indent(out, indent);
|
||||||
return WOLFSSL_FAILURE;
|
XSTRNCPY(line, "DSA Public-Key: (", sizeof(line));
|
||||||
}
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
XSTRNCPY(line, " bit)\n", sizeof(line));
|
break;
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
if (mp_set_int(&a, bitlen) != 0) {
|
||||||
}
|
break;
|
||||||
/* print pub element */
|
}
|
||||||
Indent(out, indent);
|
if (mp_todecimal(&a, (char*)buff) != 0) {
|
||||||
XSTRNCPY(line, "pub:\n", sizeof(line));
|
break;
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
}
|
||||||
return WOLFSSL_FAILURE;
|
wsz = (int)XSTRLEN((const char*)buff);
|
||||||
}
|
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
||||||
if (PrintHexWithColon(out, y, ySz, indent + 4) != WOLFSSL_SUCCESS) {
|
break;
|
||||||
return WOLFSSL_FAILURE;
|
}
|
||||||
}
|
XSTRNCPY(line, " bit)\n", sizeof(line));
|
||||||
/* print P element */
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
Indent(out, indent);
|
break;
|
||||||
XSTRNCPY(line, "P:\n", sizeof(line));
|
}
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
/* print pub element */
|
||||||
return WOLFSSL_FAILURE;
|
Indent(out, indent);
|
||||||
}
|
XSTRNCPY(line, "pub:\n", sizeof(line));
|
||||||
if (PrintHexWithColon(out, p, pSz, indent + 4) != WOLFSSL_SUCCESS) {
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
/* print Q element */
|
if (PrintHexWithColon(out, y, ySz, indent + 4) != WOLFSSL_SUCCESS) {
|
||||||
Indent(out, indent);
|
break;
|
||||||
XSTRNCPY(line, "Q:\n", sizeof(line));
|
}
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
/* print P element */
|
||||||
return WOLFSSL_FAILURE;
|
Indent(out, indent);
|
||||||
}
|
XSTRNCPY(line, "P:\n", sizeof(line));
|
||||||
if (PrintHexWithColon(out, q, qSz, indent + 4) != WOLFSSL_SUCCESS) {
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
/* print G element */
|
if (PrintHexWithColon(out, p, pSz, indent + 4) != WOLFSSL_SUCCESS) {
|
||||||
Indent(out, indent);
|
break;
|
||||||
XSTRNCPY(line, "G:\n", sizeof(line));
|
}
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
/* print Q element */
|
||||||
return WOLFSSL_FAILURE;
|
Indent(out, indent);
|
||||||
}
|
XSTRNCPY(line, "Q:\n", sizeof(line));
|
||||||
if (PrintHexWithColon(out, g, gSz, indent + 4) != WOLFSSL_SUCCESS) {
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
return WOLFSSL_SUCCESS;
|
if (PrintHexWithColon(out, q, qSz, indent + 4) != WOLFSSL_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* print G element */
|
||||||
|
Indent(out, indent);
|
||||||
|
XSTRNCPY(line, "G:\n", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (PrintHexWithColon(out, g, gSz, indent + 4) != WOLFSSL_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = WOLFSSL_SUCCESS;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
mp_free(&a);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
#endif /* !NO_DSA */
|
#endif /* !NO_DSA */
|
||||||
|
|
||||||
@ -8504,6 +8518,7 @@ static int PrintPubKeyDH(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
|
|||||||
{
|
{
|
||||||
|
|
||||||
byte buff[8] = { 0 };
|
byte buff[8] = { 0 };
|
||||||
|
int res = WOLFSSL_FAILURE;
|
||||||
word32 length;
|
word32 length;
|
||||||
word32 inOutIdx;
|
word32 inOutIdx;
|
||||||
word32 oid;
|
word32 oid;
|
||||||
@ -8532,158 +8547,165 @@ static int PrintPubKeyDH(WOLFSSL_BIO* out, const byte* pkey, int pkeySz,
|
|||||||
if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
|
if (indent > EVP_PKEY_PRINT_INDENT_MAX) {
|
||||||
indent = EVP_PKEY_PRINT_INDENT_MAX;
|
indent = EVP_PKEY_PRINT_INDENT_MAX;
|
||||||
}
|
}
|
||||||
if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
/* get prime element */
|
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (tagFound != ASN_INTEGER) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
prime = (byte*)(pkey + inOutIdx);
|
|
||||||
primeSz = length;
|
|
||||||
inOutIdx += length;
|
|
||||||
|
|
||||||
/* get generator element */
|
do {
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
|
||||||
if (tagFound != ASN_INTEGER) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (length != 1) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
generator = *(pkey + inOutIdx);
|
|
||||||
inOutIdx += length;
|
|
||||||
|
|
||||||
/* get public-key element */
|
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (tagFound != ASN_BIT_STRING) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
inOutIdx ++;
|
|
||||||
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (tagFound != ASN_INTEGER) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
publicKeySz = length;
|
|
||||||
publicKey = (byte*)(pkey + inOutIdx);
|
|
||||||
|
|
||||||
if (bitlen == 0) {
|
|
||||||
if (*publicKey == 0) {
|
|
||||||
bitlen = (publicKeySz - 1) * 8;
|
|
||||||
}
|
}
|
||||||
else {
|
if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) {
|
||||||
bitlen = publicKeySz * 8;
|
break;
|
||||||
}
|
}
|
||||||
}
|
if (GetObjectId(pkey, &inOutIdx, &oid, oidIgnoreType, pkeySz) < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetSequence(pkey, &inOutIdx, (int*)&length, pkeySz) < 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
/* get prime element */
|
||||||
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (tagFound != ASN_INTEGER) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
prime = (byte*)(pkey + inOutIdx);
|
||||||
|
primeSz = length;
|
||||||
|
inOutIdx += length;
|
||||||
|
|
||||||
/* print elements */
|
/* get generator element */
|
||||||
idx = 0;
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
Indent(out, indent);
|
break;
|
||||||
XSTRNCPY(line, "DH Public-Key: (", sizeof(line));
|
}
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
if (tagFound != ASN_INTEGER) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
if (mp_set_int(&a, bitlen) != 0) {
|
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
if (mp_todecimal(&a, (char*)buff) != 0) {
|
if (length != 1) {
|
||||||
return WOLFSSL_FAILURE;
|
break;
|
||||||
}
|
}
|
||||||
wsz = (int)XSTRLEN((const char*)buff);
|
generator = *(pkey + inOutIdx);
|
||||||
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
inOutIdx += length;
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
XSTRNCPY(line, " bit)\n", sizeof(line));
|
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
Indent(out, indent);
|
|
||||||
XSTRNCPY(line, "public-key:\n", sizeof(line));
|
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (PrintHexWithColon(out, publicKey, publicKeySz, indent + 4)
|
|
||||||
!= WOLFSSL_SUCCESS) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
Indent(out, indent);
|
|
||||||
XSTRNCPY(line, "prime:\n", sizeof(line));
|
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (PrintHexWithColon(out, prime, primeSz, indent + 4) != WOLFSSL_SUCCESS) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
idx = 0;
|
|
||||||
XMEMSET(buff, 0, sizeof(buff));
|
|
||||||
Indent(out, indent);
|
|
||||||
XSTRNCPY(line, "generator: ", sizeof(line));
|
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (mp_set_int(&a, generator) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (mp_todecimal(&a, (char*)buff) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
wsz = (int)XSTRLEN((const char*)buff);
|
|
||||||
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
XSTRNCPY(line, " (0x", sizeof(line));
|
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
idx = 0;
|
|
||||||
XMEMSET(buff, 0, sizeof(buff));
|
|
||||||
outSz = sizeof(outHex);
|
|
||||||
if (Base16_Encode((const byte*)&generator, 1, outHex, &outSz ) != 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
if (idx + 2 < (int)sizeof(buff) ) {
|
|
||||||
XMEMCPY(buff + idx, outHex, 2);
|
|
||||||
idx += 2;
|
|
||||||
}
|
|
||||||
if (wolfSSL_BIO_write(out, buff, idx) <= 0 ) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
XSTRNCPY(line, ")\n", sizeof(line));
|
|
||||||
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
|
||||||
return WOLFSSL_FAILURE;
|
|
||||||
}
|
|
||||||
|
|
||||||
return WOLFSSL_SUCCESS;
|
/* get public-key element */
|
||||||
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (tagFound != ASN_BIT_STRING) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
inOutIdx ++;
|
||||||
|
if (GetASNTag(pkey, &inOutIdx, &tagFound, pkeySz) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (tagFound != ASN_INTEGER) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (GetLength(pkey, &inOutIdx, (int*)&length, pkeySz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
publicKeySz = length;
|
||||||
|
publicKey = (byte*)(pkey + inOutIdx);
|
||||||
|
|
||||||
|
if (bitlen == 0) {
|
||||||
|
if (*publicKey == 0) {
|
||||||
|
bitlen = (publicKeySz - 1) * 8;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
bitlen = publicKeySz * 8;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* print elements */
|
||||||
|
idx = 0;
|
||||||
|
Indent(out, indent);
|
||||||
|
XSTRNCPY(line, "DH Public-Key: (", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mp_set_int(&a, bitlen) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mp_todecimal(&a, (char*)buff) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wsz = (int)XSTRLEN((const char*)buff);
|
||||||
|
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
XSTRNCPY(line, " bit)\n", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Indent(out, indent);
|
||||||
|
XSTRNCPY(line, "public-key:\n", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (PrintHexWithColon(out, publicKey, publicKeySz, indent + 4)
|
||||||
|
!= WOLFSSL_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
Indent(out, indent);
|
||||||
|
XSTRNCPY(line, "prime:\n", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (PrintHexWithColon(out, prime, primeSz, indent + 4)
|
||||||
|
!= WOLFSSL_SUCCESS) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
idx = 0;
|
||||||
|
XMEMSET(buff, 0, sizeof(buff));
|
||||||
|
Indent(out, indent);
|
||||||
|
XSTRNCPY(line, "generator: ", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mp_set_int(&a, generator) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (mp_todecimal(&a, (char*)buff) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
wsz = (int)XSTRLEN((const char*)buff);
|
||||||
|
if (wolfSSL_BIO_write(out, buff + idx, wsz) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
XSTRNCPY(line, " (0x", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
idx = 0;
|
||||||
|
XMEMSET(buff, 0, sizeof(buff));
|
||||||
|
outSz = sizeof(outHex);
|
||||||
|
if (Base16_Encode((const byte*)&generator, 1, outHex, &outSz ) != 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (idx + 2 < (int)sizeof(buff) ) {
|
||||||
|
XMEMCPY(buff + idx, outHex, 2);
|
||||||
|
idx += 2;
|
||||||
|
}
|
||||||
|
if (wolfSSL_BIO_write(out, buff, idx) <= 0 ) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
XSTRNCPY(line, ")\n", sizeof(line));
|
||||||
|
if (wolfSSL_BIO_write(out, line, (int)XSTRLEN(line)) <= 0) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = WOLFSSL_SUCCESS;
|
||||||
|
} while (0);
|
||||||
|
|
||||||
|
mp_free(&a);
|
||||||
|
return res;
|
||||||
}
|
}
|
||||||
#endif /* WOLFSSL_DH_EXTRA */
|
#endif /* WOLFSSL_DH_EXTRA */
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user