3.\" 4.\" Standard preamble: 5.\" ====================================================================== 6.de Sh \" Subsection heading 7.br 8.if t .Sp 9.ne 5 10.PP 11\fB\\$1\fR 12.PP 13.. 14.de Sp \" Vertical space (when we can't use .PP) 15.if t .sp .5v 16.if n .sp 17.. 18.de Ip \" List item 19.br 20.ie \\n(.$>=3 .ne \\$3 21.el .ne 3 22.IP "\\$1" \\$2 23.. 24.de Vb \" Begin verbatim text 25.ft CW 26.nf 27.ne \\$1 28.. 29.de Ve \" End verbatim text 30.ft R 31 32.fi 33.. 34.\" Set up some character translations and predefined strings. \*(-- will 35.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left 36.\" double quote, and \*(R" will give a right double quote. | will give a 37.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used 38.\" to do unbreakable dashes and therefore won't be available. \*(C` and 39.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> 40.tr \(*W-|\(bv\*(Tr 41.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' 42.ie n \{\ 43. ds -- \(*W- 44. ds PI pi 45. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch 46. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch 47. ds L" "" 48. ds R" "" 49. ds C` "" 50. ds C' "" 51'br\} 52.el\{\ 53. ds -- \|\(em\| 54. ds PI \(*p 55. ds L" `` 56. ds R" '' 57'br\} 58.\" 59.\" If the F register is turned on, we'll generate index entries on stderr 60.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and 61.\" index entries marked with X<> in POD. Of course, you'll have to process 62.\" the output yourself in some meaningful fashion. 63.if \nF \{\ 64. de IX 65. tm Index:\\$1\t\\n%\t"\\$2" 66.. 67. nr % 0 68. rr F 69.\} 70.\" 71.\" For nroff, turn off justification. Always turn off hyphenation; it 72.\" makes way too many mistakes in technical documents. 73.hy 0 74.if n .na 75.\" 76.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). 77.\" Fear. Run. Save yourself. No user-serviceable parts. 78.bd B 3 79. \" fudge factors for nroff and troff 80.if n \{\ 81. ds #H 0 82. ds #V .8m 83. ds #F .3m 84. ds #[ \f1 85. ds #] \fP 86.\} 87.if t \{\ 88. ds #H ((1u-(\\\\n(.fu%2u))*.13m) 89. ds #V .6m 90. ds #F 0 91. ds #[ \& 92. ds #] \& 93.\} 94. \" simple accents for nroff and troff 95.if n \{\ 96. ds ' \& 97. ds ` \& 98. ds ^ \& 99. ds , \& 100. ds ~ ~ 101. ds / 102.\} 103.if t \{\ 104. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" 105. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' 106. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' 107. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' 108. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' 109. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' 110.\} 111. \" troff and (daisy-wheel) nroff accents 112.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' 113.ds 8 \h'\*(#H'\(*b\h'-\*(#H' 114.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] 115.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' 116.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' 117.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] 118.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] 119.ds ae a\h'-(\w'a'u*4/10)'e 120.ds Ae A\h'-(\w'A'u*4/10)'E 121. \" corrections for vroff 122.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' 123.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' 124. \" for low resolution devices (crt and lpr) 125.if \n(.H>23 .if \n(.V>19 \ 126\{\ 127. ds : e 128. ds 8 ss 129. ds o a 130. ds d- d\h'-1'\(ga 131. ds D- D\h'-1'\(hy 132. ds th \o'bp' 133. ds Th \o'LP' 134. ds ae ae 135. ds Ae AE 136.\} 137.rm #[ #] #H #V #F C 138.\" ====================================================================== 139.\" 140.IX Title "BIO_f_md 3"
| 3.\" 4.\" Standard preamble: 5.\" ====================================================================== 6.de Sh \" Subsection heading 7.br 8.if t .Sp 9.ne 5 10.PP 11\fB\\$1\fR 12.PP 13.. 14.de Sp \" Vertical space (when we can't use .PP) 15.if t .sp .5v 16.if n .sp 17.. 18.de Ip \" List item 19.br 20.ie \\n(.$>=3 .ne \\$3 21.el .ne 3 22.IP "\\$1" \\$2 23.. 24.de Vb \" Begin verbatim text 25.ft CW 26.nf 27.ne \\$1 28.. 29.de Ve \" End verbatim text 30.ft R 31 32.fi 33.. 34.\" Set up some character translations and predefined strings. \*(-- will 35.\" give an unbreakable dash, \*(PI will give pi, \*(L" will give a left 36.\" double quote, and \*(R" will give a right double quote. | will give a 37.\" real vertical bar. \*(C+ will give a nicer C++. Capital omega is used 38.\" to do unbreakable dashes and therefore won't be available. \*(C` and 39.\" \*(C' expand to `' in nroff, nothing in troff, for use with C<> 40.tr \(*W-|\(bv\*(Tr 41.ds C+ C\v'-.1v'\h'-1p'\s-2+\h'-1p'+\s0\v'.1v'\h'-1p' 42.ie n \{\ 43. ds -- \(*W- 44. ds PI pi 45. if (\n(.H=4u)&(1m=24u) .ds -- \(*W\h'-12u'\(*W\h'-12u'-\" diablo 10 pitch 46. if (\n(.H=4u)&(1m=20u) .ds -- \(*W\h'-12u'\(*W\h'-8u'-\" diablo 12 pitch 47. ds L" "" 48. ds R" "" 49. ds C` "" 50. ds C' "" 51'br\} 52.el\{\ 53. ds -- \|\(em\| 54. ds PI \(*p 55. ds L" `` 56. ds R" '' 57'br\} 58.\" 59.\" If the F register is turned on, we'll generate index entries on stderr 60.\" for titles (.TH), headers (.SH), subsections (.Sh), items (.Ip), and 61.\" index entries marked with X<> in POD. Of course, you'll have to process 62.\" the output yourself in some meaningful fashion. 63.if \nF \{\ 64. de IX 65. tm Index:\\$1\t\\n%\t"\\$2" 66.. 67. nr % 0 68. rr F 69.\} 70.\" 71.\" For nroff, turn off justification. Always turn off hyphenation; it 72.\" makes way too many mistakes in technical documents. 73.hy 0 74.if n .na 75.\" 76.\" Accent mark definitions (@(#)ms.acc 1.5 88/02/08 SMI; from UCB 4.2). 77.\" Fear. Run. Save yourself. No user-serviceable parts. 78.bd B 3 79. \" fudge factors for nroff and troff 80.if n \{\ 81. ds #H 0 82. ds #V .8m 83. ds #F .3m 84. ds #[ \f1 85. ds #] \fP 86.\} 87.if t \{\ 88. ds #H ((1u-(\\\\n(.fu%2u))*.13m) 89. ds #V .6m 90. ds #F 0 91. ds #[ \& 92. ds #] \& 93.\} 94. \" simple accents for nroff and troff 95.if n \{\ 96. ds ' \& 97. ds ` \& 98. ds ^ \& 99. ds , \& 100. ds ~ ~ 101. ds / 102.\} 103.if t \{\ 104. ds ' \\k:\h'-(\\n(.wu*8/10-\*(#H)'\'\h"|\\n:u" 105. ds ` \\k:\h'-(\\n(.wu*8/10-\*(#H)'\`\h'|\\n:u' 106. ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'^\h'|\\n:u' 107. ds , \\k:\h'-(\\n(.wu*8/10)',\h'|\\n:u' 108. ds ~ \\k:\h'-(\\n(.wu-\*(#H-.1m)'~\h'|\\n:u' 109. ds / \\k:\h'-(\\n(.wu*8/10-\*(#H)'\z\(sl\h'|\\n:u' 110.\} 111. \" troff and (daisy-wheel) nroff accents 112.ds : \\k:\h'-(\\n(.wu*8/10-\*(#H+.1m+\*(#F)'\v'-\*(#V'\z.\h'.2m+\*(#F'.\h'|\\n:u'\v'\*(#V' 113.ds 8 \h'\*(#H'\(*b\h'-\*(#H' 114.ds o \\k:\h'-(\\n(.wu+\w'\(de'u-\*(#H)/2u'\v'-.3n'\*(#[\z\(de\v'.3n'\h'|\\n:u'\*(#] 115.ds d- \h'\*(#H'\(pd\h'-\w'~'u'\v'-.25m'\f2\(hy\fP\v'.25m'\h'-\*(#H' 116.ds D- D\\k:\h'-\w'D'u'\v'-.11m'\z\(hy\v'.11m'\h'|\\n:u' 117.ds th \*(#[\v'.3m'\s+1I\s-1\v'-.3m'\h'-(\w'I'u*2/3)'\s-1o\s+1\*(#] 118.ds Th \*(#[\s+2I\s-2\h'-\w'I'u*3/5'\v'-.3m'o\v'.3m'\*(#] 119.ds ae a\h'-(\w'a'u*4/10)'e 120.ds Ae A\h'-(\w'A'u*4/10)'E 121. \" corrections for vroff 122.if v .ds ~ \\k:\h'-(\\n(.wu*9/10-\*(#H)'\s-2\u~\d\s+2\h'|\\n:u' 123.if v .ds ^ \\k:\h'-(\\n(.wu*10/11-\*(#H)'\v'-.4m'^\v'.4m'\h'|\\n:u' 124. \" for low resolution devices (crt and lpr) 125.if \n(.H>23 .if \n(.V>19 \ 126\{\ 127. ds : e 128. ds 8 ss 129. ds o a 130. ds d- d\h'-1'\(ga 131. ds D- D\h'-1'\(hy 132. ds th \o'bp' 133. ds Th \o'LP' 134. ds ae ae 135. ds Ae AE 136.\} 137.rm #[ #] #H #V #F C 138.\" ====================================================================== 139.\" 140.IX Title "BIO_f_md 3"
|
142.UC 143.SH "NAME" 144BIO_f_md, BIO_set_md, BIO_get_md, BIO_get_md_ctx \- message digest \s-1BIO\s0 filter 145.SH "SYNOPSIS" 146.IX Header "SYNOPSIS" 147.Vb 2 148\& #include <openssl/bio.h> 149\& #include <openssl/evp.h> 150.Ve 151.Vb 4 152\& BIO_METHOD * BIO_f_md(void); 153\& int BIO_set_md(BIO *b,EVP_MD *md); 154\& int BIO_get_md(BIO *b,EVP_MD **mdp); 155\& int BIO_get_md_ctx(BIO *b,EVP_MD_CTX **mdcp); 156.Ve 157.SH "DESCRIPTION" 158.IX Header "DESCRIPTION" 159\&\fIBIO_f_md()\fR returns the message digest \s-1BIO\s0 method. This is a filter 160\&\s-1BIO\s0 that digests any data passed through it, it is a \s-1BIO\s0 wrapper 161for the digest routines \fIEVP_DigestInit()\fR, \fIEVP_DigestUpdate()\fR 162and \fIEVP_DigestFinal()\fR. 163.PP 164Any data written or read through a digest \s-1BIO\s0 using \fIBIO_read()\fR and 165\&\fIBIO_write()\fR is digested. 166.PP 167\&\fIBIO_gets()\fR, if its \fBsize\fR parameter is large enough finishes the 168digest calculation and returns the digest value. \fIBIO_puts()\fR is 169not supported. 170.PP 171\&\fIBIO_reset()\fR reinitialises a digest \s-1BIO\s0. 172.PP 173\&\fIBIO_set_md()\fR sets the message digest of \s-1BIO\s0 \fBb\fR to \fBmd\fR: this 174must be called to initialize a digest \s-1BIO\s0 before any data is 175passed through it. It is a \fIBIO_ctrl()\fR macro. 176.PP 177\&\fIBIO_get_md()\fR places the a pointer to the digest BIOs digest method 178in \fBmdp\fR, it is a \fIBIO_ctrl()\fR macro. 179.PP 180\&\fIBIO_get_md_ctx()\fR returns the digest BIOs context into \fBmdcp\fR. 181.SH "NOTES" 182.IX Header "NOTES" 183The context returned by \fIBIO_get_md_ctx()\fR can be used in calls 184to \fIEVP_DigestFinal()\fR and also the signature routines \fIEVP_SignFinal()\fR 185and \fIEVP_VerifyFinal()\fR. 186.PP 187The context returned by \fIBIO_get_md_ctx()\fR is an internal context 188structure. Changes made to this context will affect the digest 189\&\s-1BIO\s0 itself and the context pointer will become invalid when the digest 190\&\s-1BIO\s0 is freed. 191.PP 192After the digest has been retrieved from a digest \s-1BIO\s0 it must be 193reinitialized by calling \fIBIO_reset()\fR, or \fIBIO_set_md()\fR before any more 194data is passed through it. 195.PP 196If an application needs to call \fIBIO_gets()\fR or \fIBIO_puts()\fR through 197a chain containing digest BIOs then this can be done by prepending 198a buffering \s-1BIO\s0. 199.SH "RETURN VALUES" 200.IX Header "RETURN VALUES" 201\&\fIBIO_f_md()\fR returns the digest \s-1BIO\s0 method. 202.PP 203\&\fIBIO_set_md()\fR, \fIBIO_get_md()\fR and \fIBIO_md_ctx()\fR return 1 for success and 2040 for failure. 205.SH "EXAMPLES" 206.IX Header "EXAMPLES" 207The following example creates a \s-1BIO\s0 chain containing an \s-1SHA1\s0 and \s-1MD5\s0 208digest \s-1BIO\s0 and passes the string \*(L"Hello World\*(R" through it. Error 209checking has been omitted for clarity. 210.PP 211.Vb 14 212\& BIO *bio, *mdtmp; 213\& char message[] = "Hello World"; 214\& bio = BIO_new(BIO_s_null()); 215\& mdtmp = BIO_new(BIO_f_md()); 216\& BIO_set_md(mdtmp, EVP_sha1()); 217\& /* For BIO_push() we want to append the sink BIO and keep a note of 218\& * the start of the chain. 219\& */ 220\& bio = BIO_push(mdtmp, bio); 221\& mdtmp = BIO_new(BIO_f_md()); 222\& BIO_set_md(mdtmp, EVP_md5()); 223\& bio = BIO_push(mdtmp, bio); 224\& /* Note: mdtmp can now be discarded */ 225\& BIO_write(bio, message, strlen(message)); 226.Ve 227The next example digests data by reading through a chain instead: 228.PP 229.Vb 14 230\& BIO *bio, *mdtmp; 231\& char buf[1024]; 232\& int rdlen; 233\& bio = BIO_new_file(file, "rb"); 234\& mdtmp = BIO_new(BIO_f_md()); 235\& BIO_set_md(mdtmp, EVP_sha1()); 236\& bio = BIO_push(mdtmp, bio); 237\& mdtmp = BIO_new(BIO_f_md()); 238\& BIO_set_md(mdtmp, EVP_md5()); 239\& bio = BIO_push(mdtmp, bio); 240\& do { 241\& rdlen = BIO_read(bio, buf, sizeof(buf)); 242\& /* Might want to do something with the data here */ 243\& } while(rdlen > 0); 244.Ve 245This next example retrieves the message digests from a \s-1BIO\s0 chain and 246outputs them. This could be used with the examples above. 247.PP 248.Vb 16 249\& BIO *mdtmp; 250\& unsigned char mdbuf[EVP_MAX_MD_SIZE]; 251\& int mdlen; 252\& int i; 253\& mdtmp = bio; /* Assume bio has previously been set up */ 254\& do { 255\& EVP_MD *md; 256\& mdtmp = BIO_find_type(mdtmp, BIO_TYPE_MD); 257\& if(!mdtmp) break; 258\& BIO_get_md(mdtmp, &md); 259\& printf("%s digest", OBJ_nid2sn(EVP_MD_type(md))); 260\& mdlen = BIO_gets(mdtmp, mdbuf, EVP_MAX_MD_SIZE); 261\& for(i = 0; i < mdlen; i++) printf(":%02X", mdbuf[i]); 262\& printf("\en"); 263\& mdtmp = BIO_next(mdtmp); 264\& } while(mdtmp); 265.Ve 266.Vb 1 267\& BIO_free_all(bio); 268.Ve 269.SH "BUGS" 270.IX Header "BUGS" 271The lack of support for \fIBIO_puts()\fR and the non standard behaviour of 272\&\fIBIO_gets()\fR could be regarded as anomalous. It could be argued that \fIBIO_gets()\fR 273and \fIBIO_puts()\fR should be passed to the next \s-1BIO\s0 in the chain and digest 274the data passed through and that digests should be retrieved using a 275separate \fIBIO_ctrl()\fR call. 276.SH "SEE ALSO" 277.IX Header "SEE ALSO" 278\&\s-1TBA\s0
| 142.UC 143.SH "NAME" 144BIO_f_md, BIO_set_md, BIO_get_md, BIO_get_md_ctx \- message digest \s-1BIO\s0 filter 145.SH "SYNOPSIS" 146.IX Header "SYNOPSIS" 147.Vb 2 148\& #include <openssl/bio.h> 149\& #include <openssl/evp.h> 150.Ve 151.Vb 4 152\& BIO_METHOD * BIO_f_md(void); 153\& int BIO_set_md(BIO *b,EVP_MD *md); 154\& int BIO_get_md(BIO *b,EVP_MD **mdp); 155\& int BIO_get_md_ctx(BIO *b,EVP_MD_CTX **mdcp); 156.Ve 157.SH "DESCRIPTION" 158.IX Header "DESCRIPTION" 159\&\fIBIO_f_md()\fR returns the message digest \s-1BIO\s0 method. This is a filter 160\&\s-1BIO\s0 that digests any data passed through it, it is a \s-1BIO\s0 wrapper 161for the digest routines \fIEVP_DigestInit()\fR, \fIEVP_DigestUpdate()\fR 162and \fIEVP_DigestFinal()\fR. 163.PP 164Any data written or read through a digest \s-1BIO\s0 using \fIBIO_read()\fR and 165\&\fIBIO_write()\fR is digested. 166.PP 167\&\fIBIO_gets()\fR, if its \fBsize\fR parameter is large enough finishes the 168digest calculation and returns the digest value. \fIBIO_puts()\fR is 169not supported. 170.PP 171\&\fIBIO_reset()\fR reinitialises a digest \s-1BIO\s0. 172.PP 173\&\fIBIO_set_md()\fR sets the message digest of \s-1BIO\s0 \fBb\fR to \fBmd\fR: this 174must be called to initialize a digest \s-1BIO\s0 before any data is 175passed through it. It is a \fIBIO_ctrl()\fR macro. 176.PP 177\&\fIBIO_get_md()\fR places the a pointer to the digest BIOs digest method 178in \fBmdp\fR, it is a \fIBIO_ctrl()\fR macro. 179.PP 180\&\fIBIO_get_md_ctx()\fR returns the digest BIOs context into \fBmdcp\fR. 181.SH "NOTES" 182.IX Header "NOTES" 183The context returned by \fIBIO_get_md_ctx()\fR can be used in calls 184to \fIEVP_DigestFinal()\fR and also the signature routines \fIEVP_SignFinal()\fR 185and \fIEVP_VerifyFinal()\fR. 186.PP 187The context returned by \fIBIO_get_md_ctx()\fR is an internal context 188structure. Changes made to this context will affect the digest 189\&\s-1BIO\s0 itself and the context pointer will become invalid when the digest 190\&\s-1BIO\s0 is freed. 191.PP 192After the digest has been retrieved from a digest \s-1BIO\s0 it must be 193reinitialized by calling \fIBIO_reset()\fR, or \fIBIO_set_md()\fR before any more 194data is passed through it. 195.PP 196If an application needs to call \fIBIO_gets()\fR or \fIBIO_puts()\fR through 197a chain containing digest BIOs then this can be done by prepending 198a buffering \s-1BIO\s0. 199.SH "RETURN VALUES" 200.IX Header "RETURN VALUES" 201\&\fIBIO_f_md()\fR returns the digest \s-1BIO\s0 method. 202.PP 203\&\fIBIO_set_md()\fR, \fIBIO_get_md()\fR and \fIBIO_md_ctx()\fR return 1 for success and 2040 for failure. 205.SH "EXAMPLES" 206.IX Header "EXAMPLES" 207The following example creates a \s-1BIO\s0 chain containing an \s-1SHA1\s0 and \s-1MD5\s0 208digest \s-1BIO\s0 and passes the string \*(L"Hello World\*(R" through it. Error 209checking has been omitted for clarity. 210.PP 211.Vb 14 212\& BIO *bio, *mdtmp; 213\& char message[] = "Hello World"; 214\& bio = BIO_new(BIO_s_null()); 215\& mdtmp = BIO_new(BIO_f_md()); 216\& BIO_set_md(mdtmp, EVP_sha1()); 217\& /* For BIO_push() we want to append the sink BIO and keep a note of 218\& * the start of the chain. 219\& */ 220\& bio = BIO_push(mdtmp, bio); 221\& mdtmp = BIO_new(BIO_f_md()); 222\& BIO_set_md(mdtmp, EVP_md5()); 223\& bio = BIO_push(mdtmp, bio); 224\& /* Note: mdtmp can now be discarded */ 225\& BIO_write(bio, message, strlen(message)); 226.Ve 227The next example digests data by reading through a chain instead: 228.PP 229.Vb 14 230\& BIO *bio, *mdtmp; 231\& char buf[1024]; 232\& int rdlen; 233\& bio = BIO_new_file(file, "rb"); 234\& mdtmp = BIO_new(BIO_f_md()); 235\& BIO_set_md(mdtmp, EVP_sha1()); 236\& bio = BIO_push(mdtmp, bio); 237\& mdtmp = BIO_new(BIO_f_md()); 238\& BIO_set_md(mdtmp, EVP_md5()); 239\& bio = BIO_push(mdtmp, bio); 240\& do { 241\& rdlen = BIO_read(bio, buf, sizeof(buf)); 242\& /* Might want to do something with the data here */ 243\& } while(rdlen > 0); 244.Ve 245This next example retrieves the message digests from a \s-1BIO\s0 chain and 246outputs them. This could be used with the examples above. 247.PP 248.Vb 16 249\& BIO *mdtmp; 250\& unsigned char mdbuf[EVP_MAX_MD_SIZE]; 251\& int mdlen; 252\& int i; 253\& mdtmp = bio; /* Assume bio has previously been set up */ 254\& do { 255\& EVP_MD *md; 256\& mdtmp = BIO_find_type(mdtmp, BIO_TYPE_MD); 257\& if(!mdtmp) break; 258\& BIO_get_md(mdtmp, &md); 259\& printf("%s digest", OBJ_nid2sn(EVP_MD_type(md))); 260\& mdlen = BIO_gets(mdtmp, mdbuf, EVP_MAX_MD_SIZE); 261\& for(i = 0; i < mdlen; i++) printf(":%02X", mdbuf[i]); 262\& printf("\en"); 263\& mdtmp = BIO_next(mdtmp); 264\& } while(mdtmp); 265.Ve 266.Vb 1 267\& BIO_free_all(bio); 268.Ve 269.SH "BUGS" 270.IX Header "BUGS" 271The lack of support for \fIBIO_puts()\fR and the non standard behaviour of 272\&\fIBIO_gets()\fR could be regarded as anomalous. It could be argued that \fIBIO_gets()\fR 273and \fIBIO_puts()\fR should be passed to the next \s-1BIO\s0 in the chain and digest 274the data passed through and that digests should be retrieved using a 275separate \fIBIO_ctrl()\fR call. 276.SH "SEE ALSO" 277.IX Header "SEE ALSO" 278\&\s-1TBA\s0
|