X-Git-Url: https://git.cryptolib.org/?a=blobdiff_plain;ds=sidebyside;f=rsa%2Frsa_pkcs15.c;fp=rsa%2Frsa_pkcs15.c;h=781c9badee0844baa14230d31b7cdba0786a0112;hb=3edc70ba3f2306ec503fb5e99858d28659dcac65;hp=0000000000000000000000000000000000000000;hpb=52867acc0c7f09a79efbbb738cef0c3f5a2abb04;p=arm-crypto-lib.git diff --git a/rsa/rsa_pkcs15.c b/rsa/rsa_pkcs15.c new file mode 100644 index 0000000..781c9ba --- /dev/null +++ b/rsa/rsa_pkcs15.c @@ -0,0 +1,94 @@ +/* rsa_pkcs15.c */ +/* + This file is part of the ARM-Crypto-Lib. + Copyright (C) 2006-2011 Daniel Otte (daniel.otte@rub.de) + + This program is free software: you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation, either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see . +*/ + +#include +#include +#include +#include "bigint.h" +#include "rsa_basic.h" + +#include "bigint_io.h" +#include "cli.h" + +#include "random_dummy.h" + +uint8_t rsa_encrypt_pkcs15(void* dest, uint16_t* out_length, const void* src, + uint16_t length_B, rsa_publickey_t* key, const void* pad){ + int16_t pad_length; + bigint_t x; + pad_length = (bigint_get_first_set_bit(key->modulus) + 7) / 8 - length_B - 3; + if(pad_length<8){ + cli_putstr("\r\nERROR: pad_length<8; pad_length: "); + cli_hexdump_rev(&pad_length, 2); + return 2; /* message to long */ + } + if(!pad){ + uint16_t i; + uint8_t c; + for(i=0; i=m_length){ + return 1; + } + ++idx; + while(((uint8_t*)x.wordv)[idx+pad_length]!=0 && (idx+pad_length)=m_length){ + return 2; + } + *out_length = m_length - idx - pad_length - 1; + memcpy(dest, ((uint8_t*)x.wordv) + idx + pad_length + 1, m_length - idx - pad_length - 1); + if(pad){ + memcpy(pad, ((uint8_t*)x.wordv)+idx, pad_length); + } + return 0; +} +