Donatien Garnier / MiniTLS-GPL

Dependents:   MiniTLS-HTTPS-Example

Committer:
MiniTLS
Date:
Fri Jun 06 10:49:02 2014 +0000
Revision:
0:35aa5be3b78d
Initial commit

Who changed what in which revision?

UserRevisionLine numberNew 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