2 * Copyright 2019-2020 The OpenSSL Project Authors. All Rights Reserved.
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
10 /* Dispatch functions for RC4_HMAC_MD5 cipher */
13 * MD5 and RC4 low level APIs are deprecated for public use, but still ok for
16 #include "internal/deprecated.h"
18 #include "cipher_rc4_hmac_md5.h"
19 #include "prov/implementations.h"
20 #include "prov/providercommon.h"
21 #include "prov/providercommonerr.h"
23 /* TODO(3.0) Figure out what flags are required */
24 #define RC4_HMAC_MD5_FLAGS (EVP_CIPH_STREAM_CIPHER | EVP_CIPH_VARIABLE_LENGTH \
25 | EVP_CIPH_FLAG_AEAD_CIPHER)
27 #define RC4_HMAC_MD5_KEY_BITS (16 * 8)
28 #define RC4_HMAC_MD5_BLOCK_BITS (1 * 8)
29 #define RC4_HMAC_MD5_IV_BITS 0
30 #define RC4_HMAC_MD5_MODE 0
32 #define GET_HW(ctx) ((PROV_CIPHER_HW_RC4_HMAC_MD5 *)ctx->base.hw)
34 static OSSL_FUNC_cipher_newctx_fn rc4_hmac_md5_newctx
;
35 static OSSL_FUNC_cipher_freectx_fn rc4_hmac_md5_freectx
;
36 static OSSL_FUNC_cipher_get_ctx_params_fn rc4_hmac_md5_get_ctx_params
;
37 static OSSL_FUNC_cipher_gettable_ctx_params_fn rc4_hmac_md5_gettable_ctx_params
;
38 static OSSL_FUNC_cipher_set_ctx_params_fn rc4_hmac_md5_set_ctx_params
;
39 static OSSL_FUNC_cipher_settable_ctx_params_fn rc4_hmac_md5_settable_ctx_params
;
40 static OSSL_FUNC_cipher_get_params_fn rc4_hmac_md5_get_params
;
41 #define rc4_hmac_md5_gettable_params ossl_cipher_generic_gettable_params
42 #define rc4_hmac_md5_einit ossl_cipher_generic_einit
43 #define rc4_hmac_md5_dinit ossl_cipher_generic_dinit
44 #define rc4_hmac_md5_update ossl_cipher_generic_stream_update
45 #define rc4_hmac_md5_final ossl_cipher_generic_stream_final
46 #define rc4_hmac_md5_cipher ossl_cipher_generic_cipher
48 static void *rc4_hmac_md5_newctx(void *provctx
)
50 PROV_RC4_HMAC_MD5_CTX
*ctx
;
52 if (!ossl_prov_is_running())
55 ctx
= OPENSSL_zalloc(sizeof(*ctx
));
57 ossl_cipher_generic_initkey(ctx
, RC4_HMAC_MD5_KEY_BITS
,
58 RC4_HMAC_MD5_BLOCK_BITS
,
60 RC4_HMAC_MD5_MODE
, RC4_HMAC_MD5_FLAGS
,
61 ossl_prov_cipher_hw_rc4_hmac_md5(
67 static void rc4_hmac_md5_freectx(void *vctx
)
69 PROV_RC4_HMAC_MD5_CTX
*ctx
= (PROV_RC4_HMAC_MD5_CTX
*)vctx
;
71 ossl_cipher_generic_reset_ctx((PROV_CIPHER_CTX
*)vctx
);
72 OPENSSL_clear_free(ctx
, sizeof(*ctx
));
75 static const OSSL_PARAM rc4_hmac_md5_known_gettable_ctx_params
[] = {
76 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN
, NULL
),
77 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN
, NULL
),
78 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD
, NULL
),
81 const OSSL_PARAM
*rc4_hmac_md5_gettable_ctx_params(ossl_unused
void *provctx
)
83 return rc4_hmac_md5_known_gettable_ctx_params
;
86 static int rc4_hmac_md5_get_ctx_params(void *vctx
, OSSL_PARAM params
[])
88 PROV_RC4_HMAC_MD5_CTX
*ctx
= (PROV_RC4_HMAC_MD5_CTX
*)vctx
;
91 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_KEYLEN
);
92 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, ctx
->base
.keylen
)) {
93 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
97 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_IVLEN
);
98 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, ctx
->base
.ivlen
)) {
99 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
102 p
= OSSL_PARAM_locate(params
, OSSL_CIPHER_PARAM_AEAD_TLS1_AAD_PAD
);
103 if (p
!= NULL
&& !OSSL_PARAM_set_size_t(p
, ctx
->tls_aad_pad_sz
)) {
104 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_SET_PARAMETER
);
110 static const OSSL_PARAM rc4_hmac_md5_known_settable_ctx_params
[] = {
111 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_KEYLEN
, NULL
),
112 OSSL_PARAM_size_t(OSSL_CIPHER_PARAM_IVLEN
, NULL
),
113 OSSL_PARAM_octet_string(OSSL_CIPHER_PARAM_AEAD_TLS1_AAD
, NULL
, 0),
116 const OSSL_PARAM
*rc4_hmac_md5_settable_ctx_params(ossl_unused
void *provctx
)
118 return rc4_hmac_md5_known_settable_ctx_params
;
121 static int rc4_hmac_md5_set_ctx_params(void *vctx
, const OSSL_PARAM params
[])
123 PROV_RC4_HMAC_MD5_CTX
*ctx
= (PROV_RC4_HMAC_MD5_CTX
*)vctx
;
127 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_KEYLEN
);
129 if (!OSSL_PARAM_get_size_t(p
, &sz
)) {
130 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
133 if (ctx
->base
.keylen
!= sz
) {
134 ERR_raise(ERR_LIB_PROV
, PROV_R_INVALID_KEY_LENGTH
);
139 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_IVLEN
);
141 if (!OSSL_PARAM_get_size_t(p
, &sz
)) {
142 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
145 if (ctx
->base
.ivlen
!= sz
) {
146 ERR_raise(ERR_LIB_PROV
, PROV_R_INVALID_IV_LENGTH
);
151 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_AEAD_TLS1_AAD
);
153 if (p
->data_type
!= OSSL_PARAM_OCTET_STRING
) {
154 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
157 sz
= GET_HW(ctx
)->tls_init(&ctx
->base
, p
->data
, p
->data_size
);
159 ERR_raise(ERR_LIB_PROV
, PROV_R_INVALID_DATA
);
162 ctx
->tls_aad_pad_sz
= sz
;
164 p
= OSSL_PARAM_locate_const(params
, OSSL_CIPHER_PARAM_AEAD_TLS1_AAD
);
166 if (p
->data_type
!= OSSL_PARAM_OCTET_STRING
) {
167 ERR_raise(ERR_LIB_PROV
, PROV_R_FAILED_TO_GET_PARAMETER
);
170 GET_HW(ctx
)->init_mackey(&ctx
->base
, p
->data
, p
->data_size
);
175 static int rc4_hmac_md5_get_params(OSSL_PARAM params
[])
177 return ossl_cipher_generic_get_params(params
, RC4_HMAC_MD5_MODE
,
179 RC4_HMAC_MD5_KEY_BITS
,
180 RC4_HMAC_MD5_BLOCK_BITS
,
181 RC4_HMAC_MD5_IV_BITS
);
184 const OSSL_DISPATCH ossl_rc4_hmac_ossl_md5_functions
[] = {
185 { OSSL_FUNC_CIPHER_NEWCTX
, (void (*)(void))rc4_hmac_md5_newctx
},
186 { OSSL_FUNC_CIPHER_FREECTX
, (void (*)(void))rc4_hmac_md5_freectx
},
187 { OSSL_FUNC_CIPHER_ENCRYPT_INIT
, (void (*)(void))rc4_hmac_md5_einit
},
188 { OSSL_FUNC_CIPHER_DECRYPT_INIT
, (void (*)(void))rc4_hmac_md5_dinit
},
189 { OSSL_FUNC_CIPHER_UPDATE
, (void (*)(void))rc4_hmac_md5_update
},
190 { OSSL_FUNC_CIPHER_FINAL
, (void (*)(void))rc4_hmac_md5_final
},
191 { OSSL_FUNC_CIPHER_CIPHER
, (void (*)(void))rc4_hmac_md5_cipher
},
192 { OSSL_FUNC_CIPHER_GET_PARAMS
, (void (*)(void))rc4_hmac_md5_get_params
},
193 { OSSL_FUNC_CIPHER_GETTABLE_PARAMS
,
194 (void (*)(void))rc4_hmac_md5_gettable_params
},
195 { OSSL_FUNC_CIPHER_GET_CTX_PARAMS
,
196 (void (*)(void))rc4_hmac_md5_get_ctx_params
},
197 { OSSL_FUNC_CIPHER_GETTABLE_CTX_PARAMS
,
198 (void (*)(void))rc4_hmac_md5_gettable_ctx_params
},
199 { OSSL_FUNC_CIPHER_SET_CTX_PARAMS
,
200 (void (*)(void))rc4_hmac_md5_set_ctx_params
},
201 { OSSL_FUNC_CIPHER_SETTABLE_CTX_PARAMS
,
202 (void (*)(void))rc4_hmac_md5_settable_ctx_params
},