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
)
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.
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));
The
RMD160End(),
RMD160File(
),
and
RMD160Data(
)
helper functions are derived from code written by Poul-Henning Kamp.