$NetBSD: BIO_f_md.3,v 1.1.1.2 2023/04/18 14:19:12 christos Exp $ Automatically generated by Pod::Man 4.11 (Pod::Simple 3.35) Standard preamble: ========================================================================..
..
..
Set up some character translations and predefined strings. \*(-- will give an unbreakable dash, \*(PI will give pi, \*(L" will give a left double quote, and \*(R" will give a right double quote. \*(C+ will give a nicer C++. Capital omega is used to do unbreakable dashes and therefore won't be available. \*(C` and \*(C' expand to `' in nroff, nothing in troff, for use with C<>..tr \(*W-
. ds -- \(*W-
. ds PI pi
. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch
. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch
. ds L" ""
. ds R" ""
. ds C` ""
. ds C' ""
'br\}
. ds -- \|\(em\|
. ds PI \(*p
. ds L" ``
. ds R" ''
. ds C`
. ds C'
'br\}
Escape single quotes in literal strings from groff's Unicode transform. If the F register is >0, we'll generate index entries on stderr for titles (.TH), headers (.SH), subsections (.SS), items (.Ip), and index entries marked with X<> in POD. Of course, you'll have to process the output yourself in some meaningful fashion. Avoid warning from groff about undefined register 'F'...
.nr rF 0
. if \nF \{\
. de IX
. tm Index:\\$1\t\\n%\t"\\$2"
..
. if !\nF==2 \{\
. nr % 0
. nr F 2
. \}
. \}
.\}
.rr rF
Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). Fear. Run. Save yourself. No user-serviceable parts.. \" fudge factors for nroff and troff
. ds #H 0
. ds #V .8m
. ds #F .3m
. ds #[ \f1
. ds #]
.\}
. ds #H ((1u-(\\\\n(.fu%2u))*.13m)
. ds #V .6m
. ds #F 0
. ds #[ \&
. ds #] \&
.\}
. \" simple accents for nroff and troff
. ds ' \&
. ds ` \&
. ds ^ \&
. ds , \&
. ds ~ ~
. ds /
.\}
. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u"
. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u'
. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u'
. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u'
. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u'
. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u'
.\}
. \" troff and (daisy-wheel) nroff accents
. \" corrections for vroff
. \" for low resolution devices (crt and lpr)
\{\
. ds : e
. ds 8 ss
. ds o a
. ds d- d\h'-1'\(ga
. ds D- D\h'-1'\(hy
. ds th \o'bp'
. ds Th \o'LP'
. ds ae ae
. ds Ae AE
.\}
======================================================================== Title "BIO_f_md 3" BIO_f_md 3 "2018-09-23" "1.1.1i" "OpenSSL"
For nroff, turn off justification. Always turn off hyphenation; it makes way too many mistakes in technical documents..nh
"NAME"
BIO_f_md, BIO_set_md, BIO_get_md, BIO_get_md_ctx - message digest BIO filter
"LIBRARY"
libcrypto, -lcrypto
"SYNOPSIS"
Header "SYNOPSIS" .Vb 2
#include <
openssl/
bio.h>
#include <
openssl/
evp.h>
\&
const 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);
.Ve
"DESCRIPTION"
Header "DESCRIPTION" \fBBIO_f_md() returns the message digest \s-1BIO\s0 method. This is a filter
\s-1BIO\s0 that digests any data passed through it, it is a \s-1BIO\s0 wrapper
for the digest routines
EVP_DigestInit(),
EVP_DigestUpdate()
and
EVP_DigestFinal().
Any data written or read through a digest \s-1BIO\s0 using BIO_read_ex() and
\fBBIO_write_ex() is digested.
\fBBIO_gets(), if its size parameter is large enough finishes the
digest calculation and returns the digest value. BIO_puts() is
not supported.
\fBBIO_reset() reinitialises a digest \s-1BIO.\s0
\fBBIO_set_md() sets the message digest of \s-1BIO\s0 b to md: this
must be called to initialize a digest \s-1BIO\s0 before any data is
passed through it. It is a BIO_ctrl() macro.
\fBBIO_get_md() places the a pointer to the digest BIOs digest method
in mdp, it is a BIO_ctrl() macro.
\fBBIO_get_md_ctx() returns the digest BIOs context into mdcp.
"NOTES"
Header "NOTES" The context returned by
BIO_get_md_ctx() can be used in calls
to
EVP_DigestFinal() and also the signature routines
EVP_SignFinal()
and
EVP_VerifyFinal().
The context returned by BIO_get_md_ctx() is an internal context
structure. Changes made to this context will affect the digest
\s-1BIO\s0 itself and the context pointer will become invalid when the digest
\s-1BIO\s0 is freed.
After the digest has been retrieved from a digest \s-1BIO\s0 it must be
reinitialized by calling BIO_reset(), or BIO_set_md() before any more
data is passed through it.
If an application needs to call BIO_gets() or BIO_puts() through
a chain containing digest BIOs then this can be done by prepending
a buffering \s-1BIO.\s0
Calling BIO_get_md_ctx() will return the context and initialize the \s-1BIO\s0
state. This allows applications to initialize the context externally
if the standard calls such as BIO_set_md() are not sufficiently flexible.
"RETURN VALUES"
Header "RETURN VALUES" \fBBIO_f_md() returns the digest \s-1BIO\s0 method.
\fBBIO_set_md(), BIO_get_md() and BIO_md_ctx() return 1 for success and
0 for failure.
"EXAMPLES"
Header "EXAMPLES" The following example creates a \s-1BIO\s0 chain containing an \s-1SHA1\s0 and \s-1MD5\s0
digest \s-1BIO\s0 and passes the string \*(L"Hello World\*(R" through it. Error
checking has been omitted for clarity.
.Vb 2
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));
.Ve
The next example digests data by reading through a chain instead:
.Vb 3
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);
.Ve
This next example retrieves the message digests from a \s-1BIO\s0 chain and
outputs them. This could be used with the examples above.
.Vb 4
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("\en");
mdtmp = BIO_next(mdtmp);
} while (mdtmp);
\&
BIO_free_all(bio);
.Ve
"BUGS"
Header "BUGS" The lack of support for
BIO_puts() and the non standard behaviour of
\fBBIO_gets() could be regarded as anomalous. It could be argued that
BIO_gets()
and
BIO_puts() should be passed to the next \s-1BIO\s0 in the chain and digest
the data passed through and that digests should be retrieved using a
separate
BIO_ctrl() call.
"HISTORY"
Header "HISTORY" Before OpenSSL 1.0.0., the call to
BIO_get_md_ctx() would only work if the
\s-1BIO\s0 was initialized first.
"COPYRIGHT"
Header "COPYRIGHT" Copyright 2000-2016 The OpenSSL Project Authors. All Rights Reserved.
Licensed under the OpenSSL license (the \*(L"License\*(R"). You may not use
this file except in compliance with the License. You can obtain a copy
in the file \s-1LICENSE\s0 in the source distribution or at
<https://www.openssl.org/source/license.html>.