create new file and rename
[pam_pcsc_cr.git] / ossl_crypto.c
1 #ifdef HAVE_CONFIG_H
2 # include "config.h"
3 #endif
4 #include <openssl/err.h>
5 #include <openssl/aes.h>
6 #include <openssl/sha.h>
7 #include <openssl/hmac.h>
8
9 #include "crypto_if.h"
10
11 static const char *ossl_init(void)
12 {
13         ERR_load_crypto_strings();
14         return "openssl";
15 }
16
17 static unsigned long ossl_encrypt(void *key, int keylen, void *iv,
18                         void *pt, void *ct, int tlen)
19 {
20         AES_KEY akey;
21
22         if (AES_set_encrypt_key(key, keylen*8, &akey))
23                 return ERR_get_error();
24         AES_cbc_encrypt(pt, ct, tlen, &akey, iv, AES_ENCRYPT);
25         return 0UL;
26 }
27
28 static unsigned long ossl_decrypt(void *key, int keylen, void *iv,
29                         void *ct, void *pt, int tlen)
30 {
31         AES_KEY akey;
32
33         if (AES_set_decrypt_key(key, keylen*8, &akey))
34                 return ERR_get_error();
35         AES_cbc_encrypt(ct, pt, tlen, &akey, iv, AES_DECRYPT);
36         return 0UL;
37 }
38
39 static unsigned long ossl_hash(void *pt, int tlen, void *tag, int *taglen)
40 {
41         SHA_CTX sctx;
42
43         if (!SHA1_Init(&sctx)) return ERR_get_error();
44         if (!SHA1_Update(&sctx, pt, tlen)) return ERR_get_error();
45         if (!SHA1_Final(tag, &sctx)) return ERR_get_error();
46         *taglen = SHA_DIGEST_LENGTH;
47         return 0UL;
48 }
49
50 static unsigned long ossl_hmac(void *key, int keylen, void *pt, int tlen,
51                         void *tag, int *taglen)
52 {
53 #if 1
54         HMAC_CTX hctx;
55
56         HMAC_CTX_init(&hctx);
57         if (!HMAC_Init_ex(&hctx, key, keylen, EVP_sha1(), NULL))
58                 return ERR_get_error();
59         if (!HMAC_Update(&hctx, pt, tlen)) return ERR_get_error();
60         if (!HMAC_Final(&hctx, tag, (unsigned int *)taglen))
61                 return ERR_get_error();
62         HMAC_CTX_cleanup(&hctx);
63 #else
64         if (HMAC(EVP_sha1(), key, keylen, pt, tlen,
65                                 tag, (unsigned int *)taglen) != tag)
66                 return ERR_get_error();
67 #endif
68         return 0UL;
69 }
70
71 static const char *ossl_errstr(unsigned long err)
72 {
73         return ERR_error_string(err, NULL);
74 }
75
76 struct crypto_interface ossl_crypto_if = {
77         .init           = ossl_init,
78         .encrypt        = ossl_encrypt,
79         .decrypt        = ossl_decrypt,
80         .hash           = ossl_hash,
81         .hmac           = ossl_hmac,
82         .errstr         = ossl_errstr,
83 };