From 4c39a9df93c962c69e23ff48789cb950a105a44b Mon Sep 17 00:00:00 2001 From: Panu Matilainen Date: Thu, 16 Apr 2009 11:03:29 +0300 Subject: [PATCH] Pad RSA signatures up to modulus size if necessary (rhbz#494049) - unfortunately can't be detected at initial allocation so extra copy is needed at verification time --- rpmio/rpmpgp.c | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/rpmio/rpmpgp.c b/rpmio/rpmpgp.c index e671552..3498e56 100644 --- a/rpmio/rpmpgp.c +++ b/rpmio/rpmpgp.c @@ -1371,11 +1371,30 @@ rpmRC pgpVerifySig(pgpDig dig, DIGEST_CTX hashctx) /* Compare leading 16 bits of digest for quick check. */ if (hash && memcmp(hash, sigp->signhash16, 2) == 0) { SECItem digest = { .type = siBuffer, .data = hash, .len = hashlen }; + SECItem *sig = dig->sigdata; + + /* Zero-pad RSA signature to expected size if necessary */ + if (sigp->pubkey_algo == PGPPUBKEYALGO_RSA) { + size_t siglen = SECKEY_SignatureLen(dig->keydata); + if (siglen > sig->len) { + size_t pad = siglen - sig->len; + if ((sig = SECITEM_AllocItem(NULL, NULL, siglen)) == NULL) { + goto exit; + } + memset(sig->data, 0, pad); + memcpy(sig->data+pad, dig->sigdata->data, dig->sigdata->len); + } + } + /* XXX VFY_VerifyDigest() is deprecated in NSS 3.12 */ - if (VFY_VerifyDigest(&digest, dig->keydata, dig->sigdata, + if (VFY_VerifyDigest(&digest, dig->keydata, sig, getSigAlg(sigp), NULL) == SECSuccess) { res = RPMRC_OK; } + + if (sig != dig->sigdata) { + SECITEM_ZfreeItem(sig, 1); + } } exit: -- 2.7.4