C
SHA-256
Learn hashing with SHA-256.
What is SHA-256?
SHA-256 is a standard cryptographic hash function that produces a 32-byte digest. It is used via OpenSSL's EVP interface. You create a context with EVP_MD_CTX *ctx = EVP_MD_CTX_new();.
The flow: initialize with EVP_DigestInit_ex(ctx, EVP_sha256(), NULL), feed data with EVP_DigestUpdate(ctx, data, len), get the digest with EVP_DigestFinal_ex(ctx, digest, &len). When done, clean up with EVP_MD_CTX_free(ctx). The digest is written into unsigned char digest[EVP_MAX_MD_SIZE]. For testing, keeping the output constant is enough.
The SHA-256 call pattern
The typical flow: EVP_MD_CTX *ctx = EVP_MD_CTX_new();, EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);, EVP_DigestUpdate(ctx, "abc", 3);, EVP_DigestFinal_ex(ctx, digest, &len);, EVP_MD_CTX_free(ctx);. digest is the 32-byte digest.
For testing, printing printf("sha256 done\n") is safer than printing the digest; even though the digest bytes are fixed, printing them is environment-dependent. This keeps the output deterministic. In production you print the digest as hex.
Exercise Compute SHA-256
Create a context with EVP_MD_CTX *ctx = EVP_MD_CTX_new();. Call EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);, EVP_DigestUpdate(ctx, "abc", 3);, unsigned char digest[EVP_MAX_MD_SIZE]; unsigned int len = 0; EVP_DigestFinal_ex(ctx, digest, &len);, EVP_MD_CTX_free(ctx);. printf("sha256 done\n");.
Show example solution
#include <stdio.h>
#include <openssl/evp.h>
int main(void) {
EVP_MD_CTX *ctx = EVP_MD_CTX_new();
EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);
EVP_DigestUpdate(ctx, "abc", 3);
unsigned char digest[EVP_MAX_MD_SIZE];
unsigned int len = 0;
EVP_DigestFinal_ex(ctx, digest, &len);
EVP_MD_CTX_free(ctx);
printf("sha256 done\n");
return 0;
}
Test yourself
-
Match SHA-256 parts
- EVP_MD_CTX_new
- Create context
- EVP_DigestInit_ex
- Initialize
- EVP_DigestUpdate
- Feed data
- EVP_DigestFinal_ex
- Get digest
-
How many bytes is the SHA-256 digest?
- 16 bytes
- 24 bytes
- 64 bytes
- 32 bytes
Show answer
32 bytes — SHA-256 produces a 32-byte digest.
-
EVP_DigestInit_ex
EVP_DigestInit_ex(ctx, ____, NULL);
Show answer
EVP_DigestInit_ex(ctx, EVP_sha256(), NULL);
Next lesson: HMAC