RPM Package Manager, CVS Repository http://rpm5.org/cvs/ ____________________________________________________________________________
Server: rpm5.org Name: Jeff Johnson Root: /v/rpm/cvs Email: [email protected] Module: rpm Date: 25-Jun-2010 20:40:28 Branch: rpm-5_3 Handle: 2010062518402601 Modified files: (Branch: rpm-5_3) rpm CHANGES rpm/build build.c pack.c rpm/rpmio rpmbc.c Log: - pgp: fix: algo parameters to signature/pubkey with msbits(). Summary: Revision Changes Path 1.3296.2.50 +1 -0 rpm/CHANGES 2.139.2.4 +12 -8 rpm/build/build.c 2.317.2.4 +11 -9 rpm/build/pack.c 2.17.2.5 +65 -12 rpm/rpmio/rpmbc.c ____________________________________________________________________________ patch -p0 <<'@@ .' Index: rpm/CHANGES ============================================================================ $ cvs diff -u -r1.3296.2.49 -r1.3296.2.50 CHANGES --- rpm/CHANGES 23 Jun 2010 07:12:41 -0000 1.3296.2.49 +++ rpm/CHANGES 25 Jun 2010 18:40:26 -0000 1.3296.2.50 @@ -1,4 +1,5 @@ 5.3.1 -> 5.3.2: + - jbj: pgp: fix: algo parameters to signature/pubkey with msbits(). - jbj: pgp: use the pubkey from header when installing. - jbj: pgp: retrieve pubkey from package header (if present). - jbj: pgp: add pgpArmorUnwrap to parse a pubkey from a buffer. @@ . patch -p0 <<'@@ .' Index: rpm/build/build.c ============================================================================ $ cvs diff -u -r2.139.2.3 -r2.139.2.4 build.c --- rpm/build/build.c 23 Jun 2010 04:08:04 -0000 2.139.2.3 +++ rpm/build/build.c 25 Jun 2010 18:40:27 -0000 2.139.2.4 @@ -339,14 +339,14 @@ static int rpmbcExportPubkey(pgpDig dig) { uint8_t pkt[8192]; -uint8_t * be = pkt; + uint8_t * be = pkt; size_t pktlen; time_t now = time(NULL); uint32_t bt = now; uint16_t bn; -pgpDigParams pubp = pgpGetPubkey(dig); -rpmbc bc = dig->impl; -int xx; + pgpDigParams pubp = pgpGetPubkey(dig); + rpmbc bc = dig->impl; + int xx; *be++ = 0x80 | (PGPTAG_PUBLIC_KEY << 2) | 0x01; be += 2; @@ -358,22 +358,26 @@ *be++ = (bt ); *be++ = pubp->pubkey_algo; - bn = MP_WORDS_TO_BITS(bc->dsa_keypair.param.p.size); + bn = mpbits(bc->dsa_keypair.param.p.size, bc->dsa_keypair.param.p.modl); + bn += 7; bn &= ~7; *be++ = (bn >> 8); *be++ = (bn ); xx = i2osp(be, bn/8, bc->dsa_keypair.param.p.modl, bc->dsa_keypair.param.p.size); be += bn/8; - bn = MP_WORDS_TO_BITS(bc->dsa_keypair.param.q.size); + bn = mpbits(bc->dsa_keypair.param.q.size, bc->dsa_keypair.param.q.modl); + bn += 7; bn &= ~7; *be++ = (bn >> 8); *be++ = (bn ); xx = i2osp(be, bn/8, bc->dsa_keypair.param.q.modl, bc->dsa_keypair.param.q.size); be += bn/8; - bn = MP_WORDS_TO_BITS(bc->dsa_keypair.param.g.size); + bn = mpbits(bc->dsa_keypair.param.g.size, bc->dsa_keypair.param.g.data); + bn += 7; bn &= ~7; *be++ = (bn >> 8); *be++ = (bn ); xx = i2osp(be, bn/8, bc->dsa_keypair.param.g.data, bc->dsa_keypair.param.g.size); be += bn/8; - bn = MP_WORDS_TO_BITS(bc->dsa_keypair.y.size); + bn = mpbits(bc->dsa_keypair.y.size, bc->dsa_keypair.y.data); + bn += 7; bn &= ~7; *be++ = (bn >> 8); *be++ = (bn ); xx = i2osp(be, bn/8, bc->dsa_keypair.y.data, bc->dsa_keypair.y.size); be += bn/8; @@ . patch -p0 <<'@@ .' Index: rpm/build/pack.c ============================================================================ $ cvs diff -u -r2.317.2.3 -r2.317.2.4 pack.c --- rpm/build/pack.c 23 Jun 2010 04:08:04 -0000 2.317.2.3 +++ rpm/build/pack.c 25 Jun 2010 18:40:27 -0000 2.317.2.4 @@ -638,16 +638,16 @@ static int rpmbcExportSignature(pgpDig dig, /*...@only@*/ DIGEST_CTX ctx) { uint8_t pkt[8192]; -uint8_t * be = pkt; -uint8_t * h; + uint8_t * be = pkt; + uint8_t * h; size_t pktlen; time_t now = time(NULL); uint32_t bt; uint16_t bn; -pgpDigParams pubp = pgpGetPubkey(dig); -pgpDigParams sigp = pgpGetSignature(dig); -rpmbc bc = dig->impl; -int xx; + pgpDigParams pubp = pgpGetPubkey(dig); + pgpDigParams sigp = pgpGetSignature(dig); + rpmbc bc = dig->impl; + int xx; sigp->tag = PGPTAG_SIGNATURE; *be++ = 0x80 | (sigp->tag << 2) | 0x01; @@ -720,7 +720,7 @@ assert(xx == 1); be += 2; /* skip unhashed length. */ -h = be; + h = be; *be++ = 1 + 8; /* issuer key ID */ *be++ = PGPSUBTYPE_ISSUER_KEYID; @@ -740,13 +740,15 @@ *be++ = sigp->signhash16[0]; /* signhash16 */ *be++ = sigp->signhash16[1]; - bn = MP_WORDS_TO_BITS(bc->r.size); + bn = mpbits(bc->r.size, bc->r.data); + bn += 7; bn &= ~7; *be++ = (bn >> 8); *be++ = (bn ); xx = i2osp(be, bn/8, bc->r.data, bc->r.size); be += bn/8; - bn = MP_WORDS_TO_BITS(bc->s.size); + bn = mpbits(bc->s.size, bc->s.data); + bn += 7; bn &= ~7; *be++ = (bn >> 8); *be++ = (bn ); xx = i2osp(be, bn/8, bc->s.data, bc->s.size); @@ . patch -p0 <<'@@ .' Index: rpm/rpmio/rpmbc.c ============================================================================ $ cvs diff -u -r2.17.2.4 -r2.17.2.5 rpmbc.c --- rpm/rpmio/rpmbc.c 23 Jun 2010 04:08:05 -0000 2.17.2.4 +++ rpm/rpmio/rpmbc.c 25 Jun 2010 18:40:27 -0000 2.17.2.5 @@ -56,6 +56,55 @@ return (unsigned char) '\0'; } +#define _spewMPB(_N, _MPB) \ + { mpbarrett * mpb = &(_MPB); \ + fprintf(stderr, "\t" _N ": "); mpfprintln(stderr, mpb->size, mpb->modl); \ + } + +#define _spewMPN(_N, _MPN) \ + { mpnumber * mpn = &(_MPN); \ + fprintf(stderr, "\t" _N ": "); mpfprintln(stderr, mpn->size, mpn->data); \ + } + +#ifdef UNUSED +static void rpmbcDumpRSA(const char * msg, rpmbc bc) +{ + if (msg) fprintf(stderr, "========== %s\n", msg); + + { + _spewMPB(" n", bc->rsa_keypair.n); + _spewMPN(" e", bc->rsa_keypair.e); + _spewMPN(" d", bc->rsa_keypair.d); + _spewMPB(" p", bc->rsa_keypair.p); + _spewMPB(" q", bc->rsa_keypair.q); + _spewMPN("dp", bc->rsa_keypair.dp); + _spewMPN("dq", bc->rsa_keypair.dq); + _spewMPN("qi", bc->rsa_keypair.qi); + } + + _spewMPN(" c", bc->c); + _spewMPN("hm", bc->hm); +} + +static void rpmbcDumpDSA(const char * msg, rpmbc bc) +{ + if (msg) fprintf(stderr, "========== %s\n", msg); + + { + _spewMPB(" p", bc->dsa_keypair.param.p); + _spewMPB(" q", bc->dsa_keypair.param.q); + _spewMPN(" g", bc->dsa_keypair.param.g); + _spewMPN(" y", bc->dsa_keypair.y); + } + + _spewMPN(" r", bc->r); + _spewMPN(" s", bc->s); + + _spewMPN("hm", bc->hm); + +} +#endif /* UNUSED */ + static int rpmbcSetRSA(/*...@only@*/ DIGEST_CTX ctx, pgpDig dig, pgpDigParams sigp) /*...@modifies dig @*/ @@ -66,7 +115,7 @@ const char * prefix = rpmDigestASN1(ctx); const char * hexstr; char * tt; - int rc; + int rc = 1; /* assume failure */ int xx; pgpDigParams pubp = pgpGetPubkey(dig); dig->pubkey_algoN = _pgpPubkeyAlgo2Name(pubp->pubkey_algo); @@ -74,7 +123,7 @@ assert(sigp->hash_algo == rpmDigestAlgo(ctx)); if (prefix == NULL) - return 1; + goto exit; /* * The no. of bytes for hash + PKCS1 padding is needed. @@ -88,7 +137,7 @@ nbits = (unsigned) MP_WORDS_TO_BITS(bc->rsa_keypair.n.size); nb = (nbits + 7) >> 3; /* XXX overkill */ if (nb < 64/8 || nb > 65536/8) /* XXX generous "sanity" check */ - return 1; + goto exit; /* XXX FIXME: do PKCS1 padding in binary not hex */ /* XXX FIXME: should this lazy free be done elsewhere? */ @@ -119,6 +168,8 @@ s[1] = (rpmuint8_t) (nibble(str[2]) << 4) | nibble(str[3]); rc = memcmp(s, t, sizeof(sigp->signhash16)); } + +exit: SPEW(0, !rc, dig); return rc; } @@ -671,8 +722,6 @@ fprintf(stderr, "*** %s %s\n", pre, t); (void) mpnsethex(mpn, t); t = _free(t); -if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, mpn->size, mpn->data); return 0; } @@ -697,43 +746,47 @@ case 10: /* RSA m**d */ (void) mpnsethex(&bc->c, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->c.size, bc->c.data); +_spewMPN(" c", bc->c); break; case 20: /* DSA r */ rc = pgpMpiSet(pre, 160, &bc->r, p, pend); +if (_pgp_debug && _pgp_print) +_spewMPN(" r", bc->r); break; case 21: /* DSA s */ rc = pgpMpiSet(pre, 160, &bc->s, p, pend); +if (_pgp_debug && _pgp_print) +_spewMPN(" s", bc->s); break; case 30: /* RSA n */ (void) mpbsethex(&bc->rsa_keypair.n, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->rsa_keypair.n.size, bc->rsa_keypair.n.modl); +_spewMPB(" n", bc->dsa_keypair.param.n); break; case 31: /* RSA e */ (void) mpnsethex(&bc->rsa_keypair.e, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->rsa_keypair.e.size, bc->rsa_keypair.e.data); +_spewMPN(" e", bc->rsa_keypair.e); break; case 40: /* DSA p */ (void) mpbsethex(&bc->dsa_keypair.param.p, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->dsa_keypair.param.p.size, bc->dsa_keypair.param.p.modl); +_spewMPB(" p", bc->dsa_keypair.param.p); break; case 41: /* DSA q */ (void) mpbsethex(&bc->dsa_keypair.param.q, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->dsa_keypair.param.q.size, bc->dsa_keypair.param.q.modl); +_spewMPB(" q", bc->dsa_keypair.param.q); break; case 42: /* DSA g */ (void) mpnsethex(&bc->dsa_keypair.param.g, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->dsa_keypair.param.g.size, bc->dsa_keypair.param.g.data); +_spewMPN(" g", bc->dsa_keypair.param.g); break; case 43: /* DSA y */ (void) mpnsethex(&bc->dsa_keypair.y, s = pgpMpiHex(p)); if (_pgp_debug && _pgp_print) -fprintf(stderr, "\t %s ", pre), mpfprintln(stderr, bc->dsa_keypair.y.size, bc->dsa_keypair.y.data); +_spewMPN(" y", bc->dsa_keypair.y); break; } s = _free(s); @@ . ______________________________________________________________________ RPM Package Manager http://rpm5.org CVS Sources Repository [email protected]
