2 * Copyright 1995-2016 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
11 #include "internal/cryptlib.h"
13 #ifndef OPENSSL_NO_RC5
15 # include <openssl/evp.h>
16 # include "crypto/evp.h"
17 # include <openssl/objects.h>
18 # include "evp_locl.h"
19 # include <openssl/rc5.h>
21 static int r_32_12_16_init_key(EVP_CIPHER_CTX
*ctx
, const unsigned char *key
,
22 const unsigned char *iv
, int enc
);
23 static int rc5_ctrl(EVP_CIPHER_CTX
*c
, int type
, int arg
, void *ptr
);
26 int rounds
; /* number of rounds */
27 RC5_32_KEY ks
; /* key schedule */
30 # define data(ctx) EVP_C_DATA(EVP_RC5_KEY,ctx)
32 IMPLEMENT_BLOCK_CIPHER(rc5_32_12_16
, ks
, RC5_32
, EVP_RC5_KEY
, NID_rc5
,
33 8, RC5_32_KEY_LENGTH
, 8, 64,
34 EVP_CIPH_VARIABLE_LENGTH
| EVP_CIPH_CTRL_INIT
,
35 r_32_12_16_init_key
, NULL
, NULL
, NULL
, rc5_ctrl
)
37 static int rc5_ctrl(EVP_CIPHER_CTX
*c
, int type
, int arg
, void *ptr
)
41 data(c
)->rounds
= RC5_12_ROUNDS
;
44 case EVP_CTRL_GET_RC5_ROUNDS
:
45 *(int *)ptr
= data(c
)->rounds
;
48 case EVP_CTRL_SET_RC5_ROUNDS
:
53 data(c
)->rounds
= arg
;
57 EVPerr(EVP_F_RC5_CTRL
, EVP_R_UNSUPPORTED_NUMBER_OF_ROUNDS
);
66 static int r_32_12_16_init_key(EVP_CIPHER_CTX
*ctx
, const unsigned char *key
,
67 const unsigned char *iv
, int enc
)
69 if (EVP_CIPHER_CTX_key_length(ctx
) > 255) {
70 EVPerr(EVP_F_R_32_12_16_INIT_KEY
, EVP_R_BAD_KEY_LENGTH
);
73 return RC5_32_set_key(&data(ctx
)->ks
, EVP_CIPHER_CTX_key_length(ctx
),
74 key
, data(ctx
)->rounds
);