diff options
Diffstat (limited to 'node')
-rw-r--r-- | node/C25519.cpp | 100 | ||||
-rw-r--r-- | node/SHA512.cpp | 9 |
2 files changed, 60 insertions, 49 deletions
diff --git a/node/C25519.cpp b/node/C25519.cpp index 3ff6310f..77084bd8 100644 --- a/node/C25519.cpp +++ b/node/C25519.cpp @@ -295,10 +295,7 @@ int crypto_scalarmult_base(unsigned char *q,const unsigned char *n) ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -// This is the Ed25519 stuff from SUPERCOP: -// http://bench.cr.yp.to/supercop.html - -// Also public domain, newer version than the Ed25519 found in NaCl +// Ed25519 ref from: http://bench.cr.yp.to/supercop.html typedef struct { @@ -306,6 +303,49 @@ typedef struct } fe25519; +typedef struct +{ + crypto_uint32 v[32]; +} +sc25519; + +typedef struct +{ + crypto_uint32 v[16]; +} +shortsc25519; + +typedef struct +{ + fe25519 x; + fe25519 y; + fe25519 z; + fe25519 t; +} ge25519; + +#define ge25519_p3 ge25519 + +typedef struct +{ + fe25519 x; + fe25519 z; + fe25519 y; + fe25519 t; +} ge25519_p1p1; + +typedef struct +{ + fe25519 x; + fe25519 y; + fe25519 z; +} ge25519_p2; + +typedef struct +{ + fe25519 x; + fe25519 y; +} ge25519_aff; + static void fe25519_sub(fe25519 *r, const fe25519 *x, const fe25519 *y); crypto_uint32 equal(crypto_uint32 a,crypto_uint32 b) /* 16-bit inputs */ @@ -619,18 +659,6 @@ void fe25519_pow2523(fe25519 *r, const fe25519 *x) /* 2^252 - 3 */ fe25519_mul(r,&t,x); } -typedef struct -{ - crypto_uint32 v[32]; -} -sc25519; - -typedef struct -{ - crypto_uint32 v[16]; -} -shortsc25519; - static const crypto_uint32 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}; @@ -827,14 +855,6 @@ void sc25519_2interleave2(unsigned char r[127], const sc25519 *s1, const sc25519 r[126] = ((s1->v[31] >> 4) & 3) ^ (((s2->v[31] >> 4) & 3) << 2); } -typedef struct -{ - fe25519 x; - fe25519 y; - fe25519 z; - fe25519 t; -} ge25519; - /* d */ static const fe25519 ge25519_ecd = {{0xA3, 0x78, 0x59, 0x13, 0xCA, 0x4D, 0xEB, 0x75, 0xAB, 0xD8, 0x41, 0x41, 0x4D, 0x0A, 0x70, 0x00, 0x98, 0xE8, 0x79, 0x77, 0x79, 0x40, 0xC7, 0x8C, 0x73, 0xFE, 0x6F, 0x2B, 0xEE, 0x6C, 0x03, 0x52}}; @@ -845,30 +865,6 @@ static const fe25519 ge25519_ec2d = {{0x59, 0xF1, 0xB2, 0x26, 0x94, 0x9B, 0xD6, static const fe25519 ge25519_sqrtm1 = {{0xB0, 0xA0, 0x0E, 0x4A, 0x27, 0x1B, 0xEE, 0xC4, 0x78, 0xE4, 0x2F, 0xAD, 0x06, 0x18, 0x43, 0x2F, 0xA7, 0xD7, 0xFB, 0x3D, 0x99, 0x00, 0x4D, 0x2B, 0x0B, 0xDF, 0xC1, 0x4F, 0x80, 0x24, 0x83, 0x2B}}; -#define ge25519_p3 ge25519 - -typedef struct -{ - fe25519 x; - fe25519 z; - fe25519 y; - fe25519 t; -} ge25519_p1p1; - -typedef struct -{ - fe25519 x; - fe25519 y; - fe25519 z; -} ge25519_p2; - -typedef struct -{ - fe25519 x; - fe25519 y; -} ge25519_aff; - - /* Packed coordinates of the base point */ static const ge25519 ge25519_base = {{{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}}, @@ -1999,6 +1995,10 @@ void get_hram(unsigned char *hram, const unsigned char *sm, const unsigned char } // anonymous namespace +#ifdef ZT_USE_FAST_X64_ED25519 +extern "C" void ed25519_amd64_asm_sign(const unsigned char *sk,const unsigned char *pk,const unsigned char *m,const unsigned int mlen,unsigned char *sig); +#endif + namespace ZeroTier { void C25519::agree(const C25519::Private &mine,const C25519::Public &their,void *keybuf,unsigned int keylen) @@ -2019,6 +2019,9 @@ void C25519::agree(const C25519::Private &mine,const C25519::Public &their,void void C25519::sign(const C25519::Private &myPrivate,const C25519::Public &myPublic,const void *msg,unsigned int len,void *signature) { +#ifdef ZT_USE_FAST_X64_ED25519 + ed25519_amd64_asm_sign(myPrivate.data + 32,myPublic.data + 32,(const unsigned char *)msg,len,(unsigned char *)signature); +#else sc25519 sck, scs, scsk; ge25519 ger; unsigned char r[32]; @@ -2063,6 +2066,7 @@ void C25519::sign(const C25519::Private &myPrivate,const C25519::Public &myPubli sc25519_to32bytes(s,&scs); /* cat s */ for(unsigned int i=0;i<32;i++) sig[32 + i] = s[i]; +#endif } bool C25519::verify(const C25519::Public &their,const void *msg,unsigned int len,const void *signature) diff --git a/node/SHA512.cpp b/node/SHA512.cpp index 589913d7..d3c938af 100644 --- a/node/SHA512.cpp +++ b/node/SHA512.cpp @@ -357,4 +357,11 @@ void SHA512::hash(void *digest,const void *data,unsigned int len) } // namespace ZeroTier -#endif +#endif // !ZT_HAVE_NATIVE_SHA512 + +// Internally re-export to included C code, which includes some fast crypto code ported in on some platforms. +// This eliminates the need to link against a third party SHA512() from this code +extern "C" void ZT_sha512internal(void *digest,const void *data,unsigned int len) +{ + ZeroTier::SHA512::hash(digest,data,len); +} |