Absolute File Name: | /home/opencoverage/opencoverage/guest-scripts/libressl/src/crypto/cmac/cmac.c |
Switch to Source code | Preprocessed file |
Line | Source | Count | ||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
1 | - | |||||||||||||||||||||||||
2 | - | |||||||||||||||||||||||||
3 | struct CMAC_CTX_st { | - | ||||||||||||||||||||||||
4 | - | |||||||||||||||||||||||||
5 | EVP_CIPHER_CTX cctx; | - | ||||||||||||||||||||||||
6 | - | |||||||||||||||||||||||||
7 | unsigned char k1[32]; | - | ||||||||||||||||||||||||
8 | unsigned char k2[32]; | - | ||||||||||||||||||||||||
9 | - | |||||||||||||||||||||||||
10 | unsigned char tbl[32]; | - | ||||||||||||||||||||||||
11 | - | |||||||||||||||||||||||||
12 | unsigned char last_block[32]; | - | ||||||||||||||||||||||||
13 | - | |||||||||||||||||||||||||
14 | int nlast_block; | - | ||||||||||||||||||||||||
15 | }; | - | ||||||||||||||||||||||||
16 | - | |||||||||||||||||||||||||
17 | - | |||||||||||||||||||||||||
18 | - | |||||||||||||||||||||||||
19 | - | |||||||||||||||||||||||||
20 | static void | - | ||||||||||||||||||||||||
21 | make_kn(unsigned char *k1, unsigned char *l, int bl) | - | ||||||||||||||||||||||||
22 | { | - | ||||||||||||||||||||||||
23 | int i; | - | ||||||||||||||||||||||||
24 | - | |||||||||||||||||||||||||
25 | - | |||||||||||||||||||||||||
26 | for (i = 0; i < bl
| 0 | ||||||||||||||||||||||||
27 | k1[i] = l[i] << 1; | - | ||||||||||||||||||||||||
28 | if (i < bl - 1
| 0 | ||||||||||||||||||||||||
29 | k1[i] |= 1; never executed: k1[i] |= 1; | 0 | ||||||||||||||||||||||||
30 | } never executed: end of block | 0 | ||||||||||||||||||||||||
31 | - | |||||||||||||||||||||||||
32 | if (l[0] & 0x80
| 0 | ||||||||||||||||||||||||
33 | k1[bl - 1] ^= bl == 16
never executed: k1[bl - 1] ^= bl == 16 ? 0x87 : 0x1b; | 0 | ||||||||||||||||||||||||
34 | } never executed: end of block | 0 | ||||||||||||||||||||||||
35 | - | |||||||||||||||||||||||||
36 | CMAC_CTX * | - | ||||||||||||||||||||||||
37 | CMAC_CTX_new(void) | - | ||||||||||||||||||||||||
38 | { | - | ||||||||||||||||||||||||
39 | CMAC_CTX *ctx; | - | ||||||||||||||||||||||||
40 | - | |||||||||||||||||||||||||
41 | ctx = malloc(sizeof(CMAC_CTX)); | - | ||||||||||||||||||||||||
42 | if (!ctx
| 0 | ||||||||||||||||||||||||
43 | return never executed: return ((void *)0) ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
44 | ((void *)0) never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
45 | ; never executed: return ((void *)0) ; | 0 | ||||||||||||||||||||||||
46 | EVP_CIPHER_CTX_init(&ctx->cctx); | - | ||||||||||||||||||||||||
47 | ctx->nlast_block = -1; | - | ||||||||||||||||||||||||
48 | return never executed: ctx;return ctx; never executed: return ctx; | 0 | ||||||||||||||||||||||||
49 | } | - | ||||||||||||||||||||||||
50 | - | |||||||||||||||||||||||||
51 | void | - | ||||||||||||||||||||||||
52 | CMAC_CTX_cleanup(CMAC_CTX *ctx) | - | ||||||||||||||||||||||||
53 | { | - | ||||||||||||||||||||||||
54 | EVP_CIPHER_CTX_cleanup(&ctx->cctx); | - | ||||||||||||||||||||||||
55 | explicit_bzero(ctx->tbl, 32); | - | ||||||||||||||||||||||||
56 | explicit_bzero(ctx->k1, 32); | - | ||||||||||||||||||||||||
57 | explicit_bzero(ctx->k2, 32); | - | ||||||||||||||||||||||||
58 | explicit_bzero(ctx->last_block, 32); | - | ||||||||||||||||||||||||
59 | ctx->nlast_block = -1; | - | ||||||||||||||||||||||||
60 | } never executed: end of block | 0 | ||||||||||||||||||||||||
61 | - | |||||||||||||||||||||||||
62 | EVP_CIPHER_CTX * | - | ||||||||||||||||||||||||
63 | CMAC_CTX_get0_cipher_ctx(CMAC_CTX *ctx) | - | ||||||||||||||||||||||||
64 | { | - | ||||||||||||||||||||||||
65 | return never executed: &ctx->cctx;return &ctx->cctx; never executed: return &ctx->cctx; | 0 | ||||||||||||||||||||||||
66 | } | - | ||||||||||||||||||||||||
67 | - | |||||||||||||||||||||||||
68 | void | - | ||||||||||||||||||||||||
69 | CMAC_CTX_free(CMAC_CTX *ctx) | - | ||||||||||||||||||||||||
70 | { | - | ||||||||||||||||||||||||
71 | if (ctx ==
| 0-1 | ||||||||||||||||||||||||
72 | ((void *)0)
| 0-1 | ||||||||||||||||||||||||
73 | ) | - | ||||||||||||||||||||||||
74 | return; executed 1 time by 1 test: return; Executed by:
| 1 | ||||||||||||||||||||||||
75 | - | |||||||||||||||||||||||||
76 | CMAC_CTX_cleanup(ctx); | - | ||||||||||||||||||||||||
77 | free(ctx); | - | ||||||||||||||||||||||||
78 | } never executed: end of block | 0 | ||||||||||||||||||||||||
79 | - | |||||||||||||||||||||||||
80 | int | - | ||||||||||||||||||||||||
81 | CMAC_CTX_copy(CMAC_CTX *out, const CMAC_CTX *in) | - | ||||||||||||||||||||||||
82 | { | - | ||||||||||||||||||||||||
83 | int bl; | - | ||||||||||||||||||||||||
84 | - | |||||||||||||||||||||||||
85 | if (in->nlast_block == -1
| 0 | ||||||||||||||||||||||||
86 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
87 | if (!EVP_CIPHER_CTX_copy(&out->cctx, &in->cctx)
| 0 | ||||||||||||||||||||||||
88 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
89 | bl = EVP_CIPHER_CTX_block_size(&in->cctx); | - | ||||||||||||||||||||||||
90 | memcpy(out->k1, in->k1, bl); | - | ||||||||||||||||||||||||
91 | memcpy(out->k2, in->k2, bl); | - | ||||||||||||||||||||||||
92 | memcpy(out->tbl, in->tbl, bl); | - | ||||||||||||||||||||||||
93 | memcpy(out->last_block, in->last_block, bl); | - | ||||||||||||||||||||||||
94 | out->nlast_block = in->nlast_block; | - | ||||||||||||||||||||||||
95 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
96 | } | - | ||||||||||||||||||||||||
97 | - | |||||||||||||||||||||||||
98 | int | - | ||||||||||||||||||||||||
99 | CMAC_Init(CMAC_CTX *ctx, const void *key, size_t keylen, | - | ||||||||||||||||||||||||
100 | const EVP_CIPHER *cipher, ENGINE *impl) | - | ||||||||||||||||||||||||
101 | { | - | ||||||||||||||||||||||||
102 | static unsigned char zero_iv[32]; | - | ||||||||||||||||||||||||
103 | - | |||||||||||||||||||||||||
104 | - | |||||||||||||||||||||||||
105 | if (!key
| 0 | ||||||||||||||||||||||||
106 | - | |||||||||||||||||||||||||
107 | if (ctx->nlast_block == -1
| 0 | ||||||||||||||||||||||||
108 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
109 | if (!EVP_EncryptInit_ex(&ctx->cctx,
| 0 | ||||||||||||||||||||||||
110 | ((void *)0)
| 0 | ||||||||||||||||||||||||
111 | ,
| 0 | ||||||||||||||||||||||||
112 | ((void *)0)
| 0 | ||||||||||||||||||||||||
113 | ,
| 0 | ||||||||||||||||||||||||
114 | ((void *)0)
| 0 | ||||||||||||||||||||||||
115 | , zero_iv)
| 0 | ||||||||||||||||||||||||
116 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
117 | memset(ctx->tbl, 0, EVP_CIPHER_CTX_block_size(&ctx->cctx)); | - | ||||||||||||||||||||||||
118 | ctx->nlast_block = 0; | - | ||||||||||||||||||||||||
119 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
120 | } | - | ||||||||||||||||||||||||
121 | - | |||||||||||||||||||||||||
122 | if (cipher
| 0 | ||||||||||||||||||||||||
123 | ((void *)0)
| 0 | ||||||||||||||||||||||||
124 | ,
| 0 | ||||||||||||||||||||||||
125 | ((void *)0)
| 0 | ||||||||||||||||||||||||
126 | )
| 0 | ||||||||||||||||||||||||
127 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
128 | - | |||||||||||||||||||||||||
129 | if (key
| 0 | ||||||||||||||||||||||||
130 | int bl; | - | ||||||||||||||||||||||||
131 | - | |||||||||||||||||||||||||
132 | if (!EVP_CIPHER_CTX_cipher(&ctx->cctx)
| 0 | ||||||||||||||||||||||||
133 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
134 | if (!EVP_CIPHER_CTX_set_key_length(&ctx->cctx, keylen)
| 0 | ||||||||||||||||||||||||
135 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
136 | if (!EVP_EncryptInit_ex(&ctx->cctx,
| 0 | ||||||||||||||||||||||||
137 | ((void *)0)
| 0 | ||||||||||||||||||||||||
138 | ,
| 0 | ||||||||||||||||||||||||
139 | ((void *)0)
| 0 | ||||||||||||||||||||||||
140 | , key, zero_iv)
| 0 | ||||||||||||||||||||||||
141 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
142 | bl = EVP_CIPHER_CTX_block_size(&ctx->cctx); | - | ||||||||||||||||||||||||
143 | if (!EVP_Cipher(&ctx->cctx, ctx->tbl, zero_iv, bl)
| 0 | ||||||||||||||||||||||||
144 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
145 | make_kn(ctx->k1, ctx->tbl, bl); | - | ||||||||||||||||||||||||
146 | make_kn(ctx->k2, ctx->k1, bl); | - | ||||||||||||||||||||||||
147 | explicit_bzero(ctx->tbl, bl); | - | ||||||||||||||||||||||||
148 | - | |||||||||||||||||||||||||
149 | if (!EVP_EncryptInit_ex(&ctx->cctx,
| 0 | ||||||||||||||||||||||||
150 | ((void *)0)
| 0 | ||||||||||||||||||||||||
151 | ,
| 0 | ||||||||||||||||||||||||
152 | ((void *)0)
| 0 | ||||||||||||||||||||||||
153 | ,
| 0 | ||||||||||||||||||||||||
154 | ((void *)0)
| 0 | ||||||||||||||||||||||||
155 | , zero_iv)
| 0 | ||||||||||||||||||||||||
156 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
157 | - | |||||||||||||||||||||||||
158 | memset(ctx->tbl, 0, bl); | - | ||||||||||||||||||||||||
159 | ctx->nlast_block = 0; | - | ||||||||||||||||||||||||
160 | } never executed: end of block | 0 | ||||||||||||||||||||||||
161 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
162 | } | - | ||||||||||||||||||||||||
163 | - | |||||||||||||||||||||||||
164 | int | - | ||||||||||||||||||||||||
165 | CMAC_Update(CMAC_CTX *ctx, const void *in, size_t dlen) | - | ||||||||||||||||||||||||
166 | { | - | ||||||||||||||||||||||||
167 | const unsigned char *data = in; | - | ||||||||||||||||||||||||
168 | size_t bl; | - | ||||||||||||||||||||||||
169 | - | |||||||||||||||||||||||||
170 | if (ctx->nlast_block == -1
| 0 | ||||||||||||||||||||||||
171 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
172 | if (dlen == 0
| 0 | ||||||||||||||||||||||||
173 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
174 | bl = EVP_CIPHER_CTX_block_size(&ctx->cctx); | - | ||||||||||||||||||||||||
175 | - | |||||||||||||||||||||||||
176 | if (ctx->nlast_block > 0
| 0 | ||||||||||||||||||||||||
177 | size_t nleft; | - | ||||||||||||||||||||||||
178 | - | |||||||||||||||||||||||||
179 | nleft = bl - ctx->nlast_block; | - | ||||||||||||||||||||||||
180 | if (dlen < nleft
| 0 | ||||||||||||||||||||||||
181 | nleft = dlen; never executed: nleft = dlen; | 0 | ||||||||||||||||||||||||
182 | memcpy(ctx->last_block + ctx->nlast_block, data, nleft); | - | ||||||||||||||||||||||||
183 | dlen -= nleft; | - | ||||||||||||||||||||||||
184 | ctx->nlast_block += nleft; | - | ||||||||||||||||||||||||
185 | - | |||||||||||||||||||||||||
186 | if (dlen == 0
| 0 | ||||||||||||||||||||||||
187 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
188 | data += nleft; | - | ||||||||||||||||||||||||
189 | - | |||||||||||||||||||||||||
190 | if (!EVP_Cipher(&ctx->cctx, ctx->tbl, ctx->last_block, bl)
| 0 | ||||||||||||||||||||||||
191 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
192 | } never executed: end of block | 0 | ||||||||||||||||||||||||
193 | - | |||||||||||||||||||||||||
194 | while (dlen > bl
| 0 | ||||||||||||||||||||||||
195 | if (!EVP_Cipher(&ctx->cctx, ctx->tbl, data, bl)
| 0 | ||||||||||||||||||||||||
196 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
197 | dlen -= bl; | - | ||||||||||||||||||||||||
198 | data += bl; | - | ||||||||||||||||||||||||
199 | } never executed: end of block | 0 | ||||||||||||||||||||||||
200 | - | |||||||||||||||||||||||||
201 | memcpy(ctx->last_block, data, dlen); | - | ||||||||||||||||||||||||
202 | ctx->nlast_block = dlen; | - | ||||||||||||||||||||||||
203 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
204 | } | - | ||||||||||||||||||||||||
205 | - | |||||||||||||||||||||||||
206 | int | - | ||||||||||||||||||||||||
207 | CMAC_Final(CMAC_CTX *ctx, unsigned char *out, size_t *poutlen) | - | ||||||||||||||||||||||||
208 | { | - | ||||||||||||||||||||||||
209 | int i, bl, lb; | - | ||||||||||||||||||||||||
210 | - | |||||||||||||||||||||||||
211 | if (ctx->nlast_block == -1
| 0 | ||||||||||||||||||||||||
212 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
213 | bl = EVP_CIPHER_CTX_block_size(&ctx->cctx); | - | ||||||||||||||||||||||||
214 | *poutlen = (size_t)bl; | - | ||||||||||||||||||||||||
215 | if (!out
| 0 | ||||||||||||||||||||||||
216 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
217 | lb = ctx->nlast_block; | - | ||||||||||||||||||||||||
218 | - | |||||||||||||||||||||||||
219 | if (lb == bl
| 0 | ||||||||||||||||||||||||
220 | for (i = 0; i < bl
| 0 | ||||||||||||||||||||||||
221 | out[i] = ctx->last_block[i] ^ ctx->k1[i]; never executed: out[i] = ctx->last_block[i] ^ ctx->k1[i]; | 0 | ||||||||||||||||||||||||
222 | } never executed: else {end of block | 0 | ||||||||||||||||||||||||
223 | ctx->last_block[lb] = 0x80; | - | ||||||||||||||||||||||||
224 | if (bl - lb > 1
| 0 | ||||||||||||||||||||||||
225 | memset(ctx->last_block + lb + 1, 0, bl - lb - 1); never executed: memset(ctx->last_block + lb + 1, 0, bl - lb - 1); | 0 | ||||||||||||||||||||||||
226 | for (i = 0; i < bl
| 0 | ||||||||||||||||||||||||
227 | out[i] = ctx->last_block[i] ^ ctx->k2[i]; never executed: out[i] = ctx->last_block[i] ^ ctx->k2[i]; | 0 | ||||||||||||||||||||||||
228 | } never executed: end of block | 0 | ||||||||||||||||||||||||
229 | if (!EVP_Cipher(&ctx->cctx, out, out, bl)
| 0 | ||||||||||||||||||||||||
230 | explicit_bzero(out, bl); | - | ||||||||||||||||||||||||
231 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
232 | } | - | ||||||||||||||||||||||||
233 | return never executed: 1;return 1; never executed: return 1; | 0 | ||||||||||||||||||||||||
234 | } | - | ||||||||||||||||||||||||
235 | - | |||||||||||||||||||||||||
236 | int | - | ||||||||||||||||||||||||
237 | CMAC_resume(CMAC_CTX *ctx) | - | ||||||||||||||||||||||||
238 | { | - | ||||||||||||||||||||||||
239 | if (ctx->nlast_block == -1
| 0 | ||||||||||||||||||||||||
240 | return never executed: 0;return 0; never executed: return 0; | 0 | ||||||||||||||||||||||||
241 | - | |||||||||||||||||||||||||
242 | - | |||||||||||||||||||||||||
243 | - | |||||||||||||||||||||||||
244 | - | |||||||||||||||||||||||||
245 | - | |||||||||||||||||||||||||
246 | - | |||||||||||||||||||||||||
247 | return never executed: EVP_EncryptInit_ex(&ctx->cctx, return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
248 | ((void *)0) never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
249 | , never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
250 | ((void *)0) never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
251 | , never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
252 | ((void *)0) never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
253 | , ctx->tbl); never executed: return EVP_EncryptInit_ex(&ctx->cctx, ((void *)0) , ((void *)0) , ((void *)0) , ctx->tbl); | 0 | ||||||||||||||||||||||||
254 | } | - | ||||||||||||||||||||||||
Switch to Source code | Preprocessed file |