2 * sha1sum - compute SHA1 or SHA2 digest
8 #pragma varargck type "M" uchar*
10 typedef struct Sha2 Sha2;
14 DigestState* (*func)(uchar *, ulong, uchar *, DigestState *);
17 static Sha2 sha2s[] = {
18 224, SHA2_224dlen, sha2_224,
19 256, SHA2_256dlen, sha2_256,
20 384, SHA2_384dlen, sha2_384,
21 512, SHA2_512dlen, sha2_512,
24 static DigestState* (*shafunc)(uchar *, ulong, uchar *, DigestState *);
30 char buf[SHA2_512dlen*2 + 1];
34 p = va_arg(fmt->args, uchar*);
35 for(i = 0; i < shadlen; i++)
36 sprint(buf + 2*i, "%.2ux", p[i]);
37 return fmtstrcpy(fmt, buf);
41 sum(int fd, char *name)
44 uchar buf[8192], digest[SHA2_512dlen];
47 s = (*shafunc)(nil, 0, nil, nil);
48 while((n = read(fd, buf, sizeof buf)) > 0)
49 (*shafunc)(buf, n, nil, s);
51 fprint(2, "reading %s: %r\n", name? name: "stdin");
54 (*shafunc)(nil, 0, digest, s);
56 print("%M\n", digest);
58 print("%M\t%s\n", digest, name);
64 fprint(2, "usage: %s [-2 bits] [file...]\n", argv0);
69 main(int argc, char *argv[])
78 bits = atoi(EARGF(usage()));
79 for (sha = sha2s; sha < sha2s + nelem(sha2s); sha++)
80 if (sha->bits == bits)
82 if (sha >= sha2s + nelem(sha2s))
83 sysfatal("unknown number of sha2 bits: %d", bits);
91 fmtinstall('M', digestfmt);
96 for(i = 0; i < argc; i++){
97 fd = open(argv[i], OREAD);
99 fprint(2, "%s: can't open %s: %r\n", argv0, argv[i]);