X-Git-Url: https://git.cryptolib.org/?p=arm-crypto-lib.git;a=blobdiff_plain;f=rsa%2Frsaes_pkcs1v15.c;fp=rsa%2Frsaes_pkcs1v15.c;h=450053b6346b2489750695ceb9f7fe52f19749df;hp=0000000000000000000000000000000000000000;hb=2a4779378a7bf4322a0e6b2024284092135e8a3d;hpb=e69f1207a9fbd9c0f45bfdbb2d8ebe9852d95969 diff --git a/rsa/rsaes_pkcs1v15.c b/rsa/rsaes_pkcs1v15.c new file mode 100644 index 0000000..450053b --- /dev/null +++ b/rsa/rsaes_pkcs1v15.c @@ -0,0 +1,142 @@ +/* rsa_pkcs1v15.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" + +#define DEBUG 0 + +#if DEBUG +#include "bigint_io.h" +#include "cli.h" +#endif + +#include "random_dummy.h" + +uint16_t rsa_pkcs1v15_compute_padlength_B(const bigint_t* modulus, uint16_t msg_length_B){ + return bigint_get_first_set_bit(modulus) / 8 + 1 - msg_length_B - 3; +} + +uint8_t rsa_encrypt_pkcs1v15(void* dest, uint16_t* out_length, const void* src, + uint16_t length_B, const rsa_publickey_t* key, const void* pad){ + int16_t pad_length; + bigint_t x; + pad_length = rsa_pkcs1v15_compute_padlength_B(&key->modulus, length_B); + if(pad_length<8){ +#if DEBUG + cli_putstr("\r\nERROR: pad_length<8; pad_length: "); + cli_hexdump_rev(&pad_length, 2); +#endif + return 2; /* message to long */ + } + if(!pad){ +#if DEBUG + cli_putstr("\r\nauto-generating pad ..."); +#endif + uint16_t i; + uint8_t c; + for(i=0; i=m_length){ + return 1; + } + if(((uint8_t*)x.wordv)[idx]!=2){ + return 3; + } + + ++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; + if(pad){ +#if DEBUG + cli_putstr("\r\npadding block:"); + cli_hexdump_block(((uint8_t*)x.wordv)+idx, pad_length, 4, 16); + cli_putstr("\r\npad @ 0x"); + cli_hexdump_rev(&pad, 2); + cli_putstr("\r\ndst @ 0x"); + cli_hexdump_rev(&dest, 2); +#endif + memcpy(pad, ((uint8_t*)x.wordv)+idx, pad_length); + } + memmove(dest, ((uint8_t*)x.wordv) + idx + pad_length + 1, m_length - idx - pad_length - 1); + + return 0; +} +