July 16, 1997 RMD160 3

### NAME

RMD160Init, RMD160Update, RMD160Final, RMD160Transform, RMD160End, RMD160File, RMD160Data - calculate the ``RIPEMD-160'' message digest

### SYNOPSIS

```void` RMD160Init(```RMD160_CTX *context`)
```void` RMD160Update(```RMD160_CTX *context``, const u_char *data``, u_int nbytes`)
```void` RMD160Final(```u_char digest[20]``, RMD160_CTX *context`)
```void` RMD160Transform(```uint32_t state[5]``, const uint32_t block[16]`)
```char *` RMD160End(```RMD160_CTX *context``, char *buf`)
```char *` RMD160File(```char *filename``, char *buf`)
```char *` RMD160Data(```u_char *data``, size_t len``, char *buf`)

### 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.

The RMD160 functions are considered to be more secure than the md4(3) and md5(3) functions and at least as secure as the sha1(3) function. All share a similar interface.

The RMD160Init(``) function initializes a RMD160_CTX context for use with RMD160Update(``), and RMD160Final(``). The RMD160Update(``) function adds data of length nbytes to the RMD160_CTX specified by context. RMD160Final(``) is called when all data has been added via RMD160Update(``) and stores a message digest in the digest parameter. When a null pointer is passed to RMD160Final(``) as first argument only the final padding will be applied and the current context can still be used with RMD160Update(``).

The RMD160Transform(``) function is used by RMD160Update(``) to hash 512-bit blocks and forms the core of the algorithm. Most programs should use the interface provided by RMD160Init(``), RMD160Update(``) and RMD160Final(``) instead of calling RMD160Transform(``) directly.

The RMD160End(``) function is a front end for RMD160Final(``) which converts the digest into an ASCII representation of the 160 bit digest in hexadecimal.

The RMD160File(``) function calculates the digest for a file and returns the result via RMD160End(``). If RMD160File(``) is unable to open the file a NULL pointer is returned.

The RMD160Data(``) function calculates the digest of an arbitrary string and returns the result via RMD160End(``).

For each of the RMD160End(``), RMD160File(``), and RMD160Data(``) functions the 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 malloc(3) and should be freed using free(3) when it is no longer needed.

### EXAMPLES

The follow code fragment will calculate the digest for the string "abc" which is ``0x8eb208f7e05d987a9b044a8e98c6b087f15a0bfc''.

  `

      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('\n');

  `

Alternately, the helper functions could be used in the following way:

  `

      RMD160_CTX rmd;
      u_char output[41];
      char *buf = "abc";

      printf("0x%s\n", RMD160Data(buf, strlen(buf), output));

  `

### SEE ALSO

rmd160(1), md4(3), md5(3), sha1(3)

### HISTORY

The RMD-160 functions appeared in OpenBSD2.1.

### AUTHORS

This implementation of RMD-160 was written by Antoon Bosselaers.

The RMD160End(``), RMD160File(``), and RMD160Data(``) helper functions are derived from code written by Poul-Henning Kamp.

### 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.