summaryrefslogtreecommitdiff
path: root/src/lib/libcrypto/cmac
diff options
context:
space:
mode:
authorcvs2svn <admin@example.com>2014-02-27 21:04:58 +0000
committercvs2svn <admin@example.com>2014-02-27 21:04:58 +0000
commit726818f36b5221c023cd04c4b90bdbc08e94cd96 (patch)
treecf8221f3aa5bf5a578ddf1ecf5677ad08c04d342 /src/lib/libcrypto/cmac
parent3b6d92e82b1421b811bcdec7f7fdfb31eeef18de (diff)
downloadopenbsd-OPENBSD_5_5_BASE.tar.gz
openbsd-OPENBSD_5_5_BASE.tar.bz2
openbsd-OPENBSD_5_5_BASE.zip
This commit was manufactured by cvs2git to create tag 'OPENBSD_5_5_BASE'.OPENBSD_5_5_BASE
Diffstat (limited to 'src/lib/libcrypto/cmac')
-rw-r--r--src/lib/libcrypto/cmac/cm_ameth.c97
-rw-r--r--src/lib/libcrypto/cmac/cm_pmeth.c224
-rw-r--r--src/lib/libcrypto/cmac/cmac.c308
-rw-r--r--src/lib/libcrypto/cmac/cmac.h82
4 files changed, 0 insertions, 711 deletions
diff --git a/src/lib/libcrypto/cmac/cm_ameth.c b/src/lib/libcrypto/cmac/cm_ameth.c
deleted file mode 100644
index 0b8e5670b0..0000000000
--- a/src/lib/libcrypto/cmac/cm_ameth.c
+++ /dev/null
@@ -1,97 +0,0 @@
1/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
2 * project 2010.
3 */
4/* ====================================================================
5 * Copyright (c) 2010 The OpenSSL Project. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. All advertising materials mentioning features or use of this
20 * software must display the following acknowledgment:
21 * "This product includes software developed by the OpenSSL Project
22 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23 *
24 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25 * endorse or promote products derived from this software without
26 * prior written permission. For written permission, please contact
27 * licensing@OpenSSL.org.
28 *
29 * 5. Products derived from this software may not be called "OpenSSL"
30 * nor may "OpenSSL" appear in their names without prior written
31 * permission of the OpenSSL Project.
32 *
33 * 6. Redistributions of any form whatsoever must retain the following
34 * acknowledgment:
35 * "This product includes software developed by the OpenSSL Project
36 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37 *
38 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
42 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49 * OF THE POSSIBILITY OF SUCH DAMAGE.
50 * ====================================================================
51 */
52
53#include <stdio.h>
54#include "cryptlib.h"
55#include <openssl/evp.h>
56#include <openssl/cmac.h>
57#include "asn1_locl.h"
58
59/* CMAC "ASN1" method. This is just here to indicate the
60 * maximum CMAC output length and to free up a CMAC
61 * key.
62 */
63
64static int cmac_size(const EVP_PKEY *pkey)
65 {
66 return EVP_MAX_BLOCK_LENGTH;
67 }
68
69static void cmac_key_free(EVP_PKEY *pkey)
70 {
71 CMAC_CTX *cmctx = (CMAC_CTX *)pkey->pkey.ptr;
72 if (cmctx)
73 CMAC_CTX_free(cmctx);
74 }
75
76const EVP_PKEY_ASN1_METHOD cmac_asn1_meth =
77 {
78 EVP_PKEY_CMAC,
79 EVP_PKEY_CMAC,
80 0,
81
82 "CMAC",
83 "OpenSSL CMAC method",
84
85 0,0,0,0,
86
87 0,0,0,
88
89 cmac_size,
90 0,
91 0,0,0,0,0,0,0,
92
93 cmac_key_free,
94 0,
95 0,0
96 };
97
diff --git a/src/lib/libcrypto/cmac/cm_pmeth.c b/src/lib/libcrypto/cmac/cm_pmeth.c
deleted file mode 100644
index 072228ec7f..0000000000
--- a/src/lib/libcrypto/cmac/cm_pmeth.c
+++ /dev/null
@@ -1,224 +0,0 @@
1/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
2 * project 2010.
3 */
4/* ====================================================================
5 * Copyright (c) 2010 The OpenSSL Project. All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 *
11 * 1. Redistributions of source code must retain the above copyright
12 * notice, this list of conditions and the following disclaimer.
13 *
14 * 2. Redistributions in binary form must reproduce the above copyright
15 * notice, this list of conditions and the following disclaimer in
16 * the documentation and/or other materials provided with the
17 * distribution.
18 *
19 * 3. All advertising materials mentioning features or use of this
20 * software must display the following acknowledgment:
21 * "This product includes software developed by the OpenSSL Project
22 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
23 *
24 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
25 * endorse or promote products derived from this software without
26 * prior written permission. For written permission, please contact
27 * licensing@OpenSSL.org.
28 *
29 * 5. Products derived from this software may not be called "OpenSSL"
30 * nor may "OpenSSL" appear in their names without prior written
31 * permission of the OpenSSL Project.
32 *
33 * 6. Redistributions of any form whatsoever must retain the following
34 * acknowledgment:
35 * "This product includes software developed by the OpenSSL Project
36 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
37 *
38 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
39 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
40 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
41 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
42 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
43 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
44 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
45 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
46 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
47 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
48 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
49 * OF THE POSSIBILITY OF SUCH DAMAGE.
50 * ====================================================================
51 */
52
53#include <stdio.h>
54#include "cryptlib.h"
55#include <openssl/x509.h>
56#include <openssl/x509v3.h>
57#include <openssl/evp.h>
58#include <openssl/cmac.h>
59#include "evp_locl.h"
60
61/* The context structure and "key" is simply a CMAC_CTX */
62
63static int pkey_cmac_init(EVP_PKEY_CTX *ctx)
64 {
65 ctx->data = CMAC_CTX_new();
66 if (!ctx->data)
67 return 0;
68 ctx->keygen_info_count = 0;
69 return 1;
70 }
71
72static int pkey_cmac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src)
73 {
74 if (!pkey_cmac_init(dst))
75 return 0;
76 if (!CMAC_CTX_copy(dst->data, src->data))
77 return 0;
78 return 1;
79 }
80
81static void pkey_cmac_cleanup(EVP_PKEY_CTX *ctx)
82 {
83 CMAC_CTX_free(ctx->data);
84 }
85
86static int pkey_cmac_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey)
87 {
88 CMAC_CTX *cmkey = CMAC_CTX_new();
89 CMAC_CTX *cmctx = ctx->data;
90 if (!cmkey)
91 return 0;
92 if (!CMAC_CTX_copy(cmkey, cmctx))
93 {
94 CMAC_CTX_free(cmkey);
95 return 0;
96 }
97 EVP_PKEY_assign(pkey, EVP_PKEY_CMAC, cmkey);
98
99 return 1;
100 }
101
102static int int_update(EVP_MD_CTX *ctx,const void *data,size_t count)
103 {
104 if (!CMAC_Update(ctx->pctx->data, data, count))
105 return 0;
106 return 1;
107 }
108
109static int cmac_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx)
110 {
111 EVP_MD_CTX_set_flags(mctx, EVP_MD_CTX_FLAG_NO_INIT);
112 mctx->update = int_update;
113 return 1;
114 }
115
116static int cmac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen,
117 EVP_MD_CTX *mctx)
118 {
119 return CMAC_Final(ctx->data, sig, siglen);
120 }
121
122static int pkey_cmac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2)
123 {
124 CMAC_CTX *cmctx = ctx->data;
125 switch (type)
126 {
127
128 case EVP_PKEY_CTRL_SET_MAC_KEY:
129 if (!p2 || p1 < 0)
130 return 0;
131 if (!CMAC_Init(cmctx, p2, p1, NULL, NULL))
132 return 0;
133 break;
134
135 case EVP_PKEY_CTRL_CIPHER:
136 if (!CMAC_Init(cmctx, NULL, 0, p2, ctx->engine))
137 return 0;
138 break;
139
140 case EVP_PKEY_CTRL_MD:
141 if (ctx->pkey && !CMAC_CTX_copy(ctx->data,
142 (CMAC_CTX *)ctx->pkey->pkey.ptr))
143 return 0;
144 if (!CMAC_Init(cmctx, NULL, 0, NULL, NULL))
145 return 0;
146 break;
147
148 default:
149 return -2;
150
151 }
152 return 1;
153 }
154
155static int pkey_cmac_ctrl_str(EVP_PKEY_CTX *ctx,
156 const char *type, const char *value)
157 {
158 if (!value)
159 {
160 return 0;
161 }
162 if (!strcmp(type, "key"))
163 {
164 void *p = (void *)value;
165 return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY,
166 strlen(p), p);
167 }
168 if (!strcmp(type, "cipher"))
169 {
170 const EVP_CIPHER *c;
171 c = EVP_get_cipherbyname(value);
172 if (!c)
173 return 0;
174 return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_CIPHER, -1, (void *)c);
175 }
176 if (!strcmp(type, "hexkey"))
177 {
178 unsigned char *key;
179 int r;
180 long keylen;
181 key = string_to_hex(value, &keylen);
182 if (!key)
183 return 0;
184 r = pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, keylen, key);
185 OPENSSL_free(key);
186 return r;
187 }
188 return -2;
189 }
190
191const EVP_PKEY_METHOD cmac_pkey_meth =
192 {
193 EVP_PKEY_CMAC,
194 EVP_PKEY_FLAG_SIGCTX_CUSTOM,
195 pkey_cmac_init,
196 pkey_cmac_copy,
197 pkey_cmac_cleanup,
198
199 0, 0,
200
201 0,
202 pkey_cmac_keygen,
203
204 0, 0,
205
206 0, 0,
207
208 0,0,
209
210 cmac_signctx_init,
211 cmac_signctx,
212
213 0,0,
214
215 0,0,
216
217 0,0,
218
219 0,0,
220
221 pkey_cmac_ctrl,
222 pkey_cmac_ctrl_str
223
224 };
diff --git a/src/lib/libcrypto/cmac/cmac.c b/src/lib/libcrypto/cmac/cmac.c
deleted file mode 100644
index 8b72b09681..0000000000
--- a/src/lib/libcrypto/cmac/cmac.c
+++ /dev/null
@@ -1,308 +0,0 @@
1/* crypto/cmac/cmac.c */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project.
4 */
5/* ====================================================================
6 * Copyright (c) 2010 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 */
53
54#include <stdio.h>
55#include <stdlib.h>
56#include <string.h>
57#include "cryptlib.h"
58#include <openssl/cmac.h>
59
60#ifdef OPENSSL_FIPS
61#include <openssl/fips.h>
62#endif
63
64struct CMAC_CTX_st
65 {
66 /* Cipher context to use */
67 EVP_CIPHER_CTX cctx;
68 /* Keys k1 and k2 */
69 unsigned char k1[EVP_MAX_BLOCK_LENGTH];
70 unsigned char k2[EVP_MAX_BLOCK_LENGTH];
71 /* Temporary block */
72 unsigned char tbl[EVP_MAX_BLOCK_LENGTH];
73 /* Last (possibly partial) block */
74 unsigned char last_block[EVP_MAX_BLOCK_LENGTH];
75 /* Number of bytes in last block: -1 means context not initialised */
76 int nlast_block;
77 };
78
79
80/* Make temporary keys K1 and K2 */
81
82static void make_kn(unsigned char *k1, unsigned char *l, int bl)
83 {
84 int i;
85 /* Shift block to left, including carry */
86 for (i = 0; i < bl; i++)
87 {
88 k1[i] = l[i] << 1;
89 if (i < bl - 1 && l[i + 1] & 0x80)
90 k1[i] |= 1;
91 }
92 /* If MSB set fixup with R */
93 if (l[0] & 0x80)
94 k1[bl - 1] ^= bl == 16 ? 0x87 : 0x1b;
95 }
96
97CMAC_CTX *CMAC_CTX_new(void)
98 {
99 CMAC_CTX *ctx;
100 ctx = OPENSSL_malloc(sizeof(CMAC_CTX));
101 if (!ctx)
102 return NULL;
103 EVP_CIPHER_CTX_init(&ctx->cctx);
104 ctx->nlast_block = -1;
105 return ctx;
106 }
107
108void CMAC_CTX_cleanup(CMAC_CTX *ctx)
109 {
110#ifdef OPENSSL_FIPS
111 if (FIPS_mode() && !ctx->cctx.engine)
112 {
113 FIPS_cmac_ctx_cleanup(ctx);
114 return;
115 }
116#endif
117 EVP_CIPHER_CTX_cleanup(&ctx->cctx);
118 OPENSSL_cleanse(ctx->tbl, EVP_MAX_BLOCK_LENGTH);
119 OPENSSL_cleanse(ctx->k1, EVP_MAX_BLOCK_LENGTH);
120 OPENSSL_cleanse(ctx->k2, EVP_MAX_BLOCK_LENGTH);
121 OPENSSL_cleanse(ctx->last_block, EVP_MAX_BLOCK_LENGTH);
122 ctx->nlast_block = -1;
123 }
124
125EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx)
126 {
127 return &ctx->cctx;
128 }
129
130void CMAC_CTX_free(CMAC_CTX *ctx)
131 {
132 CMAC_CTX_cleanup(ctx);
133 OPENSSL_free(ctx);
134 }
135
136int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in)
137 {
138 int bl;
139 if (in->nlast_block == -1)
140 return 0;
141 if (!EVP_CIPHER_CTX_copy(&out->cctx, &in->cctx))
142 return 0;
143 bl = EVP_CIPHER_CTX_block_size(&in->cctx);
144 memcpy(out->k1, in->k1, bl);
145 memcpy(out->k2, in->k2, bl);
146 memcpy(out->tbl, in->tbl, bl);
147 memcpy(out->last_block, in->last_block, bl);
148 out->nlast_block = in->nlast_block;
149 return 1;
150 }
151
152int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
153 const EVP_CIPHER *cipher, ENGINE *impl)
154 {
155 static unsigned char zero_iv[EVP_MAX_BLOCK_LENGTH];
156#ifdef OPENSSL_FIPS
157 if (FIPS_mode())
158 {
159 /* If we have an ENGINE need to allow non FIPS */
160 if ((impl || ctx->cctx.engine)
161 && !(ctx->cctx.flags & EVP_CIPH_FLAG_NON_FIPS_ALLOW))
162
163 {
164 EVPerr(EVP_F_CMAC_INIT, EVP_R_DISABLED_FOR_FIPS);
165 return 0;
166 }
167 /* Other algorithm blocking will be done in FIPS_cmac_init,
168 * via FIPS_cipherinit().
169 */
170 if (!impl && !ctx->cctx.engine)
171 return FIPS_cmac_init(ctx, key, keylen, cipher, NULL);
172 }
173#endif
174 /* All zeros means restart */
175 if (!key && !cipher && !impl && keylen == 0)
176 {
177 /* Not initialised */
178 if (ctx->nlast_block == -1)
179 return 0;
180 if (!EVP_EncryptInit_ex(&ctx->cctx, NULL, NULL, NULL, zero_iv))
181 return 0;
182 memset(ctx->tbl, 0, EVP_CIPHER_CTX_block_size(&ctx->cctx));
183 ctx->nlast_block = 0;
184 return 1;
185 }
186 /* Initialiase context */
187 if (cipher && !EVP_EncryptInit_ex(&ctx->cctx, cipher, impl, NULL, NULL))
188 return 0;
189 /* Non-NULL key means initialisation complete */
190 if (key)
191 {
192 int bl;
193 if (!EVP_CIPHER_CTX_cipher(&ctx->cctx))
194 return 0;
195 if (!EVP_CIPHER_CTX_set_key_length(&ctx->cctx, keylen))
196 return 0;
197 if (!EVP_EncryptInit_ex(&ctx->cctx, NULL, NULL, key, zero_iv))
198 return 0;
199 bl = EVP_CIPHER_CTX_block_size(&ctx->cctx);
200 if (!EVP_Cipher(&ctx->cctx, ctx->tbl, zero_iv, bl))
201 return 0;
202 make_kn(ctx->k1, ctx->tbl, bl);
203 make_kn(ctx->k2, ctx->k1, bl);
204 OPENSSL_cleanse(ctx->tbl, bl);
205 /* Reset context again ready for first data block */
206 if (!EVP_EncryptInit_ex(&ctx->cctx, NULL, NULL, NULL, zero_iv))
207 return 0;
208 /* Zero tbl so resume works */
209 memset(ctx->tbl, 0, bl);
210 ctx->nlast_block = 0;
211 }
212 return 1;
213 }
214
215int CMAC_Update(CMAC_CTX *ctx, const void *in, size_t dlen)
216 {
217 const unsigned char *data = in;
218 size_t bl;
219#ifdef OPENSSL_FIPS
220 if (FIPS_mode() && !ctx->cctx.engine)
221 return FIPS_cmac_update(ctx, in, dlen);
222#endif
223 if (ctx->nlast_block == -1)
224 return 0;
225 if (dlen == 0)
226 return 1;
227 bl = EVP_CIPHER_CTX_block_size(&ctx->cctx);
228 /* Copy into partial block if we need to */
229 if (ctx->nlast_block > 0)
230 {
231 size_t nleft;
232 nleft = bl - ctx->nlast_block;
233 if (dlen < nleft)
234 nleft = dlen;
235 memcpy(ctx->last_block + ctx->nlast_block, data, nleft);
236 dlen -= nleft;
237 ctx->nlast_block += nleft;
238 /* If no more to process return */
239 if (dlen == 0)
240 return 1;
241 data += nleft;
242 /* Else not final block so encrypt it */
243 if (!EVP_Cipher(&ctx->cctx, ctx->tbl, ctx->last_block,bl))
244 return 0;
245 }
246 /* Encrypt all but one of the complete blocks left */
247 while(dlen > bl)
248 {
249 if (!EVP_Cipher(&ctx->cctx, ctx->tbl, data, bl))
250 return 0;
251 dlen -= bl;
252 data += bl;
253 }
254 /* Copy any data left to last block buffer */
255 memcpy(ctx->last_block, data, dlen);
256 ctx->nlast_block = dlen;
257 return 1;
258
259 }
260
261int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen)
262 {
263 int i, bl, lb;
264#ifdef OPENSSL_FIPS
265 if (FIPS_mode() && !ctx->cctx.engine)
266 return FIPS_cmac_final(ctx, out, poutlen);
267#endif
268 if (ctx->nlast_block == -1)
269 return 0;
270 bl = EVP_CIPHER_CTX_block_size(&ctx->cctx);
271 *poutlen = (size_t)bl;
272 if (!out)
273 return 1;
274 lb = ctx->nlast_block;
275 /* Is last block complete? */
276 if (lb == bl)
277 {
278 for (i = 0; i < bl; i++)
279 out[i] = ctx->last_block[i] ^ ctx->k1[i];
280 }
281 else
282 {
283 ctx->last_block[lb] = 0x80;
284 if (bl - lb > 1)
285 memset(ctx->last_block + lb + 1, 0, bl - lb - 1);
286 for (i = 0; i < bl; i++)
287 out[i] = ctx->last_block[i] ^ ctx->k2[i];
288 }
289 if (!EVP_Cipher(&ctx->cctx, out, out, bl))
290 {
291 OPENSSL_cleanse(out, bl);
292 return 0;
293 }
294 return 1;
295 }
296
297int CMAC_resume(CMAC_CTX *ctx)
298 {
299 if (ctx->nlast_block == -1)
300 return 0;
301 /* The buffer "tbl" containes the last fully encrypted block
302 * which is the last IV (or all zeroes if no last encrypted block).
303 * The last block has not been modified since CMAC_final().
304 * So reinitliasing using the last decrypted block will allow
305 * CMAC to continue after calling CMAC_Final().
306 */
307 return EVP_EncryptInit_ex(&ctx->cctx, NULL, NULL, NULL, ctx->tbl);
308 }
diff --git a/src/lib/libcrypto/cmac/cmac.h b/src/lib/libcrypto/cmac/cmac.h
deleted file mode 100644
index 712e92dced..0000000000
--- a/src/lib/libcrypto/cmac/cmac.h
+++ /dev/null
@@ -1,82 +0,0 @@
1/* crypto/cmac/cmac.h */
2/* Written by Dr Stephen N Henson (steve@openssl.org) for the OpenSSL
3 * project.
4 */
5/* ====================================================================
6 * Copyright (c) 2010 The OpenSSL Project. All rights reserved.
7 *
8 * Redistribution and use in source and binary forms, with or without
9 * modification, are permitted provided that the following conditions
10 * are met:
11 *
12 * 1. Redistributions of source code must retain the above copyright
13 * notice, this list of conditions and the following disclaimer.
14 *
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in
17 * the documentation and/or other materials provided with the
18 * distribution.
19 *
20 * 3. All advertising materials mentioning features or use of this
21 * software must display the following acknowledgment:
22 * "This product includes software developed by the OpenSSL Project
23 * for use in the OpenSSL Toolkit. (http://www.OpenSSL.org/)"
24 *
25 * 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
26 * endorse or promote products derived from this software without
27 * prior written permission. For written permission, please contact
28 * licensing@OpenSSL.org.
29 *
30 * 5. Products derived from this software may not be called "OpenSSL"
31 * nor may "OpenSSL" appear in their names without prior written
32 * permission of the OpenSSL Project.
33 *
34 * 6. Redistributions of any form whatsoever must retain the following
35 * acknowledgment:
36 * "This product includes software developed by the OpenSSL Project
37 * for use in the OpenSSL Toolkit (http://www.OpenSSL.org/)"
38 *
39 * THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
40 * EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
41 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
42 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
43 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
44 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
45 * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
46 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
47 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
48 * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
49 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
50 * OF THE POSSIBILITY OF SUCH DAMAGE.
51 * ====================================================================
52 */
53
54
55#ifndef HEADER_CMAC_H
56#define HEADER_CMAC_H
57
58#ifdef __cplusplus
59extern "C" {
60#endif
61
62#include <openssl/evp.h>
63
64/* Opaque */
65typedef struct CMAC_CTX_st CMAC_CTX;
66
67CMAC_CTX *CMAC_CTX_new(void);
68void CMAC_CTX_cleanup(CMAC_CTX *ctx);
69void CMAC_CTX_free(CMAC_CTX *ctx);
70EVP_CIPHER_CTX *CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx);
71int CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in);
72
73int CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen,
74 const EVP_CIPHER *cipher, ENGINE *impl);
75int CMAC_Update(CMAC_CTX *ctx, const void *data, size_t dlen);
76int CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen);
77int CMAC_resume(CMAC_CTX *ctx);
78
79#ifdef __cplusplus
80}
81#endif
82#endif