Module: PolyPseudo::Util

Extended by:
Util
Included in:
Util
Defined in:
lib/poly_pseudo/util.rb

Class Method Summary collapse

Instance Method Summary collapse

Class Method Details

.mgf1(z, l) ⇒ Object



47
48
49
50
51
52
53
54
55
56
# File 'lib/poly_pseudo/util.rb', line 47

def self.mgf1(z, l)
  t = ''

  n = (l - 1) / 48 + 1
  n.times do |i|
    t << Digest::SHA384.digest(z + [i].pack('N'))
  end

  t[0...l]
end

.xor(s1, s2) ⇒ Object



58
59
60
61
62
63
64
65
66
67
# File 'lib/poly_pseudo/util.rb', line 58

def self.xor s1, s2
  b1 = s1.unpack('c*')
  b2 = s2.unpack('c*')

  if b1.length != b2.length
    raise 'cannot xor strings of different lengths!'
  end

  b1.zip(b2).map { |a, b| a ^ b }.pack('c*')
end

Instance Method Details

#oaep_decode(em, p = '', hlen = 10) ⇒ Object

Parameters:

  • bn (OpenSSL::BN)


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/poly_pseudo/util.rb', line 21

def oaep_decode(em, p = '', hlen = 10)
  raise 'message is too short!' if em.length < hlen * 2 + 1

  raise 'Y should be zero!' unless em[0] == "\x00"
  maskedSeed = em[1..hlen]
  maskedDB   = em[(hlen+1)..-1]

  seedMask = mgf1 maskedDB, hlen
  seed     = xor maskedSeed, seedMask
  dbMask   = mgf1 seed, em.size - hlen - 1
  db       = xor maskedDB, dbMask
  pHash    = Digest::SHA384.digest(p)[0...hlen]

  ind = db.index("\x01", hlen)
  raise 'message is invalid!' if ind.nil?

  pHash2 = db[0...hlen]
  ps     = db[hlen...ind]
  m      = db[(ind + 1)..-1]

  raise 'message is invalid!' unless ps.bytes.all?(&:zero?)
  raise "specified p = #{p.inspect} is wrong!" unless pHash2 == pHash

  m
end

#read_key(raw) ⇒ Object

Parameters:

  • raw (String)

    in pem format with metadata



6
7
8
9
10
11
12
13
14
15
16
17
18
# File 'lib/poly_pseudo/util.rb', line 6

def read_key(raw)
  attributes               = {}
  lines                    = raw.lines
  meta_lines               = lines.slice!(1, 6)
  attributes["PrivateKey"] = OpenSSL::PKey::EC.new(lines.join)

  meta_lines.each do |line|
    key, value      = line.split(":").map(&:strip)
    attributes[key] = value
  end

  Key.new(attributes)
end