123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240 |
- .\" $OpenBSD: rmd160.3,v 1.30 2010/07/13 07:01:23 jmc Exp $
- .\"
- .\" Copyright (c) 1997, 2004 Todd C. Miller <[email protected]>
- .\"
- .\" Permission to use, copy, modify, and distribute this software for any
- .\" purpose with or without fee is hereby granted, provided that the above
- .\" copyright notice and this permission notice appear in all copies.
- .\"
- .\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- .\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- .\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- .\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- .\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- .\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- .\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- .\"
- .\" See http://www.esat.kuleuven.ac.be/~bosselae/ripemd160.html
- .\" for detailed information about RIPEMD-160.
- .\"
- .Dd $Mdocdate: July 13 2010 $
- .Dt RMD160 3
- .Os
- .Sh NAME
- .Nm RMD160Init ,
- .Nm RMD160Update ,
- .Nm RMD160Pad ,
- .Nm RMD160Final ,
- .Nm RMD160Transform ,
- .Nm RMD160End ,
- .Nm RMD160File ,
- .Nm RMD160FileChunk ,
- .Nm RMD160Data
- .Nd calculate the ``RIPEMD-160'' message digest
- .Sh LIBRARY
- .Lb libmd
- .Sh SYNOPSIS
- .Fd #include <sys/types.h>
- .Fd #include <rmd160.h>
- .Ft void
- .Fn RMD160Init "RMD160_CTX *context"
- .Ft void
- .Fn RMD160Update "RMD160_CTX *context" "const uint8_t *data" "uint32_t nbytes"
- .Ft void
- .Fn RMD160Pad "RMD160_CTX *context"
- .Ft void
- .Fn RMD160Final "uint8_t digest[RMD160_DIGEST_LENGTH]" "RMD160_CTX *context"
- .Ft void
- .Fn RMD160Transform "uint32_t state[5]" "const uint8_t block[RMD160_BLOCK_LENGTH]"
- .Ft "char *"
- .Fn RMD160End "RMD160_CTX *context" "char *buf"
- .Ft "char *"
- .Fn RMD160File "const char *filename" "char *buf"
- .Ft "char *"
- .Fn RMD160FileChunk "const char *filename" "char *buf" "off_t offset" "off_t length"
- .Ft "char *"
- .Fn RMD160Data "const uint8_t *data" "size_t len" "char *buf"
- .Sh DESCRIPTION
- The RMD160 functions implement the 160-bit RIPE message digest hash algorithm
- (RMD-160).
- RMD-160 is used to generate a condensed representation
- of a message called a message digest.
- The algorithm takes a
- message less than 2^64 bits as input and produces a 160-bit digest
- suitable for use as a digital signature.
- .Pp
- The RMD160 functions are considered to be more secure than the
- .Xr md4 3 ,
- .Xr md5 3
- and
- .Xr sha1 3
- functions.
- All share a similar interface.
- .Pp
- The
- .Fn RMD160Init
- function initializes a RMD160_CTX
- .Ar context
- for use with
- .Fn RMD160Update ,
- and
- .Fn RMD160Final .
- The
- .Fn RMD160Update
- function adds
- .Ar data
- of length
- .Ar nbytes
- to the RMD160_CTX specified by
- .Ar context .
- .Fn RMD160Final
- is called when all data has been added via
- .Fn RMD160Update
- and stores a message digest in the
- .Ar digest
- parameter.
- .Pp
- The
- .Fn RMD160Pad
- function can be used to apply padding to the message digest as in
- .Fn RMD160Final ,
- but the current context can still be used with
- .Fn RMD160Update .
- .Pp
- The
- .Fn RMD160Transform
- function is used by
- .Fn RMD160Update
- to hash 512-bit blocks and forms the core of the algorithm.
- Most programs should use the interface provided by
- .Fn RMD160Init ,
- .Fn RMD160Update
- and
- .Fn RMD160Final
- instead of calling
- .Fn RMD160Transform
- directly.
- .Pp
- The
- .Fn RMD160End
- function is a front end for
- .Fn RMD160Final
- which converts the digest into an
- .Tn ASCII
- representation of the 160 bit digest in hexadecimal.
- .Pp
- The
- .Fn RMD160File
- function calculates the digest for a file and returns the result via
- .Fn RMD160End .
- If
- .Fn RMD160File
- is unable to open the file a NULL pointer is returned.
- .Pp
- .Fn RMD160FileChunk
- behaves like
- .Fn RMD160File
- but calculates the digest only for that portion of the file starting at
- .Fa offset
- and continuing for
- .Fa length
- bytes or until end of file is reached, whichever comes first.
- A zero
- .Fa length
- can be specified to read until end of file.
- A negative
- .Fa length
- or
- .Fa offset
- will be ignored.
- .Pp
- The
- .Fn RMD160Data
- function
- calculates the digest of an arbitrary string and returns the result via
- .Fn RMD160End .
- .Pp
- For each of the
- .Fn RMD160End ,
- .Fn RMD160File ,
- and
- .Fn RMD160Data
- functions the
- .Ar buf
- parameter should either be a string of at least 41 characters in
- size or a NULL pointer.
- In the latter case, space will be dynamically allocated via
- .Xr malloc 3
- and should be freed using
- .Xr free 3
- when it is no longer needed.
- .Sh EXAMPLES
- The follow code fragment will calculate the digest for
- the string "abc" which is ``0x8eb208f7e05d987a9b044a8e98c6b087f15a0bfc''.
- .Bd -literal -offset indent
- RMD160_CTX rmd;
- uint8_t results[RMD160_DIGEST_LENGTH];
- char *buf;
- int n;
- buf = "abc";
- n = strlen(buf);
- RMD160Init(&rmd);
- RMD160Update(&rmd, (uint8_t *)buf, n);
- RMD160Final(results, &rmd);
- /* Print the digest as one long hex value */
- printf("0x");
- for (n = 0; n < RMD160_DIGEST_LENGTH; n++)
- printf("%02x", results[n]);
- putchar('\en');
- .Ed
- .Pp
- Alternately, the helper functions could be used in the following way:
- .Bd -literal -offset indent
- RMD160_CTX rmd;
- uint8_t output[RMD160_DIGEST_STRING_LENGTH];
- char *buf = "abc";
- printf("0x%s\en", RMD160Data(buf, strlen(buf), output));
- .Ed
- .Sh SEE ALSO
- .Xr cksum 1 ,
- .Xr md4 3 ,
- .Xr md5 3 ,
- .Xr sha1 3 ,
- .Xr sha2 3
- .Rs
- .%A H. Dobbertin, A. Bosselaers, B. Preneel
- .%T RIPEMD-160, a strengthened version of RIPEMD
- .Re
- .Rs
- .%T Information technology - Security techniques - Hash-functions - Part 3: Dedicated hash-functions
- .%O ISO/IEC 10118-3
- .Re
- .Rs
- .%A H. Dobbertin, A. Bosselaers, B. Preneel
- .%T The RIPEMD-160 cryptographic hash function
- .%J Dr. Dobb's Journal
- .%V Vol. 22, No. 1
- .%D January 1997
- .%P pp. 24-28
- .Re
- .Sh HISTORY
- The RMD-160 functions appeared in
- .Ox 2.1 .
- .Sh AUTHORS
- This implementation of RMD-160 was written by Markus Friedl.
- .Pp
- The
- .Fn RMD160End ,
- .Fn RMD160File ,
- .Fn RMD160FileChunk ,
- and
- .Fn RMD160Data
- helper functions are derived from code written by Poul-Henning Kamp.
- .Sh CAVEATS
- If a message digest is to be copied to a multi-byte type (ie:
- an array of five 32-bit integers) it will be necessary to
- perform byte swapping on little endian machines such as the i386, alpha,
- and vax.
|