/
symencryptedintegrityprotecteddata.rb
66 lines (50 loc) · 1.18 KB
/
symencryptedintegrityprotecteddata.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
require 'pgp/packet/packet'
require 'pgp/pkeyalgorithm'
module PGP
module Packet
class SymEncryptedIntegrityProtectedData < Packet
def initialize(version = 1)
super(18)
@version = version
@cipher = nil
end
attr_accessor :cipher
attr_accessor :plain
def scan(io)
super
io.puts "Encrypted data + MDC SHA1(20 bytes)"
end
def decrypt(algo, key)
block = SKeyAlgorithm.decrypt(algo, key, @cipher, :normal_cfb)
header = block[0, 10]
body = block[10, block.size - 10 - 22]
mdcheader = block[-22, 2]
mdcbody = block[-20..-1]
require 'digest/sha1'
if Digest::SHA1.digest(header + body + mdcheader) != mdcbody
raise "MDC check failed"
end
@plain = body
end
private
def dump_body
raise "ToDo"
end
def self.loader(port, length)
initpos = port.readlength
version = load_version(port)
packet = new(version)
packet.cipher = port.read(length - (port.readlength - initpos))
packet
end
def self.scanner(io, port, length)
loader(port, length).scan(io)
end
def self.load_version(port)
load_1octet(port)
end
add_loader(18, method(:loader))
add_scanner(18, method(:scanner))
end
end
end