1#include <stdio.h>
2#include <string.h>
3
4#include <openssl/evp.h>
5
6int print_hex(unsigned char *buf, int len)
7{
8	int i;
9	int n;
10
11	for (i = 0, n = 0; i < len; i++) {
12		if (n > 7) {
13			printf("\n");
14			n = 0;
15		}
16		printf("0x%02x, ", buf[i]);
17		n++;
18	}
19	printf("\n");
20
21	return (0);
22}
23
24
25int main(int argc, char *argv[])
26{
27	char *pass = "password";
28	char *salt = "1234";
29	int ic = 1000;
30	unsigned char key_material[256];
31
32	unsigned char *key;
33	unsigned char *iv;
34
35	unsigned char inbuf[256];
36	unsigned char outbuf[256];
37	int outlen;
38	int n;
39
40	EVP_CIPHER_CTX ctx;
41
42	PKCS5_PBKDF2_HMAC_SHA1(pass, strlen(pass), salt, strlen(salt), ic, 128, key_material);
43	printf("PKCS5_PBKDF2_HMAC_SHA1(\"%s\", \"%s\", %d)=\n", pass, salt, ic);
44	print_hex(key_material, 32);
45
46	key = key_material;
47	//iv = key_material + 8;
48	//iv = key_material + 24;
49	//iv = key_material + 16;
50	//iv = key_material + 24;
51	iv = key_material + 32;
52
53	EVP_CIPHER_CTX_init(&ctx);
54	//EVP_EncryptInit_ex(&ctx, EVP_des_cbc(), NULL, key, iv);
55	//EVP_EncryptInit_ex(&ctx, EVP_des_ede3_cbc(), NULL, key, iv);
56	//EVP_EncryptInit_ex(&ctx, EVP_aes_128_cbc(), NULL, key, iv);
57	//EVP_EncryptInit_ex(&ctx, EVP_aes_192_cbc(), NULL, key, iv);
58	EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, key, iv);
59
60	printf("\ncipher parameters:\n");
61	printf("    block size: %d\n", EVP_CIPHER_CTX_block_size(&ctx));
62	printf("    key length: %d\n", EVP_CIPHER_CTX_key_length(&ctx));
63	printf("     iv length: %d\n", EVP_CIPHER_CTX_iv_length(&ctx));
64
65	while (1) {
66		if ((n = fread(inbuf, 1, 128, stdin)) <= 0) {
67			break;
68		}
69		if (!EVP_EncryptUpdate(&ctx, outbuf, &outlen, inbuf, n)) {
70			return (0);
71		}
72		print_hex(outbuf, outlen);
73	}
74
75	if (!EVP_EncryptFinal_ex(&ctx, outbuf, &outlen)) {
76		return (0);
77	}
78	print_hex(outbuf, outlen);
79
80	EVP_CIPHER_CTX_cleanup(&ctx);
81
82	return (0);
83}
84
85