2 * Copyright (c) 2016-2020 Samsung Electronics Co., Ltd All Rights Reserved
4 * Contact: Krzysztof Jackiewicz <k.jackiewicz@samsung.com>
6 * Licensed under the Apache License, Version 2.0 (the "License");
7 * you may not use this file except in compliance with the License.
8 * You may obtain a copy of the License at
10 * http://www.apache.org/licenses/LICENSE-2.0
12 * Unless required by applicable law or agreed to in writing, software
13 * distributed under the License is distributed on an "AS IS" BASIS,
14 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
15 * See the License for the specific language governing permissions and
16 * limitations under the License
21 * @brief Advanced API for low-level RSA operations
26 #include <openssl/evp.h>
27 #include <openssl/rsa.h>
30 #include <yaca_error.h>
31 #include <yaca_types.h>
32 #include <yaca_crypto.h>
37 #ifdef OPENSSL_MOCKUP_TESTS
38 #include "../tests/openssl_mock_redefine.h"
42 int rsa_padding2openssl(yaca_padding_e padding)
45 case YACA_PADDING_NONE:
46 return RSA_NO_PADDING;
47 case YACA_PADDING_X931:
48 return RSA_X931_PADDING;
49 case YACA_PADDING_PKCS1:
50 return RSA_PKCS1_PADDING;
51 case YACA_PADDING_PKCS1_PSS:
52 return RSA_PKCS1_PSS_PADDING;
53 case YACA_PADDING_PKCS1_OAEP:
54 return RSA_PKCS1_OAEP_PADDING;
55 case YACA_PADDING_PKCS1_SSLV23:
56 return RSA_SSLV23_PADDING;
63 typedef int (*encrypt_decrypt_fn)(int, const unsigned char*, unsigned char*, RSA*, int);
65 static int encrypt_decrypt(yaca_padding_e padding,
71 encrypt_decrypt_fn fn)
76 struct yaca_key_evp_s *lasym_key;
79 if ((input == NULL && input_len > 0) || (input != NULL && input_len == 0) ||
80 output == NULL || output_len == NULL)
81 return YACA_ERROR_INVALID_PARAMETER;
83 lpadding = rsa_padding2openssl(padding);
85 lasym_key = key_get_evp(key);
86 assert(lasym_key != NULL);
88 ret = EVP_PKEY_size(lasym_key->evp);
90 ret = YACA_ERROR_INTERNAL;
97 ret = yaca_zalloc(max_len, (void**)&loutput);
98 if (ret != YACA_ERROR_NONE)
102 (const unsigned char*)input,
103 (unsigned char*)loutput,
104 EVP_PKEY_get0_RSA(lasym_key->evp),
108 ret = ERROR_HANDLE();
120 ret = YACA_ERROR_NONE;
128 API int yaca_rsa_public_encrypt(yaca_padding_e padding,
129 const yaca_key_h pub_key,
130 const char *plaintext,
131 size_t plaintext_len,
133 size_t *ciphertext_len)
135 if (pub_key == YACA_KEY_NULL || pub_key->type != YACA_KEY_TYPE_RSA_PUB)
136 return YACA_ERROR_INVALID_PARAMETER;
139 case YACA_PADDING_NONE:
140 case YACA_PADDING_PKCS1:
141 case YACA_PADDING_PKCS1_OAEP:
142 case YACA_PADDING_PKCS1_SSLV23:
145 return YACA_ERROR_INVALID_PARAMETER;
148 return encrypt_decrypt(padding,
157 API int yaca_rsa_private_decrypt(yaca_padding_e padding,
158 const yaca_key_h prv_key,
159 const char *ciphertext,
160 size_t ciphertext_len,
162 size_t *plaintext_len)
164 if (prv_key == YACA_KEY_NULL || prv_key->type != YACA_KEY_TYPE_RSA_PRIV)
165 return YACA_ERROR_INVALID_PARAMETER;
168 case YACA_PADDING_NONE:
169 case YACA_PADDING_PKCS1:
170 case YACA_PADDING_PKCS1_OAEP:
171 case YACA_PADDING_PKCS1_SSLV23:
174 return YACA_ERROR_INVALID_PARAMETER;
177 return encrypt_decrypt(padding,
183 RSA_private_decrypt);
186 API int yaca_rsa_private_encrypt(yaca_padding_e padding,
187 const yaca_key_h prv_key,
188 const char *plaintext,
189 size_t plaintext_len,
191 size_t *ciphertext_len)
193 if (prv_key == YACA_KEY_NULL || prv_key->type != YACA_KEY_TYPE_RSA_PRIV)
194 return YACA_ERROR_INVALID_PARAMETER;
197 case YACA_PADDING_NONE:
198 case YACA_PADDING_PKCS1:
201 return YACA_ERROR_INVALID_PARAMETER;
204 return encrypt_decrypt(padding,
210 RSA_private_encrypt);
213 API int yaca_rsa_public_decrypt(yaca_padding_e padding,
214 const yaca_key_h pub_key,
215 const char *ciphertext,
216 size_t ciphertext_len,
218 size_t *plaintext_len)
220 if (pub_key == YACA_KEY_NULL || pub_key->type != YACA_KEY_TYPE_RSA_PUB)
221 return YACA_ERROR_INVALID_PARAMETER;
224 case YACA_PADDING_NONE:
225 case YACA_PADDING_PKCS1:
228 return YACA_ERROR_INVALID_PARAMETER;
231 return encrypt_decrypt(padding,