sha1sum.c 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  1. /*
  2. * sha1sum - compute SHA1 or SHA2 digest
  3. */
  4. #include <u.h>
  5. #include <libc.h>
  6. #include <bio.h>
  7. #include <libsec.h>
  8. #pragma varargck type "M" uchar*
  9. typedef struct Sha2 Sha2;
  10. struct Sha2 {
  11. int bits;
  12. int dlen;
  13. DigestState* (*func)(uchar *, ulong, uchar *, DigestState *);
  14. };
  15. static Sha2 sha2s[] = {
  16. 224, SHA2_224dlen, sha2_224,
  17. 256, SHA2_256dlen, sha2_256,
  18. 384, SHA2_384dlen, sha2_384,
  19. 512, SHA2_512dlen, sha2_512,
  20. };
  21. static DigestState* (*shafunc)(uchar *, ulong, uchar *, DigestState *);
  22. static int shadlen;
  23. static int
  24. digestfmt(Fmt *fmt)
  25. {
  26. char buf[SHA2_512dlen*2 + 1];
  27. uchar *p;
  28. int i;
  29. p = va_arg(fmt->args, uchar*);
  30. for(i = 0; i < shadlen; i++)
  31. sprint(buf + 2*i, "%.2ux", p[i]);
  32. return fmtstrcpy(fmt, buf);
  33. }
  34. static void
  35. sum(int fd, char *name)
  36. {
  37. int n;
  38. uchar buf[8192], digest[SHA2_512dlen];
  39. DigestState *s;
  40. s = (*shafunc)(nil, 0, nil, nil);
  41. while((n = read(fd, buf, sizeof buf)) > 0)
  42. (*shafunc)(buf, n, nil, s);
  43. if(n < 0){
  44. fprint(2, "reading %s: %r\n", name? name: "stdin");
  45. return;
  46. }
  47. (*shafunc)(nil, 0, digest, s);
  48. if(name == nil)
  49. print("%M\n", digest);
  50. else
  51. print("%M\t%s\n", digest, name);
  52. }
  53. static void
  54. usage(void)
  55. {
  56. fprint(2, "usage: %s [-2 bits] [file...]\n", argv0);
  57. exits("usage");
  58. }
  59. void
  60. main(int argc, char *argv[])
  61. {
  62. int i, fd, bits;
  63. Sha2 *sha;
  64. shafunc = sha1;
  65. shadlen = SHA1dlen;
  66. ARGBEGIN{
  67. case '2':
  68. bits = atoi(EARGF(usage()));
  69. for (sha = sha2s; sha < sha2s + nelem(sha2s); sha++)
  70. if (sha->bits == bits)
  71. break;
  72. if (sha >= sha2s + nelem(sha2s))
  73. sysfatal("unknown number of sha2 bits: %d", bits);
  74. shafunc = sha->func;
  75. shadlen = sha->dlen;
  76. break;
  77. default:
  78. usage();
  79. }ARGEND
  80. fmtinstall('M', digestfmt);
  81. if(argc == 0)
  82. sum(0, nil);
  83. else
  84. for(i = 0; i < argc; i++){
  85. fd = open(argv[i], OREAD);
  86. if(fd < 0){
  87. fprint(2, "%s: can't open %s: %r\n", argv0, argv[i]);
  88. continue;
  89. }
  90. sum(fd, argv[i]);
  91. close(fd);
  92. }
  93. exits(nil);
  94. }