2
2
// RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for
3
3
// Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526
4
4
5
- use lazy_static;
6
5
use num_bigint:: BigUint ;
7
6
use num_traits:: { Num , Zero } ;
8
7
use std:: {
9
8
collections:: HashMap ,
9
+ sync:: LazyLock ,
10
10
time:: { SystemTime , UNIX_EPOCH } ,
11
11
} ;
12
12
13
- // Using lazy static to initialize statics that require code to be executed at runtime.
14
- lazy_static ! {
15
- // A map of predefined prime numbers for different bit lengths, as specified in RFC 3526
16
- static ref PRIMES : HashMap <u8 , BigUint > = {
17
- let mut m: HashMap <u8 , BigUint > = HashMap :: new( ) ;
18
- m. insert(
19
- // 1536-bit
20
- 5 ,
21
- BigUint :: parse_bytes(
22
- b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
23
- 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
24
- EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
25
- E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\
26
- EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\
27
- C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\
28
- 83655D23DCA3AD961C62F356208552BB9ED529077096966D\
29
- 670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",
30
- 16
31
- ) . unwrap( )
32
- ) ;
33
- m. insert(
34
- // 2048-bit
35
- 14 ,
36
- BigUint :: parse_bytes(
37
- b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
13
+ // A map of predefined prime numbers for different bit lengths, as specified in RFC 3526
14
+ static PRIMES : LazyLock < HashMap < u8 , BigUint > > = LazyLock :: new ( || {
15
+ let mut m: HashMap < u8 , BigUint > = HashMap :: new ( ) ;
16
+ m. insert (
17
+ // 1536-bit
18
+ 5 ,
19
+ BigUint :: parse_bytes (
20
+ b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
38
21
29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
39
22
EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
40
23
E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\
41
24
EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\
42
25
C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\
43
26
83655D23DCA3AD961C62F356208552BB9ED529077096966D\
44
- 670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\
45
- E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\
46
- DE2BCBF6955817183995497CEA956AE515D2261898FA0510\
47
- 15728E5A8AACAA68FFFFFFFFFFFFFFFF",
48
- 16
49
- ) . unwrap( )
50
- ) ;
27
+ 670C354E4ABC9804F1746C08CA237327FFFFFFFFFFFFFFFF",
28
+ 16 ,
29
+ )
30
+ . unwrap ( ) ,
31
+ ) ;
32
+ m. insert (
33
+ // 2048-bit
34
+ 14 ,
35
+ BigUint :: parse_bytes (
36
+ b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
37
+ 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
38
+ EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
39
+ E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\
40
+ EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\
41
+ C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\
42
+ 83655D23DCA3AD961C62F356208552BB9ED529077096966D\
43
+ 670C354E4ABC9804F1746C08CA18217C32905E462E36CE3B\
44
+ E39E772C180E86039B2783A2EC07A28FB5C55DF06F4C52C9\
45
+ DE2BCBF6955817183995497CEA956AE515D2261898FA0510\
46
+ 15728E5A8AACAA68FFFFFFFFFFFFFFFF",
47
+ 16 ,
48
+ )
49
+ . unwrap ( ) ,
50
+ ) ;
51
51
52
52
m. insert (
53
- // 3072-bit
54
- 15 ,
55
- BigUint :: parse_bytes(
53
+ // 3072-bit
54
+ 15 ,
55
+ BigUint :: parse_bytes (
56
56
b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
57
57
29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
58
58
EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
@@ -69,13 +69,14 @@ lazy_static! {
69
69
F12FFA06D98A0864D87602733EC86A64521F2B18177B200C\
70
70
BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31\
71
71
43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF",
72
- 16
73
- ) . unwrap( )
72
+ 16 ,
73
+ )
74
+ . unwrap ( ) ,
74
75
) ;
75
76
m. insert (
76
- // 4096-bit
77
- 16 ,
78
- BigUint :: parse_bytes(
77
+ // 4096-bit
78
+ 16 ,
79
+ BigUint :: parse_bytes (
79
80
b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
80
81
29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
81
82
EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
@@ -98,13 +99,14 @@ lazy_static! {
98
99
1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9\
99
100
93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\
100
101
FFFFFFFFFFFFFFFF",
101
- 16
102
- ) . unwrap( )
102
+ 16 ,
103
+ )
104
+ . unwrap ( ) ,
103
105
) ;
104
106
m. insert (
105
- // 6144-bit
106
- 17 ,
107
- BigUint :: parse_bytes(
107
+ // 6144-bit
108
+ 17 ,
109
+ BigUint :: parse_bytes (
108
110
b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\
109
111
8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\
110
112
302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\
@@ -133,15 +135,16 @@ lazy_static! {
133
135
B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632\
134
136
387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E\
135
137
6DCC4024FFFFFFFFFFFFFFFF",
136
- 16
137
- ) . unwrap( )
138
+ 16 ,
139
+ )
140
+ . unwrap ( ) ,
138
141
) ;
139
142
140
143
m. insert (
141
- // 8192-bit
142
- 18 ,
143
- BigUint :: parse_bytes(
144
- b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
144
+ // 8192-bit
145
+ 18 ,
146
+ BigUint :: parse_bytes (
147
+ b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
145
148
29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
146
149
EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
147
150
E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\
@@ -184,12 +187,12 @@ lazy_static! {
184
187
4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47\
185
188
9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71\
186
189
60C980DD98EDD3DFFFFFFFFFFFFFFFFF",
187
- 16
188
- ) . unwrap( )
190
+ 16 ,
191
+ )
192
+ . unwrap ( ) ,
189
193
) ;
190
194
m
191
- } ;
192
- }
195
+ } ) ;
193
196
194
197
/// Generating random number, should use num_bigint::RandomBits if possible.
195
198
fn rand ( ) -> usize {
0 commit comments