Module: PolyPseudo::Util
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
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
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 = lines.slice!(1, 6) attributes["PrivateKey"] = OpenSSL::PKey::EC.new(lines.join) .each do |line| key, value = line.split(":").map(&:strip) attributes[key] = value end Key.new(attributes) end |