]>
Commit | Line | Data |
---|---|---|
068489a2 | 1 | /* |
a28d06f3 | 2 | * Copyright 2020-2021 The OpenSSL Project Authors. All Rights Reserved. |
068489a2 MC |
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 | #include <string.h> | |
11 | #include <openssl/crypto.h> | |
23c48d94 | 12 | #include <openssl/core_dispatch.h> |
2741128e | 13 | #include <openssl/proverr.h> |
068489a2 MC |
14 | #include "prov/implementations.h" |
15 | #include "prov/ciphercommon.h" | |
f99d3eed | 16 | #include "prov/providercommon.h" |
068489a2 | 17 | |
1ae7354c MC |
18 | typedef struct prov_cipher_null_ctx_st { |
19 | int enc; | |
20 | size_t tlsmacsize; | |
21 | const unsigned char *tlsmac; | |
22 | } PROV_CIPHER_NULL_CTX; | |
23 | ||
363b1e5d | 24 | static OSSL_FUNC_cipher_newctx_fn null_newctx; |
068489a2 MC |
25 | static void *null_newctx(void *provctx) |
26 | { | |
f99d3eed P |
27 | if (!ossl_prov_is_running()) |
28 | return NULL; | |
29 | ||
1ae7354c | 30 | return OPENSSL_zalloc(sizeof(PROV_CIPHER_NULL_CTX)); |
068489a2 MC |
31 | } |
32 | ||
363b1e5d | 33 | static OSSL_FUNC_cipher_freectx_fn null_freectx; |
068489a2 MC |
34 | static void null_freectx(void *vctx) |
35 | { | |
1ae7354c MC |
36 | OPENSSL_free(vctx); |
37 | } | |
38 | ||
39 | static OSSL_FUNC_cipher_encrypt_init_fn null_einit; | |
40 | static int null_einit(void *vctx, const unsigned char *key, size_t keylen, | |
41 | const unsigned char *iv, size_t ivlen) | |
42 | { | |
43 | PROV_CIPHER_NULL_CTX *ctx = (PROV_CIPHER_NULL_CTX *)vctx; | |
44 | ||
f99d3eed P |
45 | if (!ossl_prov_is_running()) |
46 | return 0; | |
47 | ||
1ae7354c MC |
48 | ctx->enc = 1; |
49 | return 1; | |
068489a2 MC |
50 | } |
51 | ||
1ae7354c MC |
52 | static OSSL_FUNC_cipher_decrypt_init_fn null_dinit; |
53 | static int null_dinit(void *vctx, const unsigned char *key, size_t keylen, | |
54 | const unsigned char *iv, size_t ivlen) | |
068489a2 | 55 | { |
f99d3eed P |
56 | if (!ossl_prov_is_running()) |
57 | return 0; | |
58 | ||
068489a2 MC |
59 | return 1; |
60 | } | |
61 | ||
363b1e5d | 62 | static OSSL_FUNC_cipher_cipher_fn null_cipher; |
068489a2 MC |
63 | static int null_cipher(void *vctx, unsigned char *out, size_t *outl, |
64 | size_t outsize, const unsigned char *in, size_t inl) | |
65 | { | |
1ae7354c MC |
66 | PROV_CIPHER_NULL_CTX *ctx = (PROV_CIPHER_NULL_CTX *)vctx; |
67 | ||
f99d3eed P |
68 | if (!ossl_prov_is_running()) |
69 | return 0; | |
70 | ||
1ae7354c MC |
71 | if (!ctx->enc && ctx->tlsmacsize > 0) { |
72 | /* | |
73 | * TLS NULL cipher as per: | |
74 | * https://tools.ietf.org/html/rfc5246#section-6.2.3.1 | |
75 | */ | |
76 | if (inl < ctx->tlsmacsize) | |
77 | return 0; | |
78 | ctx->tlsmac = in + inl - ctx->tlsmacsize; | |
79 | inl -= ctx->tlsmacsize; | |
80 | } | |
068489a2 MC |
81 | if (outsize < inl) |
82 | return 0; | |
83 | if (in != out) | |
84 | memcpy(out, in, inl); | |
85 | *outl = inl; | |
86 | return 1; | |
87 | } | |
88 | ||
363b1e5d | 89 | static OSSL_FUNC_cipher_final_fn null_final; |
068489a2 MC |
90 | static int null_final(void *vctx, unsigned char *out, size_t *outl, |
91 | size_t outsize) | |
92 | { | |
f99d3eed P |
93 | if (!ossl_prov_is_running()) |
94 | return 0; | |
95 | ||
068489a2 MC |
96 | *outl = 0; |
97 | return 1; | |
98 | } | |
99 | ||
363b1e5d | 100 | static OSSL_FUNC_cipher_get_params_fn null_get_params; |
068489a2 MC |
101 | static int null_get_params(OSSL_PARAM params[]) |
102 | { | |
592dcfd3 | 103 | return ossl_cipher_generic_get_params(params, 0, 0, 0, 8, 0); |
068489a2 MC |
104 | } |
105 | ||
106 | static const OSSL_PARAM null_known_gettable_ctx_params[] = { | |
107 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN, NULL), | |
108 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN, NULL), | |
1ae7354c | 109 | { OSSL_CIPHER_PARAM_TLS_MAC, OSSL_PARAM_OCTET_PTR, NULL, 0, OSSL_PARAM_UNMODIFIED }, |
068489a2 MC |
110 | OSSL_PARAM_END |
111 | }; | |
112 | ||
363b1e5d | 113 | static OSSL_FUNC_cipher_gettable_ctx_params_fn null_gettable_ctx_params; |
1017ab21 | 114 | static const OSSL_PARAM *null_gettable_ctx_params(ossl_unused void *provctx) |
068489a2 MC |
115 | { |
116 | return null_known_gettable_ctx_params; | |
117 | } | |
118 | ||
363b1e5d | 119 | static OSSL_FUNC_cipher_get_ctx_params_fn null_get_ctx_params; |
068489a2 MC |
120 | static int null_get_ctx_params(void *vctx, OSSL_PARAM params[]) |
121 | { | |
1ae7354c | 122 | PROV_CIPHER_NULL_CTX *ctx = (PROV_CIPHER_NULL_CTX *)vctx; |
068489a2 MC |
123 | OSSL_PARAM *p; |
124 | ||
125 | p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_IVLEN); | |
126 | if (p != NULL && !OSSL_PARAM_set_size_t(p, 0)) { | |
127 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); | |
128 | return 0; | |
129 | } | |
130 | p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_KEYLEN); | |
131 | if (p != NULL && !OSSL_PARAM_set_size_t(p, 0)) { | |
132 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); | |
133 | return 0; | |
134 | } | |
1ae7354c MC |
135 | p = OSSL_PARAM_locate(params, OSSL_CIPHER_PARAM_TLS_MAC); |
136 | if (p != NULL | |
137 | && !OSSL_PARAM_set_octet_ptr(p, ctx->tlsmac, ctx->tlsmacsize)) { | |
138 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_SET_PARAMETER); | |
139 | return 0; | |
140 | } | |
141 | return 1; | |
142 | } | |
143 | ||
144 | static const OSSL_PARAM null_known_settable_ctx_params[] = { | |
145 | OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_TLS_MAC_SIZE, NULL), | |
146 | OSSL_PARAM_END | |
147 | }; | |
148 | ||
149 | static OSSL_FUNC_cipher_settable_ctx_params_fn null_settable_ctx_params; | |
1017ab21 | 150 | static const OSSL_PARAM *null_settable_ctx_params(ossl_unused void *provctx) |
1ae7354c MC |
151 | { |
152 | return null_known_settable_ctx_params; | |
153 | } | |
154 | ||
155 | ||
156 | static OSSL_FUNC_cipher_set_ctx_params_fn null_set_ctx_params; | |
157 | static int null_set_ctx_params(void *vctx, const OSSL_PARAM params[]) | |
158 | { | |
159 | PROV_CIPHER_NULL_CTX *ctx = (PROV_CIPHER_NULL_CTX *)vctx; | |
160 | const OSSL_PARAM *p; | |
161 | ||
162 | p = OSSL_PARAM_locate_const(params, OSSL_CIPHER_PARAM_TLS_MAC_SIZE); | |
163 | if (p != NULL) { | |
164 | if (!OSSL_PARAM_get_size_t(p, &ctx->tlsmacsize)) { | |
165 | ERR_raise(ERR_LIB_PROV, PROV_R_FAILED_TO_GET_PARAMETER); | |
166 | return 0; | |
167 | } | |
168 | } | |
169 | ||
068489a2 MC |
170 | return 1; |
171 | } | |
172 | ||
1be63951 | 173 | const OSSL_DISPATCH ossl_null_functions[] = { |
068489a2 MC |
174 | { OSSL_FUNC_CIPHER_NEWCTX, |
175 | (void (*)(void)) null_newctx }, | |
176 | { OSSL_FUNC_CIPHER_FREECTX, (void (*)(void)) null_freectx }, | |
177 | { OSSL_FUNC_CIPHER_DUPCTX, (void (*)(void)) null_newctx }, | |
1ae7354c MC |
178 | { OSSL_FUNC_CIPHER_ENCRYPT_INIT, (void (*)(void))null_einit }, |
179 | { OSSL_FUNC_CIPHER_DECRYPT_INIT, (void (*)(void))null_dinit }, | |
068489a2 MC |
180 | { OSSL_FUNC_CIPHER_UPDATE, (void (*)(void))null_cipher }, |
181 | { OSSL_FUNC_CIPHER_FINAL, (void (*)(void))null_final }, | |
182 | { OSSL_FUNC_CIPHER_CIPHER, (void (*)(void))null_cipher }, | |
183 | { OSSL_FUNC_CIPHER_GET_PARAMS, (void (*)(void)) null_get_params }, | |
184 | { OSSL_FUNC_CIPHER_GETTABLE_PARAMS, | |
592dcfd3 | 185 | (void (*)(void))ossl_cipher_generic_gettable_params }, |
068489a2 MC |
186 | { OSSL_FUNC_CIPHER_GET_CTX_PARAMS, (void (*)(void))null_get_ctx_params }, |
187 | { OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS, | |
188 | (void (*)(void))null_gettable_ctx_params }, | |
1ae7354c MC |
189 | { OSSL_FUNC_CIPHER_SET_CTX_PARAMS, (void (*)(void))null_set_ctx_params }, |
190 | { OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS, | |
191 | (void (*)(void))null_settable_ctx_params }, | |
068489a2 MC |
192 | { 0, NULL } |
193 | }; |