![]() | ![]() | |||||||||||||||||||
| ||||||||||||||||||||
| BIO_f_md(3)
NAMEBIO_f_md, BIO_set_md, BIO_get_md, BIO_get_md_ctx - message digest BIO filter
SYNOPSIS#include <openssl/bio.h> #include <openssl/evp.h> BIO_METHOD * BIO_f_md(void); int BIO_set_md(BIO *b,EVP_MD *md); int BIO_get_md(BIO *b,EVP_MD **mdp); int BIO_get_md_ctx(BIO *b,EVP_MD_CTX **mdcp);
DESCRIPTION
Any data written or read through a digest BIO using
NOTES
The context returned by
The context returned by
After the digest has been retrieved from a digest BIO it must be
reinitialized by calling
If an application needs to call
Before OpenSSL 1.0.0 the call to
RETURN VALUES
EXAMPLESThe following example creates a BIO chain containing an SHA1 and MD5 digest BIO and passes the string ``Hello World'' through it. Error checking has been omitted for clarity. BIO *bio, *mdtmp; char message[] = "Hello World"; bio = BIO_new(BIO_s_null()); mdtmp = BIO_new(BIO_f_md()); BIO_set_md(mdtmp, EVP_sha1()); /* For BIO_push() we want to append the sink BIO and keep a note of * the start of the chain. */ bio = BIO_push(mdtmp, bio); mdtmp = BIO_new(BIO_f_md()); BIO_set_md(mdtmp, EVP_md5()); bio = BIO_push(mdtmp, bio); /* Note: mdtmp can now be discarded */ BIO_write(bio, message, strlen(message)); The next example digests data by reading through a chain instead: BIO *bio, *mdtmp;
char buf[1024];
int rdlen;
bio = BIO_new_file(file, "rb");
mdtmp = BIO_new(BIO_f_md());
BIO_set_md(mdtmp, EVP_sha1());
bio = BIO_push(mdtmp, bio);
mdtmp = BIO_new(BIO_f_md());
BIO_set_md(mdtmp, EVP_md5());
bio = BIO_push(mdtmp, bio);
do {
rdlen = BIO_read(bio, buf, sizeof(buf));
/* Might want to do something with the data here */
} while(rdlen > 0);
This next example retrieves the message digests from a BIO chain and outputs them. This could be used with the examples above. BIO *mdtmp;
unsigned char mdbuf[EVP_MAX_MD_SIZE];
int mdlen;
int i;
mdtmp = bio; /* Assume bio has previously been set up */
do {
EVP_MD *md;
mdtmp = BIO_find_type(mdtmp, BIO_TYPE_MD);
if(!mdtmp) break;
BIO_get_md(mdtmp, &md);
printf("%s digest", OBJ_nid2sn(EVP_MD_type(md)));
mdlen = BIO_gets(mdtmp, mdbuf, EVP_MAX_MD_SIZE);
for(i = 0; i < mdlen; i++) printf(":%02X", mdbuf[i]);
printf("\n");
mdtmp = BIO_next(mdtmp);
} while(mdtmp);
BIO_free_all(bio);
BUGS
The lack of support for
SEE ALSOTBA | |||||||||||||||||||