Module: MTProto::Crypto::DHValidator
- Defined in:
- lib/mtproto/crypto/dh_validator.rb
Class Method Summary collapse
- .validate_dh_params(g, dh_prime_bytes, g_a_bytes) ⇒ Object
- .validate_dh_prime(dh_prime) ⇒ Object
- .validate_g(g, dh_prime) ⇒ Object
- .validate_g_a(g_a, dh_prime) ⇒ Object
Class Method Details
.validate_dh_params(g, dh_prime_bytes, g_a_bytes) ⇒ Object
10 11 12 13 14 15 16 17 18 19 |
# File 'lib/mtproto/crypto/dh_validator.rb', line 10 def validate_dh_params(g, dh_prime_bytes, g_a_bytes) dh_prime = OpenSSL::BN.new(dh_prime_bytes, 2) g_a = OpenSSL::BN.new(g_a_bytes, 2) validate_g(g, dh_prime) validate_dh_prime(dh_prime) validate_g_a(g_a, dh_prime) true end |
.validate_dh_prime(dh_prime) ⇒ Object
47 48 49 50 51 52 53 54 55 56 57 58 59 60 |
# File 'lib/mtproto/crypto/dh_validator.rb', line 47 def validate_dh_prime(dh_prime) bit_length = dh_prime.num_bits raise 'dh_prime must be 2048 bits' unless bit_length == 2048 min_prime = OpenSSL::BN.new(2)**2047 max_prime = OpenSSL::BN.new(2)**2048 if dh_prime <= min_prime || dh_prime >= max_prime raise 'dh_prime out of range (must be 2^2047 < p < 2^2048)' end true end |
.validate_g(g, dh_prime) ⇒ Object
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/mtproto/crypto/dh_validator.rb', line 21 def validate_g(g, dh_prime) raise 'Invalid g: must be 2, 3, 4, 5, 6, or 7' unless [2, 3, 4, 5, 6, 7].include?(g) p_mod = case g when 2 dh_prime % 8 == 7 when 3 dh_prime % 3 == 2 when 4 true when 5 mod5 = dh_prime % 5 mod5 == 1 || mod5 == 4 when 6 mod24 = dh_prime % 24 mod24 == 19 || mod24 == 23 when 7 mod7 = dh_prime % 7 [3, 5, 6].include?(mod7) end raise "g=#{g} is not a valid generator for this prime" unless p_mod true end |
.validate_g_a(g_a, dh_prime) ⇒ Object
62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
# File 'lib/mtproto/crypto/dh_validator.rb', line 62 def validate_g_a(g_a, dh_prime) one = OpenSSL::BN.new(1) dh_prime_minus_one = dh_prime - one raise 'g_a must be > 1' if g_a <= one raise 'g_a must be < dh_prime - 1' if g_a >= dh_prime_minus_one safety_range_min = OpenSSL::BN.new(2)**1984 safety_range_max = dh_prime - safety_range_min if g_a < safety_range_min || g_a > safety_range_max raise 'g_a outside safety range (2^1984 to dh_prime - 2^1984)' end true end |