summaryrefslogtreecommitdiff
path: root/lib/cryptohi
diff options
context:
space:
mode:
authorTim Taubert <ttaubert@mozilla.com>2017-01-12 07:03:13 +0100
committerTim Taubert <ttaubert@mozilla.com>2017-01-12 07:03:13 +0100
commitc14864d233c88628c87216ac37f126d2edd80264 (patch)
tree8df83822a6970cb99f794b25f696a868cdd50b10 /lib/cryptohi
parenta962154b9cb639003be2bf17abc89457d20f9b0e (diff)
downloadnss-hg-c14864d233c88628c87216ac37f126d2edd80264.tar.gz
Bug 944179 - Use QuickDER to decode DER-encoded DSA and ECDSA signatures r=mt
Differential Revision: https://nss-review.dev.mozaws.net/D142
Diffstat (limited to 'lib/cryptohi')
-rw-r--r--lib/cryptohi/dsautil.c11
1 files changed, 6 insertions, 5 deletions
diff --git a/lib/cryptohi/dsautil.c b/lib/cryptohi/dsautil.c
index db397dfd5..df4d9a9a7 100644
--- a/lib/cryptohi/dsautil.c
+++ b/lib/cryptohi/dsautil.c
@@ -166,12 +166,16 @@ static SECItem *
common_DecodeDerSig(const SECItem *item, unsigned int len)
{
SECItem *result = NULL;
+ PORTCheapArenaPool arena;
SECStatus status;
DSA_ASN1Signature sig;
SECItem dst;
PORT_Memset(&sig, 0, sizeof(sig));
+ /* Make enough room for r + s. */
+ PORT_InitCheapArena(&arena, PR_MAX(2 * MAX_ECKEY_LEN, DSA_MAX_SIGNATURE_LEN));
+
result = PORT_ZNew(SECItem);
if (result == NULL)
goto loser;
@@ -183,7 +187,7 @@ common_DecodeDerSig(const SECItem *item, unsigned int len)
sig.r.type = siUnsignedInteger;
sig.s.type = siUnsignedInteger;
- status = SEC_ASN1DecodeItem(NULL, &sig, DSA_SignatureTemplate, item);
+ status = SEC_QuickDERDecodeItem(&arena.arena, &sig, DSA_SignatureTemplate, item);
if (status != SECSuccess)
goto loser;
@@ -202,10 +206,7 @@ common_DecodeDerSig(const SECItem *item, unsigned int len)
goto loser;
done:
- if (sig.r.data != NULL)
- PORT_Free(sig.r.data);
- if (sig.s.data != NULL)
- PORT_Free(sig.s.data);
+ PORT_DestroyCheapArena(&arena);
return result;