X509gen.c 1.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <mp.h>
  5. #include <libsec.h>
  6. int PEMflag = 0;
  7. void
  8. main(int argc, char **argv)
  9. {
  10. Biobuf *bin;
  11. int len, pemlen;
  12. char *keystr, *field[20], *buf;
  13. uchar *cert;
  14. RSApriv priv;
  15. ulong valid[2];
  16. valid[0] = time(0);
  17. valid[1] = valid[0] + 3*366*24*60*60;
  18. ARGBEGIN{
  19. case 'e':
  20. valid[1] = valid[0] + strtoul(ARGF(), 0, 10);
  21. break;
  22. case 'p':
  23. PEMflag = 1;
  24. break;
  25. }ARGEND
  26. fmtinstall('B', mpfmt);
  27. fmtinstall('H', encodefmt);
  28. if(argc<2){
  29. fprint(2, "usage: aux/X509gen key.secret 'C=US ...CN=xxx' > cert");
  30. exits("X509gen usage");
  31. }
  32. bin = Bopen(argv[0], OREAD);
  33. if(bin == nil){
  34. fprint(2, "can't open %s", argv[0]);
  35. exits("gen_x509 open key.secret");
  36. }
  37. keystr = Brdstr(bin, '\n', 1);
  38. Bterm(bin);
  39. if(tokenize(keystr, field, nelem(field)) != 9){
  40. fprint(2, "expected 9 fields in %s", argv[0]);
  41. exits("gen_x509 fields");
  42. }
  43. priv.pub.ek = strtomp(field[1], nil, 16, nil);
  44. priv.dk = strtomp(field[2], nil, 16, nil);
  45. priv.pub.n = strtomp(field[3], nil, 16, nil);
  46. priv.p = strtomp(field[4], nil, 16, nil);
  47. priv.q = strtomp(field[5], nil, 16, nil);
  48. priv.kp = strtomp(field[6], nil, 16, nil);
  49. priv.kq = strtomp(field[7], nil, 16, nil);
  50. priv.c2 = strtomp(field[8], nil, 16, nil);
  51. cert = X509gen(&priv, argv[1], valid, &len);
  52. if(cert == nil){
  53. fprint(2, "X509gen failed");
  54. exits("X509gen");
  55. }
  56. if(!PEMflag){
  57. write(1, cert, len);
  58. }else{
  59. pemlen = 2*len;
  60. buf = malloc(pemlen);
  61. if(!buf)
  62. exits("out of memory");
  63. pemlen = enc64(buf, pemlen, cert, len);
  64. print("-----BEGIN CERTIFICATE-----\n");
  65. while(pemlen > 64){
  66. write(1, buf, 64);
  67. write(1, "\n", 1);
  68. buf += 64;
  69. pemlen -= 64;
  70. }
  71. print("%s\n-----END CERTIFICATE-----\n", buf);
  72. }
  73. exits("");
  74. }