[prev in list] [next in list] [prev in thread] [next in thread] 

List:       pgp-keyserver-folk
Subject:    [schoepf@proteosys.de: patch_pgputil.c_take3]
From:       Christoph Martin <martin () uni-mainz ! de>
Date:       2001-07-20 17:03:38
[Download RAW message or body]

Hi folks,

some time ago a friend of mine wrote a patch for pgputil.c to include
x509 certificates in pksd. Perhaps we can include it in pksd.

Christoph


Return-Path: <schoepf@proteosys.de>
Received: via tmail-4.1(11) (invoked by user martin) for martin; Thu, 26 Oct 2000 17:12:03 +0200 (MEST)
Received: from mailgate1.zdv.Uni-Mainz.DE (mailgate1.zdv.Uni-Mainz.DE [134.93.8.56])
	by mail.Uni-Mainz.DE (8.9.3/8.9.3) with ESMTP id RAA27615
	for <martin@mail.uni-mainz.de>; Thu, 26 Oct 2000 17:12:03 +0200 (MEST)
Received: from webgate.proteosys.de (mail.proteosys-ag.com [62.225.9.49])
	by mailgate1.zdv.Uni-Mainz.DE (8.11.0/8.10.2) with ESMTP id e9QFBvR13175
	for <martin@uni-mainz.de>; Thu, 26 Oct 2000 17:12:02 +0200 (MET DST)
Received: by webgate.proteosys.de (8.11.0/8.11.0) with ESMTP id e9QFA7v31791 .
	for <martin@uni-mainz.de>; Thu, 26 Oct 2000 17:10:08 +0200
Message-Id: <200010261511.e9QFBuk00387@lucy.proteosys>
Date: Thu, 26 Oct 2000 17:11:56 +0200
From: schoepf@proteosys.de
To: martin@uni-mainz.de
Subject: patch_pgputil.c_take3
X-Status: 
X-Keywords:                  
X-UID: 3929

*** pgputil.c.~1~	Wed May 26 05:35:28 1999
--- pgputil.c	Thu Oct 26 15:45:00 2000
***************
*** 16,21 ****
--- 16,25 ----
  #include "armor.h"
  #include "shs.h"
  
+ #ifdef HANDLE_X509
+ #include <openssl/x509.h>
+ #endif
+ 
  int generate_dsa_keyid(ddesc *data, unsigned char *keyid)
  {
     unsigned char hash[20];
***************
*** 142,147 ****
--- 146,202 ----
     return(1);
  }
  
+ #ifdef HANDLE_X509
+ int decode_x509(ddesc *data, long len, ddesc *keyid)
+ {
+    X509 *cert = NULL;
+    EVP_PKEY *pkey;
+    int ret = 0;
+    char *keyid_hex;
+    BIGNUM *b;
+    unsigned char *data_start = data->data+data->offset;
+ 
+    if (d2i_X509(&cert, &data_start, len) != NULL) {
+       /* X.509 certificate has been parsed,
+          now get keyid = last 4 bytes of modulus */
+       pkey = X509_get_pubkey(cert);
+       if (pkey != NULL && pkey->type == EVP_PKEY_RSA) {
+          /* pkey->pkey.rsa->n is the modulus */
+ 	 b = BN_dup(pkey->pkey.rsa->n);
+ 	 BN_mask_bits(b,32);
+          keyid_hex = BN_bn2hex(b);
+          if (keyid_hex != NULL) {
+             /* left pad with zeroes if necessary */
+ 	    if ((keyid->data = malloc(8)) != NULL) {
+ 	       memset(keyid->data,'0',8);
+                memcpy(keyid->data+8-strlen(keyid_hex),keyid_hex,strlen(keyid_hex));
+ 	       free(keyid_hex);
+ 	       keyid->size = 8;
+ 	       ret = 1;
+ 	    }
+ 	 }
+       }
+    }
+    data->offset += len;
+    return(ret);
+ }
+ 
+ int decode_nai(ddesc *data, long len, ddesc *keyid)
+ {
+    len -= 3;			/* skip header */
+    if (len < 0 || data->data[data->offset++] != 1 ||
+        data->data[data->offset++] != 1 ||
+        data->data[data->offset++] != 4) {
+       /* don't know how to handle this case */
+       data->offset += len;
+       return(0);
+    }
+ 
+    /* here follows an asn.1 coded X.509 certificate */
+    return(decode_x509(data, len, keyid));
+ }
+ #endif
+ 
  int decode_subpacket(ddesc *data, time_t *sig_time, ddesc *keyid)
  {
     long OverallSPlen;
***************
*** 165,170 ****
--- 220,229 ----
           decode_time(data, sig_time);
        else if (SPtype == 16)		/* keyid of signer */
  	 decode_bytestr(data, SPlen - 1, keyid);
+ #ifdef HANDLE_X509
+       else if (SPtype == 100)           /* NAI private */
+ 	 decode_nai(data, SPlen - 1, keyid);
+ #endif
        else
           data->offset += SPlen - 1;
  
***************
*** 275,280 ****
--- 334,341 ----
     char msg[100];
  #endif
  
+    keyid->size = 0;
+ 
     if (!decode_num(data, 1, &version))
        return(0);
  
***************
*** 372,377 ****
--- 433,444 ----
           if (!decode_mpi(data, &sig) || !decode_mpi(data, &sig))
  	    return(0);
           break;
+ #if 0
+       case 100: /* X.509 */
+ 	 if (!decode_x509(data, &sig)
+ 	    return(0);
+          break;
+ #endif
        default:
           /* this is kind of ugly.  There can be any number of MPI's here
              (although 2 is the largest and most likely number. */
***************
*** 395,401 ****
        }
     }
  
!    return(1);
  }
  
  int decode_packet(ddesc *data, packet_handler h, void *c)
--- 462,468 ----
        }
     }
  
!    return(keyid->size > 0);
  }
  
  int decode_packet(ddesc *data, packet_handler h, void *c)


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic