22// RFC 3526 - More Modular Exponential (MODP) Diffie-Hellman groups for
33// Internet Key Exchange (IKE) https://tools.ietf.org/html/rfc3526
44
5- use lazy_static;
65use num_bigint:: BigUint ;
76use num_traits:: { Num , Zero } ;
87use std:: {
98 collections:: HashMap ,
9+ sync:: LazyLock ,
1010 time:: { SystemTime , UNIX_EPOCH } ,
1111} ;
1212
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\
3821 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
3922 EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
4023 E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\
4124 EE386BFB5A899FA5AE9F24117C4B1FE649286651ECE45B3D\
4225 C2007CB8A163BF0598DA48361C55D39A69163FA8FD24CF5F\
4326 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+ ) ;
5151
5252 m. insert (
53- // 3072-bit
54- 15 ,
55- BigUint :: parse_bytes(
53+ // 3072-bit
54+ 15 ,
55+ BigUint :: parse_bytes (
5656 b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
5757 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
5858 EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
@@ -69,13 +69,14 @@ lazy_static! {
6969 F12FFA06D98A0864D87602733EC86A64521F2B18177B200C\
7070 BBE117577A615D6C770988C0BAD946E208E24FA074E5AB31\
7171 43DB5BFCE0FD108E4B82D120A93AD2CAFFFFFFFFFFFFFFFF",
72- 16
73- ) . unwrap( )
72+ 16 ,
73+ )
74+ . unwrap ( ) ,
7475 ) ;
7576 m. insert (
76- // 4096-bit
77- 16 ,
78- BigUint :: parse_bytes(
77+ // 4096-bit
78+ 16 ,
79+ BigUint :: parse_bytes (
7980 b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD1\
8081 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
8182 EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
@@ -98,13 +99,14 @@ lazy_static! {
9899 1F612970CEE2D7AFB81BDD762170481CD0069127D5B05AA9\
99100 93B4EA988D8FDDC186FFB7DC90A6C08F4DF435C934063199\
100101 FFFFFFFFFFFFFFFF",
101- 16
102- ) . unwrap( )
102+ 16 ,
103+ )
104+ . unwrap ( ) ,
103105 ) ;
104106 m. insert (
105- // 6144-bit
106- 17 ,
107- BigUint :: parse_bytes(
107+ // 6144-bit
108+ 17 ,
109+ BigUint :: parse_bytes (
108110 b"FFFFFFFFFFFFFFFFC90FDAA22168C234C4C6628B80DC1CD129024E08\
109111 8A67CC74020BBEA63B139B22514A08798E3404DDEF9519B3CD3A431B\
110112 302B0A6DF25F14374FE1356D6D51C245E485B576625E7EC6F44C42E9\
@@ -133,15 +135,16 @@ lazy_static! {
133135 B7C5DA76F550AA3D8A1FBFF0EB19CCB1A313D55CDA56C9EC2EF29632\
134136 387FE8D76E3C0468043E8F663F4860EE12BF2D5B0B7474D6E694F91E\
135137 6DCC4024FFFFFFFFFFFFFFFF",
136- 16
137- ) . unwrap( )
138+ 16 ,
139+ )
140+ . unwrap ( ) ,
138141 ) ;
139142
140143 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\
145148 29024E088A67CC74020BBEA63B139B22514A08798E3404DD\
146149 EF9519B3CD3A431B302B0A6DF25F14374FE1356D6D51C245\
147150 E485B576625E7EC6F44C42E9A637ED6B0BFF5CB6F406B7ED\
@@ -184,12 +187,12 @@ lazy_static! {
184187 4009438B481C6CD7889A002ED5EE382BC9190DA6FC026E47\
185188 9558E4475677E9AA9E3050E2765694DFC81F56E880B96E71\
186189 60C980DD98EDD3DFFFFFFFFFFFFFFFFF",
187- 16
188- ) . unwrap( )
190+ 16 ,
191+ )
192+ . unwrap ( ) ,
189193 ) ;
190194 m
191- } ;
192- }
195+ } ) ;
193196
194197/// Generating random number, should use num_bigint::RandomBits if possible.
195198fn rand ( ) -> usize {
0 commit comments