| .TH SECHASH 3 |
| .SH NAME |
| md4, md5, sha1, hmac_md5, hmac_sha1, md5pickle, md5unpickle, sha1pickle, sha1unpickle \- cryptographically secure hashes |
| .SH SYNOPSIS |
| .B #include <u.h> |
| .br |
| .B #include <libc.h> |
| .br |
| .B #include <mp.h> |
| .br |
| .B #include <libsec.h> |
| .PP |
| .B |
| DigestState* md4(uchar *data, ulong dlen, uchar *digest, |
| .B |
| DigestState *state) |
| .PP |
| .B |
| DigestState* md5(uchar *data, ulong dlen, uchar *digest, |
| .B |
| DigestState *state) |
| .PP |
| .B |
| char* md5pickle(MD5state *state) |
| .PP |
| .B |
| MD5state* md5unpickle(char *p); |
| .PP |
| .B |
| DigestState* sha1(uchar *data, ulong dlen, uchar *digest, |
| .B |
| DigestState *state) |
| .PP |
| .B |
| char* sha1pickle(MD5state *state) |
| .PP |
| .B |
| MD5state* sha1unpickle(char *p); |
| .PP |
| .B |
| DigestState* hmac_md5(uchar *data, ulong dlen, |
| .br |
| .B |
| uchar *key, ulong klen, |
| .br |
| .B |
| uchar *digest, DigestState *state) |
| .PP |
| .B |
| DigestState* hmac_sha1(uchar *data, ulong dlen, |
| .br |
| .B |
| uchar *key, ulong klen, |
| .br |
| .B |
| uchar *digest, DigestState *state) |
| .SH DESCRIPTION |
| .PP |
| These functions implement |
| the cryptographic hash functions MD4, MD5, and SHA1. The output of the |
| hash is called a |
| .IR digest . |
| A hash is secure if, given the hashed data and the digest, |
| it is difficult to predict the change to the digest resulting |
| from some change to the data without rehashing |
| the whole data. Therefore, if a secret is part of the hashed |
| data, the digest can be used as an integrity check of the data by anyone |
| possessing the secret. |
| .PP |
| The routines |
| .IR md4 , |
| .IR md5 , |
| .IR sha1 , |
| .IR hmac_md5 , |
| and |
| .I hmac_sha1 |
| differ only in the length of the resulting digest |
| and in the security of the hash. Usage for each is the same. |
| The first call to the routine should have |
| .B nil |
| as the |
| .I state |
| parameter. This call returns a state which can be used to chain |
| subsequent calls. |
| The last call should have digest non-\fBnil\fR. |
| .I Digest |
| must point to a buffer of at least the size of the digest produced. |
| This last call will free the state and copy the result into |
| .IR digest . |
| For example, to hash a single buffer using |
| .IR md5 : |
| .EX |
| |
| uchar digest[MD5dlen]; |
| |
| md5(data, len, digest, nil); |
| .EE |
| .PP |
| To chain a number of buffers together, |
| bounded on each end by some secret: |
| .EX |
| |
| char buf[256]; |
| uchar digest[MD5dlen]; |
| DigestState *s; |
| |
| s = md5("my password", 11, nil, nil); |
| while((n = read(fd, buf, 256)) > 0) |
| md5(buf, n, nil, s); |
| md5("drowssap ym", 11, digest, s); |
| .EE |
| .PP |
| The constants |
| .IR MD4dlen , |
| .IR MD5dlen , |
| and |
| .I SHA1dlen |
| define the lengths of the digests. |
| .PP |
| .I Hmac_md5 |
| and |
| .I hmac_sha1 |
| are used slightly differently. These hash algorithms are keyed and require |
| a key to be specified on every call. |
| The digest lengths for these hashes are |
| .I MD5dlen |
| and |
| .I SHA1dlen |
| respectively. |
| .PP |
| The functions |
| .I md5pickle |
| and |
| .I sha1pickle |
| marshal the state of a digest for transmission. |
| .I Md5unpickle |
| and |
| .I sha1unpickle |
| unmarshal a pickled digest. |
| All four routines return a pointer to a newly |
| .IR malloc (3)'d |
| object. |
| .SH SOURCE |
| .B \*9/src/libsec |
| .SH SEE ALSO |
| .IR aes (3), |
| .IR blowfish (3), |
| .IR des (3), |
| .IR elgamal (3), |
| .IR rc4 (3), |
| .IR rsa (3) |