I have implemented the following code for SHA3-224 which uses "shortmessage" in bit oriented mode, the message length is 47 bits and I am not able to get correct message digest which is supposed to be "6a1cdc94a6d676d598d7dd51be9461598bd931b6a8c45d6b34dfa6bb":
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <openssl/evp.h>
#include "basic_convertion.h"
#define HANDLE_ERROR(msg) { fprintf(stderr, "%s\n", msg); exit(EXIT_FAILURE); }
#define HANDLE_ERROR2(msg, mdctx) { fprintf(stderr, "%s\n", msg); EVP_MD_CTX_destroy(mdctx); exit(EXIT_FAILURE); }
int main()
{
char *msg = "a1fc9771d600";
/*Len = 47
Msg = a1fc9771d600
MD = 6a1cdc94a6d676d598d7dd51be9461598bd931b6a8c45d6b34dfa6bb*/
int msg_len_byt = (strlen(msg)/2);
int msg_len_chr = strlen(msg);//*4;
int msg_len_bit = strlen(msg)*4;
printf("msg_len_byt = %d\n",msg_len_byt);
printf("msg_len_chr = %d\n",msg_len_chr);
printf("msg_len_bit = %d\n",msg_len_bit);
int i;
EVP_MD_CTX *mdctx;
int val;
unsigned char * digest;
unsigned int digest_len;
EVP_MD *algo = NULL;
algo = EVP_sha3_224();
if ((mdctx = EVP_MD_CTX_create()) == NULL) {
HANDLE_ERROR("EVP_MD_CTX_create() error");
}
// initialize digest engine
if (EVP_DigestInit_ex(mdctx, algo, NULL) != 1) { // returns 1 if successful
HANDLE_ERROR2("EVP_DigestInit_ex() error", mdctx)
}
//provide data to digest engine
if (EVP_DigestUpdate(mdctx, msg, 47) != 1) { // returns 1 if successful
HANDLE_ERROR2("EVP_DigestUpdate() error", mdctx)
}
digest_len = EVP_MD_size(algo);
printf("digest_len = %d\n",digest_len);
if ((digest = (unsigned char *)OPENSSL_malloc(digest_len)) == NULL) {
HANDLE_ERROR2("OPENSSL_malloc() error", mdctx)
}
if (EVP_DigestFinal_ex(mdctx, digest, &digest_len) != 1) { // returns 1 if successful
OPENSSL_free(digest);
HANDLE_ERROR2("EVP_DigestFinal_ex() error", mdctx)
}
for (int i = 0; i < digest_len; i++) {
printf("%02x", digest[i]);
}
//OPENSSL_free(digest);
EVP_MD_CTX_destroy(mdctx);
return 0;
}