Digests

Updated: April 19, 2023

The qcrypto library API includes cryptographic digest (hashing) functions.

See the library reference for detailed information on the following functions:

Digest examples

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include <qcrypto/qcrypto.h>

int main(int argc, char* argv[])
{
    const char *sha256 = "sha256";
    int ret;
    qcrypto_ctx_t *ctx = NULL;
    size_t dsize;
    const char *input_buffer = "hello world";
    size_t input_size = strlen(input_buffer);
    uint8_t *output_buffer = NULL;

    /* Initializing the qcrypto library */
    ret = qcrypto_init(QCRYPTO_INIT_LAZY, NULL);
    if (ret != QCRYPTO_R_EOK) {
        fprintf(stderr, "qcrypto_init() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
        goto done;
    }

    /* Checking if a digest is supported */
    ret = qcrypto_digest_supported(sha256, NULL, 0);
    if (ret != QCRYPTO_R_EOK) {
        fprintf(stderr, "qcrypto_digest_supported() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
        goto done;
    }

    /* Requesting the digest */
    ret = qcrypto_digest_request(sha256, NULL, 0, &ctx);
    if (ret != QCRYPTO_R_EOK) {
        fprintf(stderr, "qcrypto_digest_request() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
        goto done;
    }

    /* Querying the digest size */
    dsize = qcrypto_digestsize(ctx);
    printf("digest size =  %ld\n", dsize);

    output_buffer = malloc(dsize);
    if (output_buffer == NULL) {
        fprintf(stderr,"output size not defined (%d:%s)\n", ret, qcrypto_strerror(ret));
        goto done;
    }

     /* Initializing, updating, and finalizing the digest */
    ret = qcrypto_digest(ctx, (const uint8_t*)input_buffer, input_size, output_buffer, &dsize);
    if (ret != QCRYPTO_R_EOK) {
        fprintf(stderr, "qcrypto_digest() failed (%d:%s)\n", ret, qcrypto_strerror(ret));
        goto done;
    }

    printf("sha256(\"hello world\") = ");
    for (int i=0; i < dsize; i++) {
        printf("%02x", output_buffer[i]);
    }
    printf("\n");

done:
    /* free the allocated memory */
    free(output_buffer);

    /* Releasing the context */
    qcrypto_release_ctx(ctx);

    /* Uninitializing the qcrypto library */
    qcrypto_uninit();

    return ret;
}
#if defined(__QNXNTO__) && defined(__USESRCVERSION)
#include <sys/srcversion.h>
__SRCVERSION("$URL:$ $Rev:$")
#endif