Line | Source | Count |
1 | | - |
2 | | - |
3 | | - |
4 | | - |
5 | | - |
6 | | - |
7 | | - |
8 | | - |
9 | | - |
10 | | - |
11 | | - |
12 | | - |
13 | | - |
14 | | - |
15 | | - |
16 | | - |
17 | | - |
18 | | - |
19 | | - |
20 | | - |
21 | | - |
22 | | - |
23 | | - |
24 | | - |
25 | | - |
26 | | - |
27 | | - |
28 | | - |
29 | | - |
30 | | - |
31 | | - |
32 | | - |
33 | | - |
34 | | - |
35 | | - |
36 | | - |
37 | | - |
38 | | - |
39 | | - |
40 | | - |
41 | | - |
42 | | - |
43 | | - |
44 | | - |
45 | | - |
46 | | - |
47 | | - |
48 | | - |
49 | | - |
50 | | - |
51 | | - |
52 | | - |
53 | | - |
54 | #include <stdio.h> | - |
55 | #include <string.h> | - |
56 | | - |
57 | #include <openssl/cmac.h> | - |
58 | #include <openssl/evp.h> | - |
59 | #include <openssl/x509.h> | - |
60 | #include <openssl/x509v3.h> | - |
61 | | - |
62 | #include "evp_locl.h" | - |
63 | | - |
64 | | - |
65 | | - |
66 | static int | - |
67 | pkey_cmac_init(EVP_PKEY_CTX *ctx) | - |
68 | { | - |
69 | ctx->data = CMAC_CTX_new(); | - |
70 | if (!ctx->data)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
71 | return 0; never executed: return 0; | 0 |
72 | ctx->keygen_info_count = 0; | - |
73 | return 1; never executed: return 1; | 0 |
74 | } | - |
75 | | - |
76 | static int | - |
77 | pkey_cmac_copy(EVP_PKEY_CTX *dst, EVP_PKEY_CTX *src) | - |
78 | { | - |
79 | if (!pkey_cmac_init(dst))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
80 | return 0; never executed: return 0; | 0 |
81 | if (!CMAC_CTX_copy(dst->data, src->data))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
82 | return 0; never executed: return 0; | 0 |
83 | return 1; never executed: return 1; | 0 |
84 | } | - |
85 | | - |
86 | static void | - |
87 | pkey_cmac_cleanup(EVP_PKEY_CTX *ctx) | - |
88 | { | - |
89 | CMAC_CTX_free(ctx->data); | - |
90 | } never executed: end of block | 0 |
91 | | - |
92 | static int | - |
93 | pkey_cmac_keygen(EVP_PKEY_CTX *ctx, EVP_PKEY *pkey) | - |
94 | { | - |
95 | CMAC_CTX *cmkey = CMAC_CTX_new(); | - |
96 | CMAC_CTX *cmctx = ctx->data; | - |
97 | | - |
98 | if (!cmkey)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
99 | return 0; never executed: return 0; | 0 |
100 | if (!CMAC_CTX_copy(cmkey, cmctx)) {TRUE | never evaluated | FALSE | never evaluated |
| 0 |
101 | CMAC_CTX_free(cmkey); | - |
102 | return 0; never executed: return 0; | 0 |
103 | } | - |
104 | EVP_PKEY_assign(pkey, EVP_PKEY_CMAC, cmkey); | - |
105 | | - |
106 | return 1; never executed: return 1; | 0 |
107 | } | - |
108 | | - |
109 | static int | - |
110 | int_update(EVP_MD_CTX *ctx, const void *data, size_t count) | - |
111 | { | - |
112 | if (!CMAC_Update(ctx->pctx->data, data, count))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
113 | return 0; never executed: return 0; | 0 |
114 | return 1; never executed: return 1; | 0 |
115 | } | - |
116 | | - |
117 | static int | - |
118 | cmac_signctx_init(EVP_PKEY_CTX *ctx, EVP_MD_CTX *mctx) | - |
119 | { | - |
120 | EVP_MD_CTX_set_flags(mctx, EVP_MD_CTX_FLAG_NO_INIT); | - |
121 | mctx->update = int_update; | - |
122 | return 1; never executed: return 1; | 0 |
123 | } | - |
124 | | - |
125 | static int | - |
126 | cmac_signctx(EVP_PKEY_CTX *ctx, unsigned char *sig, size_t *siglen, | - |
127 | EVP_MD_CTX *mctx) | - |
128 | { | - |
129 | return CMAC_Final(ctx->data, sig, siglen); never executed: return CMAC_Final(ctx->data, sig, siglen); | 0 |
130 | } | - |
131 | | - |
132 | static int | - |
133 | pkey_cmac_ctrl(EVP_PKEY_CTX *ctx, int type, int p1, void *p2) | - |
134 | { | - |
135 | CMAC_CTX *cmctx = ctx->data; | - |
136 | | - |
137 | switch (type) { | - |
138 | case EVP_PKEY_CTRL_SET_MAC_KEY: never executed: case 6: | 0 |
139 | if (!p2 || p1 < 0)TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
140 | return 0; never executed: return 0; | 0 |
141 | if (!CMAC_Init(cmctx, p2, p1, NULL, NULL))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
142 | return 0; never executed: return 0; | 0 |
143 | break; never executed: break; | 0 |
144 | | - |
145 | case EVP_PKEY_CTRL_CIPHER: never executed: case 12: | 0 |
146 | if (!CMAC_Init(cmctx, NULL, 0, p2, ctx->engine))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
147 | return 0; never executed: return 0; | 0 |
148 | break; never executed: break; | 0 |
149 | | - |
150 | case EVP_PKEY_CTRL_MD: never executed: case 1: | 0 |
151 | if (ctx->pkey && !CMAC_CTX_copy(ctx->data,TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
152 | (CMAC_CTX *)ctx->pkey->pkey.ptr))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
153 | return 0; never executed: return 0; | 0 |
154 | if (!CMAC_Init(cmctx, NULL, 0, NULL, NULL))TRUE | never evaluated | FALSE | never evaluated |
| 0 |
155 | return 0; never executed: return 0; | 0 |
156 | break; never executed: break; | 0 |
157 | | - |
158 | default: never executed: default: | 0 |
159 | return -2; never executed: return -2; | 0 |
160 | } | - |
161 | return 1; never executed: return 1; | 0 |
162 | } | - |
163 | | - |
164 | static int | - |
165 | pkey_cmac_ctrl_str(EVP_PKEY_CTX *ctx, const char *type, const char *value) | - |
166 | { | - |
167 | if (!value)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
168 | return 0; never executed: return 0; | 0 |
169 | if (!strcmp(type, "key")) { never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( "key" ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
170 | void *p = (void *)value; | - |
171 | return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, never executed: return pkey_cmac_ctrl(ctx, 6, strlen(p), p); | 0 |
172 | strlen(p), p); never executed: return pkey_cmac_ctrl(ctx, 6, strlen(p), p); | 0 |
173 | } | - |
174 | if (!strcmp(type, "cipher")) { never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( "cipher" ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
175 | const EVP_CIPHER *c; | - |
176 | | - |
177 | c = EVP_get_cipherbyname(value); | - |
178 | if (!c)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
179 | return 0; never executed: return 0; | 0 |
180 | return pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_CIPHER, -1, (void *)c); never executed: return pkey_cmac_ctrl(ctx, 12, -1, (void *)c); | 0 |
181 | } | - |
182 | if (!strcmp(type, "hexkey")) { never executed: __result = (((const unsigned char *) (const char *) ( type ))[3] - __s2[3]); never executed: end of block never executed: end of block never executed: __result = (((const unsigned char *) (const char *) ( "hexkey" ))[3] - __s2[3]); never executed: end of block never executed: end of block TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
TRUE | never evaluated | FALSE | never evaluated |
| 0 |
183 | unsigned char *key; | - |
184 | int r; | - |
185 | long keylen; | - |
186 | | - |
187 | key = string_to_hex(value, &keylen); | - |
188 | if (!key)TRUE | never evaluated | FALSE | never evaluated |
| 0 |
189 | return 0; never executed: return 0; | 0 |
190 | r = pkey_cmac_ctrl(ctx, EVP_PKEY_CTRL_SET_MAC_KEY, keylen, key); | - |
191 | free(key); | - |
192 | return r; never executed: return r; | 0 |
193 | } | - |
194 | | - |
195 | return -2; never executed: return -2; | 0 |
196 | } | - |
197 | | - |
198 | const EVP_PKEY_METHOD cmac_pkey_meth = { | - |
199 | .pkey_id = EVP_PKEY_CMAC, | - |
200 | .flags = EVP_PKEY_FLAG_SIGCTX_CUSTOM, | - |
201 | | - |
202 | .init = pkey_cmac_init, | - |
203 | .copy = pkey_cmac_copy, | - |
204 | .cleanup = pkey_cmac_cleanup, | - |
205 | | - |
206 | .keygen = pkey_cmac_keygen, | - |
207 | | - |
208 | .signctx_init = cmac_signctx_init, | - |
209 | .signctx = cmac_signctx, | - |
210 | | - |
211 | .ctrl = pkey_cmac_ctrl, | - |
212 | .ctrl_str = pkey_cmac_ctrl_str | - |
213 | }; | - |
| | |