Path: blob/main/contrib/bearssl/src/ssl/ssl_scert_single_rsa.c
39488 views
/*1* Copyright (c) 2016 Thomas Pornin <[email protected]>2*3* Permission is hereby granted, free of charge, to any person obtaining4* a copy of this software and associated documentation files (the5* "Software"), to deal in the Software without restriction, including6* without limitation the rights to use, copy, modify, merge, publish,7* distribute, sublicense, and/or sell copies of the Software, and to8* permit persons to whom the Software is furnished to do so, subject to9* the following conditions:10*11* The above copyright notice and this permission notice shall be12* included in all copies or substantial portions of the Software.13*14* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,15* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF16* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND17* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS18* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN19* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN20* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE21* SOFTWARE.22*/2324#include "inner.h"2526static int27sr_choose(const br_ssl_server_policy_class **pctx,28const br_ssl_server_context *cc,29br_ssl_server_choices *choices)30{31br_ssl_server_policy_rsa_context *pc;32const br_suite_translated *st;33size_t u, st_num;34unsigned hash_id;35int fh;3637pc = (br_ssl_server_policy_rsa_context *)pctx;38st = br_ssl_server_get_client_suites(cc, &st_num);39if (cc->eng.session.version < BR_TLS12) {40hash_id = 0;41fh = 1;42} else {43hash_id = br_ssl_choose_hash(44br_ssl_server_get_client_hashes(cc));45fh = (hash_id != 0);46}47choices->chain = pc->chain;48choices->chain_len = pc->chain_len;49for (u = 0; u < st_num; u ++) {50unsigned tt;5152tt = st[u][1];53switch (tt >> 12) {54case BR_SSLKEYX_RSA:55if ((pc->allowed_usages & BR_KEYTYPE_KEYX) != 0) {56choices->cipher_suite = st[u][0];57return 1;58}59break;60case BR_SSLKEYX_ECDHE_RSA:61if ((pc->allowed_usages & BR_KEYTYPE_SIGN) != 0 && fh) {62choices->cipher_suite = st[u][0];63choices->algo_id = hash_id + 0xFF00;64return 1;65}66break;67}68}69return 0;70}7172static uint32_t73sr_do_keyx(const br_ssl_server_policy_class **pctx,74unsigned char *data, size_t *len)75{76br_ssl_server_policy_rsa_context *pc;7778pc = (br_ssl_server_policy_rsa_context *)pctx;79return br_rsa_ssl_decrypt(pc->irsacore, pc->sk, data, *len);80}8182/*83* OID for hash functions in RSA signatures.84*/85static const unsigned char HASH_OID_SHA1[] = {860x05, 0x2B, 0x0E, 0x03, 0x02, 0x1A87};8889static const unsigned char HASH_OID_SHA224[] = {900x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0491};9293static const unsigned char HASH_OID_SHA256[] = {940x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0195};9697static const unsigned char HASH_OID_SHA384[] = {980x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x0299};100101static const unsigned char HASH_OID_SHA512[] = {1020x09, 0x60, 0x86, 0x48, 0x01, 0x65, 0x03, 0x04, 0x02, 0x03103};104105static const unsigned char *HASH_OID[] = {106HASH_OID_SHA1,107HASH_OID_SHA224,108HASH_OID_SHA256,109HASH_OID_SHA384,110HASH_OID_SHA512111};112113static size_t114sr_do_sign(const br_ssl_server_policy_class **pctx,115unsigned algo_id, unsigned char *data, size_t hv_len, size_t len)116{117br_ssl_server_policy_rsa_context *pc;118unsigned char hv[64];119size_t sig_len;120const unsigned char *hash_oid;121122pc = (br_ssl_server_policy_rsa_context *)pctx;123memcpy(hv, data, hv_len);124algo_id &= 0xFF;125if (algo_id == 0) {126hash_oid = NULL;127} else if (algo_id >= 2 && algo_id <= 6) {128hash_oid = HASH_OID[algo_id - 2];129} else {130return 0;131}132sig_len = (pc->sk->n_bitlen + 7) >> 3;133if (len < sig_len) {134return 0;135}136return pc->irsasign(hash_oid, hv, hv_len, pc->sk, data) ? sig_len : 0;137}138139static const br_ssl_server_policy_class sr_policy_vtable = {140sizeof(br_ssl_server_policy_rsa_context),141sr_choose,142sr_do_keyx,143sr_do_sign144};145146/* see bearssl_ssl.h */147void148br_ssl_server_set_single_rsa(br_ssl_server_context *cc,149const br_x509_certificate *chain, size_t chain_len,150const br_rsa_private_key *sk, unsigned allowed_usages,151br_rsa_private irsacore, br_rsa_pkcs1_sign irsasign)152{153cc->chain_handler.single_rsa.vtable = &sr_policy_vtable;154cc->chain_handler.single_rsa.chain = chain;155cc->chain_handler.single_rsa.chain_len = chain_len;156cc->chain_handler.single_rsa.sk = sk;157cc->chain_handler.single_rsa.allowed_usages = allowed_usages;158cc->chain_handler.single_rsa.irsacore = irsacore;159cc->chain_handler.single_rsa.irsasign = irsasign;160cc->policy_vtable = &cc->chain_handler.single_rsa.vtable;161}162163164