Class: Zwiebel::HiddenService::Descriptor

Inherits:
Object
  • Object
show all
Defined in:
lib/zwiebel/hidden_service/descriptor.rb

Constant Summary collapse

FIELDS =
%w(hs-descriptor descriptor-lifetime descriptor-signing-key-cert revision-counter superencrypted signature).freeze

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(string:) ⇒ Descriptor

Returns a new instance of Descriptor.



22
23
24
25
26
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 22

def initialize(string:)
  @string = string
  parse
  @certificate = Ed25519Certificate.new(descriptor_data: descriptor_signing_key_cert)
end

Instance Attribute Details

#certificateObject

Returns the value of attribute certificate.



20
21
22
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 20

def certificate
  @certificate
end

#stringObject

Returns the value of attribute string.



20
21
22
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 20

def string
  @string
end

Instance Method Details

#descriptor_lifetimeObject



57
58
59
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 57

def descriptor_lifetime
  @hs_descriptor["descriptor-lifetime"]&.to_i
end

#descriptor_signing_key_certObject



61
62
63
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 61

def descriptor_signing_key_cert
  @hs_descriptor["descriptor-signing-key-cert"]
end

#hs_descriptorObject



53
54
55
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 53

def hs_descriptor
  @hs_descriptor["hs-descriptor"]&.to_i
end

#parseObject



28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 28

def parse
  @hs_descriptor = {}
  descriptor_current_field = nil
  string.each_line do |line|
    line_field = line.split(" ")[0]
    if FIELDS.include?(line_field)
      descriptor_current_field = line_field

      if @hs_descriptor[descriptor_current_field].nil? && !line.split(" ")[1..-1].nil?
        @hs_descriptor[descriptor_current_field] = line.split(" ")[1..-1].join(" ")
      else
        @hs_descriptor[descriptor_current_field] = ""
      end
    else
      hs_descriptor_value = @hs_descriptor[descriptor_current_field]

      if hs_descriptor_value.nil?
        @hs_descriptor[descriptor_current_field] = line
      else
        @hs_descriptor[descriptor_current_field] = hs_descriptor_value + line
      end
    end
  end
end

#revision_counterObject



65
66
67
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 65

def revision_counter
  @hs_descriptor["revision-counter"]&.to_i
end

#signatureObject



73
74
75
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 73

def signature
  @hs_descriptor["signature"]
end

#subcredential(identity_public_key) ⇒ Object



77
78
79
80
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 77

def subcredential(identity_public_key)
  credential = OpenSSL::Digest.digest("SHA3-256", "credential" + identity_public_key)
  OpenSSL::Digest.digest("SHA3-256", "subcredential" + credential + certificate.signing_key)
end

#superencryptedObject



69
70
71
# File 'lib/zwiebel/hidden_service/descriptor.rb', line 69

def superencrypted
  @hs_descriptor["superencrypted"]
end