intel/isa-l_crypto

Returned a NULL `MD5_HASH_CTX`

Closed this issue · 3 comments

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <assert.h>
#include <isa-l_crypto.h>

int main() {
    // Taken from https://github.com/intel/isa-l_crypto/blob/master/md5_mb/md5_mb_test.c#L87-L131

    MD5_HASH_CTX_MGR *mgr = NULL;
    MD5_HASH_CTX ctxpool[1], *ctx = NULL;
    uint32_t i = 0;
    int ret;
    const char *msgs[] = {
            "Test vector from febooti.com",
    };

    ret = posix_memalign((void *) &mgr, 16, sizeof(MD5_HASH_CTX_MGR));
    if ((ret != 0) || (mgr == NULL)) {
        printf("posix_memalign failed test aborted\n");
        return 1;
    }

    md5_ctx_mgr_init(mgr);

    hash_ctx_init(&ctxpool[i]);
    ctxpool[i].user_data = (void *) ((uint64_t) i);

    ctx = md5_ctx_mgr_submit(mgr,
                             &ctxpool[i], msgs[i],
                             strlen((char *) msgs[i]), HASH_ENTIRE);
    assert(ctx != NULL);

    free(mgr);

    return 0;
}
$ gcc -Wall main.c -lisal_crypto && ./a.out
a.out: main.c:31: main: Assertion `ctx != NULL' failed.
[1]    691171 abort (core dumped)  ./a.out

The above code is taken from https://github.com/intel/isa-l_crypto/blob/master/md5_mb/md5_mb_test.c#L87-L131
I don't know why it failed to run. certainly, something is wrong with me.

FYI, make -j$(nproc) test was all passed.

$ make -j$(nproc) check
PASS: md5_mb/md5_mb_test
PASS: sha256_mb/sha256_mb_test
PASS: sha1_mb/sha1_mb_test
PASS: aes/cbc_std_vectors_test
PASS: sha512_mb/sha512_mb_test
PASS: sm3_mb/sm3_ref_test
PASS: aes/gcm_std_vectors_test
PASS: aes/gcm_nt_std_vectors_test
PASS: aes/xts_128_test
PASS: aes/xts_256_test
PASS: aes/xts_128_expanded_key_test
PASS: aes/xts_256_expanded_key_test
PASS: sha256_mb/sha256_mb_flush_test
PASS: sha1_mb/sha1_mb_flush_test
PASS: rolling_hash/rolling_hash2_test
PASS: md5_mb/md5_mb_rand_test
PASS: md5_mb/md5_mb_rand_update_test
PASS: sha512_mb/sha512_mb_rand_update_test
PASS: sha1_mb/sha1_mb_rand_update_test
PASS: sha1_mb/sha1_mb_rand_test
PASS: sha256_mb/sha256_mb_rand_test
PASS: sha512_mb/sha512_mb_rand_test
PASS: sha256_mb/sha256_mb_rand_update_test
PASS: mh_sha1/mh_sha1_test
PASS: mh_sha256/mh_sha256_test
============================================================================
Testsuite summary for libisal_crypto 2.24.0
============================================================================
# TOTAL: 25
# PASS:  25
# SKIP:  0
# XFAIL: 0
# FAIL:  0
# XPASS: 0
# ERROR: 0
============================================================================

Solved, I forget to call md5_ctx_mgr_flush() after submit.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <assert.h>
#include <isa-l_crypto.h>
#include <arpa/inet.h>

int main(void) {
    MD5_HASH_CTX_MGR *mgr = NULL;

    int e = posix_memalign((void *) &mgr, 16, sizeof *mgr);
    assert(e == 0);
    assert(mgr != NULL);
    md5_ctx_mgr_init(mgr);

    MD5_HASH_CTX job;
    hash_ctx_init(&job);

    const char *msg = "Test vector from febooti.com";
    uint32_t len = strlen(msg);

    MD5_HASH_CTX *ctx = md5_ctx_mgr_submit(mgr, &job, msg, len, HASH_ENTIRE);
    assert(ctx == NULL || ctx->error == HASH_CTX_ERROR_NONE);

    ctx = md5_ctx_mgr_flush(mgr);
    if (ctx != NULL && ctx->error == HASH_CTX_ERROR_NONE) {
        uint32_t *p = job.job.result_digest;
        printf("%x%x%x%x\n",
               htonl(p[0]),
               htonl(p[1]),
               htonl(p[2]),
               htonl(p[3])
        );
    } else {
        printf("something is bad.\n");
    }

    free(mgr);

    return 0;
}