Commit d166ed8c authored by Dr. Stephen Henson's avatar Dr. Stephen Henson
Browse files

check return values for EVP_Digest*() APIs

parent 1fc431ba
Loading
Loading
Loading
Loading
+53 −32
Original line number Diff line number Diff line
@@ -287,7 +287,7 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
    char *salt_out;
    int n;
    unsigned int i;
    EVP_MD_CTX *md, *md2;
    EVP_MD_CTX *md = NULL, *md2 = NULL;
    size_t passwd_len, salt_len;

    passwd_len = strlen(passwd);
@@ -303,49 +303,65 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
    assert(salt_len <= 8);

    md = EVP_MD_CTX_new();
    if (md == NULL)
        return NULL;
    EVP_DigestInit_ex(md, EVP_md5(), NULL);
    EVP_DigestUpdate(md, passwd, passwd_len);
    EVP_DigestUpdate(md, "$", 1);
    EVP_DigestUpdate(md, magic, strlen(magic));
    EVP_DigestUpdate(md, "$", 1);
    EVP_DigestUpdate(md, salt_out, salt_len);
    if (md == NULL
        || !EVP_DigestInit_ex(md, EVP_md5(), NULL)
        || !EVP_DigestUpdate(md, passwd, passwd_len)
        || !EVP_DigestUpdate(md, "$", 1)
        || !EVP_DigestUpdate(md, magic, strlen(magic))
        || !EVP_DigestUpdate(md, "$", 1)
        || !EVP_DigestUpdate(md, salt_out, salt_len))

    md2 = EVP_MD_CTX_new();
    if (md2 == NULL)
        return NULL;
    EVP_DigestInit_ex(md2, EVP_md5(), NULL);
    EVP_DigestUpdate(md2, passwd, passwd_len);
    EVP_DigestUpdate(md2, salt_out, salt_len);
    EVP_DigestUpdate(md2, passwd, passwd_len);
    EVP_DigestFinal_ex(md2, buf, NULL);

    for (i = passwd_len; i > sizeof buf; i -= sizeof buf)
        EVP_DigestUpdate(md, buf, sizeof buf);
    EVP_DigestUpdate(md, buf, i);
    if (md2 == NULL
        || !EVP_DigestInit_ex(md2, EVP_md5(), NULL)
        || !EVP_DigestUpdate(md2, passwd, passwd_len)
        || !EVP_DigestUpdate(md2, salt_out, salt_len)
        || !EVP_DigestUpdate(md2, passwd, passwd_len)
        || !EVP_DigestFinal_ex(md2, buf, NULL))
        goto err;

    for (i = passwd_len; i > sizeof buf; i -= sizeof buf) {
        if (!EVP_DigestUpdate(md, buf, sizeof buf))
            goto err;
    }
    if (!EVP_DigestUpdate(md, buf, i))
        goto err;

    n = passwd_len;
    while (n) {
        EVP_DigestUpdate(md, (n & 1) ? "\0" : passwd, 1);
        if (!EVP_DigestUpdate(md, (n & 1) ? "\0" : passwd, 1))
            goto err;
        n >>= 1;
    }
    EVP_DigestFinal_ex(md, buf, NULL);
    if (!EVP_DigestFinal_ex(md, buf, NULL))
        return NULL;

    for (i = 0; i < 1000; i++) {
        EVP_DigestInit_ex(md2, EVP_md5(), NULL);
        EVP_DigestUpdate(md2, (i & 1) ? (unsigned const char *)passwd : buf,
                         (i & 1) ? passwd_len : sizeof buf);
        if (i % 3)
            EVP_DigestUpdate(md2, salt_out, salt_len);
        if (i % 7)
            EVP_DigestUpdate(md2, passwd, passwd_len);
        EVP_DigestUpdate(md2, (i & 1) ? buf : (unsigned const char *)passwd,
                         (i & 1) ? sizeof buf : passwd_len);
        EVP_DigestFinal_ex(md2, buf, NULL);
        if (!EVP_DigestInit_ex(md2, EVP_md5(), NULL))
            goto err;
        if (!EVP_DigestUpdate(md2,
                              (i & 1) ? (unsigned const char *)passwd : buf,
                              (i & 1) ? passwd_len : sizeof buf))
            goto err;
        if (i % 3) {
            if (!EVP_DigestUpdate(md2, salt_out, salt_len))
                goto err;
        }
        if (i % 7) {
            if (!EVP_DigestUpdate(md2, passwd, passwd_len))
                goto err;
        }
        if (!EVP_DigestUpdate(md2,
                              (i & 1) ? buf : (unsigned const char *)passwd,
                              (i & 1) ? sizeof buf : passwd_len))
                goto err;
        if (!EVP_DigestFinal_ex(md2, buf, NULL))
                goto err;
    }
    EVP_MD_CTX_free(md2);
    EVP_MD_CTX_free(md);
    md2 = NULL;
    md = NULL;

    {
        /* transform buf into output string */
@@ -386,6 +402,11 @@ static char *md5crypt(const char *passwd, const char *magic, const char *salt)
    }

    return out_buf;

 err:
    EVP_MD_CTX_free(md2);
    EVP_MD_CTX_free(md);
    return NULL;
}
# endif

+28 −15
Original line number Diff line number Diff line
@@ -601,9 +601,11 @@ static int EVP_Digest_MD2_loop(void *args)
    unsigned char *buf = tempargs->buf;
    unsigned char md2[MD2_DIGEST_LENGTH];
    int count;
    for (count = 0; COND(c[D_MD2][testnum]); count++)
        EVP_Digest(buf, (unsigned long)lengths[testnum], &(md2[0]), NULL,
                EVP_md2(), NULL);
    for (count = 0; COND(c[D_MD2][testnum]); count++) {
        if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(md2[0]), NULL,
                EVP_md2(), NULL))
            return -1;
    }
    return count;
}
#endif
@@ -615,9 +617,11 @@ static int EVP_Digest_MDC2_loop(void *args)
    unsigned char *buf = tempargs->buf;
    unsigned char mdc2[MDC2_DIGEST_LENGTH];
    int count;
    for (count = 0; COND(c[D_MDC2][testnum]); count++)
        EVP_Digest(buf, (unsigned long)lengths[testnum], &(mdc2[0]), NULL,
                EVP_mdc2(), NULL);
    for (count = 0; COND(c[D_MDC2][testnum]); count++) {
        if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(mdc2[0]), NULL,
                EVP_mdc2(), NULL))
            return -1;
    }
    return count;
}
#endif
@@ -629,9 +633,11 @@ static int EVP_Digest_MD4_loop(void *args)
    unsigned char *buf = tempargs->buf;
    unsigned char md4[MD4_DIGEST_LENGTH];
    int count;
    for (count = 0; COND(c[D_MD4][testnum]); count++)
        EVP_Digest(&(buf[0]), (unsigned long)lengths[testnum], &(md4[0]),
                NULL, EVP_md4(), NULL);
    for (count = 0; COND(c[D_MD4][testnum]); count++) {
        if (!EVP_Digest(&(buf[0]), (unsigned long)lengths[testnum], &(md4[0]),
                NULL, EVP_md4(), NULL))
            return -1;
    }
    return count;
}
#endif
@@ -717,9 +723,11 @@ static int EVP_Digest_RMD160_loop(void *args)
    unsigned char *buf = tempargs->buf;
    unsigned char rmd160[RIPEMD160_DIGEST_LENGTH];
    int count;
    for (count = 0; COND(c[D_RMD160][testnum]); count++)
        EVP_Digest(buf, (unsigned long)lengths[testnum], &(rmd160[0]), NULL,
                EVP_ripemd160(), NULL);
    for (count = 0; COND(c[D_RMD160][testnum]); count++) {
        if (!EVP_Digest(buf, (unsigned long)lengths[testnum], &(rmd160[0]),
                NULL, EVP_ripemd160(), NULL))
            return -1;
    }
    return count;
}
#endif
@@ -888,9 +896,10 @@ static int EVP_Digest_loop(void *args)
    unsigned char md[EVP_MAX_MD_SIZE];
    int count;
    for (count = 0;
            COND(save_count * 4 * lengths[0] / lengths[testnum]); count++)
        EVP_Digest(buf, lengths[testnum], &(md[0]), NULL, evp_md, NULL);

            COND(save_count * 4 * lengths[0] / lengths[testnum]); count++) {
        if (!EVP_Digest(buf, lengths[testnum], &(md[0]), NULL, evp_md, NULL))
            return -1;
    }
    return count;
}

@@ -2845,6 +2854,10 @@ static void pkey_print_message(const char *str, const char *str2, long num,

static void print_result(int alg, int run_no, int count, double time_used)
{
    if (count == -1) {
        BIO_puts(bio_err, "EVP error!\n");
        exit(1);
    }
    BIO_printf(bio_err,
               mr ? "+R:%d:%s:%f\n"
               : "%d %s's in %.2fs\n", count, names[alg], time_used);
+14 −9
Original line number Diff line number Diff line
@@ -492,28 +492,30 @@ static int create_digest(BIO *input, char *digest, const EVP_MD *md,
                         unsigned char **md_value)
{
    int md_value_len;
    int rv = 0;
    EVP_MD_CTX *md_ctx = NULL;

    md_value_len = EVP_MD_size(md);
    if (md_value_len < 0)
        return 0;

    if (input) {
        EVP_MD_CTX *md_ctx = EVP_MD_CTX_new();
        unsigned char buffer[4096];
        int length;

        md_ctx = EVP_MD_CTX_new();
        if (md_ctx == NULL)
            return 0;
        *md_value = app_malloc(md_value_len, "digest buffer");
        EVP_DigestInit(md_ctx, md);
        if (!EVP_DigestInit(md_ctx, md))
            goto err;
        while ((length = BIO_read(input, buffer, sizeof(buffer))) > 0) {
            EVP_DigestUpdate(md_ctx, buffer, length);
        }
        if (!EVP_DigestFinal(md_ctx, *md_value, NULL)) {
            EVP_MD_CTX_free(md_ctx);
            return 0;
            if (!EVP_DigestUpdate(md_ctx, buffer, length))
                goto err;
        }
        EVP_MD_CTX_free(md_ctx);
        if (!EVP_DigestFinal(md_ctx, *md_value, NULL))
            goto err;
        md_value_len = EVP_MD_size(md);
    } else {
        long digest_len;
        *md_value = OPENSSL_hexstr2buf(digest, &digest_len);
@@ -525,7 +527,10 @@ static int create_digest(BIO *input, char *digest, const EVP_MD *md,
            return 0;
        }
    }
    return md_value_len;
    rv = md_value_len;
 err:
    EVP_MD_CTX_free(md_ctx);
    return rv;
}

static ASN1_INTEGER *create_nonce(int bits)
+2 −2
Original line number Diff line number Diff line
@@ -117,8 +117,8 @@ int DH_KDF_X9_42(unsigned char *out, size_t outlen,
        goto err;
    for (i = 1;; i++) {
        unsigned char mtmp[EVP_MAX_MD_SIZE];
        EVP_DigestInit_ex(mctx, md, NULL);
        if (!EVP_DigestUpdate(mctx, Z, Zlen))
        if (!EVP_DigestInit_ex(mctx, md, NULL)
            || !EVP_DigestUpdate(mctx, Z, Zlen))
            goto err;
        ctr[3] = i & 0xFF;
        ctr[2] = (i >> 8) & 0xFF;
+2 −1
Original line number Diff line number Diff line
@@ -34,7 +34,8 @@ int ECDH_KDF_X9_62(unsigned char *out, size_t outlen,
    mdlen = EVP_MD_size(md);
    for (i = 1;; i++) {
        unsigned char mtmp[EVP_MAX_MD_SIZE];
        EVP_DigestInit_ex(mctx, md, NULL);
        if (!EVP_DigestInit_ex(mctx, md, NULL))
            goto err;
        ctr[3] = i & 0xFF;
        ctr[2] = (i >> 8) & 0xFF;
        ctr[1] = (i >> 16) & 0xFF;
Loading