/* make-dns-cert.c - An OpenPGP-to-DNS CERT conversion tool * Copyright (C) 2006 Free Software Foundation, Inc. * * This file is part of GnuPG. * * GnuPG is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * GnuPG is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, * USA. */ #include #include #ifdef HAVE_GETOPT_H #include #endif #include #include #include #include #include #include #include /* We use TYPE37 instead of CERT since not all nameservers can handle CERT yet... */ static int cert_key(const char *name,const char *keyfile) { int fd,ret=1,err,i; struct stat statbuf; fd=open(keyfile,O_RDONLY); if(fd==-1) { printf("Cannot open key file %s: %s\n",keyfile,strerror(errno)); return 1; } err=fstat(fd,&statbuf); if(err==-1) { printf("Unable to stat key file %s: %s\n",keyfile,strerror(errno)); goto fail; } if(statbuf.st_size>32768) { printf("Key %s too large for CERT encoding\n",keyfile); goto fail; } printf("%s\tTYPE37\t\\# %u 0003 0000 00 ", name,(unsigned int)statbuf.st_size+5); err=1; while(err!=0) { unsigned char buffer[1024]; err=read(fd,buffer,1024); if(err==-1) { printf("Unable to read key file %s: %s\n",keyfile,strerror(errno)); goto fail; } for(i=0;i1 && strcmp(argv[1],"--version")==0) { printf("make-dns-cert (GnuPG) " VERSION "\n"); return 0; } else if(argc>1 && strcmp(argv[1],"--help")==0) { usage(); return 0; } while((arg=getopt(argc,argv,"hf:u:k:n:"))!=-1) switch(arg) { default: case 'h': usage(); exit(0); case 'f': fpr=optarg; break; case 'u': url=optarg; break; case 'k': keyfile=optarg; break; case 'n': name=optarg; break; } if(!name) { printf("No name provided\n"); return 1; } if(keyfile && (fpr || url)) { printf("Cannot generate a CERT record with both a keyfile and" " a fingerprint or URL\n"); return 1; } if(keyfile) err=cert_key(name,keyfile); else err=url_key(name,fpr,url); return err; }