tags:

views:

137

answers:

1

I'm following the example of code available in: http://www.openssl.org/docs/crypto/sha.html#

After the following:

EVP_DigestFinal_ex(&mdctx, md_value, &md_len);

the final digest is stored in md_value. I'd like to copy that digest to another character array of equal size. This is a two part problem though. I'm not understanding what exactly is being stored in md_value, looks like binary. The following printf formats the data to output hex, which is what I need.. a final string version of the hash involved (within a loop where i has context:

printf("val: %02x\n", md_value[i]);

My question is, how do I copy only the hex values to another character array. Here's what I've tried so far, which is terrible in as far as an example goes:

for(i = 0; i < md_len; i++) {
 unsigned char c;
   printf("val: %02x\n", md_value[i]);
 sprintf(c, "%02x", md_value[i]);
 h[0] = c;
}

h in this case is where I want the hex characters copied. It is a character array that looks like:

unsigned char h[EVP_MAX_MD_SIZE];
+2  A: 

I'm not sure from your question if you want to copy the raw data or to create a formatted textual string.

Anyway, to copy the raw data, memcpy is what you want:

unsigned char *copy = malloc(md_len);
memcpy(copy, md_value, md_len);

If you want to create a formatted string, that's when you need sprintf:

// each byte needs two chararacters for display plus 1 for terminating NULL
char *formatted = malloc(md_len * 2 + 1);

for (idx = 0; idx < md_len; ++idx)
{
    sprintf(formatted + idx * 2, "%02x", md_value[idx]);
}
R Samuel Klatchko
curious, how does formatted + idx * 2 work? for every index, it essentially leaves room for two characters?
randombits