1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2017-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * Copyright 2017 BaishanCloud. All rights reserved. 4e1051a39Sopenharmony_ci * 5e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 6e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 7e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 8e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 9e1051a39Sopenharmony_ci */ 10e1051a39Sopenharmony_ci 11e1051a39Sopenharmony_ci#include <openssl/bn.h> 12e1051a39Sopenharmony_ci#include <openssl/err.h> 13e1051a39Sopenharmony_ci#include "rsa_local.h" 14e1051a39Sopenharmony_ci 15e1051a39Sopenharmony_civoid ossl_rsa_multip_info_free_ex(RSA_PRIME_INFO *pinfo) 16e1051a39Sopenharmony_ci{ 17e1051a39Sopenharmony_ci /* free pp and pinfo only */ 18e1051a39Sopenharmony_ci BN_clear_free(pinfo->pp); 19e1051a39Sopenharmony_ci OPENSSL_free(pinfo); 20e1051a39Sopenharmony_ci} 21e1051a39Sopenharmony_ci 22e1051a39Sopenharmony_civoid ossl_rsa_multip_info_free(RSA_PRIME_INFO *pinfo) 23e1051a39Sopenharmony_ci{ 24e1051a39Sopenharmony_ci /* free an RSA_PRIME_INFO structure */ 25e1051a39Sopenharmony_ci BN_clear_free(pinfo->r); 26e1051a39Sopenharmony_ci BN_clear_free(pinfo->d); 27e1051a39Sopenharmony_ci BN_clear_free(pinfo->t); 28e1051a39Sopenharmony_ci ossl_rsa_multip_info_free_ex(pinfo); 29e1051a39Sopenharmony_ci} 30e1051a39Sopenharmony_ci 31e1051a39Sopenharmony_ciRSA_PRIME_INFO *ossl_rsa_multip_info_new(void) 32e1051a39Sopenharmony_ci{ 33e1051a39Sopenharmony_ci RSA_PRIME_INFO *pinfo; 34e1051a39Sopenharmony_ci 35e1051a39Sopenharmony_ci /* create an RSA_PRIME_INFO structure */ 36e1051a39Sopenharmony_ci if ((pinfo = OPENSSL_zalloc(sizeof(RSA_PRIME_INFO))) == NULL) { 37e1051a39Sopenharmony_ci ERR_raise(ERR_LIB_RSA, ERR_R_MALLOC_FAILURE); 38e1051a39Sopenharmony_ci return NULL; 39e1051a39Sopenharmony_ci } 40e1051a39Sopenharmony_ci if ((pinfo->r = BN_secure_new()) == NULL) 41e1051a39Sopenharmony_ci goto err; 42e1051a39Sopenharmony_ci if ((pinfo->d = BN_secure_new()) == NULL) 43e1051a39Sopenharmony_ci goto err; 44e1051a39Sopenharmony_ci if ((pinfo->t = BN_secure_new()) == NULL) 45e1051a39Sopenharmony_ci goto err; 46e1051a39Sopenharmony_ci if ((pinfo->pp = BN_secure_new()) == NULL) 47e1051a39Sopenharmony_ci goto err; 48e1051a39Sopenharmony_ci 49e1051a39Sopenharmony_ci return pinfo; 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ci err: 52e1051a39Sopenharmony_ci BN_free(pinfo->r); 53e1051a39Sopenharmony_ci BN_free(pinfo->d); 54e1051a39Sopenharmony_ci BN_free(pinfo->t); 55e1051a39Sopenharmony_ci BN_free(pinfo->pp); 56e1051a39Sopenharmony_ci OPENSSL_free(pinfo); 57e1051a39Sopenharmony_ci return NULL; 58e1051a39Sopenharmony_ci} 59e1051a39Sopenharmony_ci 60e1051a39Sopenharmony_ci/* Refill products of primes */ 61e1051a39Sopenharmony_ciint ossl_rsa_multip_calc_product(RSA *rsa) 62e1051a39Sopenharmony_ci{ 63e1051a39Sopenharmony_ci RSA_PRIME_INFO *pinfo; 64e1051a39Sopenharmony_ci BIGNUM *p1 = NULL, *p2 = NULL; 65e1051a39Sopenharmony_ci BN_CTX *ctx = NULL; 66e1051a39Sopenharmony_ci int i, rv = 0, ex_primes; 67e1051a39Sopenharmony_ci 68e1051a39Sopenharmony_ci if ((ex_primes = sk_RSA_PRIME_INFO_num(rsa->prime_infos)) <= 0) { 69e1051a39Sopenharmony_ci /* invalid */ 70e1051a39Sopenharmony_ci goto err; 71e1051a39Sopenharmony_ci } 72e1051a39Sopenharmony_ci 73e1051a39Sopenharmony_ci if ((ctx = BN_CTX_new()) == NULL) 74e1051a39Sopenharmony_ci goto err; 75e1051a39Sopenharmony_ci 76e1051a39Sopenharmony_ci /* calculate pinfo->pp = p * q for first 'extra' prime */ 77e1051a39Sopenharmony_ci p1 = rsa->p; 78e1051a39Sopenharmony_ci p2 = rsa->q; 79e1051a39Sopenharmony_ci 80e1051a39Sopenharmony_ci for (i = 0; i < ex_primes; i++) { 81e1051a39Sopenharmony_ci pinfo = sk_RSA_PRIME_INFO_value(rsa->prime_infos, i); 82e1051a39Sopenharmony_ci if (pinfo->pp == NULL) { 83e1051a39Sopenharmony_ci pinfo->pp = BN_secure_new(); 84e1051a39Sopenharmony_ci if (pinfo->pp == NULL) 85e1051a39Sopenharmony_ci goto err; 86e1051a39Sopenharmony_ci } 87e1051a39Sopenharmony_ci if (!BN_mul(pinfo->pp, p1, p2, ctx)) 88e1051a39Sopenharmony_ci goto err; 89e1051a39Sopenharmony_ci /* save previous one */ 90e1051a39Sopenharmony_ci p1 = pinfo->pp; 91e1051a39Sopenharmony_ci p2 = pinfo->r; 92e1051a39Sopenharmony_ci } 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci rv = 1; 95e1051a39Sopenharmony_ci err: 96e1051a39Sopenharmony_ci BN_CTX_free(ctx); 97e1051a39Sopenharmony_ci return rv; 98e1051a39Sopenharmony_ci} 99e1051a39Sopenharmony_ci 100e1051a39Sopenharmony_ciint ossl_rsa_multip_cap(int bits) 101e1051a39Sopenharmony_ci{ 102e1051a39Sopenharmony_ci int cap = 5; 103e1051a39Sopenharmony_ci 104e1051a39Sopenharmony_ci if (bits < 1024) 105e1051a39Sopenharmony_ci cap = 2; 106e1051a39Sopenharmony_ci else if (bits < 4096) 107e1051a39Sopenharmony_ci cap = 3; 108e1051a39Sopenharmony_ci else if (bits < 8192) 109e1051a39Sopenharmony_ci cap = 4; 110e1051a39Sopenharmony_ci 111e1051a39Sopenharmony_ci if (cap > RSA_MAX_PRIME_NUM) 112e1051a39Sopenharmony_ci cap = RSA_MAX_PRIME_NUM; 113e1051a39Sopenharmony_ci 114e1051a39Sopenharmony_ci return cap; 115e1051a39Sopenharmony_ci} 116