A super trimmed down TLS stack, GPL licensed

Dependents:   MiniTLS-HTTPS-Example

MiniTLS - A super trimmed down TLS/SSL Library for embedded devices Author: Donatien Garnier Copyright (C) 2013-2014 AppNearMe Ltd

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 2 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, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.

Committer:
MiniTLS
Date:
Tue Jun 10 14:23:09 2014 +0000
Revision:
4:cbaf466d717d
Parent:
2:527a66d0a1a9
Fixes for mbed

Who changed what in which revision?

UserRevisionLine numberNew contents of line
MiniTLS 2:527a66d0a1a9 1 /*
MiniTLS 2:527a66d0a1a9 2 MiniTLS - A super trimmed down TLS/SSL Library for embedded devices
MiniTLS 2:527a66d0a1a9 3 Author: Donatien Garnier
MiniTLS 2:527a66d0a1a9 4 Copyright (C) 2013-2014 AppNearMe Ltd
MiniTLS 2:527a66d0a1a9 5
MiniTLS 2:527a66d0a1a9 6 This program is free software; you can redistribute it and/or
MiniTLS 2:527a66d0a1a9 7 modify it under the terms of the GNU General Public License
MiniTLS 2:527a66d0a1a9 8 as published by the Free Software Foundation; either version 2
MiniTLS 2:527a66d0a1a9 9 of the License, or (at your option) any later version.
MiniTLS 2:527a66d0a1a9 10
MiniTLS 2:527a66d0a1a9 11 This program is distributed in the hope that it will be useful,
MiniTLS 2:527a66d0a1a9 12 but WITHOUT ANY WARRANTY; without even the implied warranty of
MiniTLS 2:527a66d0a1a9 13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
MiniTLS 2:527a66d0a1a9 14 GNU General Public License for more details.
MiniTLS 2:527a66d0a1a9 15
MiniTLS 2:527a66d0a1a9 16 You should have received a copy of the GNU General Public License
MiniTLS 2:527a66d0a1a9 17 along with this program; if not, write to the Free Software
MiniTLS 2:527a66d0a1a9 18 Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
MiniTLS 2:527a66d0a1a9 19 *//* LibTomCrypt, modular cryptographic library -- Tom St Denis
MiniTLS 2:527a66d0a1a9 20 *
MiniTLS 2:527a66d0a1a9 21 * LibTomCrypt is a library that provides various cryptographic
MiniTLS 2:527a66d0a1a9 22 * algorithms in a highly modular and flexible manner.
MiniTLS 2:527a66d0a1a9 23 *
MiniTLS 2:527a66d0a1a9 24 * The library is free for all purposes without any express
MiniTLS 2:527a66d0a1a9 25 * guarantee it works.
MiniTLS 2:527a66d0a1a9 26 *
MiniTLS 2:527a66d0a1a9 27 * Tom St Denis, tomstdenis@gmail.com, http://libtom.org
MiniTLS 2:527a66d0a1a9 28 */
MiniTLS 2:527a66d0a1a9 29
MiniTLS 2:527a66d0a1a9 30 /* Implements ECC over Z/pZ for curve &y^2 = &x^3 - 3x + b
MiniTLS 2:527a66d0a1a9 31 *
MiniTLS 2:527a66d0a1a9 32 * All curves taken from NIST recommendation paper of July 1999
MiniTLS 2:527a66d0a1a9 33 * Available at http://csrc.nist.gov/cryptval/dss.htm
MiniTLS 2:527a66d0a1a9 34 */
MiniTLS 2:527a66d0a1a9 35 #include "ltc.h"
MiniTLS 2:527a66d0a1a9 36
MiniTLS 2:527a66d0a1a9 37 /**
MiniTLS 2:527a66d0a1a9 38 @file ltc_ecc_projective_add_point.c
MiniTLS 2:527a66d0a1a9 39 ECC Crypto, Tom St Denis
MiniTLS 2:527a66d0a1a9 40 */
MiniTLS 2:527a66d0a1a9 41
MiniTLS 2:527a66d0a1a9 42 #if defined(LTC_MECC) & (!defined(LTC_MECC_ACCEL) || defined(LTM_LTC_DESC))
MiniTLS 2:527a66d0a1a9 43
MiniTLS 2:527a66d0a1a9 44 /**
MiniTLS 2:527a66d0a1a9 45 Add two ECC points
MiniTLS 2:527a66d0a1a9 46 @param P The point to add
MiniTLS 2:527a66d0a1a9 47 @param Q The point to add
MiniTLS 2:527a66d0a1a9 48 @param R [out] The destination of the double
MiniTLS 2:527a66d0a1a9 49 @param modulus The modulus of the field the ECC curve is in
MiniTLS 2:527a66d0a1a9 50 @param mp The "b" value from montgomery_setup()
MiniTLS 2:527a66d0a1a9 51 @return MINITLS_OK on success
MiniTLS 2:527a66d0a1a9 52 */
MiniTLS 2:527a66d0a1a9 53 int ltc_ecc_projective_add_point(ecc_point *P, ecc_point *Q, ecc_point *R, void *modulus, void *mp)
MiniTLS 2:527a66d0a1a9 54 {
MiniTLS 2:527a66d0a1a9 55 fp_int t1, t2, x, y, z;
MiniTLS 2:527a66d0a1a9 56 int err;
MiniTLS 2:527a66d0a1a9 57
MiniTLS 2:527a66d0a1a9 58 LTC_ARGCHK(P != NULL);
MiniTLS 2:527a66d0a1a9 59 LTC_ARGCHK(Q != NULL);
MiniTLS 2:527a66d0a1a9 60 LTC_ARGCHK(R != NULL);
MiniTLS 2:527a66d0a1a9 61 LTC_ARGCHK(modulus != NULL);
MiniTLS 2:527a66d0a1a9 62 LTC_ARGCHK(mp != NULL);
MiniTLS 2:527a66d0a1a9 63
MiniTLS 2:527a66d0a1a9 64 if ((err = mp_init_multi(&t1, &t2, &x, &y, &z, NULL)) != MINITLS_OK) {
MiniTLS 2:527a66d0a1a9 65 return err;
MiniTLS 2:527a66d0a1a9 66 }
MiniTLS 2:527a66d0a1a9 67
MiniTLS 2:527a66d0a1a9 68 /* should we dbl instead? */
MiniTLS 2:527a66d0a1a9 69 /*if ((err =*/ mp_sub(modulus, &Q->y, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 70
MiniTLS 2:527a66d0a1a9 71 if ( (mp_cmp(&P->x, &Q->x) == MP_EQ) &&
MiniTLS 2:527a66d0a1a9 72 ((&Q->z != NULL) && mp_cmp(&P->z, &Q->z) == MP_EQ) &&
MiniTLS 2:527a66d0a1a9 73 (mp_cmp(&P->y, &Q->y) == MP_EQ || mp_cmp(&P->y, &t1) == MP_EQ)) {
MiniTLS 2:527a66d0a1a9 74 mp_clear_multi(&t1, &t2, &x, &y, &z, NULL);
MiniTLS 2:527a66d0a1a9 75 return ltc_ecc_projective_dbl_point(P, R, modulus, mp);
MiniTLS 2:527a66d0a1a9 76 }
MiniTLS 2:527a66d0a1a9 77
MiniTLS 2:527a66d0a1a9 78 /*if ((err =*/ mp_copy(&P->x, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 79 /*if ((err =*/ mp_copy(&P->y, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 80 /*if ((err =*/ mp_copy(&P->z, &z);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 81
MiniTLS 2:527a66d0a1a9 82 /* if Z is one then these are no-operations */
MiniTLS 2:527a66d0a1a9 83 if (&Q->z != NULL) {
MiniTLS 2:527a66d0a1a9 84 /* T1 = Z' * Z' */
MiniTLS 2:527a66d0a1a9 85 /*if ((err = */mp_sqr(&Q->z, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 86 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 87 /* X = X * T1 */
MiniTLS 2:527a66d0a1a9 88 /*if ((err = */mp_mul(&t1, &x, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 89 /*if ((err = */mp_montgomery_reduce(&x, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 90 /* T1 = Z' * T1 */
MiniTLS 2:527a66d0a1a9 91 /*if ((err = */mp_mul(&Q->z, &t1, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 92 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 93 /* Y = Y * T1 */
MiniTLS 2:527a66d0a1a9 94 /*if ((err = */mp_mul(&t1, &y, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 95 /*if ((err = */mp_montgomery_reduce(&y, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 96 }
MiniTLS 2:527a66d0a1a9 97
MiniTLS 2:527a66d0a1a9 98 /* T1 = Z*Z */
MiniTLS 2:527a66d0a1a9 99 /*if ((err = */mp_sqr(&z, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 100 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 101 /* T2 = X' * T1 */
MiniTLS 2:527a66d0a1a9 102 /*if ((err = */mp_mul(&Q->x, &t1, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 103 /*if ((err = */mp_montgomery_reduce(&t2, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 104 /* T1 = Z * T1 */
MiniTLS 2:527a66d0a1a9 105 /*if ((err = */mp_mul(&z, &t1, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 106 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 107 /* T1 = Y' * T1 */
MiniTLS 2:527a66d0a1a9 108 /*if ((err = */mp_mul(&Q->y, &t1, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 109 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 110
MiniTLS 2:527a66d0a1a9 111 /* Y = Y - T1 */
MiniTLS 2:527a66d0a1a9 112 /*if ((err = */mp_sub(&y, &t1, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 113 if (mp_cmp_d(&y, 0) == MP_LT) {
MiniTLS 2:527a66d0a1a9 114 /*if ((err = */mp_add(&y, modulus, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 115 }
MiniTLS 2:527a66d0a1a9 116 /* T1 = 2T1 */
MiniTLS 2:527a66d0a1a9 117 /*if ((err = */mp_add(&t1, &t1, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 118 if (mp_cmp(&t1, modulus) != MP_LT) {
MiniTLS 2:527a66d0a1a9 119 /*if ((err = */mp_sub(&t1, modulus, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 120 }
MiniTLS 2:527a66d0a1a9 121 /* T1 = Y + T1 */
MiniTLS 2:527a66d0a1a9 122 /*if ((err = */mp_add(&t1, &y, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 123 if (mp_cmp(&t1, modulus) != MP_LT) {
MiniTLS 2:527a66d0a1a9 124 /*if ((err = */mp_sub(&t1, modulus, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 125 }
MiniTLS 2:527a66d0a1a9 126 /* X = X - T2 */
MiniTLS 2:527a66d0a1a9 127 /*if ((err = */mp_sub(&x, &t2, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 128 if (mp_cmp_d(&x, 0) == MP_LT) {
MiniTLS 2:527a66d0a1a9 129 /*if ((err = */mp_add(&x, modulus, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 130 }
MiniTLS 2:527a66d0a1a9 131 /* T2 = 2T2 */
MiniTLS 2:527a66d0a1a9 132 /*if ((err = */mp_add(&t2, &t2, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 133 if (mp_cmp(&t2, modulus) != MP_LT) {
MiniTLS 2:527a66d0a1a9 134 /*if ((err = */mp_sub(&t2, modulus, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 135 }
MiniTLS 2:527a66d0a1a9 136 /* T2 = X + T2 */
MiniTLS 2:527a66d0a1a9 137 /*if ((err = */mp_add(&t2, &x, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 138 if (mp_cmp(&t2, modulus) != MP_LT) {
MiniTLS 2:527a66d0a1a9 139 /*if ((err = */mp_sub(&t2, modulus, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 140 }
MiniTLS 2:527a66d0a1a9 141
MiniTLS 2:527a66d0a1a9 142 /* if Z' != 1 */
MiniTLS 2:527a66d0a1a9 143 if (&Q->z != NULL) {
MiniTLS 2:527a66d0a1a9 144 /* Z = Z * Z' */
MiniTLS 2:527a66d0a1a9 145 /*if ((err = */mp_mul(&z, &Q->z, &z);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 146 /*if ((err = */mp_montgomery_reduce(&z, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 147 }
MiniTLS 2:527a66d0a1a9 148
MiniTLS 2:527a66d0a1a9 149 /* Z = Z * X */
MiniTLS 2:527a66d0a1a9 150 /*if ((err = */mp_mul(&z, &x, &z);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 151 /*if ((err = */mp_montgomery_reduce(&z, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 152
MiniTLS 2:527a66d0a1a9 153 /* T1 = T1 * X */
MiniTLS 2:527a66d0a1a9 154 /*if ((err = */mp_mul(&t1, &x, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 155 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 156 /* X = X * X */
MiniTLS 2:527a66d0a1a9 157 /*if ((err = */mp_sqr(&x, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 158 /*if ((err = */mp_montgomery_reduce(&x, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 159 /* T2 = T2 * &x */
MiniTLS 2:527a66d0a1a9 160 /*if ((err = */mp_mul(&t2, &x, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 161 /*if ((err = */mp_montgomery_reduce(&t2, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 162 /* T1 = T1 * X */
MiniTLS 2:527a66d0a1a9 163 /*if ((err = */mp_mul(&t1, &x, &t1);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 164 /*if ((err = */mp_montgomery_reduce(&t1, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 165
MiniTLS 2:527a66d0a1a9 166 /* X = Y*Y */
MiniTLS 2:527a66d0a1a9 167 /*if ((err = */mp_sqr(&y, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 168 /*if ((err = */mp_montgomery_reduce(&x, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 169 /* X = X - T2 */
MiniTLS 2:527a66d0a1a9 170 /*if ((err = */mp_sub(&x, &t2, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 171 if (mp_cmp_d(&x, 0) == MP_LT) {
MiniTLS 2:527a66d0a1a9 172 /*if ((err = */mp_add(&x, modulus, &x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 173 }
MiniTLS 2:527a66d0a1a9 174
MiniTLS 2:527a66d0a1a9 175 /* T2 = T2 - X */
MiniTLS 2:527a66d0a1a9 176 /*if ((err = */mp_sub(&t2, &x, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 177 if (mp_cmp_d(&t2, 0) == MP_LT) {
MiniTLS 2:527a66d0a1a9 178 /*if ((err = */mp_add(&t2, modulus, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 179 }
MiniTLS 2:527a66d0a1a9 180 /* T2 = T2 - X */
MiniTLS 2:527a66d0a1a9 181 /*if ((err = */mp_sub(&t2, &x, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 182 if (mp_cmp_d(&t2, 0) == MP_LT) {
MiniTLS 2:527a66d0a1a9 183 /*if ((err = */mp_add(&t2, modulus, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 184 }
MiniTLS 2:527a66d0a1a9 185 /* T2 = T2 * Y */
MiniTLS 2:527a66d0a1a9 186 /*if ((err = */mp_mul(&t2, &y, &t2);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 187 /*if ((err = */mp_montgomery_reduce(&t2, modulus, mp);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 188 /* Y = T2 - T1 */
MiniTLS 2:527a66d0a1a9 189 /*if ((err = */mp_sub(&t2, &t1, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 190 if (mp_cmp_d(&y, 0) == MP_LT) {
MiniTLS 2:527a66d0a1a9 191 /*if ((err = */mp_add(&y, modulus, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 192 }
MiniTLS 2:527a66d0a1a9 193 /* Y = Y/2 */
MiniTLS 2:527a66d0a1a9 194 if (mp_isodd(&y)) {
MiniTLS 2:527a66d0a1a9 195 /*if ((err = */mp_add(&y, modulus, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 196 }
MiniTLS 2:527a66d0a1a9 197 /*if ((err = */mp_div_2(&y, &y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 198
MiniTLS 2:527a66d0a1a9 199 /*if ((err = */mp_copy(&x, &R->x);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 200 /*if ((err = */mp_copy(&y, &R->y);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 201 /*if ((err = */mp_copy(&z, &R->z);/*) != MINITLS_OK) { goto done; }*/
MiniTLS 2:527a66d0a1a9 202
MiniTLS 2:527a66d0a1a9 203 err = MINITLS_OK;
MiniTLS 2:527a66d0a1a9 204 /*done:*/ //Not used
MiniTLS 2:527a66d0a1a9 205 mp_clear_multi(&t1, &t2, &x, &y, &z, NULL);
MiniTLS 2:527a66d0a1a9 206 return err;
MiniTLS 2:527a66d0a1a9 207 }
MiniTLS 2:527a66d0a1a9 208
MiniTLS 2:527a66d0a1a9 209 #endif
MiniTLS 2:527a66d0a1a9 210
MiniTLS 2:527a66d0a1a9 211 /* $Source: /cvs/libtom/libtomcrypt/src/pk/ecc/ltc_ecc_projective_add_point.c,v $ */
MiniTLS 2:527a66d0a1a9 212 /* $Revision: 1.16 $ */
MiniTLS 2:527a66d0a1a9 213 /* $Date: 2007/05/12 14:32:35 $ */
MiniTLS 2:527a66d0a1a9 214