2 * sha1sum - compute SHA1 or SHA2 digest
8 #pragma varargck type "M" uchar*
10 static char exitstr[ERRMAX];
12 typedef struct Sha2 Sha2;
16 DigestState* (*func)(uchar *, ulong, uchar *, DigestState *);
19 static Sha2 sha2s[] = {
20 224, SHA2_224dlen, sha2_224,
21 256, SHA2_256dlen, sha2_256,
22 384, SHA2_384dlen, sha2_384,
23 512, SHA2_512dlen, sha2_512,
26 static DigestState* (*shafunc)(uchar *, ulong, uchar *, DigestState *);
32 char buf[SHA2_512dlen*2 + 1];
36 p = va_arg(fmt->args, uchar*);
37 for(i = 0; i < shadlen; i++)
38 sprint(buf + 2*i, "%.2ux", p[i]);
39 return fmtstrcpy(fmt, buf);
43 sum(int fd, char *name)
46 uchar buf[8192], digest[SHA2_512dlen];
49 s = (*shafunc)(nil, 0, nil, nil);
50 while((n = read(fd, buf, sizeof buf)) > 0)
51 (*shafunc)(buf, n, nil, s);
53 snprint(exitstr, sizeof(exitstr), "reading %s: %r\n", name? name: "stdin");
54 fprint(2, "%s", exitstr);
57 (*shafunc)(nil, 0, digest, s);
59 print("%M\n", digest);
61 print("%M\t%s\n", digest, name);
67 fprint(2, "usage: %s [-2 bits] [file...]\n", argv0);
72 main(int argc, char *argv[])
81 bits = atoi(EARGF(usage()));
82 for (sha = sha2s; sha < sha2s + nelem(sha2s); sha++)
83 if (sha->bits == bits)
85 if (sha >= sha2s + nelem(sha2s))
86 sysfatal("unknown number of sha2 bits: %d", bits);
94 fmtinstall('M', digestfmt);
99 for(i = 0; i < argc; i++){
100 fd = open(argv[i], OREAD);
102 snprint(exitstr, sizeof(exitstr), "can't open %s: %r", argv[i]);
103 fprint(2, "%s: %s\n", argv0, exitstr);