2 * sha1sum - compute SHA1 or SHA2 digest
9 #pragma varargck type "M" uchar*
11 typedef struct Sha2 Sha2;
15 DigestState* (*func)(uchar *, ulong, uchar *, DigestState *);
18 static Sha2 sha2s[] = {
19 224, SHA2_224dlen, sha2_224,
20 256, SHA2_256dlen, sha2_256,
21 384, SHA2_384dlen, sha2_384,
22 512, SHA2_512dlen, sha2_512,
25 static DigestState* (*shafunc)(uchar *, ulong, uchar *, DigestState *);
31 char buf[SHA2_512dlen*2 + 1];
35 p = va_arg(fmt->args, uchar*);
36 for(i = 0; i < shadlen; i++)
37 sprint(buf + 2*i, "%.2ux", p[i]);
38 return fmtstrcpy(fmt, buf);
42 sum(int fd, char *name)
45 uchar buf[8192], digest[SHA2_512dlen];
48 s = (*shafunc)(nil, 0, nil, nil);
49 while((n = read(fd, buf, sizeof buf)) > 0)
50 (*shafunc)(buf, n, nil, s);
52 fprint(2, "reading %s: %r\n", name? name: "stdin");
55 (*shafunc)(nil, 0, digest, s);
57 print("%M\n", digest);
59 print("%M\t%s\n", digest, name);
65 fprint(2, "usage: %s [-2 bits] [file...]\n", argv0);
70 main(int argc, char *argv[])
79 bits = atoi(EARGF(usage()));
80 for (sha = sha2s; sha < sha2s + nelem(sha2s); sha++)
81 if (sha->bits == bits)
83 if (sha >= sha2s + nelem(sha2s))
84 sysfatal("unknown number of sha2 bits: %d", bits);
92 fmtinstall('M', digestfmt);
97 for(i = 0; i < argc; i++){
98 fd = open(argv[i], OREAD);
100 fprint(2, "%s: can't open %s: %r\n", argv0, argv[i]);