thumb.c 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  1. #include <u.h>
  2. #include <libc.h>
  3. #include <bio.h>
  4. #include <auth.h>
  5. #include <mp.h>
  6. #include <libsec.h>
  7. enum{ ThumbTab = 1<<10 };
  8. static void *
  9. emalloc(int n)
  10. {
  11. void *p;
  12. if(n==0)
  13. n=1;
  14. p = malloc(n);
  15. if(p == nil){
  16. exits("out of memory");
  17. }
  18. memset(p, 0, n);
  19. return p;
  20. }
  21. void
  22. freeThumbprints(Thumbprint *table)
  23. {
  24. Thumbprint *hd, *p, *q;
  25. for(hd = table; hd < table+ThumbTab; hd++){
  26. for(p = hd->next; p; p = q){
  27. q = p->next;
  28. free(p);
  29. }
  30. }
  31. free(table);
  32. }
  33. int
  34. okThumbprint(uchar *sum, Thumbprint *table)
  35. {
  36. Thumbprint *p;
  37. int i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1);
  38. for(p = table[i].next; p; p = p->next)
  39. if(memcmp(sum, p->sha1, SHA1dlen) == 0)
  40. return 1;
  41. return 0;
  42. }
  43. static void
  44. loadThumbprints(char *file, Thumbprint *table, Thumbprint *crltab)
  45. {
  46. Thumbprint *entry;
  47. Biobuf *bin;
  48. char *line, *field[50];
  49. uchar sum[SHA1dlen];
  50. int i;
  51. bin = Bopen(file, OREAD);
  52. if(bin == nil)
  53. return;
  54. for(; (line = Brdstr(bin, '\n', 1)) != 0; free(line)){
  55. if(tokenize(line, field, nelem(field)) < 2)
  56. continue;
  57. if(strcmp(field[0], "#include") == 0){
  58. loadThumbprints(field[1], table, crltab);
  59. continue;
  60. }
  61. if(strcmp(field[0], "x509") != 0 || strncmp(field[1], "sha1=", strlen("sha1=")) != 0)
  62. continue;
  63. field[1] += strlen("sha1=");
  64. dec16(sum, sizeof(sum), field[1], strlen(field[1]));
  65. if(crltab && okThumbprint(sum, crltab))
  66. continue;
  67. entry = (Thumbprint*)emalloc(sizeof(*entry));
  68. memcpy(entry->sha1, sum, SHA1dlen);
  69. i = ((sum[0]<<8) + sum[1]) & (ThumbTab-1);
  70. entry->next = table[i].next;
  71. table[i].next = entry;
  72. }
  73. Bterm(bin);
  74. }
  75. Thumbprint *
  76. initThumbprints(char *ok, char *crl)
  77. {
  78. Thumbprint *table, *crltab = nil;
  79. if(crl){
  80. crltab = emalloc(ThumbTab * sizeof(*table));
  81. loadThumbprints(crl, crltab, nil);
  82. }
  83. table = emalloc(ThumbTab * sizeof(*table));
  84. loadThumbprints(ok, table, crltab);
  85. free(crltab);
  86. return table;
  87. }