/* compile: gcc -o dblist dblist.c -I/usr/local/include/db -I/usr/local/ssl/include -L/usr/local/lib -L/usr/local/ssl/lib -ldb -lcrypto GNU copyleft ariel@columbia.edu, blah blah blah... */ #include #include #include #include #include #include #include #include #include #include #include "x509.h" #include "asn1.h" #define MAXSTRLEN 4096 extern char *sys_errlist[]; char *whoami; main(argc, argv) int argc; char **argv; { char *dbname; int offset=14; /* ns 4.0x */ DB *db; DBT dkey,dvalue; int result; char oname[40]; int j; int fout; int find; char *p; int ptag=0, pclass, plen; X509 *mycert; char *shortname; whoami=argv[0]; if (argc!=2) { fprintf(stderr,"usage: %s dbname\n",whoami); exit(1); } dbname=argv[1]; if ((db=dbopen(dbname,O_RDONLY,0,DB_HASH,NULL)) == NULL ) { fprintf(stderr,"open of db '%s' failed: '%s'\n",dbname,sys_errlist[errno]); exit(1); } if ((find=open("cert-index",O_WRONLY|O_CREAT|O_TRUNC,0755)) == -1) { fprintf(stderr,"couldn't open %s\n",oname); exit(1); } j=0; while ((result=(db->seq(db,&dkey,&dvalue,R_NEXT))) == 0) { if ((dvalue.size)-offset > 500) { p=(char *)dvalue.data+offset-1; ASN1_get_object((unsigned char **)&p,(long *)&plen,&ptag,&pclass,dvalue.size); if (ptag==V_ASN1_SEQUENCE) { /* ok, it might be a cert then. */ /* include length of object header junk */ plen+=p-((char *)dvalue.data+offset-1); mycert=NULL; p=(char *)dvalue.data+offset-1; d2i_X509(&mycert,(unsigned char **)&p,plen); if (mycert==NULL) { /* must be garbage after all */ continue; } j++; sprintf(oname,"cert-%d",j); if ((fout=open(oname,O_WRONLY|O_CREAT|O_TRUNC,0755)) == -1) { fprintf(stderr,"couldn't open %s\n",oname); continue; } write(fout,(char *)dvalue.data+offset-1,plen); close(fout); write(find,oname,strlen(oname)); write(find," '",3); shortname=(char *)dvalue.data+offset-1+plen; write(find,shortname,dvalue.size-plen-offset+1); write(find,"'\n",2); } else fprintf(stderr,"ptag is %d, plen is %d\n",ptag,plen); } } close(find); db->close(db); return(0); }