|
|
|
|
@ -55,7 +55,20 @@ public:
|
|
|
|
|
}; |
|
|
|
|
static _EC_Group ZT_EC_GROUP; |
|
|
|
|
|
|
|
|
|
/* Key derivation function */ |
|
|
|
|
/**
|
|
|
|
|
* Key derivation function |
|
|
|
|
* |
|
|
|
|
* TODO: |
|
|
|
|
* If/when we document the protocol, this will have to be documented as |
|
|
|
|
* well. It's a fairly standard KDF that uses SHA-256 to transform the |
|
|
|
|
* raw EC key. It's generally considered good crypto practice to do this |
|
|
|
|
* to eliminate the possibility of leaking information from EC exchange to |
|
|
|
|
* downstream algorithms. |
|
|
|
|
* |
|
|
|
|
* In our code it is used to produce a two 32-bit keys. One key is used |
|
|
|
|
* for Salsa20 and the other for HMAC-SHA-256. They are generated together |
|
|
|
|
* as a single 64-bit key. |
|
|
|
|
*/ |
|
|
|
|
static void *_zt_EC_KDF(const void *in,size_t inlen,void *out,size_t *outlen) |
|
|
|
|
{ |
|
|
|
|
SHA256_CTX sha; |
|
|
|
|
@ -130,9 +143,8 @@ bool EllipticCurveKeyPair::generate()
|
|
|
|
|
fread(tmp,sizeof(tmp),1,rf); |
|
|
|
|
fclose(rf); |
|
|
|
|
} else { |
|
|
|
|
fprintf(stderr,"WARNING: cannot open /dev/urandom\n"); |
|
|
|
|
for(unsigned int i=0;i<sizeof(tmp);++i) |
|
|
|
|
tmp[i] = (unsigned char)(rand() >> 3); |
|
|
|
|
fprintf(stderr,"FATAL: could not open /dev/urandom\n"); |
|
|
|
|
exit(-1); |
|
|
|
|
} |
|
|
|
|
RAND_seed(tmp,sizeof(tmp)); |
|
|
|
|
#else |
|
|
|
|
|