<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body>
    Shane, any thoughts?<br>
    <br>
    <br>
    Pauli<br>
    <br>
    <div class="moz-cite-prefix">On 11/2/22 5:23 pm, Gahlot, Ashish
      Kumar wrote:<br>
    </div>
    <blockquote type="cite"
cite="mid:MW4PR03MB66497F523895A0CFF8A27314DB309@MW4PR03MB6649.namprd03.prod.outlook.com">
      <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
      <meta name="Generator" content="Microsoft Word 15 (filtered
        medium)">
      <style>@font-face
        {font-family:Wingdings;
        panose-1:5 0 0 0 0 0 0 0 0 0;}@font-face
        {font-family:"Cambria Math";
        panose-1:2 4 5 3 5 4 6 3 2 4;}@font-face
        {font-family:Calibri;
        panose-1:2 15 5 2 2 2 4 3 2 4;}p.MsoNormal, li.MsoNormal, div.MsoNormal
        {margin:0in;
        font-size:11.0pt;
        font-family:"Calibri",sans-serif;}a:link, span.MsoHyperlink
        {mso-style-priority:99;
        color:#0563C1;
        text-decoration:underline;}span.EmailStyle19
        {mso-style-type:personal-reply;
        font-family:"Calibri",sans-serif;
        color:windowtext;}.MsoChpDefault
        {mso-style-type:export-only;
        font-size:10.0pt;}div.WordSection1
        {page:WordSection1;}</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]-->
      <div class="WordSection1">
        <p class="MsoNormal">Hi,<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Thanks Pauli, the API worked but also I
          have a callback defined as below which is failing at corrupt
          phase:<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">int SelfTestCb(const OSSL_PARAM params[],
          void *arg)<o:p></o:p></p>
        <p class="MsoNormal">{<o:p></o:p></p>
        <p class="MsoNormal">    int ret = 0;<o:p></o:p></p>
        <p class="MsoNormal">    const OSSL_PARAM *p = NULL;<o:p></o:p></p>
        <p class="MsoNormal">    const char *phase = NULL;<o:p></o:p></p>
        <p class="MsoNormal">    const char *type = NULL;<o:p></o:p></p>
        <p class="MsoNormal">    const char *desc = NULL;<o:p></o:p></p>
        <p class="MsoNormal">    //BIO *bio_out =
          BIO_new_file("FipsSelfTestFile.txt", "w");<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">    p = OSSL_PARAM_locate_const(params,
          OSSL_PROV_PARAM_SELF_TEST_PHASE);<o:p></o:p></p>
        <p class="MsoNormal">    if ((p == NULL) || (arg) || (p ->
          data_type != OSSL_PARAM_UTF8_STRING))<o:p></o:p></p>
        <p class="MsoNormal">        goto err;<o:p></o:p></p>
        <p class="MsoNormal">    phase = (const char *)p -> data;<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">    p = OSSL_PARAM_locate_const(params,
          OSSL_PROV_PARAM_SELF_TEST_DESC);<o:p></o:p></p>
        <p class="MsoNormal">    if ((p == NULL) || (p -> data_type
          != OSSL_PARAM_UTF8_STRING))<o:p></o:p></p>
        <p class="MsoNormal">        goto err;<o:p></o:p></p>
        <p class="MsoNormal">    desc = (const char *)p -> data;<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">    p = OSSL_PARAM_locate_const(params,
          OSSL_PROV_PARAM_SELF_TEST_TYPE);<o:p></o:p></p>
        <p class="MsoNormal">    if ((p == NULL) || (p -> data_type
          != OSSL_PARAM_UTF8_STRING))<o:p></o:p></p>
        <p class="MsoNormal">        goto err;<o:p></o:p></p>
        <p class="MsoNormal">    type = (const char *)p ->data;<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">    /* Do some logging */<o:p></o:p></p>
        <p class="MsoNormal">    if (strcmp(phase,
          OSSL_SELF_TEST_PHASE_START) == 0)<o:p></o:p></p>
        <p class="MsoNormal">        syslog(LOG_NOTICE, "%s : (%s) : ",
          desc, type);<o:p></o:p></p>
        <p class="MsoNormal">    if ((strcmp(phase,
          OSSL_SELF_TEST_PHASE_PASS) == 0)<o:p></o:p></p>
        <p class="MsoNormal">            || (strcmp(phase,
          OSSL_SELF_TEST_PHASE_FAIL) ==0))<o:p></o:p></p>
        <p class="MsoNormal">        syslog(LOG_NOTICE, "%s\n", phase);<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">    /* Corrupt the SHA1 self-test during
          the 'corrupt' phase by returning 0 */<o:p></o:p></p>
        <p class="MsoNormal">    if (strcmp(phase,
          OSSL_SELF_TEST_PHASE_CORRUPT) == 0){                //
          <span style="font-family:Wingdings">ß</span>--------------THIS
          FAILS<o:p></o:p></p>
        <p class="MsoNormal">        syslog(LOG_NOTICE, "%s %s", phase,
          desc);<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">    ret = 1;<o:p></o:p></p>
        <p class="MsoNormal">err:<o:p></o:p></p>
        <p class="MsoNormal">    return ret;<o:p></o:p></p>
        <p class="MsoNormal">}<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal">Thanks,<o:p></o:p></p>
        <p class="MsoNormal">Ashish<o:p></o:p></p>
        <p class="MsoNormal"><o:p> </o:p></p>
        <div>
          <div style="border:none;border-top:solid #E1E1E1
            1.0pt;padding:3.0pt 0in 0in 0in">
            <p class="MsoNormal"><b>From:</b> openssl-users
              <a class="moz-txt-link-rfc2396E" href="mailto:openssl-users-bounces@openssl.org"><openssl-users-bounces@openssl.org></a>
              <b>On Behalf Of </b>Dr Paul Dale<br>
              <b>Sent:</b> Tuesday, February 8, 2022 1:35 PM<br>
              <b>To:</b> <a class="moz-txt-link-abbreviated" href="mailto:openssl-users@openssl.org">openssl-users@openssl.org</a><br>
              <b>Subject:</b> [EXTERNAL] Re: Not able to perform FIPS
              self-tests<o:p></o:p></p>
          </div>
        </div>
        <p class="MsoNormal"><o:p> </o:p></p>
        <p class="MsoNormal" style="margin-bottom:12.0pt">Have you
          considered using the provided for this:
          OSSL_PROVIDER_self_test()?<br>
          <a
href="https://clicktime.symantec.com/3MLQWE4xgv1bwQFXJyvrWt87GS?u=https%3A%2F%2Fwww.openssl.org%2Fdocs%2Fman3.0%2Fman3%2FOSSL_PROVIDER.html"
            moz-do-not-send="true">https://www.openssl.org/docs/man3.0/man3/OSSL_PROVIDER.html</a><br>
          <br>
          Pauli<o:p></o:p></p>
        <div>
          <p class="MsoNormal">On 8/2/22 17:41, Gahlot, Ashish Kumar
            wrote:<o:p></o:p></p>
        </div>
        <blockquote style="margin-top:5.0pt;margin-bottom:5.0pt">
          <p class="MsoNormal">Hello All,<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">I’m trying to execute self-tests that
            FIPS runs after installation manually by calling the APIs.
            I’m using code from
            <a
href="https://clicktime.symantec.com/34e4QufezjLGGtyNv3jNidX7GS?u=https%3A%2F%2Fgithub.com%2Fopenssl%2Fopenssl%2Fblob%2F7cce994d3e57345ba729388b9321d9bf8b661b4f%2Fproviders%2Ffips%2Fself_test_kats.c"
              moz-do-not-send="true">
https://github.com/openssl/openssl/blob/7cce994d3e57345ba729388b9321d9bf8b661b4f/providers/fips/self_test_kats.c</a>
            but I’m getting NULL when I’m trying to fetch the encryption
            algorithm. Is there a way to perform self-tests that FIPS
            runs after installation because I did not find any code in
            fipsinstall.c where it is directly calling the APIs.<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">int self_test_digest(const ST_KAT_DIGEST
            *t, OSSL_SELF_TEST *st, OSSL_LIB_CTX *libctx)<o:p></o:p></p>
          <p class="MsoNormal">{<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    int ok = 0;<o:p></o:p></p>
          <p class="MsoNormal">    unsigned char out[EVP_MAX_MD_SIZE];<o:p></o:p></p>
          <p class="MsoNormal">    unsigned int out_len = 0;<o:p></o:p></p>
          <p class="MsoNormal">    EVP_MD_CTX *ctx = EVP_MD_CTX_new();<o:p></o:p></p>
          <p class="MsoNormal">    EVP_MD *md = EVP_MD_fetch(libctx,
            t->algorithm, NULL);<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    OSSL_SELF_TEST_onbegin(st,
            OSSL_SELF_TEST_TYPE_KAT_DIGEST, t->desc);<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    if (ctx == NULL)<o:p></o:p></p>
          <p class="MsoNormal">    {syslog(LOG_NOTICE, "ctx NULL"); goto
            err;}<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    if (md == NULL)<o:p></o:p></p>
          <p class="MsoNormal">    {syslog(LOG_NOTICE, "md is NULL");
            goto err;}    //  <-------------------  This is getting
            failed!<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    if (!EVP_DigestInit_ex(ctx, md,
            NULL))<o:p></o:p></p>
          <p class="MsoNormal">    {syslog(LOG_NOTICE, "digest failed");
            goto err;}<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    if (!EVP_DigestUpdate(ctx, sha1_pt,
            t->pt_len))<o:p></o:p></p>
          <p class="MsoNormal">    {syslog(LOG_NOTICE, "digest update
            failed"); goto err;}<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    if (!EVP_DigestFinal(ctx, out,
            &out_len))<o:p></o:p></p>
          <p class="MsoNormal">    {syslog(LOG_NOTICE, "digest final
            failed"); goto err;}<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    /* Optional corruption */<o:p></o:p></p>
          <p class="MsoNormal">    OSSL_SELF_TEST_oncorrupt_byte(st,
            out);<o:p></o:p></p>
          <p class="MsoNormal">    for (int i=0; i <
            (int)t->expected_len; i++)<o:p></o:p></p>
          <p class="MsoNormal">   {syslog(LOG_NOTICE, "%x", out[i]);}<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    if (out_len != t->expected_len<o:p></o:p></p>
          <p class="MsoNormal">            || memcmp(out, sha1_digest,
            out_len) != 0)<o:p></o:p></p>
          <p class="MsoNormal">        goto err;<o:p></o:p></p>
          <p class="MsoNormal">    ok = 1;<o:p></o:p></p>
          <p class="MsoNormal">err:<o:p></o:p></p>
          <p class="MsoNormal">    EVP_MD_free(md);<o:p></o:p></p>
          <p class="MsoNormal">    EVP_MD_CTX_free(ctx);<o:p></o:p></p>
          <p class="MsoNormal">    OSSL_SELF_TEST_onend(st, ok);<o:p></o:p></p>
          <p class="MsoNormal">    return 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">static int self_test_digests(OSSL_LIB_CTX
            *libctx)<o:p></o:p></p>
          <p class="MsoNormal">{<o:p></o:p></p>
          <p class="MsoNormal">    OSSL_SELF_TEST *st = NULL;<o:p></o:p></p>
          <p class="MsoNormal">    st = OSSL_SELF_TEST_new(SelfTestCb,
            NULL);<o:p></o:p></p>
          <p class="MsoNormal">    if (st == NULL)<o:p></o:p></p>
          <p class="MsoNormal">        syslog(LOG_NOTICE,
            "OSSL_SELF_TEST_new failed");<o:p></o:p></p>
          <p class="MsoNormal">    int i, ret = 1;<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">    for (i = 0; i <
            (int)OSSL_NELEM(st_kat_digest_tests); ++i) {<o:p></o:p></p>
          <p class="MsoNormal">        if
            (!self_test_digest(&st_kat_digest_tests[i], st, libctx))<o:p></o:p></p>
          <p class="MsoNormal">            ret = 0;<o:p></o:p></p>
          <p class="MsoNormal">    }<o:p></o:p></p>
          <p class="MsoNormal">    return ret;<o:p></o:p></p>
          <p class="MsoNormal">}<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">if
            (!EVP_default_properties_enable_fips(libctx,1))<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"> <o:p></o:p></p>
          <p class="MsoNormal">self_test_digests(libctx);<o:p></o:p></p>
          <p class="MsoNormal"> <o:p></o:p></p>
          <p class="MsoNormal">Thanks,<o:p></o:p></p>
          <p class="MsoNormal">Ashish<o:p></o:p></p>
          <p class="MsoNormal"><br clear="all">
            Notice: This e-mail together with any attachments may
            contain information of Ribbon Communications Inc. and its
            Affiliates that is confidential and/or proprietary for the
            sole use of the intended recipient. Any review, disclosure,
            reliance or distribution by others or forwarding without
            express permission is strictly prohibited. If you are not
            the intended recipient, please notify the sender immediately
            and then delete all copies, including any attachments.<o:p></o:p></p>
        </blockquote>
        <p class="MsoNormal"><o:p> </o:p></p>
      </div>
      <br clear="all">
      Notice: This e-mail together with any attachments may contain
      information of Ribbon Communications Inc. and its Affiliates that
      is confidential and/or proprietary for the sole use of the
      intended recipient. Any review, disclosure, reliance or
      distribution by others or forwarding without express permission is
      strictly prohibited. If you are not the intended recipient, please
      notify the sender immediately and then delete all copies,
      including any attachments.<br>
    </blockquote>
    <br>
  </body>
</html>