Sortix cross-volatile manual
This manual documents Sortix cross-volatile. You can instead view this document in the latest official manual.
NAME
BIO_f_md, BIO_set_md, BIO_get_md, BIO_get_md_ctx, BIO_set_md_ctx — message digest BIO filterSYNOPSIS
#include <openssl/bio.h>#include <openssl/evp.h>
BIO_f_md(void);
BIO_set_md(BIO *b, EVP_MD *md);
BIO_get_md(BIO *b, EVP_MD **mdp);
BIO_get_md_ctx(BIO *b, EVP_MD_CTX **mdcp);
BIO_set_md_ctx(BIO *b, EVP_MD_CTX *mdc);
DESCRIPTION
BIO_f_md() returns the message digest BIO method. This is a filter BIO that digests any data passed through it. It is a BIO wrapper for the digest routines EVP_DigestInit(3), EVP_DigestUpdate(3), and EVP_DigestFinal(3).| cmd constant | corresponding macro | 
| BIO_C_GET_MD | BIO_get_md() | 
| BIO_C_GET_MD_CTX | BIO_get_md_ctx() | 
| BIO_C_SET_MD | BIO_set_md() | 
| BIO_C_SET_MD_CTX | BIO_set_md_ctx() | 
| BIO_CTRL_RESET | BIO_reset(3) | 
RETURN VALUES
BIO_f_md() returns the digest BIO method.EXAMPLES
The following example creates a BIO chain containing a SHA-1 and MD5 digest BIO and passes the string "Hello World" through it. Error checking has been omitted for clarity.BIO *bio, *mdtmp; const 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));
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);
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);
