readcert.c 1.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <auth.h>
  4. #include <mp.h>
  5. #include <libsec.h>
  6. static char*
  7. readfile(char *name)
  8. {
  9. int fd;
  10. char *s;
  11. Dir *d;
  12. fd = open(name, OREAD);
  13. if(fd < 0)
  14. return nil;
  15. if((d = dirfstat(fd)) == nil) {
  16. close(fd);
  17. return nil;
  18. }
  19. s = malloc(d->length + 1);
  20. if(s == nil || readn(fd, s, d->length) != d->length){
  21. free(s);
  22. free(d);
  23. close(fd);
  24. return nil;
  25. }
  26. close(fd);
  27. s[d->length] = '\0';
  28. free(d);
  29. return s;
  30. }
  31. uchar*
  32. readcert(char *filename, int *pcertlen)
  33. {
  34. char *pem;
  35. uchar *binary;
  36. pem = readfile(filename);
  37. if(pem == nil){
  38. werrstr("can't read %s: %r", filename);
  39. return nil;
  40. }
  41. binary = decodePEM(pem, "CERTIFICATE", pcertlen, nil);
  42. free(pem);
  43. if(binary == nil){
  44. werrstr("can't parse %s", filename);
  45. return nil;
  46. }
  47. return binary;
  48. }
  49. PEMChain *
  50. readcertchain(char *filename)
  51. {
  52. char *chfile;
  53. chfile = readfile(filename);
  54. if (chfile == nil) {
  55. werrstr("can't read %s: %r", filename);
  56. return nil;
  57. }
  58. return decodepemchain(chfile, "CERTIFICATE");
  59. }