<html xmlns:v="urn:schemas-microsoft-com:vml" xmlns:o="urn:schemas-microsoft-com:office:office" xmlns:w="urn:schemas-microsoft-com:office:word" xmlns:m="http://schemas.microsoft.com/office/2004/12/omml" xmlns="http://www.w3.org/TR/REC-html40">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii">
<meta name="Generator" content="Microsoft Word 15 (filtered medium)">
<style><!--
/* Font Definitions */
@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}
@font-face
        {font-family:DengXian;
        panose-1:2 1 6 0 3 1 1 1 1 1;}
@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}
@font-face
        {font-family:"\@DengXian";
        panose-1:2 1 6 0 3 1 1 1 1 1;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
p.MsoListParagraph, li.MsoListParagraph, div.MsoListParagraph
        {mso-style-priority:34;
        margin-top:0in;
        margin-right:0in;
        margin-bottom:0in;
        margin-left:.5in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}
span.EmailStyle17
        {mso-style-type:personal-compose;
        font-family:"Calibri",sans-serif;
        color:windowtext;}
.MsoChpDefault
        {mso-style-type:export-only;
        font-family:"Calibri",sans-serif;}
@page WordSection1
        {size:8.5in 11.0in;
        margin:1.0in 1.0in 1.0in 1.0in;}
div.WordSection1
        {page:WordSection1;}
/* List Definitions */
@list l0
        {mso-list-id:780615186;
        mso-list-type:hybrid;
        mso-list-template-ids:-2111252282 -1348302850 67698713 67698715 67698703 67698713 67698715 67698703 67698713 67698715;}
@list l0:level1
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;
        mso-ascii-font-family:Calibri;
        mso-fareast-font-family:DengXian;
        mso-hansi-font-family:Calibri;
        mso-bidi-font-family:"Times New Roman";}
@list l0:level2
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level3
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level4
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level5
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level6
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
@list l0:level7
        {mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level8
        {mso-level-number-format:alpha-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:left;
        text-indent:-.25in;}
@list l0:level9
        {mso-level-number-format:roman-lower;
        mso-level-tab-stop:none;
        mso-level-number-position:right;
        text-indent:-9.0pt;}
ol
        {margin-bottom:0in;}
ul
        {margin-bottom:0in;}
--></style><!--[if gte mso 9]><xml>
<o:shapedefaults v:ext="edit" spidmax="1026" />
</xml><![endif]--><!--[if gte mso 9]><xml>
<o:shapelayout v:ext="edit">
<o:idmap v:ext="edit" data="1" />
</o:shapelayout></xml><![endif]-->
</head>
<body lang="EN-US" link="#0563C1" vlink="#954F72" style="word-wrap:break-word">
<div class="WordSection1">
<p class="MsoNormal">Hi team,<o:p></o:p></p>
<p class="MsoNormal">I find a segment fault in BIO_read() on openssl 3.0 about calculate digest with BIO using md4 algorithm.<o:p></o:p></p>
<p class="MsoNormal">This is my test code, put it in a.c, build & run, it will crash.<o:p></o:p></p>
<p class="MsoNormal">If don’t load legacy provider: <o:p></o:p></p>
<ol style="margin-top:0in" start="1" type="1">
<li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">Set dgst  = “md4”, EVP_get_digestbyname(dgst) won’t return NULL, but a non-NULL object. If use EVP_MD_fetch(NULL, dgst, NULL) instead, it will return NULL.<o:p></o:p></li><li class="MsoListParagraph" style="margin-left:0in;mso-list:l0 level1 lfo1">When call BIO_read(), this program crashes.<o:p></o:p></li></ol>
<p class="MsoNormal">If load legacy provider, this program works ok.<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">------------------------------------------------------------------------<o:p></o:p></p>
<p class="MsoNormal">#include <openssl/provider.h><o:p></o:p></p>
<p class="MsoNormal">#include <openssl/err.h><o:p></o:p></p>
<p class="MsoNormal">#include <openssl/types.h><o:p></o:p></p>
<p class="MsoNormal">#include <openssl/evp.h><o:p></o:p></p>
<p class="MsoNormal">#include <openssl/bn.h><o:p></o:p></p>
<p class="MsoNormal">#include <stdio.h><o:p></o:p></p>
<p class="MsoNormal">#include <stdlib.h><o:p></o:p></p>
<p class="MsoNormal">#include <unistd.h><o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">int main() {<o:p></o:p></p>
<p class="MsoNormal">    EVP_MD *md = NULL;<o:p></o:p></p>
<p class="MsoNormal">    const char *datain = "a.c";<o:p></o:p></p>
<p class="MsoNormal">    const int BUF_SIZE = 8192;<o:p></o:p></p>
<p class="MsoNormal">    char *buff = NULL;<o:p></o:p></p>
<p class="MsoNormal">    char *ptr = NULL;<o:p></o:p></p>
<p class="MsoNormal">    const char *dgst = "md4";<o:p></o:p></p>
<p class="MsoNormal">    int ret = 0, len = 0, i = 0;<o:p></o:p></p>
<p class="MsoNormal">    BIO *in = NULL, *out = NULL, *bmd = NULL, *rbio = NULL, *err;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if ((err = BIO_new(BIO_s_file())) != NULL)<o:p></o:p></p>
<p class="MsoNormal">        BIO_set_fp(err, stderr, BIO_NOCLOSE|BIO_FP_TEXT);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    md = EVP_get_digestbyname(dgst);<o:p></o:p></p>
<p class="MsoNormal">    if (!md) {<o:p></o:p></p>
<p class="MsoNormal">        printf("Error EVP_get_digestbyname %s\n", dgst);<o:p></o:p></p>
<p class="MsoNormal">        goto err_exit;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    in = BIO_new_file(datain, "rb");<o:p></o:p></p>
<p class="MsoNormal">    if (!in) {<o:p></o:p></p>
<p class="MsoNormal">        printf("Error BIO_new_file %s\n", datain);<o:p></o:p></p>
<p class="MsoNormal">        goto err_exit;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    out = BIO_new(BIO_s_mem());<o:p></o:p></p>
<p class="MsoNormal">    if (!out) {<o:p></o:p></p>
<p class="MsoNormal">        printf("Error BIO_new out\n");<o:p></o:p></p>
<p class="MsoNormal">        goto err_exit;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    rbio = in;<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    bmd = BIO_new(BIO_f_md());<o:p></o:p></p>
<p class="MsoNormal">    if (!bmd){<o:p></o:p></p>
<p class="MsoNormal">        printf("Error BIO_new bmd\n");<o:p></o:p></p>
<p class="MsoNormal">        goto err_exit;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    BIO_set_md(bmd, md);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    rbio = BIO_push(bmd, rbio);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    buff = (char *)malloc(BUF_SIZE); <o:p></o:p></p>
<p class="MsoNormal">    if (!buff) {<o:p></o:p></p>
<p class="MsoNormal">        printf("Error malloc\n");<o:p></o:p></p>
<p class="MsoNormal">        goto err_exit;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    for (;;) {<o:p></o:p></p>
<p class="MsoNormal">        ret = BIO_read(rbio, buff, BUF_SIZE); /* this call will segment fault */<o:p></o:p></p>
<p class="MsoNormal">        if (ret <= 0) break;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    len = BIO_gets(rbio, buff, BUF_SIZE);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    len = BIO_write(out, buff, len);<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    if (!BIO_flush(out)) {<o:p></o:p></p>
<p class="MsoNormal">        printf("Error BIO_flush\n");<o:p></o:p></p>
<p class="MsoNormal">        goto err_exit;<o:p></o:p></p>
<p class="MsoNormal">    }<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">    len = BIO_get_mem_data(out, &ptr);<o:p></o:p></p>
<p class="MsoNormal">    printf("digest success, len=%d\n", len);<o:p></o:p></p>
<p class="MsoNormal">    for (i = 0; i < len; i++)<o:p></o:p></p>
<p class="MsoNormal">        printf("%d ", ptr[i]);<o:p></o:p></p>
<p class="MsoNormal">    printf("\n");<o:p></o:p></p>
<p class="MsoNormal"><o:p> </o:p></p>
<p class="MsoNormal">err_exit:<o:p></o:p></p>
<p class="MsoNormal">    ERR_print_errors(err);<o:p></o:p></p>
<p class="MsoNormal">    if (in)<o:p></o:p></p>
<p class="MsoNormal">        BIO_free(in);<o:p></o:p></p>
<p class="MsoNormal">    if (out)<o:p></o:p></p>
<p class="MsoNormal">        BIO_free_all(out);<o:p></o:p></p>
<p class="MsoNormal">    if (err)<o:p></o:p></p>
<p class="MsoNormal">        BIO_free(err);<o:p></o:p></p>
<p class="MsoNormal">    if (bmd)<o:p></o:p></p>
<p class="MsoNormal">        BIO_free(bmd);<o:p></o:p></p>
<p class="MsoNormal">    if (buff)<o:p></o:p></p>
<p class="MsoNormal">        free(buff);<o:p></o:p></p>
<p class="MsoNormal">    if (md)<o:p></o:p></p>
<p class="MsoNormal">        EVP_MD_free(md);<o:p></o:p></p>
<p class="MsoNormal">    ERR_clear_error();<o:p></o:p></p>
<p class="MsoNormal">    return 0;<o:p></o:p></p>
<p class="MsoNormal">} <o:p></o:p></p>
<p class="MsoNormal">---------------------------------------------------------------------------------<o:p></o:p></p>
</div>
<p>================================<br>
Rocket Software, Inc. and subsidiaries ■ 77 Fourth Avenue, Waltham MA 02451 ■ Main Office Toll Free Number: +1 855.577.4323<br>
Contact Customer Support: https://my.rocketsoftware.com/RocketCommunity/RCEmailSupport<br>
Unsubscribe from Marketing Messages/Manage Your Subscription Preferences - http://www.rocketsoftware.com/manage-your-email-preferences<br>
Privacy Policy - http://www.rocketsoftware.com/company/legal/privacy-policy<br>
================================ <br>
<br>
This communication and any attachments may contain confidential information of Rocket Software, Inc. All unauthorized use, disclosure or distribution is prohibited. If you are not the intended recipient, please notify Rocket Software immediately and destroy
 all copies of this communication. Thank you. <br>
</p>
</body>
</html>