1 /* 2 * Copyright 1995-2018 The OpenSSL Project Authors. All Rights Reserved. 3 * 4 * Licensed under the OpenSSL license (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 <stdio.h> 11 #include "internal/cryptlib.h" 12 13 #ifndef OPENSSL_NO_RC2 14 15 # include <openssl/evp.h> 16 # include <openssl/objects.h> 17 # include "crypto/evp.h" 18 # include <openssl/rc2.h> 19 20 static int rc2_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 21 const unsigned char *iv, int enc); 22 static int rc2_meth_to_magic(EVP_CIPHER_CTX *ctx); 23 static int rc2_magic_to_meth(int i); 24 static int rc2_set_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); 25 static int rc2_get_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type); 26 static int rc2_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr); 27 28 typedef struct { 29 int key_bits; /* effective key bits */ 30 RC2_KEY ks; /* key schedule */ 31 } EVP_RC2_KEY; 32 33 # define data(ctx) EVP_C_DATA(EVP_RC2_KEY,ctx) 34 35 IMPLEMENT_BLOCK_CIPHER(rc2, ks, RC2, EVP_RC2_KEY, NID_rc2, 36 8, 37 RC2_KEY_LENGTH, 8, 64, 38 EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_CTRL_INIT, 39 rc2_init_key, NULL, 40 rc2_set_asn1_type_and_iv, rc2_get_asn1_type_and_iv, 41 rc2_ctrl) 42 # define RC2_40_MAGIC 0xa0 43 # define RC2_64_MAGIC 0x78 44 # define RC2_128_MAGIC 0x3a 45 static const EVP_CIPHER r2_64_cbc_cipher = { 46 NID_rc2_64_cbc, 47 8, 8 /* 64 bit */ , 8, 48 EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_CTRL_INIT, 49 rc2_init_key, 50 rc2_cbc_cipher, 51 NULL, 52 sizeof(EVP_RC2_KEY), 53 rc2_set_asn1_type_and_iv, 54 rc2_get_asn1_type_and_iv, 55 rc2_ctrl, 56 NULL 57 }; 58 59 static const EVP_CIPHER r2_40_cbc_cipher = { 60 NID_rc2_40_cbc, 61 8, 5 /* 40 bit */ , 8, 62 EVP_CIPH_CBC_MODE | EVP_CIPH_VARIABLE_LENGTH | EVP_CIPH_CTRL_INIT, 63 rc2_init_key, 64 rc2_cbc_cipher, 65 NULL, 66 sizeof(EVP_RC2_KEY), 67 rc2_set_asn1_type_and_iv, 68 rc2_get_asn1_type_and_iv, 69 rc2_ctrl, 70 NULL 71 }; 72 73 const EVP_CIPHER *EVP_rc2_64_cbc(void) 74 { 75 return &r2_64_cbc_cipher; 76 } 77 78 const EVP_CIPHER *EVP_rc2_40_cbc(void) 79 { 80 return &r2_40_cbc_cipher; 81 } 82 83 static int rc2_init_key(EVP_CIPHER_CTX *ctx, const unsigned char *key, 84 const unsigned char *iv, int enc) 85 { 86 RC2_set_key(&data(ctx)->ks, EVP_CIPHER_CTX_key_length(ctx), 87 key, data(ctx)->key_bits); 88 return 1; 89 } 90 91 static int rc2_meth_to_magic(EVP_CIPHER_CTX *e) 92 { 93 int i; 94 95 if (EVP_CIPHER_CTX_ctrl(e, EVP_CTRL_GET_RC2_KEY_BITS, 0, &i) <= 0) 96 return 0; 97 if (i == 128) 98 return RC2_128_MAGIC; 99 else if (i == 64) 100 return RC2_64_MAGIC; 101 else if (i == 40) 102 return RC2_40_MAGIC; 103 else 104 return 0; 105 } 106 107 static int rc2_magic_to_meth(int i) 108 { 109 if (i == RC2_128_MAGIC) 110 return 128; 111 else if (i == RC2_64_MAGIC) 112 return 64; 113 else if (i == RC2_40_MAGIC) 114 return 40; 115 else { 116 EVPerr(EVP_F_RC2_MAGIC_TO_METH, EVP_R_UNSUPPORTED_KEY_SIZE); 117 return 0; 118 } 119 } 120 121 static int rc2_get_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) 122 { 123 long num = 0; 124 int i = 0; 125 int key_bits; 126 unsigned int l; 127 unsigned char iv[EVP_MAX_IV_LENGTH]; 128 129 if (type != NULL) { 130 l = EVP_CIPHER_CTX_iv_length(c); 131 OPENSSL_assert(l <= sizeof(iv)); 132 i = ASN1_TYPE_get_int_octetstring(type, &num, iv, l); 133 if (i != (int)l) 134 return -1; 135 key_bits = rc2_magic_to_meth((int)num); 136 if (!key_bits) 137 return -1; 138 if (i > 0 && !EVP_CipherInit_ex(c, NULL, NULL, NULL, iv, -1)) 139 return -1; 140 if (EVP_CIPHER_CTX_ctrl(c, EVP_CTRL_SET_RC2_KEY_BITS, key_bits, 141 NULL) <= 0 142 || EVP_CIPHER_CTX_set_key_length(c, key_bits / 8) <= 0) 143 return -1; 144 } 145 return i; 146 } 147 148 static int rc2_set_asn1_type_and_iv(EVP_CIPHER_CTX *c, ASN1_TYPE *type) 149 { 150 long num; 151 int i = 0, j; 152 153 if (type != NULL) { 154 num = rc2_meth_to_magic(c); 155 j = EVP_CIPHER_CTX_iv_length(c); 156 i = ASN1_TYPE_set_int_octetstring(type, num, 157 (unsigned char *)EVP_CIPHER_CTX_original_iv(c), 158 j); 159 } 160 return i; 161 } 162 163 static int rc2_ctrl(EVP_CIPHER_CTX *c, int type, int arg, void *ptr) 164 { 165 switch (type) { 166 case EVP_CTRL_INIT: 167 data(c)->key_bits = EVP_CIPHER_CTX_key_length(c) * 8; 168 return 1; 169 170 case EVP_CTRL_GET_RC2_KEY_BITS: 171 *(int *)ptr = data(c)->key_bits; 172 return 1; 173 174 case EVP_CTRL_SET_RC2_KEY_BITS: 175 if (arg > 0) { 176 data(c)->key_bits = arg; 177 return 1; 178 } 179 return 0; 180 # ifdef PBE_PRF_TEST 181 case EVP_CTRL_PBE_PRF_NID: 182 *(int *)ptr = NID_hmacWithMD5; 183 return 1; 184 # endif 185 186 default: 187 return -1; 188 } 189 } 190 191 #endif 192