p The RMD160 functions are considered to be more secure than the .Xr md4 3 and .Xr md5 3 functions and at least as secure as the .Xr sha1 3 function. All share a similar interface.
p 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. When a null pointer is passed to .Fn RMD160Final as first argument only the final padding will be applied and the current context can still be used with .Fn RMD160Update .
p 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.
p 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.
p 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.
p The .Fn RMD160Data function calculates the digest of an arbitrary string and returns the result via .Fn RMD160End .
p 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''. d -literal -offset indent RMD160_CTX rmd; u_char results[20]; char *buf; int n; buf = "abc"; n = strlen(buf); RMD160Init(&rmd); RMD160Update(&rmd, (u_char *)buf, n); RMD160Final(results, &rmd); /* Print the digest as one long hex value */ printf("0x"); for (n = 0; n < 20; n++) printf("%02x", results[n]); putchar('\en'); .Ed
p Alternately, the helper functions could be used in the following way: d -literal -offset indent RMD160_CTX rmd; u_char output[41]; char *buf = "abc"; printf("0x%s\en", RMD160Data(buf, strlen(buf), output)); .Ed .Sh SEE ALSO .Xr rmd160 1 , .Xr md4 3 , .Xr md5 3 , .Xr sha1 3
p .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 Antoon Bosselaers.
p The .Fn RMD160End , .Fn RMD160File , and .Fn RMD160Data helper functions are derived from code written by Poul-Henning Kamp. .Sh BUGS 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.