KEYRING-SHA1(2)KEYRING-SHA1(2)NAME
keyring: sha1, md4, md5, hmac_sha1, hmac_md5, sign, verify - crypto‐
graphic digests and digital signatures
SYNOPSIS
include "keyring.m";
keyring := load Keyring Keyring->PATH;
sha1: fn(buf: array of byte, n: int, digest: array of byte,
state: ref DigestState): ref DigestState;
md4: fn(buf: array of byte, n: int, digest: array of byte,
state: ref DigestState): ref DigestState;
md5: fn(buf: array of byte, n: int, digest: array of byte,
state: ref DigestState): ref DigestState;
hmac_sha1: fn(buf: array of byte, n: int, key: array of byte, digest: array of byte,
state: ref DigestState): ref DigestState;
hmac_md5: fn(buf: array of byte, n: int, key: array of byte, digest: array of byte,
state: ref DigestState): ref DigestState;
sign: fn(sk: ref SK, exp: int, state: ref DigestState,
ha: string): ref Certificate;
verify: fn(pk: ref PK, cert: ref Certificate,
state: ref DigestState): int;
DESCRIPTION
Sha1, md4 and md5 are cryptographically secure hash functions that pro‐
duce output called a message digest. Each function computes a hash of
n bytes of the data in buf, and updates the current state. They can be
called iteratively to form a single digest for many data blocks. The
state is kept in the DigestState value referenced by state between
calls. State should be nil on the first call, and a newly allocated
DigestState will be returned for use in subsequent calls. On a call in
which digest is not nil, the hash is completed and copied into the
digest array. Sha1 produces a 20-byte hash (SHA1dlen), md4 and md5 a
16-byte one (MD4len and MD5len).
Hmac_sha1 and hmac_md5 are keyed versions of the hashing functions,
following Internet RFC2104. The key must be provided in each call, but
otherwise the calling conventions are those of sha1. The key must cur‐
rently be no more than 64 bytes.
Sign creates a digital signature of a digest from the concatenation of:
a message, the name of the signer, and an expiration time. State is
the digest state after running sha1, md4 or md5 over the message. Ha
is a string specifying the hash algorithm to use: "sha", "sha1", "md4"
or "md5". Sign extends the digest to cover the signer's name (taken
from the private key, sk) and the expiration time. It returns a cer‐
tificate containing the digital signature of the digest, signer name,
hash algorithm and signature algorithm. If any parameter is invalid,
sign returns nil. The signature algorithm is implied by the type of
the private key.
Verify uses public key pk to verify a certificate. It returns non-zero
(true) if the certificate is valid; zero (false) otherwise. State is
the digest state after running the chosen digest algorithm over the
message.
EXAMPLES
A program to read a file and hash it using SHA might contain the fol‐
lowing inner loop:
state: ref DigestState = nil;
while((n := sys->read(fd, buf, len buf)) > 0)
state = kr->sha1(buf, n, nil, state);
digest := array[kr->SHA1dlen] of byte;
kr->sha1(buf, 0, digest, state);
SOURCE
/libinterp/keyring.c
/libcrypt/hmac.c
/libcrypt/md4.c
/libcrypt/md5.c
/libcrypt/sha1.c
BUGS
The MD4 algorithm is included only to allow communication with software
that might still use it; it should not otherwise be used now, because
it is easily broken.
KEYRING-SHA1(2)