RPM Community Forums

Mailing List Message of <rpm-cvs>

[CVS] RPM: rpm/ CHANGES rpm/lib/ rpmchecksig.c signature.c

From: Jeff Johnson <jbj@rpm5.org>
Date: Thu 16 Aug 2007 - 20:36:05 CEST
Message-Id: <20070816183605.34519348455@rpm5.org>
  RPM Package Manager, CVS Repository
  http://rpm5.org/cvs/
  ____________________________________________________________________________

  Server: rpm5.org                         Name:   Jeff Johnson
  Root:   /v/rpm/cvs                       Email:  jbj@rpm5.org
  Module: rpm                              Date:   16-Aug-2007 20:36:05
  Branch: HEAD                             Handle: 2007081619360400

  Modified files:
    rpm                     CHANGES
    rpm/lib                 rpmchecksig.c signature.c

  Log:
    - functional sign/verify on --nolead packages.

  Summary:
    Revision    Changes     Path
    1.1576      +1  -0      rpm/CHANGES
    1.126       +35 -2      rpm/lib/rpmchecksig.c
    2.176       +25 -4      rpm/lib/signature.c
  ____________________________________________________________________________

  patch -p0 <<'@@ .'
  Index: rpm/CHANGES
  ============================================================================
  $ cvs diff -u -r1.1575 -r1.1576 CHANGES
  --- rpm/CHANGES	15 Aug 2007 13:23:05 -0000	1.1575
  +++ rpm/CHANGES	16 Aug 2007 18:36:04 -0000	1.1576
  @@ -1,4 +1,5 @@
   4.5 -> 5.0:
  +    - jbj: functional sign/verify on --nolead packages.
       - jbj: add rpmkey, a keyctl(1) clone.
       - jbj: disable RPMv3 RSA/DSA signing.
       - jbj: mark RPMv3 code for optional compilation.
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/rpmchecksig.c
  ============================================================================
  $ cvs diff -u -r1.125 -r1.126 rpmchecksig.c
  --- rpm/lib/rpmchecksig.c	14 Aug 2007 17:35:55 -0000	1.125
  +++ rpm/lib/rpmchecksig.c	16 Aug 2007 18:36:04 -0000	1.126
  @@ -26,6 +26,10 @@
   /*@unchecked@*/
   int _print_pkts = 0;
   
  +extern int _nolead;
  +extern int _nosigh;
  +extern int _newmagic;
  +
   /**
    */
   /*@-boundsread@*/
  @@ -211,6 +215,9 @@
   /*@-boundswrite@*/
   	memset(l, 0, sizeof(*l));
   /*@=boundswrite@*/
  +	l->signature_type = RPMSIGTYPE_HEADERSIG;
  +
  +if (!_nolead) {
   	rc = readLead(fd, l);
   	if (rc != RPMRC_OK) {
   	    rpmError(RPMERR_READLEAD, _("%s: not an rpm package\n"), rpm);
  @@ -228,7 +235,9 @@
   	default:
   	    /*@switchbreak@*/ break;
   	}
  +}
   
  +if (!_nosigh) {
   	msg = NULL;
   	rc = rpmReadSignature(fd, &sigh, l->signature_type, &msg);
   	switch (rc) {
  @@ -246,6 +255,7 @@
   	    /*@switchbreak@*/ break;
   	}
   	msg = _free(msg);
  +}
   
   	/* Write the header and archive to a temp file */
   	/* ASSERT: ofd == NULL && sigtarget == NULL */
  @@ -382,6 +392,7 @@
   	if (manageFile(&ofd, &trpm, O_WRONLY|O_CREAT|O_TRUNC, 0))
   	    goto exit;
   
  +if (!_nolead) {
   	l->signature_type = RPMSIGTYPE_HEADERSIG;
   	rc = writeLead(ofd, l);
   	if (rc != RPMRC_OK) {
  @@ -389,12 +400,15 @@
   		Fstrerror(ofd));
   	    goto exit;
   	}
  +}
   
  +if (!_nosigh) {
   	if (rpmWriteSignature(ofd, sigh)) {
   	    rpmError(RPMERR_SIGGEN, _("%s: rpmWriteSignature failed: %s\n"), trpm,
   		Fstrerror(ofd));
   	    goto exit;
   	}
  +}
   
   	/* Append the header and archive from the temp file */
   	/* ASSERT: fd == NULL && ofd != NULL */
  @@ -650,6 +664,18 @@
           0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00
   };
   
  +#ifdef	NOTYET
  +/*@observer@*/ /*@unchecked@*/
  +static unsigned char sigh_magic[8] = {
  +	0x8e, 0xad, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00
  +};
  +#endif
  +
  +/*@observer@*/ /*@unchecked@*/
  +static unsigned char meta_magic[8] = {
  +	0x8e, 0xad, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00
  +};
  +
   /**
    * @todo If the GPG key was known available, the md5 digest could be skipped.
    */
  @@ -674,6 +700,7 @@
   	dig->nbytes += headerSizeof(h);
   
   	if (headerIsEntry(h, RPMTAG_HEADERIMMUTABLE)) {
  +	    unsigned char * hmagic = (_newmagic ? meta_magic : header_magic);
   	    void * uh;
   	    int_32 uht, uhc;
   	
  @@ -685,10 +712,10 @@
   		goto exit;
   	    }
   	    dig->hdrsha1ctx = rpmDigestInit(PGPHASHALGO_SHA1, RPMDIGEST_NONE);
  -	    (void) rpmDigestUpdate(dig->hdrsha1ctx, header_magic, sizeof(header_magic));
  +	    (void) rpmDigestUpdate(dig->hdrsha1ctx, hmagic, sizeof(header_magic));
   	    (void) rpmDigestUpdate(dig->hdrsha1ctx, uh, uhc);
   	    dig->hdrmd5ctx = rpmDigestInit(dig->signature.hash_algo, RPMDIGEST_NONE);
  -	    (void) rpmDigestUpdate(dig->hdrmd5ctx, header_magic, sizeof(header_magic));
  +	    (void) rpmDigestUpdate(dig->hdrmd5ctx, hmagic, sizeof(header_magic));
   	    (void) rpmDigestUpdate(dig->hdrmd5ctx, uh, uhc);
   	    uh = headerFreeData(uh, uht);
   	}
  @@ -763,6 +790,9 @@
   /*@-boundswrite@*/
   	memset(l, 0, sizeof(*l));
   /*@=boundswrite@*/
  +	l->signature_type = RPMSIGTYPE_HEADERSIG;
  +
  +if (!_nolead) {
   	rc = readLead(fd, l);
   	if (rc != RPMRC_OK) {
   	    rpmError(RPMERR_READLEAD, _("%s: not an rpm package\n"), fn);
  @@ -778,7 +808,9 @@
   	default:
   	    /*@switchbreak@*/ break;
   	}
  +}
   
  +if (!_nosigh) {
   	msg = NULL;
   	rc = rpmReadSignature(fd, &sigh, l->signature_type, &msg);
   	switch (rc) {
  @@ -798,6 +830,7 @@
   	    /*@switchbreak@*/ break;
   	}
   	msg = _free(msg);
  +}
   
   	/* Grab a hint of what needs doing to avoid duplication. */
   	sigtag = 0;
  @@ .
  patch -p0 <<'@@ .'
  Index: rpm/lib/signature.c
  ============================================================================
  $ cvs diff -u -r2.175 -r2.176 signature.c
  --- rpm/lib/signature.c	14 Aug 2007 17:35:55 -0000	2.175
  +++ rpm/lib/signature.c	16 Aug 2007 18:36:04 -0000	2.176
  @@ -141,10 +141,25 @@
   }
   
   /*@unchecked@*/
  +extern int _newmagic;
  +
  +/*@unchecked@*/
   static unsigned char header_magic[8] = {
       0x8e, 0xad, 0xe8, 0x01, 0x00, 0x00, 0x00, 0x00
   };
   
  +/*@observer@*/ /*@unchecked@*/
  +static unsigned char sigh_magic[8] = {
  +	0x8e, 0xad, 0xe8, 0x3e, 0x00, 0x00, 0x00, 0x00
  +};
  +
  +#ifdef	NOTYET
  +/*@observer@*/ /*@unchecked@*/
  +static unsigned char meta_magic[8] = {
  +	0x8e, 0xad, 0xe8, 0x3f, 0x00, 0x00, 0x00, 0x00
  +};
  +#endif
  +
   rpmRC rpmReadSignature(void * _fd, Header * sighp, sigType sig_type,
   		const char ** msg)
   {
  @@ -171,8 +186,11 @@
   
       buf[0] = '\0';
   
  -    if (sig_type != RPMSIGTYPE_HEADERSIG)
  +    if (sig_type != RPMSIGTYPE_HEADERSIG) {
  +	(void) snprintf(buf, sizeof(buf),
  +		_("sigh type(%d): BAD\n"), sig_type);
   	goto exit;
  +    }
   
       memset(block, 0, sizeof(block));
       if ((xx = timedRead(fd, (void *)block, sizeof(block))) != sizeof(block)) {
  @@ -180,10 +198,13 @@
   		_("sigh size(%d): BAD, read returned %d\n"), (int)sizeof(block), xx);
   	goto exit;
       }
  -    if (memcmp(block, header_magic, sizeof(header_magic))) {
  -	(void) snprintf(buf, sizeof(buf),
  +    {   unsigned char * hmagic = (_newmagic ? sigh_magic : header_magic);
  +
  +	if (memcmp(block, hmagic, sizeof(header_magic))) {
  +	    (void) snprintf(buf, sizeof(buf),
   		_("sigh magic: BAD\n"));
  -	goto exit;
  +	    goto exit;
  +	}
       }
       il = ntohl(block[2]);
       if (il < 0 || il > 32) {
  @@ .
Received on Thu Aug 16 20:36:05 2007
Driven by Jeff Johnson and the RPM project team.
Hosted by OpenPKG and Ralf S. Engelschall.
Powered by FreeBSD and OpenPKG.