Ver Fonte

* Only initialize the prime and generator once

Bryan Drewery há 15 anos atrás
pai
commit
7e7beb9566
5 ficheiros alterados com 19 adições e 28 exclusões
  1. 14 27
      src/crypto/dh_util.c
  2. 1 0
      src/crypto/dh_util.h
  3. 1 0
      src/libcrypto.c
  4. 2 1
      src/libcrypto.h
  5. 1 0
      src/main.c

+ 14 - 27
src/crypto/dh_util.c

@@ -83,18 +83,15 @@ int htob64(char *h, char *d, unsigned int l){
   return strlen(d);
 }
 
+static BIGNUM* b_prime = NULL;
+static BIGNUM* b_generator = NULL;
 
-// ### new sophie-germain 1080bit prime number ###
-//static const char *prime1080 = "++ECLiPSE+is+proud+to+present+latest+FiSH+release+featuring+even+more+security+for+you+++shouts+go+out+to+TMG+for+helping+to+generate+this+cool+sophie+germain+prime+number++++/C32L";
-static const char *prime1080 = "FBE1022E23D213E8ACFA9AE8B9DFADA3EA6B7AC7A7B7E95AB5EB2DF858921FEADE95E6AC7BE7DE6ADBAB8A783E7AF7A7FA6A2B7BEB1E72EAE2B72F9FA2BFB2A2EFBEFAC868BADB3E828FA8BADFADA3E4CC1BE7E8AFE85E9698A783EB68FA07A77AB6AD7BEB618ACF9CA2897EB28A6189EFA07AB99A8A7FA9AE299EFA7BA66DEAFEFBEFBF0B7D8B";
-
-// Base16: FBE1022E23D213E8ACFA9AE8B9DFADA3EA6B7AC7A7B7E95AB5EB2DF858921FEADE95E6AC7BE7DE6ADBAB8A783E7AF7A7FA6A2B7BEB1E72EAE2B72F9FA2BFB2A2EFBEFAC868BADB3E828FA8BADFADA3E4CC1BE7E8AFE85E9698A783EB68FA07A77AB6AD7BEB618ACF9CA2897EB28A6189EFA07AB99A8A7FA9AE299EFA7BA66DEAFEFBEFBF0B7D8B
-// Base10: 12745216229761186769575009943944198619149164746831579719941140425076456621824834322853258804883232842877311723249782818608677050956745409379781245497526069657222703636504651898833151008222772087491045206203033063108075098874712912417029101508315117935752962862335062591404043092163187352352197487303798807791605274487594646923
-
-
-void DH1080_gen(bd::String& privateKey, bd::String& publicKeyB64) {
-  BIGNUM *b_prime = NULL;
-  BIGNUM *b_generator = NULL;
+void DH1080_init() {
+  // ### new sophie-germain 1080bit prime number ###
+  //const char *prime1080 = "++ECLiPSE+is+proud+to+present+latest+FiSH+release+featuring+even+more+security+for+you+++shouts+go+out+to+TMG+for+helping+to+generate+this+cool+sophie+germain+prime+number++++/C32L";
+  // Base16: FBE1022E23D213E8ACFA9AE8B9DFADA3EA6B7AC7A7B7E95AB5EB2DF858921FEADE95E6AC7BE7DE6ADBAB8A783E7AF7A7FA6A2B7BEB1E72EAE2B72F9FA2BFB2A2EFBEFAC868BADB3E828FA8BADFADA3E4CC1BE7E8AFE85E9698A783EB68FA07A77AB6AD7BEB618ACF9CA2897EB28A6189EFA07AB99A8A7FA9AE299EFA7BA66DEAFEFBEFBF0B7D8B
+  // Base10: 12745216229761186769575009943944198619149164746831579719941140425076456621824834322853258804883232842877311723249782818608677050956745409379781245497526069657222703636504651898833151008222772087491045206203033063108075098874712912417029101508315117935752962862335062591404043092163187352352197487303798807791605274487594646923
+  const char *prime1080 = "FBE1022E23D213E8ACFA9AE8B9DFADA3EA6B7AC7A7B7E95AB5EB2DF858921FEADE95E6AC7BE7DE6ADBAB8A783E7AF7A7FA6A2B7BEB1E72EAE2B72F9FA2BFB2A2EFBEFAC868BADB3E828FA8BADFADA3E4CC1BE7E8AFE85E9698A783EB68FA07A77AB6AD7BEB618ACF9CA2897EB28A6189EFA07AB99A8A7FA9AE299EFA7BA66DEAFEFBEFBF0B7D8B";
 
   if (!BN_hex2bn(&b_prime, prime1080)) {
     sdprintf("BAD PRIME");
@@ -105,12 +102,14 @@ void DH1080_gen(bd::String& privateKey, bd::String& publicKeyB64) {
     sdprintf("BAD GENERATOR");
     return;
   }
+}
 
+void DH1080_gen(bd::String& privateKey, bd::String& publicKeyB64) {
   DH *dh = NULL;
 
   dh = DH_new();
-  dh->p = b_prime;
-  dh->g = b_generator;
+  dh->p = BN_dup(b_prime);
+  dh->g = BN_dup(b_generator);
 
   if (!DH_generate_key(dh)) {
     DH_free(dh);
@@ -134,18 +133,6 @@ void DH1080_gen(bd::String& privateKey, bd::String& publicKeyB64) {
 }
 
 bool DH1080_comp(const bd::String privateKey, const bd::String theirPublicKeyB64, bd::String& sharedKey) {
-  BIGNUM *b_prime = NULL, *b_generator = NULL;
-
-  if (!BN_hex2bn(&b_prime, prime1080)) {
-    sharedKey = "Bad prime";
-    return false;
-  }
-
-  if (!BN_dec2bn(&b_generator, "2")) {
-    sharedKey = "Bad generator";
-    return false;
-  }
-
   size_t len = 0;
   unsigned char raw_buf[200] = "";
   BIGNUM *b_myPrivkey = NULL, *b_HisPubkey = NULL;
@@ -153,8 +140,8 @@ bool DH1080_comp(const bd::String privateKey, const bd::String theirPublicKeyB64
 
 
   dh = DH_new();
-  dh->p = b_prime;
-  dh->g = b_generator;
+  dh->p = BN_dup(b_prime);
+  dh->g = BN_dup(b_generator);
 
   // Setup my private key
   b_myPrivkey = BN_bin2bn(reinterpret_cast<const unsigned char*>(privateKey.data()), privateKey.length(), NULL);

+ 1 - 0
src/crypto/dh_util.h

@@ -15,4 +15,5 @@ namespace bd {
 // Adapated from znc-fish
 void DH1080_gen(bd::String& privateKey, bd::String& publicKeyB64);
 bool DH1080_comp(const bd::String privateKey, const bd::String theirPublicKeyB64, bd::String& sharedKey);
+void DH1080_init();
 #endif

+ 1 - 0
src/libcrypto.c

@@ -69,6 +69,7 @@ static int load_symbols(void *handle) {
   DLSYM_GLOBAL(handle, BN_bn2bin);
   DLSYM_GLOBAL(handle, BN_clear_free);
   DLSYM_GLOBAL(handle, BN_dec2bn);
+  DLSYM_GLOBAL(handle, BN_dup);
   DLSYM_GLOBAL(handle, BN_hex2bn);
   DLSYM_GLOBAL(handle, BN_num_bits);
 

+ 2 - 1
src/libcrypto.h

@@ -46,11 +46,12 @@ typedef int (*SHA256_Init_t)(SHA256_CTX*);
 typedef int (*SHA256_Update_t)(SHA256_CTX*, const void*, size_t);
 
 typedef BIGNUM* (*BN_bin2bn_t)(const unsigned char*, int, BIGNUM*);
+typedef BIGNUM* (*BN_dup_t)(const BIGNUM*);
 typedef int (*BN_bn2bin_t)(BIGNUM*, unsigned char*);
-typedef void (*BN_clear_free_t)(BIGNUM*);
 typedef int (*BN_dec2bn_t)(BIGNUM**, const char*);
 typedef int (*BN_hex2bn_t)(BIGNUM**, const char*);
 typedef int (*BN_num_bits_t)(const BIGNUM*);
+typedef void (*BN_clear_free_t)(BIGNUM*);
 
 typedef int (*DH_compute_key_t)(unsigned char*, const BIGNUM*, DH*);
 typedef void (*DH_free_t)(DH*);

+ 1 - 0
src/main.c

@@ -694,6 +694,7 @@ int main(int argc, char **argv)
   if (load_libcrypto()) {
     fatal("Unable to load libcrypto.", 0);
   }
+  DH1080_init();
 
   /* Initialize variables and stuff */
   timer_update_now(&egg_timeval_now);