Coverage Report

Created: 2022-08-24 06:37

/src/botan/src/lib/pubkey/workfactor.cpp
Line
Count
Source (jump to first uncovered line)
1
/*
2
* Public Key Work Factor Functions
3
* (C) 1999-2007,2012 Jack Lloyd
4
*
5
* Botan is released under the Simplified BSD License (see license.txt)
6
*/
7
8
#include <botan/internal/workfactor.h>
9
#include <algorithm>
10
#include <cmath>
11
12
namespace Botan {
13
14
size_t ecp_work_factor(size_t bits)
15
0
   {
16
0
   return bits / 2;
17
0
   }
18
19
namespace {
20
21
size_t nfs_workfactor(size_t bits, double log2_k)
22
429
   {
23
   // approximates natural logarithm of an integer of given bitsize
24
429
   const double log2_e = 1.44269504088896340736;
25
429
   const double log_p = bits / log2_e;
26
27
429
   const double log_log_p = std::log(log_p);
28
29
   // RFC 3766: k * e^((1.92 + o(1)) * cubrt(ln(n) * (ln(ln(n)))^2))
30
429
   const double est = 1.92 * std::pow(log_p * log_log_p * log_log_p, 1.0/3.0);
31
32
   // return log2 of the workfactor
33
429
   return static_cast<size_t>(log2_k + log2_e * est);
34
429
   }
35
36
}
37
38
size_t if_work_factor(size_t bits)
39
1.27k
   {
40
1.27k
   if(bits < 512)
41
842
      return 0;
42
43
   // RFC 3766 estimates k at .02 and o(1) to be effectively zero for sizes of interest
44
45
429
   const double log2_k = -5.6438; // log2(.02)
46
429
   return nfs_workfactor(bits, log2_k);
47
1.27k
   }
48
49
size_t dl_work_factor(size_t bits)
50
1.27k
   {
51
   // Lacking better estimates...
52
1.27k
   return if_work_factor(bits);
53
1.27k
   }
54
55
size_t dl_exponent_size(size_t bits)
56
1.27k
   {
57
1.27k
   if(bits == 0)
58
0
      return 0;
59
1.27k
   if(bits <= 256)
60
779
      return bits - 1;
61
492
   if(bits <= 1024)
62
192
      return 192;
63
300
   if(bits <= 1536)
64
36
      return 224;
65
264
   if(bits <= 2048)
66
110
      return 256;
67
154
   if(bits <= 4096)
68
131
      return 384;
69
23
   return 512;
70
154
   }
71
72
}