This repository has been archived by the owner on Nov 2, 2019. It is now read-only.
/
key.rb
78 lines (64 loc) · 1.85 KB
/
key.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
67
68
69
70
71
72
73
74
75
76
77
78
module CyberplatPKI
class Key
attr_reader :internal
class << self
def new_private(source, password, engine=Library::DEFAULT_ENGINE)
internal = Library::Key.new
Library.invoke :OpenSecretKey,
engine,
source, source.length,
password,
internal
new(internal)
end
def new_public(source, serial, ca_key=nil, engine=Library::DEFAULT_ENGINE)
internal = Library::Key.new
if ca_key
ca_key = ca_key.internal
end
Library.invoke :OpenPublicKey,
engine,
source, source.length,
serial,
internal,
ca_key
new(internal)
end
private :new
end
def initialize(internal)
@internal = internal
if defined?(ObjectSpace) &&
ObjectSpace.respond_to?(:define_finalizer)
ObjectSpace.define_finalizer(self, lambda {
Library.invoke :CloseKey, internal
})
else
warn "No ObjectSpace.define_finalizer; Crypt_CloseKey will not be called."
end
end
def sign(data)
# Be fucking optimistic. Someone, please teach the morons from
# cyberplat how to design APIs and document them.
# I sincerely hope this does not segfault in production.
result = FFI::MemoryPointer.new(:char, data.length + 1024)
result_length = Library.invoke :Sign,
data, data.size,
result, result.total,
@internal
result.read_string(result_length)
end
def verify(data_with_signature)
retval = Library.Crypt_Verify \
data_with_signature, data_with_signature.size,
nil, nil,
@internal
if retval == -20 # VERIFY
false
else
Library.handle_error("Crypt_Verify", retval)
true
end
end
end
end