Class: Scl::DH

Inherits:
Object
  • Object
show all
Defined in:
lib/scl/dh.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(encoder: Format::BASE64) ⇒ DH

Returns a new instance of DH.



6
7
8
# File 'lib/scl/dh.rb', line 6

def initialize(encoder: Format::BASE64)
  @encoder = encoder
end

Instance Attribute Details

#encoderObject (readonly)

Returns the value of attribute encoder.



4
5
6
# File 'lib/scl/dh.rb', line 4

def encoder
  @encoder
end

Instance Method Details

#ack(der:, public_key:) ⇒ Object



27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/scl/dh.rb', line 27

def ack(der:, public_key:)
  dh = OpenSSL::PKey::DH.new(encoder.decode(der))
  dh.generate_key!
  shared_key = dh.compute_key(OpenSSL::BN.new(encoder.decode(public_key), 16))
  {
    private: {
      shared_key: encoder.encode(shared_key)
    },
    public: {
      public_key: encoder.encode(dh.pub_key.to_s(16))
    }
  }
end

#fin(private_key:, der:, public_key:) ⇒ Object



41
42
43
44
45
46
47
48
49
50
# File 'lib/scl/dh.rb', line 41

def fin(private_key:, der:, public_key:)
  dh = OpenSSL::PKey::DH.new(encoder.decode(der))
  dh.priv_key        = OpenSSL::BN.new(encoder.decode(private_key), 16)
  shared_key = dh.compute_key(OpenSSL::BN.new(encoder.decode(public_key), 16))
  {
    private: {
      shared_key: encoder.encode(shared_key)
    }
  }
end

#syn(length: 512) ⇒ Object

:0> syn = Scl::DH.new.syn :1> ack = Scl::DH.new.ack(syn) :2> shared_key1 = Scl::DH.new.fin(syn.merge(ack))[:private] :3> shared_key2 = ack[:shared_key]



13
14
15
16
17
18
19
20
21
22
23
24
25
# File 'lib/scl/dh.rb', line 13

def syn(length: 512)
  dh = OpenSSL::PKey::DH.new(length)
  {
    private: {
      der:         encoder.encode(dh.public_key.to_der),
      private_key: encoder.encode(dh.priv_key.to_s(16))
    },
    public: {
      der:        encoder.encode(dh.public_key.to_der),
      public_key: encoder.encode(dh.pub_key.to_s(16))
    }
  }
end