On Sat, Jan 14, 2023 at 04:29:04PM +1100, Damien Miller wrote: > > > On Fri, 13 Jan 2023, Damien Miller wrote: > > > Hi, > > > > Forewarning: this is a big, noisy diff. Also on Github at > > https://github.com/djmdjm/openssh-wip/pull/18 > > > > This updates the ED25519 code to the latest version of SUPERCOP (20221122), > > but the real motivation for this is to move the ED25519 code to the same > > approach we use for the Streamlined NTRUPrime code: using a shell-script > > to extract the bits we want from SUPERCOP and squish them all into a > > single file. > > > > This removes a bunch of exported function names, a bit of unused > > code and means that all the ED25519 code is in a single file rather > > than eight. > > > > To review this, it's probably best to run the shellscript locally > > (use sh ed25519.sh /path/to/directory/with/supercop) and inspect the > > output. Apart from the original ed25519.c (assembled from the keypair.c, > > sign.c and open.c files in SUPERCOP) there are no substantial changes. > > Here's a better way to look at the substantive changes: > > 1. Assemble the existing ed25519 code in the same order as how this > patch arranges things: > > cat verify.c fe25519.h fe25519.c sc25519.h sc25519.c \ > ge25519.h ge25519.c ed25519.c | \ > sed -e '/#include "ge25519_base.data"/r ge25519_base.data' \ > -e '/#include.*/d' > ed25519.c.old > > 2. Apply the patch > > 3. Diff the original and new code (below) > > This isn't completely without noise, but it lets you see the substantive > changes clearly. > > -d
works and looks a lot cleaner than before. ok tobhe@ > > ---- > > > --- /tmp/ed25519.c Sat Jan 14 16:25:09 2023 > +++ ed25519.c Sat Jan 14 16:25:41 2023 > @@ -1,12 +1,30 @@ > -/* $OpenBSD: verify.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > +/* $OpenBSD: $ */ > > /* > - * Public Domain, Author: Daniel J. Bernstein > - * Copied from nacl-20110221/crypto_verify/32/ref/verify.c > + * Public Domain, Authors: > + * - Daniel J. Bernstein > + * - Niels Duif > + * - Tanja Lange > + * - lead: Peter Schwabe > + * - Bo-Yin Yang > */ > > +#include <string.h> > > -int crypto_verify_32(const unsigned char *x,const unsigned char *y) > +#include "crypto_api.h" > + > +#define int8 crypto_int8 > +#define uint8 crypto_uint8 > +#define int16 crypto_int16 > +#define uint16 crypto_uint16 > +#define int32 crypto_int32 > +#define uint32 crypto_uint32 > +#define int64 crypto_int64 > +#define uint64 crypto_uint64 > + > +/* from supercop-20221122/crypto_verify/32/ref/verify.c */ > + > +static int crypto_verify_32(const unsigned char *x,const unsigned char *y) > { > unsigned int differentbits = 0; > #define F(i) differentbits |= x[i] ^ y[i]; > @@ -44,14 +62,7 @@ > F(31) > return (1 & ((differentbits - 1) >> 8)) - 1; > } > -/* $OpenBSD: fe25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > - > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.h > - */ > - > +/* from supercop-20221122/crypto_sign/ed25519/ref/fe25519.h */ > #ifndef FE25519_H > #define FE25519_H > > @@ -80,52 +91,45 @@ > } > fe25519; > > -void fe25519_freeze(fe25519 *r); > +static void fe25519_freeze(fe25519 *r); > > -void fe25519_unpack(fe25519 *r, const unsigned char x[32]); > +static void fe25519_unpack(fe25519 *r, const unsigned char x[32]); > > -void fe25519_pack(unsigned char r[32], const fe25519 *x); > +static void fe25519_pack(unsigned char r[32], const fe25519 *x); > > -int fe25519_iszero(const fe25519 *x); > +static int fe25519_iszero(const fe25519 *x); > > -int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y); > +static int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y); > > -void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b); > +static void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b); > > -void fe25519_setone(fe25519 *r); > +static void fe25519_setone(fe25519 *r); > > -void fe25519_setzero(fe25519 *r); > +static void fe25519_setzero(fe25519 *r); > > -void fe25519_neg(fe25519 *r, const fe25519 *x); > +static void fe25519_neg(fe25519 *r, const fe25519 *x); > > unsigned char fe25519_getparity(const fe25519 *x); > > -void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y); > +static void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y); > > -void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y); > +static void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y); > > -void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y); > +static void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y); > > -void fe25519_square(fe25519 *r, const fe25519 *x); > +static void fe25519_square(fe25519 *r, const fe25519 *x); > > -void fe25519_invert(fe25519 *r, const fe25519 *x); > +static void fe25519_invert(fe25519 *r, const fe25519 *x); > > -void fe25519_pow2523(fe25519 *r, const fe25519 *x); > +static void fe25519_pow2523(fe25519 *r, const fe25519 *x); > > #endif > -/* $OpenBSD: fe25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > - > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/fe25519.c > - */ > - > +/* from supercop-20221122/crypto_sign/ed25519/ref/fe25519.c */ > #define WINDOWSIZE 1 /* Should be 1,2, or 4 */ > #define WINDOWMASK ((1<<WINDOWSIZE)-1) > > > -static crypto_uint32 equal(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs > */ > +static crypto_uint32 fe25519_equal(crypto_uint32 a,crypto_uint32 b) /* > 16-bit inputs */ > { > crypto_uint32 x = a ^ b; /* 0: yes; 1..65535: no */ > x -= 1; /* 4294967295: yes; 0..65534: no */ > @@ -152,7 +156,7 @@ > return (a << 5) + (a << 2) + (a << 1); > } > > -static void reduce_add_sub(fe25519 *r) > +static void fe25519_reduce_add_sub(fe25519 *r) > { > crypto_uint32 t; > int i,rep; > @@ -193,12 +197,12 @@ > } > > /* reduction modulo 2^255-19 */ > -void fe25519_freeze(fe25519 *r) > +static void fe25519_freeze(fe25519 *r) > { > int i; > - crypto_uint32 m = equal(r->v[31],127); > + crypto_uint32 m = fe25519_equal(r->v[31],127); > for(i=30;i>0;i--) > - m &= equal(r->v[i],255); > + m &= fe25519_equal(r->v[i],255); > m &= ge(r->v[0],237); > > m = -m; > @@ -209,7 +213,7 @@ > r->v[0] -= m&237; > } > > -void fe25519_unpack(fe25519 *r, const unsigned char x[32]) > +static void fe25519_unpack(fe25519 *r, const unsigned char x[32]) > { > int i; > for(i=0;i<32;i++) r->v[i] = x[i]; > @@ -217,7 +221,7 @@ > } > > /* Assumes input x being reduced below 2^255 */ > -void fe25519_pack(unsigned char r[32], const fe25519 *x) > +static void fe25519_pack(unsigned char r[32], const fe25519 *x) > { > int i; > fe25519 y = *x; > @@ -226,19 +230,19 @@ > r[i] = y.v[i]; > } > > -int fe25519_iszero(const fe25519 *x) > +static int fe25519_iszero(const fe25519 *x) > { > int i; > int r; > fe25519 t = *x; > fe25519_freeze(&t); > - r = equal(t.v[0],0); > + r = fe25519_equal(t.v[0],0); > for(i=1;i<32;i++) > - r &= equal(t.v[i],0); > + r &= fe25519_equal(t.v[i],0); > return r; > } > > -int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y) > +static int fe25519_iseq_vartime(const fe25519 *x, const fe25519 *y) > { > int i; > fe25519 t1 = *x; > @@ -250,7 +254,7 @@ > return 1; > } > > -void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b) > +static void fe25519_cmov(fe25519 *r, const fe25519 *x, unsigned char b) > { > int i; > crypto_uint32 mask = b; > @@ -265,20 +269,20 @@ > return t.v[0] & 1; > } > > -void fe25519_setone(fe25519 *r) > +static void fe25519_setone(fe25519 *r) > { > int i; > r->v[0] = 1; > for(i=1;i<32;i++) r->v[i]=0; > } > > -void fe25519_setzero(fe25519 *r) > +static void fe25519_setzero(fe25519 *r) > { > int i; > for(i=0;i<32;i++) r->v[i]=0; > } > > -void fe25519_neg(fe25519 *r, const fe25519 *x) > +static void fe25519_neg(fe25519 *r, const fe25519 *x) > { > fe25519 t; > int i; > @@ -287,14 +291,14 @@ > fe25519_sub(r, r, &t); > } > > -void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y) > +static void fe25519_add(fe25519 *r, const fe25519 *x, const fe25519 *y) > { > int i; > for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i]; > - reduce_add_sub(r); > + fe25519_reduce_add_sub(r); > } > > -void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y) > +static void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y) > { > int i; > crypto_uint32 t[32]; > @@ -302,10 +306,10 @@ > t[31] = x->v[31] + 0xfe; > for(i=1;i<31;i++) t[i] = x->v[i] + 0x1fe; > for(i=0;i<32;i++) r->v[i] = t[i] - y->v[i]; > - reduce_add_sub(r); > + fe25519_reduce_add_sub(r); > } > > -void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y) > +static void fe25519_mul(fe25519 *r, const fe25519 *x, const fe25519 *y) > { > int i,j; > crypto_uint32 t[63]; > @@ -322,12 +326,12 @@ > reduce_mul(r); > } > > -void fe25519_square(fe25519 *r, const fe25519 *x) > +static void fe25519_square(fe25519 *r, const fe25519 *x) > { > fe25519_mul(r, x, x); > } > > -void fe25519_invert(fe25519 *r, const fe25519 *x) > +static void fe25519_invert(fe25519 *r, const fe25519 *x) > { > fe25519 z2; > fe25519 z9; > @@ -394,7 +398,7 @@ > /* 2^255 - 21 */ fe25519_mul(r,&t1,&z11); > } > > -void fe25519_pow2523(fe25519 *r, const fe25519 *x) > +static void fe25519_pow2523(fe25519 *r, const fe25519 *x) > { > fe25519 z2; > fe25519 z9; > @@ -447,14 +451,7 @@ > /* 2^252 - 2^2 */ fe25519_square(&t,&t); > /* 2^252 - 3 */ fe25519_mul(r,&t,x); > } > -/* $OpenBSD: sc25519.h,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > - > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.h > - */ > - > +/* from supercop-20221122/crypto_sign/ed25519/ref/sc25519.h */ > #ifndef SC25519_H > #define SC25519_H > > @@ -462,19 +459,11 @@ > #define sc25519 crypto_sign_ed25519_ref_sc25519 > #define shortsc25519 crypto_sign_ed25519_ref_shortsc25519 > #define sc25519_from32bytes crypto_sign_ed25519_ref_sc25519_from32bytes > -#define shortsc25519_from16bytes > crypto_sign_ed25519_ref_shortsc25519_from16bytes > #define sc25519_from64bytes crypto_sign_ed25519_ref_sc25519_from64bytes > -#define sc25519_from_shortsc crypto_sign_ed25519_ref_sc25519_from_shortsc > #define sc25519_to32bytes crypto_sign_ed25519_ref_sc25519_to32bytes > -#define sc25519_iszero_vartime > crypto_sign_ed25519_ref_sc25519_iszero_vartime > -#define sc25519_isshort_vartime > crypto_sign_ed25519_ref_sc25519_isshort_vartime > -#define sc25519_lt_vartime crypto_sign_ed25519_ref_sc25519_lt_vartime > #define sc25519_add crypto_sign_ed25519_ref_sc25519_add > -#define sc25519_sub_nored crypto_sign_ed25519_ref_sc25519_sub_nored > #define sc25519_mul crypto_sign_ed25519_ref_sc25519_mul > -#define sc25519_mul_shortsc crypto_sign_ed25519_ref_sc25519_mul_shortsc > #define sc25519_window3 crypto_sign_ed25519_ref_sc25519_window3 > -#define sc25519_window5 crypto_sign_ed25519_ref_sc25519_window5 > #define sc25519_2interleave2 crypto_sign_ed25519_ref_sc25519_2interleave2 > > typedef struct > @@ -489,58 +478,43 @@ > } > shortsc25519; > > -void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]); > +static void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]); > > -void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16]); > > -void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]); > +static void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]); > > -void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x); > > -void sc25519_to32bytes(unsigned char r[32], const sc25519 *x); > +static void sc25519_to32bytes(unsigned char r[32], const sc25519 *x); > > -int sc25519_iszero_vartime(const sc25519 *x); > > -int sc25519_isshort_vartime(const sc25519 *x); > > -int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y); > > -void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y); > +static void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y); > > -void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y); > > -void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y); > +static void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y); > > -void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 > *y); > > /* Convert s into a representation of the form \sum_{i=0}^{84}r[i]2^3 > * with r[i] in {-4,...,3} > */ > -void sc25519_window3(signed char r[85], const sc25519 *s); > +static void sc25519_window3(signed char r[85], const sc25519 *s); > > /* Convert s into a representation of the form \sum_{i=0}^{50}r[i]2^5 > * with r[i] in {-16,...,15} > */ > -void sc25519_window5(signed char r[51], const sc25519 *s); > > -void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const > sc25519 *s2); > +static void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, > const sc25519 *s2); > > #endif > -/* $OpenBSD: sc25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > +/* from supercop-20221122/crypto_sign/ed25519/ref/sc25519.c */ > > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/sc25519.c > - */ > - > - > /*Arithmetic modulo the group order m = 2^252 + > 27742317777372353535851937790883648493 = > 7237005577332262213973186563042994240857116359379907606001950938285454250989 > */ > > -static const crypto_uint32 m[32] = {0xED, 0xD3, 0xF5, 0x5C, 0x1A, 0x63, > 0x12, 0x58, 0xD6, 0x9C, 0xF7, 0xA2, 0xDE, 0xF9, 0xDE, 0x14, > +static const crypto_uint32 sc25519_m[32] = {0xED, 0xD3, 0xF5, 0x5C, 0x1A, > 0x63, 0x12, 0x58, 0xD6, 0x9C, 0xF7, 0xA2, 0xDE, 0xF9, 0xDE, 0x14, > 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x10}; > > -static const crypto_uint32 mu[33] = {0x1B, 0x13, 0x2C, 0x0A, 0xA3, 0xE5, > 0x9C, 0xED, 0xA7, 0x29, 0x63, 0x08, 0x5D, 0x21, 0x06, 0x21, > +static const crypto_uint32 sc25519_mu[33] = {0x1B, 0x13, 0x2C, 0x0A, 0xA3, > 0xE5, 0x9C, 0xED, 0xA7, 0x29, 0x63, 0x08, 0x5D, 0x21, 0x06, 0x21, > 0xEB, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, > 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F}; > > static crypto_uint32 lt(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */ > @@ -551,8 +525,8 @@ > return x; > } > > -/* Reduce coefficients of r before calling reduce_add_sub */ > -static void reduce_add_sub(sc25519 *r) > +/* Reduce coefficients of r before calling sc25519_reduce_add_sub */ > +static void sc25519_reduce_add_sub(sc25519 *r) > { > crypto_uint32 pb = 0; > crypto_uint32 b; > @@ -562,7 +536,7 @@ > > for(i=0;i<32;i++) > { > - pb += m[i]; > + pb += sc25519_m[i]; > b = lt(r->v[i],pb); > t[i] = r->v[i]-pb+(b<<8); > pb = b; > @@ -590,7 +564,7 @@ > > for(i=0;i<33;i++) > for(j=0;j<33;j++) > - if(i+j >= 31) q2[i+j] += mu[i]*x[j+31]; > + if(i+j >= 31) q2[i+j] += sc25519_mu[i]*x[j+31]; > carry = q2[31] >> 8; > q2[32] += carry; > carry = q2[32] >> 8; > @@ -599,7 +573,7 @@ > for(i=0;i<33;i++)r1[i] = x[i]; > for(i=0;i<32;i++) > for(j=0;j<33;j++) > - if(i+j < 33) r2[i+j] += m[i]*q3[j]; > + if(i+j < 33) r2[i+j] += sc25519_m[i]*q3[j]; > > for(i=0;i<32;i++) > { > @@ -620,11 +594,11 @@ > * If so: Handle it here! > */ > > - reduce_add_sub(r); > - reduce_add_sub(r); > + sc25519_reduce_add_sub(r); > + sc25519_reduce_add_sub(r); > } > > -void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]) > +static void sc25519_from32bytes(sc25519 *r, const unsigned char x[32]) > { > int i; > crypto_uint32 t[64]; > @@ -633,13 +607,8 @@ > barrett_reduce(r, t); > } > > -void shortsc25519_from16bytes(shortsc25519 *r, const unsigned char x[16]) > -{ > - int i; > - for(i=0;i<16;i++) r->v[i] = x[i]; > -} > > -void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]) > +static void sc25519_from64bytes(sc25519 *r, const unsigned char x[64]) > { > int i; > crypto_uint32 t[64]; > @@ -647,49 +616,17 @@ > barrett_reduce(r, t); > } > > -void sc25519_from_shortsc(sc25519 *r, const shortsc25519 *x) > -{ > - int i; > - for(i=0;i<16;i++) > - r->v[i] = x->v[i]; > - for(i=0;i<16;i++) > - r->v[16+i] = 0; > -} > > -void sc25519_to32bytes(unsigned char r[32], const sc25519 *x) > +static void sc25519_to32bytes(unsigned char r[32], const sc25519 *x) > { > int i; > for(i=0;i<32;i++) r[i] = x->v[i]; > } > > -int sc25519_iszero_vartime(const sc25519 *x) > -{ > - int i; > - for(i=0;i<32;i++) > - if(x->v[i] != 0) return 0; > - return 1; > -} > > -int sc25519_isshort_vartime(const sc25519 *x) > -{ > - int i; > - for(i=31;i>15;i--) > - if(x->v[i] != 0) return 0; > - return 1; > -} > > -int sc25519_lt_vartime(const sc25519 *x, const sc25519 *y) > -{ > - int i; > - for(i=31;i>=0;i--) > - { > - if(x->v[i] < y->v[i]) return 1; > - if(x->v[i] > y->v[i]) return 0; > - } > - return 0; > -} > > -void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y) > +static void sc25519_add(sc25519 *r, const sc25519 *x, const sc25519 *y) > { > int i, carry; > for(i=0;i<32;i++) r->v[i] = x->v[i] + y->v[i]; > @@ -699,23 +636,11 @@ > r->v[i+1] += carry; > r->v[i] &= 0xff; > } > - reduce_add_sub(r); > + sc25519_reduce_add_sub(r); > } > > -void sc25519_sub_nored(sc25519 *r, const sc25519 *x, const sc25519 *y) > -{ > - crypto_uint32 b = 0; > - crypto_uint32 t; > - int i; > - for(i=0;i<32;i++) > - { > - t = x->v[i] - y->v[i] - b; > - r->v[i] = t & 255; > - b = (t >> 8) & 1; > - } > -} > > -void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y) > +static void sc25519_mul(sc25519 *r, const sc25519 *x, const sc25519 *y) > { > int i,j,carry; > crypto_uint32 t[64]; > @@ -736,14 +661,8 @@ > barrett_reduce(r, t); > } > > -void sc25519_mul_shortsc(sc25519 *r, const sc25519 *x, const shortsc25519 *y) > -{ > - sc25519 t; > - sc25519_from_shortsc(&t, y); > - sc25519_mul(r, x, &t); > -} > > -void sc25519_window3(signed char r[85], const sc25519 *s) > +static void sc25519_window3(signed char r[85], const sc25519 *s) > { > char carry; > int i; > @@ -780,45 +699,9 @@ > r[84] += carry; > } > > -void sc25519_window5(signed char r[51], const sc25519 *s) > -{ > - char carry; > - int i; > - for(i=0;i<6;i++) > - { > - r[8*i+0] = s->v[5*i+0] & 31; > - r[8*i+1] = (s->v[5*i+0] >> 5) & 31; > - r[8*i+1] ^= (s->v[5*i+1] << 3) & 31; > - r[8*i+2] = (s->v[5*i+1] >> 2) & 31; > - r[8*i+3] = (s->v[5*i+1] >> 7) & 31; > - r[8*i+3] ^= (s->v[5*i+2] << 1) & 31; > - r[8*i+4] = (s->v[5*i+2] >> 4) & 31; > - r[8*i+4] ^= (s->v[5*i+3] << 4) & 31; > - r[8*i+5] = (s->v[5*i+3] >> 1) & 31; > - r[8*i+6] = (s->v[5*i+3] >> 6) & 31; > - r[8*i+6] ^= (s->v[5*i+4] << 2) & 31; > - r[8*i+7] = (s->v[5*i+4] >> 3) & 31; > - } > - r[8*i+0] = s->v[5*i+0] & 31; > - r[8*i+1] = (s->v[5*i+0] >> 5) & 31; > - r[8*i+1] ^= (s->v[5*i+1] << 3) & 31; > - r[8*i+2] = (s->v[5*i+1] >> 2) & 31; > > - /* Making it signed */ > - carry = 0; > - for(i=0;i<50;i++) > +static void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, > const sc25519 *s2) > { > - r[i] += carry; > - r[i+1] += r[i] >> 5; > - r[i] &= 31; > - carry = r[i] >> 4; > - r[i] -= carry<<5; > - } > - r[50] += carry; > -} > - > -void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const > sc25519 *s2) > -{ > int i; > for(i=0;i<31;i++) > { > @@ -831,14 +714,7 @@ > r[125] = ((s1->v[31] >> 2) & 3) ^ (((s2->v[31] >> 2) & 3) << 2); > r[126] = ((s1->v[31] >> 4) & 3) ^ (((s2->v[31] >> 4) & 3) << 2); > } > -/* $OpenBSD: ge25519.h,v 1.4 2015/02/16 18:26:26 miod Exp $ */ > - > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.h > - */ > - > +/* from supercop-20221122/crypto_sign/ed25519/ref/ge25519.h */ > #ifndef GE25519_H > #define GE25519_H > > @@ -859,29 +735,22 @@ > fe25519 t; > } ge25519; > > -extern const ge25519 ge25519_base; > +const ge25519 ge25519_base; > > int ge25519_unpackneg_vartime(ge25519 *r, const unsigned char p[32]); > > -void ge25519_pack(unsigned char r[32], const ge25519 *p); > +static void ge25519_pack(unsigned char r[32], const ge25519 *p); > > int ge25519_isneutral_vartime(const ge25519 *p); > > -void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, const > sc25519 *s1, const ge25519 *p2, const sc25519 *s2); > +static void ge25519_double_scalarmult_vartime(ge25519 *r, const ge25519 *p1, > const sc25519 *s1, const ge25519 *p2, const sc25519 *s2); > > -void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s); > +static void ge25519_scalarmult_base(ge25519 *r, const sc25519 *s); > > #endif > -/* $OpenBSD: ge25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > +/* from supercop-20221122/crypto_sign/ed25519/ref/ge25519.c */ > > /* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519.c > - */ > - > - > -/* > * Arithmetic on the twisted Edwards curve -x^2 + y^2 = 1 + dx^2y^2 > * with d = -(121665/121666) = > 37095705934669439343138083508754565189542113879843219016388785533085940283555 > * Base point: > (15112221349535400772501151409588531511454012693041857206046113283949847762202,46316835694926478169428394003475163141307993866256225615783033603165251855960); > @@ -933,14 +802,6 @@ > > /* Multiples of the base point in affine representation */ > static const ge25519_aff ge25519_base_multiples_affine[425] = { > -/* $OpenBSD: ge25519_base.data,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > - > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/ge25519_base.data > - */ > - > {{{0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}, > {{0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, > 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00}}}, > {{{0x1a, 0xd5, 0x25, 0x8f, 0x60, 0x2d, 0x56, 0xc9, 0xb2, 0xa7, 0x25, 0x95, > 0x60, 0xc7, 0x2c, 0x69, 0x5c, 0xdc, 0xd6, 0xfd, 0x31, 0xe2, 0xa4, 0xc0, 0xfe, > 0x53, 0x6e, 0xcd, 0xd3, 0x36, 0x69, 0x21}} , > @@ -1966,7 +1827,7 @@ > return 0; > } > > -void ge25519_pack(unsigned char r[32], const ge25519_p3 *p) > +static void ge25519_pack(unsigned char r[32], const ge25519_p3 *p) > { > fe25519 tx, ty, zi; > fe25519_invert(&zi, &p->z); > @@ -1985,7 +1846,7 @@ > } > > /* computes [s1]p1 + [s2]p2 */ > -void ge25519_double_scalarmult_vartime(ge25519_p3 *r, const ge25519_p3 *p1, > const sc25519 *s1, const ge25519_p3 *p2, const sc25519 *s2) > +static void ge25519_double_scalarmult_vartime(ge25519_p3 *r, const > ge25519_p3 *p1, const sc25519 *s1, const ge25519_p3 *p2, const sc25519 *s2) > { > ge25519_p1p1 tp1p1; > ge25519_p3 pre[16]; > @@ -2029,7 +1890,7 @@ > } > } > > -void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) > +static void ge25519_scalarmult_base(ge25519_p3 *r, const sc25519 *s) > { > signed char b[85]; > int i; > @@ -2045,52 +1906,28 @@ > ge25519_mixadd2(r, &t); > } > } > -/* $OpenBSD: ed25519.c,v 1.3 2013/12/09 11:03:45 markus Exp $ */ > +/* from supercop-20221122/crypto_sign/ed25519/ref/keypair.c */ > > -/* > - * Public Domain, Authors: Daniel J. Bernstein, Niels Duif, Tanja Lange, > - * Peter Schwabe, Bo-Yin Yang. > - * Copied from supercop-20130419/crypto_sign/ed25519/ref/ed25519.c > - */ > - > - > - > -static void get_hram(unsigned char *hram, const unsigned char *sm, const > unsigned char *pk, unsigned char *playground, unsigned long long smlen) > +int crypto_sign_ed25519_keypair(unsigned char *pk,unsigned char *sk) > { > - unsigned long long i; > - > - for (i = 0;i < 32;++i) playground[i] = sm[i]; > - for (i = 32;i < 64;++i) playground[i] = pk[i-32]; > - for (i = 64;i < smlen;++i) playground[i] = sm[i]; > - > - crypto_hash_sha512(hram,playground,smlen); > -} > - > - > -int crypto_sign_ed25519_keypair( > - unsigned char *pk, > - unsigned char *sk > - ) > -{ > + unsigned char az[64]; > sc25519 scsk; > ge25519 gepk; > - unsigned char extsk[64]; > - int i; > > randombytes(sk, 32); > - crypto_hash_sha512(extsk, sk, 32); > - extsk[0] &= 248; > - extsk[31] &= 127; > - extsk[31] |= 64; > + crypto_hash_sha512(az,sk,32); > + az[0] &= 248; > + az[31] &= 127; > + az[31] |= 64; > > - sc25519_from32bytes(&scsk,extsk); > + sc25519_from32bytes(&scsk,az); > > ge25519_scalarmult_base(&gepk, &scsk); > ge25519_pack(pk, &gepk); > - for(i=0;i<32;i++) > - sk[32 + i] = pk[i]; > + memmove(sk + 32,pk,32); > return 0; > } > +/* from supercop-20221122/crypto_sign/ed25519/ref/sign.c */ > > int crypto_sign_ed25519( > unsigned char *sm,unsigned long long *smlen, > @@ -2098,51 +1935,53 @@ > const unsigned char *sk > ) > { > + unsigned char pk[32]; > + unsigned char az[64]; > + unsigned char nonce[64]; > + unsigned char hram[64]; > sc25519 sck, scs, scsk; > ge25519 ger; > - unsigned char r[32]; > - unsigned char s[32]; > - unsigned char extsk[64]; > - unsigned long long i; > - unsigned char hmg[crypto_hash_sha512_BYTES]; > - unsigned char hram[crypto_hash_sha512_BYTES]; > > - crypto_hash_sha512(extsk, sk, 32); > - extsk[0] &= 248; > - extsk[31] &= 127; > - extsk[31] |= 64; > + memmove(pk,sk + 32,32); > + /* pk: 32-byte public key A */ > > + crypto_hash_sha512(az,sk,32); > + az[0] &= 248; > + az[31] &= 127; > + az[31] |= 64; > + /* az: 32-byte scalar a, 32-byte randomizer z */ > + > *smlen = mlen+64; > - for(i=0;i<mlen;i++) > - sm[64 + i] = m[i]; > - for(i=0;i<32;i++) > - sm[32 + i] = extsk[32+i]; > + memmove(sm + 64,m,mlen); > + memmove(sm + 32,az + 32,32); > + /* sm: 32-byte uninit, 32-byte z, mlen-byte m */ > > - crypto_hash_sha512(hmg, sm+32, mlen+32); /* Generate k as > h(extsk[32],...,extsk[63],m) */ > + crypto_hash_sha512(nonce, sm+32, mlen+32); > + /* nonce: 64-byte H(z,m) */ > > - /* Computation of R */ > - sc25519_from64bytes(&sck, hmg); > + sc25519_from64bytes(&sck, nonce); > ge25519_scalarmult_base(&ger, &sck); > - ge25519_pack(r, &ger); > + ge25519_pack(sm, &ger); > + /* sm: 32-byte R, 32-byte z, mlen-byte m */ > > - /* Computation of s */ > - for(i=0;i<32;i++) > - sm[i] = r[i]; > + memmove(sm + 32,pk,32); > + /* sm: 32-byte R, 32-byte A, mlen-byte m */ > > - get_hram(hram, sm, sk+32, sm, mlen+64); > + crypto_hash_sha512(hram,sm,mlen + 64); > + /* hram: 64-byte H(R,A,m) */ > > sc25519_from64bytes(&scs, hram); > - sc25519_from32bytes(&scsk, extsk); > + sc25519_from32bytes(&scsk, az); > sc25519_mul(&scs, &scs, &scsk); > - > sc25519_add(&scs, &scs, &sck); > + /* scs: S = nonce + H(R,A,m)a */ > > - sc25519_to32bytes(s,&scs); /* cat s */ > - for(i=0;i<32;i++) > - sm[32 + i] = s[i]; > + sc25519_to32bytes(sm + 32,&scs); > + /* sm: 32-byte R, 32-byte S, mlen-byte m */ > > return 0; > } > +/* from supercop-20221122/crypto_sign/ed25519/ref/open.c */ > > int crypto_sign_ed25519_open( > unsigned char *m,unsigned long long *mlen, > @@ -2150,39 +1989,40 @@ > const unsigned char *pk > ) > { > - unsigned int i; > - int ret; > - unsigned char t2[32]; > + unsigned char pkcopy[32]; > + unsigned char rcopy[32]; > + unsigned char hram[64]; > + unsigned char rcheck[32]; > ge25519 get1, get2; > sc25519 schram, scs; > - unsigned char hram[crypto_hash_sha512_BYTES]; > > - *mlen = (unsigned long long) -1; > - if (smlen < 64) return -1; > + if (smlen < 64) goto badsig; > + if (sm[63] & 224) goto badsig; > + if (ge25519_unpackneg_vartime(&get1,pk)) goto badsig; > > - if (ge25519_unpackneg_vartime(&get1, pk)) return -1; > + memmove(pkcopy,pk,32); > + memmove(rcopy,sm,32); > > - get_hram(hram,sm,pk,m,smlen); > + sc25519_from32bytes(&scs, sm+32); > > + memmove(m,sm,smlen); > + memmove(m + 32,pkcopy,32); > + crypto_hash_sha512(hram,m,smlen); > + > sc25519_from64bytes(&schram, hram); > > - sc25519_from32bytes(&scs, sm+32); > - > ge25519_double_scalarmult_vartime(&get2, &get1, &schram, &ge25519_base, > &scs); > - ge25519_pack(t2, &get2); > + ge25519_pack(rcheck, &get2); > > - ret = crypto_verify_32(sm, t2); > - > - if (!ret) > - { > - for(i=0;i<smlen-64;i++) > - m[i] = sm[i + 64]; > + if (crypto_verify_32(rcopy,rcheck) == 0) { > + memmove(m,m + 64,smlen - 64); > + memset(m + smlen - 64,0,64); > *mlen = smlen - 64; > + return 0; > } > - else > - { > - for(i=0;i<smlen-64;i++) > - m[i] = 0; > - } > - return ret; > + > +badsig: > + *mlen = (unsigned long long) -1; > + memset(m,0,smlen); > + return -1; > } >