2
* Copyright (c) 2008 Kungliga Tekniska Högskolan
3
* (Royal Institute of Technology, Stockholm, Sweden).
6
* Redistribution and use in source and binary forms, with or without
7
* modification, are permitted provided that the following conditions
10
* 1. Redistributions of source code must retain the above copyright
11
* notice, this list of conditions and the following disclaimer.
13
* 2. Redistributions in binary form must reproduce the above copyright
14
* notice, this list of conditions and the following disclaimer in the
15
* documentation and/or other materials provided with the distribution.
17
* 3. Neither the name of the Institute nor the names of its contributors
18
* may be used to endorse or promote products derived from this software
19
* without specific prior written permission.
21
* THIS SOFTWARE IS PROVIDED BY THE INSTITUTE AND CONTRIBUTORS ``AS IS'' AND
22
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
23
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
24
* ARE DISCLAIMED. IN NO EVENT SHALL THE INSTITUTE OR CONTRIBUTORS BE LIABLE
25
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
26
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
27
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
28
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
29
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
30
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
34
/* Windows crypto provider plugin, sample */
40
#include <sys/types.h>
51
static HCRYPTPROV hCryptProv = NULL;
62
generic_cbc_do_cipher(EVP_CIPHER_CTX *ctx,
64
const unsigned char *in,
67
struct generic_key *gk = ctx->cipher_data;
71
bResult = CryptSetKeyParam(gk->hKey, KP_IV, ctx->iv, 0);
74
memcpy(out, in, size);
77
bResult = CryptEncrypt(gk->hKey, 0, TRUE, 0, out, &length, size);
79
bResult = CryptDecrypt(gk->hKey, 0, TRUE, 0, out, &length);
86
generic_cleanup(EVP_CIPHER_CTX *ctx)
88
struct generic_key *gk = ctx->cipher_data;
89
CryptDestroyKey(gk->hKey);
95
import_key(int alg, const unsigned char *key, size_t keylen)
102
size_t bloblen = sizeof(*key_blob) - 1 + keylen;
104
key_blob = malloc(bloblen);
106
key_blob->hdr.bType = PLAINTEXTKEYBLOB;
107
key_blob->hdr.bVersion = CUR_BLOB_VERSION;
108
key_blob->hdr.reserved = 0;
109
key_blob->hdr.aiKeyAlg = alg;
111
memcpy(key_blob->key, key, keylen);
113
bResult = CryptImportKey(hCryptProv,
114
(void *)key_blob, bloblen, 0, 0,
123
crypto_des_ede3_cbc_init(EVP_CIPHER_CTX *ctx,
124
const unsigned char * key,
125
const unsigned char * iv,
128
struct generic_key *gk = ctx->cipher_data;
131
gk->hKey = import_key(CALG_3DES,
132
key->key->keyvalue.data,
133
key->key->keyvalue.len);
139
* The tripple DES cipher type (Micrsoft crypt provider)
141
* @return the DES-EDE3-CBC EVP_CIPHER pointer.
143
* @ingroup hcrypto_evp
147
EVP_wincrypt_des_ede3_cbc(void)
149
static const EVP_CIPHER des_ede3_cbc = {
155
crypto_des_ede3_cbc_init,
156
generic_cbc_do_cipher,
158
sizeof(struct generic_key),
164
return &des_ede3_cbc;
171
struct generic_hash {
176
crypto_md5_init(struct generic_hash *m);
179
bResult = CryptCreateHash(hCryptProv, CALG_MD5, 0, 0, &m->hHash);
184
generic_hash_update (struct generic_hash *m, const void *p, size_t len)
187
bResult = CryptHashData(m->hHash, data, ( DWORD )len, 0 );
192
generic_hash_final (void *res, struct generic_hash *m);
196
bResult = CryptGetHashParam(m->hHash, HP_HASHVAL, res, &length, 0)
201
generic_hash_cleanup(struct generic_hash *m)
203
CryptDestroyHash(m->hHash);
208
EVP_wincrypt_md5(void)
210
static const struct hc_evp_md md5 = {
213
sizeof(struct generic_hash),
214
(hc_evp_md_init)crypto_md5_init,
215
(hc_evp_md_update)generic_hash_update,
216
(hc_evp_md_final)generic_hash_final,
217
(hc_evp_md_cleanup)generic_hash_cleanup