]>
Commit | Line | Data |
---|---|---|
3d5a7578 | 1 | /* |
a28d06f3 | 2 | * Copyright 2019-2021 The OpenSSL Project Authors. All Rights Reserved. |
3d5a7578 SL |
3 | * |
4 | * Licensed under the Apache License 2.0 (the "License"). You may not use | |
5 | * this file except in compliance with the License. You can obtain a copy | |
6 | * in the file LICENSE in the source distribution or at | |
7 | * https://www.openssl.org/source/license.html | |
8 | */ | |
9 | ||
10 | /* Dispatch functions for chacha20 cipher */ | |
11 | ||
2741128e | 12 | #include <openssl/proverr.h> |
3d5a7578 SL |
13 | #include "cipher_chacha20.h" |
14 | #include "prov/implementations.h" | |
f99d3eed | 15 | #include "prov/providercommon.h" |
3d5a7578 SL |
16 | |
17 | #define CHACHA20_KEYLEN (CHACHA_KEY_SIZE) | |
18 | #define CHACHA20_BLKLEN (1) | |
19 | #define CHACHA20_IVLEN (CHACHA_CTR_SIZE) | |
a054d15c | 20 | #define CHACHA20_FLAGS (PROV_CIPHER_FLAG_CUSTOM_IV) |
3d5a7578 | 21 | |
363b1e5d DMSP |
22 | static OSSL_FUNC_cipher_newctx_fn chacha20_newctx; |
23 | static OSSL_FUNC_cipher_freectx_fn chacha20_freectx; | |
24 | static OSSL_FUNC_cipher_get_params_fn chacha20_get_params; | |
25 | static OSSL_FUNC_cipher_get_ctx_params_fn chacha20_get_ctx_params; | |
26 | static OSSL_FUNC_cipher_set_ctx_params_fn chacha20_set_ctx_params; | |
27 | static OSSL_FUNC_cipher_gettable_ctx_params_fn chacha20_gettable_ctx_params; | |
28 | static OSSL_FUNC_cipher_settable_ctx_params_fn chacha20_settable_ctx_params; | |
592dcfd3 P |
29 | #define chacha20_cipher ossl_cipher_generic_cipher |
30 | #define chacha20_update ossl_cipher_generic_stream_update | |
31 | #define chacha20_final ossl_cipher_generic_stream_final | |
32 | #define chacha20_gettable_params ossl_cipher_generic_gettable_params | |
3d5a7578 | 33 | |
e36b3c2f | 34 | void ossl_chacha20_initctx(PROV_CHACHA20_CTX *ctx) |
3d5a7578 | 35 | { |
592dcfd3 P |
36 | ossl_cipher_generic_initkey(ctx, CHACHA20_KEYLEN * 8, |
37 | CHACHA20_BLKLEN * 8, | |
38 | CHACHA20_IVLEN * 8, | |
39 | 0, CHACHA20_FLAGS, | |
40 | ossl_prov_cipher_hw_chacha20(CHACHA20_KEYLEN * 8), | |
41 | NULL); | |
3d5a7578 SL |
42 | } |
43 | ||
44 | static void *chacha20_newctx(void *provctx) | |
45 | { | |
f99d3eed | 46 | PROV_CHACHA20_CTX *ctx; |
3d5a7578 | 47 | |
f99d3eed P |
48 | if (!ossl_prov_is_running()) |
49 | return NULL; | |
50 | ||
51 | ctx = OPENSSL_zalloc(sizeof(*ctx)); | |
52 | if (ctx != NULL) | |
e36b3c2f | 53 | ossl_chacha20_initctx(ctx); |
f99d3eed | 54 | return ctx; |
3d5a7578 SL |
55 | } |
56 | ||
57 | static void chacha20_freectx(void *vctx) | |
58 | { | |
59 | PROV_CHACHA20_CTX *ctx = (PROV_CHACHA20_CTX *)vctx; | |
60 | ||
61 | if (ctx != NULL) { | |
592dcfd3 | 62 | ossl_cipher_generic_reset_ctx((PROV_CIPHER_CTX *)vctx); |
5e58733b | 63 | OPENSSL_clear_free(ctx, sizeof(*ctx)); |
3d5a7578 SL |
64 | } |
65 | } | |
66 | ||
67 | static int chacha20_get_params(OSSL_PARAM params[]) | |
68 | { | |
592dcfd3 P |
69 | return ossl_cipher_generic_get_params(params, 0, CHACHA20_FLAGS, |
70 | CHACHA20_KEYLEN * 8, | |
71 | CHACHA20_BLKLEN * 8, | |
72 | CHACHA20_IVLEN * 8); | |
3d5a7578 SL |
73 | } |
74 | ||
75 | static int chacha20_get_ctx_params(void *vctx, OSSL_PARAM params[]) | |
76 | { | |
77 | OSSL_PARAM *p; | |
78 | ||
79 | p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN); | |
80 | if (p != NULL && !OSSL_PARAM_set_size_t(p, CHACHA20_IVLEN)) { | |
81 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); | |
82 | return 0; | |
83 | } | |
84 | p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN); | |
85 | if (p != NULL && !OSSL_PARAM_set_size_t(p, CHACHA20_KEYLEN)) { | |
86 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); | |
87 | return 0; | |
88 | } | |
89 | ||
90 | return 1; | |
91 | } | |
92 | ||
93 | static const OSSL_PARAM chacha20_known_gettable_ctx_params[] = { | |
94 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL), | |
95 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL), | |
96 | OSSL_PARAM_END | |
97 | }; | |
644c5dd3 P |
98 | const OSSL_PARAM *chacha20_gettable_ctx_params(ossl_unused void *cctx, |
99 | ossl_unused void *provctx) | |
3d5a7578 SL |
100 | { |
101 | return chacha20_known_gettable_ctx_params; | |
102 | } | |
103 | ||
104 | static int chacha20_set_ctx_params(void *vctx, const OSSL_PARAM params[]) | |
105 | { | |
106 | const OSSL_PARAM *p; | |
107 | size_t len; | |
108 | ||
109 | p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_KEYLEN); | |
110 | if (p != NULL) { | |
111 | if (!OSSL_PARAM_get_size_t(p, &len)) { | |
112 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); | |
113 | return 0; | |
114 | } | |
115 | if (len != CHACHA20_KEYLEN) { | |
116 | ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_KEY_LENGTH); | |
117 | return 0; | |
118 | } | |
119 | } | |
120 | p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_IVLEN); | |
121 | if (p != NULL) { | |
122 | if (!OSSL_PARAM_get_size_t(p, &len)) { | |
123 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); | |
124 | return 0; | |
125 | } | |
126 | if (len != CHACHA20_IVLEN) { | |
127 | ERR_raise(ERR_LIB_PROV, PROV_R_INVALID_IV_LENGTH); | |
128 | return 0; | |
129 | } | |
130 | } | |
131 | return 1; | |
132 | } | |
133 | ||
134 | static const OSSL_PARAM chacha20_known_settable_ctx_params[] = { | |
135 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL), | |
136 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL), | |
137 | OSSL_PARAM_END | |
138 | }; | |
644c5dd3 P |
139 | const OSSL_PARAM *chacha20_settable_ctx_params(ossl_unused void *cctx, |
140 | ossl_unused void *provctx) | |
3d5a7578 SL |
141 | { |
142 | return chacha20_known_settable_ctx_params; | |
143 | } | |
144 | ||
e36b3c2f SL |
145 | int ossl_chacha20_einit(void *vctx, const unsigned char *key, size_t keylen, |
146 | const unsigned char *iv, size_t ivlen) | |
3d5a7578 SL |
147 | { |
148 | int ret; | |
149 | ||
f99d3eed | 150 | /* The generic function checks for ossl_prov_is_running() */ |
592dcfd3 | 151 | ret= ossl_cipher_generic_einit(vctx, key, keylen, iv, ivlen); |
3d5a7578 SL |
152 | if (ret && iv != NULL) { |
153 | PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx; | |
154 | PROV_CIPHER_HW_CHACHA20 *hw = (PROV_CIPHER_HW_CHACHA20 *)ctx->hw; | |
155 | ||
156 | hw->initiv(ctx); | |
157 | } | |
158 | return ret; | |
159 | } | |
160 | ||
e36b3c2f SL |
161 | int ossl_chacha20_dinit(void *vctx, const unsigned char *key, size_t keylen, |
162 | const unsigned char *iv, size_t ivlen) | |
3d5a7578 SL |
163 | { |
164 | int ret; | |
165 | ||
f99d3eed | 166 | /* The generic function checks for ossl_prov_is_running() */ |
592dcfd3 | 167 | ret= ossl_cipher_generic_dinit(vctx, key, keylen, iv, ivlen); |
3d5a7578 SL |
168 | if (ret && iv != NULL) { |
169 | PROV_CIPHER_CTX *ctx = (PROV_CIPHER_CTX *)vctx; | |
170 | PROV_CIPHER_HW_CHACHA20 *hw = (PROV_CIPHER_HW_CHACHA20 *)ctx->hw; | |
171 | ||
172 | hw->initiv(ctx); | |
173 | } | |
174 | return ret; | |
175 | } | |
176 | ||
1be63951 P |
177 | /* ossl_chacha20_functions */ |
178 | const OSSL_DISPATCH ossl_chacha20_functions[] = { | |
3d5a7578 SL |
179 | { OSSL_FUNC_CIPHER_NEWCTX, (void (*)(void))chacha20_newctx }, |
180 | { OSSL_FUNC_CIPHER_FREECTX, (void (*)(void))chacha20_freectx }, | |
e36b3c2f SL |
181 | { OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))ossl_chacha20_einit }, |
182 | { OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))ossl_chacha20_dinit }, | |
3d5a7578 SL |
183 | { OSSL_FUNC_CIPHER_UPDATE, (void (*)(void))chacha20_update }, |
184 | { OSSL_FUNC_CIPHER_FINAL, (void (*)(void))chacha20_final }, | |
185 | { OSSL_FUNC_CIPHER_CIPHER, (void (*)(void))chacha20_cipher}, | |
186 | { OSSL_FUNC_CIPHER_GET_PARAMS, (void (*)(void))chacha20_get_params }, | |
187 | { OSSL_FUNC_CIPHER_GETTABLE_PARAMS,(void (*)(void))chacha20_gettable_params }, | |
188 | { OSSL_FUNC_CIPHER_GET_CTX_PARAMS, (void (*)(void))chacha20_get_ctx_params }, | |
189 | { OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS, | |
190 | (void (*)(void))chacha20_gettable_ctx_params }, | |
191 | { OSSL_FUNC_CIPHER_SET_CTX_PARAMS, (void (*)(void))chacha20_set_ctx_params }, | |
192 | { OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS, | |
193 | (void (*)(void))chacha20_settable_ctx_params }, | |
194 | { 0, NULL } | |
195 | }; | |
196 |