Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
Dependents: MiniTLS-HTTPS-Example
crypto/crypto_rsa.c@0:35aa5be3b78d, 2014-06-06 (annotated)
- Committer:
- MiniTLS
- Date:
- Fri Jun 06 10:49:02 2014 +0000
- Revision:
- 0:35aa5be3b78d
Initial commit
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
MiniTLS | 0:35aa5be3b78d | 1 | /* |
MiniTLS | 0:35aa5be3b78d | 2 | MuTLS - A super trimmed down TLS/SSL Library for embedded devices |
MiniTLS | 0:35aa5be3b78d | 3 | Author: Donatien Garnier |
MiniTLS | 0:35aa5be3b78d | 4 | Copyright (C) 2013-2014 AppNearMe Ltd |
MiniTLS | 0:35aa5be3b78d | 5 | |
MiniTLS | 0:35aa5be3b78d | 6 | This program is free software; you can redistribute it and/or |
MiniTLS | 0:35aa5be3b78d | 7 | modify it under the terms of the GNU General Public License |
MiniTLS | 0:35aa5be3b78d | 8 | as published by the Free Software Foundation; either version 2 |
MiniTLS | 0:35aa5be3b78d | 9 | of the License, or (at your option) any later version. |
MiniTLS | 0:35aa5be3b78d | 10 | |
MiniTLS | 0:35aa5be3b78d | 11 | This program is distributed in the hope that it will be useful, |
MiniTLS | 0:35aa5be3b78d | 12 | but WITHOUT ANY WARRANTY; without even the implied warranty of |
MiniTLS | 0:35aa5be3b78d | 13 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
MiniTLS | 0:35aa5be3b78d | 14 | GNU General Public License for more details. |
MiniTLS | 0:35aa5be3b78d | 15 | |
MiniTLS | 0:35aa5be3b78d | 16 | You should have received a copy of the GNU General Public License |
MiniTLS | 0:35aa5be3b78d | 17 | along with this program; if not, write to the Free Software |
MiniTLS | 0:35aa5be3b78d | 18 | Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. |
MiniTLS | 0:35aa5be3b78d | 19 | *//** |
MiniTLS | 0:35aa5be3b78d | 20 | * \file crypto_rsa.c |
MiniTLS | 0:35aa5be3b78d | 21 | * \copyright Copyright (c) AppNearMe Ltd 2014 |
MiniTLS | 0:35aa5be3b78d | 22 | * \author Donatien Garnier |
MiniTLS | 0:35aa5be3b78d | 23 | */ |
MiniTLS | 0:35aa5be3b78d | 24 | |
MiniTLS | 0:35aa5be3b78d | 25 | #define __DEBUG__ 0 |
MiniTLS | 0:35aa5be3b78d | 26 | #ifndef __MODULE__ |
MiniTLS | 0:35aa5be3b78d | 27 | #define __MODULE__ "crypto_rsa.c" |
MiniTLS | 0:35aa5be3b78d | 28 | #endif |
MiniTLS | 0:35aa5be3b78d | 29 | |
MiniTLS | 0:35aa5be3b78d | 30 | #include "core/fwk.h" |
MiniTLS | 0:35aa5be3b78d | 31 | #include "crypto_rsa.h" |
MiniTLS | 0:35aa5be3b78d | 32 | #include "inc/mutls_errors.h" |
MiniTLS | 0:35aa5be3b78d | 33 | #include "inc/mutls_config.h" |
MiniTLS | 0:35aa5be3b78d | 34 | |
MiniTLS | 0:35aa5be3b78d | 35 | #include "crypto_math.h" |
MiniTLS | 0:35aa5be3b78d | 36 | #include "ltc/ltc.h" |
MiniTLS | 0:35aa5be3b78d | 37 | |
MiniTLS | 0:35aa5be3b78d | 38 | static mutls_err_t crypto_pkcs_1_v1_5_encode(const uint8_t* msg, |
MiniTLS | 0:35aa5be3b78d | 39 | size_t msglen, |
MiniTLS | 0:35aa5be3b78d | 40 | size_t modulus_bitlen, |
MiniTLS | 0:35aa5be3b78d | 41 | crypto_prng_t* prng, |
MiniTLS | 0:35aa5be3b78d | 42 | uint8_t* out, |
MiniTLS | 0:35aa5be3b78d | 43 | size_t* outlen); |
MiniTLS | 0:35aa5be3b78d | 44 | static mutls_err_t crypto_rsa_exptmod(const uint8_t* in, size_t inlen, |
MiniTLS | 0:35aa5be3b78d | 45 | uint8_t *out, size_t* outlen, |
MiniTLS | 0:35aa5be3b78d | 46 | crypto_rsa_public_key_t* key); |
MiniTLS | 0:35aa5be3b78d | 47 | static mutls_err_t crypto_ecc_dsa_check_get_asn1_Ne(void* N, void* e, const uint8_t* key, size_t key_size); |
MiniTLS | 0:35aa5be3b78d | 48 | |
MiniTLS | 0:35aa5be3b78d | 49 | mutls_err_t crypto_rsa_pkcs1_import(crypto_rsa_public_key_t* key, const uint8_t* pkcs1, size_t size) |
MiniTLS | 0:35aa5be3b78d | 50 | { |
MiniTLS | 0:35aa5be3b78d | 51 | int err; |
MiniTLS | 0:35aa5be3b78d | 52 | |
MiniTLS | 0:35aa5be3b78d | 53 | /* init key */ |
MiniTLS | 0:35aa5be3b78d | 54 | if ((err = mp_init_multi(&key->e, &key->N, NULL)) != MUTLS_OK) { |
MiniTLS | 0:35aa5be3b78d | 55 | return err; |
MiniTLS | 0:35aa5be3b78d | 56 | } |
MiniTLS | 0:35aa5be3b78d | 57 | |
MiniTLS | 0:35aa5be3b78d | 58 | if( (err = crypto_ecc_dsa_check_get_asn1_Ne(&key->N, &key->e, pkcs1, size)) != MUTLS_OK ) |
MiniTLS | 0:35aa5be3b78d | 59 | { |
MiniTLS | 0:35aa5be3b78d | 60 | goto LBL_ERR; |
MiniTLS | 0:35aa5be3b78d | 61 | } |
MiniTLS | 0:35aa5be3b78d | 62 | |
MiniTLS | 0:35aa5be3b78d | 63 | return MUTLS_OK; |
MiniTLS | 0:35aa5be3b78d | 64 | LBL_ERR: |
MiniTLS | 0:35aa5be3b78d | 65 | mp_clear_multi(&key->e, &key->N, NULL); |
MiniTLS | 0:35aa5be3b78d | 66 | return err; |
MiniTLS | 0:35aa5be3b78d | 67 | } |
MiniTLS | 0:35aa5be3b78d | 68 | |
MiniTLS | 0:35aa5be3b78d | 69 | mutls_err_t crypto_rsa_encrypt(const crypto_rsa_public_key_t* public_key, |
MiniTLS | 0:35aa5be3b78d | 70 | uint8_t* plaintext, size_t plaintext_size, |
MiniTLS | 0:35aa5be3b78d | 71 | uint8_t* secret, size_t max_secret_size, size_t* secret_size, crypto_prng_t* prng) |
MiniTLS | 0:35aa5be3b78d | 72 | { |
MiniTLS | 0:35aa5be3b78d | 73 | mutls_err_t ret; |
MiniTLS | 0:35aa5be3b78d | 74 | |
MiniTLS | 0:35aa5be3b78d | 75 | /* get modulus len in bits */ |
MiniTLS | 0:35aa5be3b78d | 76 | size_t modulus_bitlen = mp_count_bits( (&public_key->N)); |
MiniTLS | 0:35aa5be3b78d | 77 | |
MiniTLS | 0:35aa5be3b78d | 78 | /* outlen must be at least the size of the modulus */ |
MiniTLS | 0:35aa5be3b78d | 79 | size_t modulus_bytelen = mp_unsigned_bin_size( (&public_key->N)); |
MiniTLS | 0:35aa5be3b78d | 80 | if (modulus_bytelen > max_secret_size) { |
MiniTLS | 0:35aa5be3b78d | 81 | *secret_size = modulus_bytelen; |
MiniTLS | 0:35aa5be3b78d | 82 | return MUTLS_ERR_BUFFER_TOO_SMALL; |
MiniTLS | 0:35aa5be3b78d | 83 | } |
MiniTLS | 0:35aa5be3b78d | 84 | |
MiniTLS | 0:35aa5be3b78d | 85 | //Apply padding |
MiniTLS | 0:35aa5be3b78d | 86 | *secret_size = max_secret_size; |
MiniTLS | 0:35aa5be3b78d | 87 | ret = crypto_pkcs_1_v1_5_encode(plaintext, plaintext_size, modulus_bitlen, prng, secret, secret_size); |
MiniTLS | 0:35aa5be3b78d | 88 | if(ret) |
MiniTLS | 0:35aa5be3b78d | 89 | { |
MiniTLS | 0:35aa5be3b78d | 90 | return ret; |
MiniTLS | 0:35aa5be3b78d | 91 | } |
MiniTLS | 0:35aa5be3b78d | 92 | |
MiniTLS | 0:35aa5be3b78d | 93 | //Do the exponentiation |
MiniTLS | 0:35aa5be3b78d | 94 | ret = crypto_rsa_exptmod(secret, *secret_size, secret, secret_size, public_key); |
MiniTLS | 0:35aa5be3b78d | 95 | if(ret) |
MiniTLS | 0:35aa5be3b78d | 96 | { |
MiniTLS | 0:35aa5be3b78d | 97 | return ret; |
MiniTLS | 0:35aa5be3b78d | 98 | } |
MiniTLS | 0:35aa5be3b78d | 99 | |
MiniTLS | 0:35aa5be3b78d | 100 | return MUTLS_OK; |
MiniTLS | 0:35aa5be3b78d | 101 | } |
MiniTLS | 0:35aa5be3b78d | 102 | |
MiniTLS | 0:35aa5be3b78d | 103 | mutls_err_t crypto_rsa_exptmod(const uint8_t* in, size_t inlen, |
MiniTLS | 0:35aa5be3b78d | 104 | uint8_t *out, size_t* outlen, |
MiniTLS | 0:35aa5be3b78d | 105 | crypto_rsa_public_key_t* key) |
MiniTLS | 0:35aa5be3b78d | 106 | { |
MiniTLS | 0:35aa5be3b78d | 107 | fp_int tmp; |
MiniTLS | 0:35aa5be3b78d | 108 | unsigned long x; |
MiniTLS | 0:35aa5be3b78d | 109 | int err; |
MiniTLS | 0:35aa5be3b78d | 110 | |
MiniTLS | 0:35aa5be3b78d | 111 | /* init and copy into tmp */ |
MiniTLS | 0:35aa5be3b78d | 112 | if ((err = mp_init_multi(&tmp, NULL)) != MUTLS_OK) { return err; } |
MiniTLS | 0:35aa5be3b78d | 113 | mp_read_unsigned_bin(&tmp, (unsigned char *)in, (int)inlen); |
MiniTLS | 0:35aa5be3b78d | 114 | |
MiniTLS | 0:35aa5be3b78d | 115 | /* sanity check on the input */ |
MiniTLS | 0:35aa5be3b78d | 116 | if (mp_cmp(&key->N, &tmp) == MP_LT) { |
MiniTLS | 0:35aa5be3b78d | 117 | err = MUTLS_ERR_WRONG_LENGTH; |
MiniTLS | 0:35aa5be3b78d | 118 | goto error; |
MiniTLS | 0:35aa5be3b78d | 119 | } |
MiniTLS | 0:35aa5be3b78d | 120 | |
MiniTLS | 0:35aa5be3b78d | 121 | /* exptmod it */ |
MiniTLS | 0:35aa5be3b78d | 122 | if ((err = mp_exptmod(&tmp, &key->e, &key->N, &tmp)) != MUTLS_OK) { goto error; } |
MiniTLS | 0:35aa5be3b78d | 123 | |
MiniTLS | 0:35aa5be3b78d | 124 | /* read it back */ |
MiniTLS | 0:35aa5be3b78d | 125 | x = (unsigned long)mp_unsigned_bin_size(&key->N); |
MiniTLS | 0:35aa5be3b78d | 126 | if (x > *outlen) { |
MiniTLS | 0:35aa5be3b78d | 127 | *outlen = x; |
MiniTLS | 0:35aa5be3b78d | 128 | err = MUTLS_ERR_BUFFER_TOO_SMALL; |
MiniTLS | 0:35aa5be3b78d | 129 | goto error; |
MiniTLS | 0:35aa5be3b78d | 130 | } |
MiniTLS | 0:35aa5be3b78d | 131 | |
MiniTLS | 0:35aa5be3b78d | 132 | /* this should never happen ... */ |
MiniTLS | 0:35aa5be3b78d | 133 | if (mp_unsigned_bin_size(&tmp) > mp_unsigned_bin_size(&key->N)) { |
MiniTLS | 0:35aa5be3b78d | 134 | err = MUTLS_ERR_CRYPTO; |
MiniTLS | 0:35aa5be3b78d | 135 | goto error; |
MiniTLS | 0:35aa5be3b78d | 136 | } |
MiniTLS | 0:35aa5be3b78d | 137 | *outlen = x; |
MiniTLS | 0:35aa5be3b78d | 138 | |
MiniTLS | 0:35aa5be3b78d | 139 | /* convert it */ |
MiniTLS | 0:35aa5be3b78d | 140 | zeromem(out, x); |
MiniTLS | 0:35aa5be3b78d | 141 | mp_to_unsigned_bin(&tmp, out+(x-mp_unsigned_bin_size(&tmp))); |
MiniTLS | 0:35aa5be3b78d | 142 | |
MiniTLS | 0:35aa5be3b78d | 143 | /* clean up and return */ |
MiniTLS | 0:35aa5be3b78d | 144 | err = MUTLS_OK; |
MiniTLS | 0:35aa5be3b78d | 145 | error: |
MiniTLS | 0:35aa5be3b78d | 146 | mp_clear_multi(&tmp, NULL); |
MiniTLS | 0:35aa5be3b78d | 147 | return err; |
MiniTLS | 0:35aa5be3b78d | 148 | } |
MiniTLS | 0:35aa5be3b78d | 149 | |
MiniTLS | 0:35aa5be3b78d | 150 | mutls_err_t crypto_pkcs_1_v1_5_encode(const uint8_t* msg, |
MiniTLS | 0:35aa5be3b78d | 151 | size_t msglen, |
MiniTLS | 0:35aa5be3b78d | 152 | size_t modulus_bitlen, |
MiniTLS | 0:35aa5be3b78d | 153 | crypto_prng_t* prng, |
MiniTLS | 0:35aa5be3b78d | 154 | uint8_t* out, |
MiniTLS | 0:35aa5be3b78d | 155 | size_t* outlen) |
MiniTLS | 0:35aa5be3b78d | 156 | { |
MiniTLS | 0:35aa5be3b78d | 157 | unsigned long modulus_len, ps_len, i; |
MiniTLS | 0:35aa5be3b78d | 158 | unsigned char *ps; |
MiniTLS | 0:35aa5be3b78d | 159 | int result; |
MiniTLS | 0:35aa5be3b78d | 160 | |
MiniTLS | 0:35aa5be3b78d | 161 | modulus_len = (modulus_bitlen >> 3) + (modulus_bitlen & 7 ? 1 : 0); |
MiniTLS | 0:35aa5be3b78d | 162 | |
MiniTLS | 0:35aa5be3b78d | 163 | /* test message size */ |
MiniTLS | 0:35aa5be3b78d | 164 | if ((msglen + 11) > modulus_len) { |
MiniTLS | 0:35aa5be3b78d | 165 | return MUTLS_ERR_WRONG_LENGTH; |
MiniTLS | 0:35aa5be3b78d | 166 | } |
MiniTLS | 0:35aa5be3b78d | 167 | |
MiniTLS | 0:35aa5be3b78d | 168 | if (*outlen < modulus_len) { |
MiniTLS | 0:35aa5be3b78d | 169 | *outlen = modulus_len; |
MiniTLS | 0:35aa5be3b78d | 170 | result = MUTLS_ERR_BUFFER_TOO_SMALL; |
MiniTLS | 0:35aa5be3b78d | 171 | goto bail; |
MiniTLS | 0:35aa5be3b78d | 172 | } |
MiniTLS | 0:35aa5be3b78d | 173 | |
MiniTLS | 0:35aa5be3b78d | 174 | /* generate an octets string PS */ |
MiniTLS | 0:35aa5be3b78d | 175 | ps = &out[2]; |
MiniTLS | 0:35aa5be3b78d | 176 | ps_len = modulus_len - msglen - 3; |
MiniTLS | 0:35aa5be3b78d | 177 | |
MiniTLS | 0:35aa5be3b78d | 178 | |
MiniTLS | 0:35aa5be3b78d | 179 | /* now choose a random ps */ |
MiniTLS | 0:35aa5be3b78d | 180 | crypto_prng_get(prng, ps, ps_len); |
MiniTLS | 0:35aa5be3b78d | 181 | |
MiniTLS | 0:35aa5be3b78d | 182 | /* transform zero bytes (if any) to non-zero random bytes */ |
MiniTLS | 0:35aa5be3b78d | 183 | for (i = 0; i < ps_len; i++) { |
MiniTLS | 0:35aa5be3b78d | 184 | while (ps[i] == 0) { |
MiniTLS | 0:35aa5be3b78d | 185 | crypto_prng_get(prng, &ps[i], 1); |
MiniTLS | 0:35aa5be3b78d | 186 | } |
MiniTLS | 0:35aa5be3b78d | 187 | } |
MiniTLS | 0:35aa5be3b78d | 188 | |
MiniTLS | 0:35aa5be3b78d | 189 | /* create string of length modulus_len */ |
MiniTLS | 0:35aa5be3b78d | 190 | out[0] = 0x00; |
MiniTLS | 0:35aa5be3b78d | 191 | out[1] = 2; /* block_type is Block type 2 (LTC_PKCS #1 v1.5 encryption padding) */ |
MiniTLS | 0:35aa5be3b78d | 192 | out[2 + ps_len] = 0x00; |
MiniTLS | 0:35aa5be3b78d | 193 | memcpy(&out[2 + ps_len + 1], msg, msglen); |
MiniTLS | 0:35aa5be3b78d | 194 | *outlen = modulus_len; |
MiniTLS | 0:35aa5be3b78d | 195 | |
MiniTLS | 0:35aa5be3b78d | 196 | result = MUTLS_OK; |
MiniTLS | 0:35aa5be3b78d | 197 | bail: |
MiniTLS | 0:35aa5be3b78d | 198 | return result; |
MiniTLS | 0:35aa5be3b78d | 199 | } |
MiniTLS | 0:35aa5be3b78d | 200 | |
MiniTLS | 0:35aa5be3b78d | 201 | |
MiniTLS | 0:35aa5be3b78d | 202 | //Decode (&N,&e) integers from ASN.1-encoded public key |
MiniTLS | 0:35aa5be3b78d | 203 | #define ENSURE_SIZE(actual_size, min_size) do{ if( (actual_size) < (min_size) ) { return MUTLS_ERR_PARAMETERS; } }while(0) |
MiniTLS | 0:35aa5be3b78d | 204 | mutls_err_t crypto_ecc_dsa_check_get_asn1_Ne(void* N, void* e, const uint8_t* key, size_t key_size) |
MiniTLS | 0:35aa5be3b78d | 205 | { |
MiniTLS | 0:35aa5be3b78d | 206 | const uint8_t* p = key; |
MiniTLS | 0:35aa5be3b78d | 207 | size_t sz = key_size; |
MiniTLS | 0:35aa5be3b78d | 208 | |
MiniTLS | 0:35aa5be3b78d | 209 | /* OpenSSL encoded keys have this format: |
MiniTLS | 0:35aa5be3b78d | 210 | * |
MiniTLS | 0:35aa5be3b78d | 211 | * SEQUENCE(2 elem) |
MiniTLS | 0:35aa5be3b78d | 212 | * * SEQUENCE(2 elem) |
MiniTLS | 0:35aa5be3b78d | 213 | * * * OBJECT IDENTIFIER1.2.840.113549.1.1.1 |
MiniTLS | 0:35aa5be3b78d | 214 | * * * NULL |
MiniTLS | 0:35aa5be3b78d | 215 | * * BIT STRING(1 elem) |
MiniTLS | 0:35aa5be3b78d | 216 | * * * SEQUENCE(2 elem) |
MiniTLS | 0:35aa5be3b78d | 217 | * * * * INTEGER(1024 bit) |
MiniTLS | 0:35aa5be3b78d | 218 | * * * * INTEGER 65537 |
MiniTLS | 0:35aa5be3b78d | 219 | * |
MiniTLS | 0:35aa5be3b78d | 220 | * |
MiniTLS | 0:35aa5be3b78d | 221 | */ |
MiniTLS | 0:35aa5be3b78d | 222 | |
MiniTLS | 0:35aa5be3b78d | 223 | |
MiniTLS | 0:35aa5be3b78d | 224 | |
MiniTLS | 0:35aa5be3b78d | 225 | |
MiniTLS | 0:35aa5be3b78d | 226 | ENSURE_SIZE(sz, 1); |
MiniTLS | 0:35aa5be3b78d | 227 | |
MiniTLS | 0:35aa5be3b78d | 228 | if( (p[0] != 0x30) && (p[0] != 0x31) ) //Sequence, SET types |
MiniTLS | 0:35aa5be3b78d | 229 | { |
MiniTLS | 0:35aa5be3b78d | 230 | return MUTLS_ERR_PARAMETERS; |
MiniTLS | 0:35aa5be3b78d | 231 | } |
MiniTLS | 0:35aa5be3b78d | 232 | |
MiniTLS | 0:35aa5be3b78d | 233 | p++; |
MiniTLS | 0:35aa5be3b78d | 234 | sz--; |
MiniTLS | 0:35aa5be3b78d | 235 | |
MiniTLS | 0:35aa5be3b78d | 236 | ENSURE_SIZE(sz, 1); |
MiniTLS | 0:35aa5be3b78d | 237 | |
MiniTLS | 0:35aa5be3b78d | 238 | size_t seq_size; |
MiniTLS | 0:35aa5be3b78d | 239 | //Get sequence length |
MiniTLS | 0:35aa5be3b78d | 240 | if(*p < 0x80) |
MiniTLS | 0:35aa5be3b78d | 241 | { |
MiniTLS | 0:35aa5be3b78d | 242 | seq_size = p[0]; |
MiniTLS | 0:35aa5be3b78d | 243 | p++; |
MiniTLS | 0:35aa5be3b78d | 244 | sz--; |
MiniTLS | 0:35aa5be3b78d | 245 | } |
MiniTLS | 0:35aa5be3b78d | 246 | else if(*p == 0x81) |
MiniTLS | 0:35aa5be3b78d | 247 | { |
MiniTLS | 0:35aa5be3b78d | 248 | ENSURE_SIZE(sz, 2); |
MiniTLS | 0:35aa5be3b78d | 249 | seq_size = p[1]; |
MiniTLS | 0:35aa5be3b78d | 250 | p+=2; |
MiniTLS | 0:35aa5be3b78d | 251 | sz-=2; |
MiniTLS | 0:35aa5be3b78d | 252 | } |
MiniTLS | 0:35aa5be3b78d | 253 | else if(*p == 0x82) |
MiniTLS | 0:35aa5be3b78d | 254 | { |
MiniTLS | 0:35aa5be3b78d | 255 | ENSURE_SIZE(sz, 3); |
MiniTLS | 0:35aa5be3b78d | 256 | seq_size = (p[1] << 8) | p[2]; |
MiniTLS | 0:35aa5be3b78d | 257 | p+=3; |
MiniTLS | 0:35aa5be3b78d | 258 | sz-=3; |
MiniTLS | 0:35aa5be3b78d | 259 | } |
MiniTLS | 0:35aa5be3b78d | 260 | else if(*p == 0x83) |
MiniTLS | 0:35aa5be3b78d | 261 | { |
MiniTLS | 0:35aa5be3b78d | 262 | ENSURE_SIZE(sz, 4); |
MiniTLS | 0:35aa5be3b78d | 263 | seq_size = (p[1] << 16) | (p[2] << 8) | p[3]; |
MiniTLS | 0:35aa5be3b78d | 264 | p+=4; |
MiniTLS | 0:35aa5be3b78d | 265 | sz-=4; |
MiniTLS | 0:35aa5be3b78d | 266 | } |
MiniTLS | 0:35aa5be3b78d | 267 | else if(*p == 0x84) |
MiniTLS | 0:35aa5be3b78d | 268 | { |
MiniTLS | 0:35aa5be3b78d | 269 | ENSURE_SIZE(sz, 5); |
MiniTLS | 0:35aa5be3b78d | 270 | seq_size = (p[1] << 24) |(p[2] << 16) | (p[3] << 8) | p[4]; |
MiniTLS | 0:35aa5be3b78d | 271 | p+=5; |
MiniTLS | 0:35aa5be3b78d | 272 | sz-=5; |
MiniTLS | 0:35aa5be3b78d | 273 | } |
MiniTLS | 0:35aa5be3b78d | 274 | else |
MiniTLS | 0:35aa5be3b78d | 275 | { |
MiniTLS | 0:35aa5be3b78d | 276 | return MUTLS_ERR_PARAMETERS; |
MiniTLS | 0:35aa5be3b78d | 277 | } |
MiniTLS | 0:35aa5be3b78d | 278 | |
MiniTLS | 0:35aa5be3b78d | 279 | //Check that sequence size == remaining bytes size |
MiniTLS | 0:35aa5be3b78d | 280 | if( seq_size != sz ) |
MiniTLS | 0:35aa5be3b78d | 281 | { |
MiniTLS | 0:35aa5be3b78d | 282 | return MUTLS_ERR_PARAMETERS; |
MiniTLS | 0:35aa5be3b78d | 283 | } |
MiniTLS | 0:35aa5be3b78d | 284 | |
MiniTLS | 0:35aa5be3b78d | 285 | //Read integers |
MiniTLS | 0:35aa5be3b78d | 286 | for(int i = 0; i < 2; i++) |
MiniTLS | 0:35aa5be3b78d | 287 | { |
MiniTLS | 0:35aa5be3b78d | 288 | ENSURE_SIZE(sz, 1); |
MiniTLS | 0:35aa5be3b78d | 289 | |
MiniTLS | 0:35aa5be3b78d | 290 | if( p[0] != 2 ) //Integer type |
MiniTLS | 0:35aa5be3b78d | 291 | { |
MiniTLS | 0:35aa5be3b78d | 292 | return MUTLS_ERR_PARAMETERS; |
MiniTLS | 0:35aa5be3b78d | 293 | } |
MiniTLS | 0:35aa5be3b78d | 294 | |
MiniTLS | 0:35aa5be3b78d | 295 | p++; |
MiniTLS | 0:35aa5be3b78d | 296 | sz--; |
MiniTLS | 0:35aa5be3b78d | 297 | |
MiniTLS | 0:35aa5be3b78d | 298 | ENSURE_SIZE(sz, 1); |
MiniTLS | 0:35aa5be3b78d | 299 | |
MiniTLS | 0:35aa5be3b78d | 300 | size_t integer_size; |
MiniTLS | 0:35aa5be3b78d | 301 | //Get sequence length |
MiniTLS | 0:35aa5be3b78d | 302 | if(*p < 0x80) |
MiniTLS | 0:35aa5be3b78d | 303 | { |
MiniTLS | 0:35aa5be3b78d | 304 | integer_size = p[0]; |
MiniTLS | 0:35aa5be3b78d | 305 | p++; |
MiniTLS | 0:35aa5be3b78d | 306 | sz--; |
MiniTLS | 0:35aa5be3b78d | 307 | } |
MiniTLS | 0:35aa5be3b78d | 308 | else if(*p == 0x81) |
MiniTLS | 0:35aa5be3b78d | 309 | { |
MiniTLS | 0:35aa5be3b78d | 310 | ENSURE_SIZE(sz, 2); |
MiniTLS | 0:35aa5be3b78d | 311 | integer_size = p[1]; |
MiniTLS | 0:35aa5be3b78d | 312 | p+=2; |
MiniTLS | 0:35aa5be3b78d | 313 | sz-=2; |
MiniTLS | 0:35aa5be3b78d | 314 | } |
MiniTLS | 0:35aa5be3b78d | 315 | else if(*p == 0x82) |
MiniTLS | 0:35aa5be3b78d | 316 | { |
MiniTLS | 0:35aa5be3b78d | 317 | ENSURE_SIZE(sz, 3); |
MiniTLS | 0:35aa5be3b78d | 318 | integer_size = (p[1] << 8) | p[2]; |
MiniTLS | 0:35aa5be3b78d | 319 | p+=3; |
MiniTLS | 0:35aa5be3b78d | 320 | sz-=3; |
MiniTLS | 0:35aa5be3b78d | 321 | } |
MiniTLS | 0:35aa5be3b78d | 322 | else if(*p == 0x83) |
MiniTLS | 0:35aa5be3b78d | 323 | { |
MiniTLS | 0:35aa5be3b78d | 324 | ENSURE_SIZE(sz, 4); |
MiniTLS | 0:35aa5be3b78d | 325 | integer_size = (p[1] << 16) | (p[2] << 8) | p[3]; |
MiniTLS | 0:35aa5be3b78d | 326 | p+=4; |
MiniTLS | 0:35aa5be3b78d | 327 | sz-=4; |
MiniTLS | 0:35aa5be3b78d | 328 | } |
MiniTLS | 0:35aa5be3b78d | 329 | else if(*p == 0x84) |
MiniTLS | 0:35aa5be3b78d | 330 | { |
MiniTLS | 0:35aa5be3b78d | 331 | ENSURE_SIZE(sz, 5); |
MiniTLS | 0:35aa5be3b78d | 332 | integer_size = (p[1] << 24) |(p[2] << 16) | (p[3] << 8) | p[4]; |
MiniTLS | 0:35aa5be3b78d | 333 | p+=5; |
MiniTLS | 0:35aa5be3b78d | 334 | sz-=5; |
MiniTLS | 0:35aa5be3b78d | 335 | } |
MiniTLS | 0:35aa5be3b78d | 336 | else |
MiniTLS | 0:35aa5be3b78d | 337 | { |
MiniTLS | 0:35aa5be3b78d | 338 | return MUTLS_ERR_PARAMETERS; |
MiniTLS | 0:35aa5be3b78d | 339 | } |
MiniTLS | 0:35aa5be3b78d | 340 | |
MiniTLS | 0:35aa5be3b78d | 341 | //Check that we have enough bytes remaining |
MiniTLS | 0:35aa5be3b78d | 342 | ENSURE_SIZE(sz, integer_size); |
MiniTLS | 0:35aa5be3b78d | 343 | |
MiniTLS | 0:35aa5be3b78d | 344 | DBG("Integer of size %d", integer_size); |
MiniTLS | 0:35aa5be3b78d | 345 | |
MiniTLS | 0:35aa5be3b78d | 346 | //Read integer |
MiniTLS | 0:35aa5be3b78d | 347 | void* integer = (i==0)?N:e; |
MiniTLS | 0:35aa5be3b78d | 348 | |
MiniTLS | 0:35aa5be3b78d | 349 | /*int err;*/ |
MiniTLS | 0:35aa5be3b78d | 350 | /*if ((err = */mp_read_unsigned_bin(integer, (unsigned char *)p, integer_size);/*) != MUTLS_OK) { |
MiniTLS | 0:35aa5be3b78d | 351 | return err; |
MiniTLS | 0:35aa5be3b78d | 352 | }*/ |
MiniTLS | 0:35aa5be3b78d | 353 | |
MiniTLS | 0:35aa5be3b78d | 354 | p+=integer_size; |
MiniTLS | 0:35aa5be3b78d | 355 | sz-=integer_size; |
MiniTLS | 0:35aa5be3b78d | 356 | } |
MiniTLS | 0:35aa5be3b78d | 357 | |
MiniTLS | 0:35aa5be3b78d | 358 | if(sz > 0) |
MiniTLS | 0:35aa5be3b78d | 359 | { |
MiniTLS | 0:35aa5be3b78d | 360 | //Unread parameters left in sequence |
MiniTLS | 0:35aa5be3b78d | 361 | return MUTLS_ERR_PARAMETERS; |
MiniTLS | 0:35aa5be3b78d | 362 | } |
MiniTLS | 0:35aa5be3b78d | 363 | |
MiniTLS | 0:35aa5be3b78d | 364 | return MUTLS_OK; |
MiniTLS | 0:35aa5be3b78d | 365 | } |
MiniTLS | 0:35aa5be3b78d | 366 |