summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorMatthias Schiffer <mschiffer@universe-factory.net>2015-10-02 13:57:19 +0200
committerMatthias Schiffer <mschiffer@universe-factory.net>2015-10-02 13:57:19 +0200
commit962888f03fb3d6254cc9e4bdadced10c1eeeb06d (patch)
treef7859fa632aadfce3c85203cda7eb694d0986555 /src
parenta68abb34c2200512fa9472832887a9326adfd30d (diff)
downloadlibuecc-962888f03fb3d6254cc9e4bdadced10c1eeeb06d.tar
libuecc-962888f03fb3d6254cc9e4bdadced10c1eeeb06d.zip
Add functions for point negation and subtraction
Diffstat (limited to 'src')
-rw-r--r--src/ec25519.c19
1 files changed, 19 insertions, 0 deletions
diff --git a/src/ec25519.c b/src/ec25519.c
index a9d519c..d673aee 100644
--- a/src/ec25519.c
+++ b/src/ec25519.c
@@ -498,6 +498,18 @@ int ecc_25519_is_identity(const ecc_25519_work_t *in) {
return (check_zero(in->X)&check_zero(Y_Z));
}
+void ecc_25519_negate(ecc_25519_work_t *out, const ecc_25519_work_t *in) {
+ int i;
+
+ for (i = 0; i < 32; i++) {
+ out->Y[i] = in->Y[i];
+ out->Z[i] = in->Z[i];
+ }
+
+ sub(out->X, zero, in->X);
+ sub(out->T, zero, in->T);
+}
+
void ecc_25519_double(ecc_25519_work_t *out, const ecc_25519_work_t *in) {
unsigned int A[32], B[32], C[32], D[32], E[32], F[32], G[32], H[32], t0[32], t1[32], t2[32], t3[32];
@@ -542,6 +554,13 @@ void ecc_25519_add(ecc_25519_work_t *out, const ecc_25519_work_t *in1, const ecc
mult(out->Z, F, G);
}
+void ecc_25519_sub(ecc_25519_work_t *out, const ecc_25519_work_t *in1, const ecc_25519_work_t *in2) {
+ ecc_25519_work_t in2_neg;
+
+ ecc_25519_negate(&in2_neg, in2);
+ ecc_25519_add(out, in1, &in2_neg);
+}
+
void ecc_25519_scalarmult_bits(ecc_25519_work_t *out, const ecc_int256_t *n, const ecc_25519_work_t *base, unsigned bits) {
ecc_25519_work_t Q2, Q2p;
ecc_25519_work_t cur = ecc_25519_work_identity;