aboutsummaryrefslogtreecommitdiffstats
path: root/lib/openssl.rb
blob: aaafed1b668a75c01b365319a03a0f554df32eff (plain)
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
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#!/usr/bin/env ruby

require 'openssl.so'
require 'openssl/buffering'
require 'thread'

module OpenSSL
  module PKey
    class DSA
      def sign(digest, data)
	unless self.private?
	  raise OpenSSL::PKey::DSAError, "Cannot sign with public key!"
	end
	unless digest.kind_of? OpenSSL::Digest::ANY
	  raise TypeError, "digest alg needed! (got #{digest.class.name})"
	end
	txt = ""
	if data.kind_of? String
	  txt = data
	else
	  begin
	    txt = data.to_s
	  rescue
	    raise TypeError, "string needed! (got #{data.class.name})"
	  end
	end
	self.sign_digest digest.update(txt).digest
      end #sign
      def verify(digest, signature, data)
	unless digest.kind_of? OpenSSL::Digest::ANY
	  raise TypeError, "digest alg needed! (got #{digest.class.name})"
	end
	txt = ""
	if data.kind_of? String
	  txt = data
	else
	  begin
	    txt = data.to_s
	  rescue
	    raise TypeError, "string needed! (got #{data.class.name})"
	  end
	end
	unless signature.type == String
	  raise TypeError, "Signature as String expected (got #{sign.class.name})"
	end
	self.verify_digest(digest.update(txt).digest, signature)
      end #verify
    end #DSA
    class RSA
      def sign(digest, data)
	unless self.private?
	  raise OpenSSL::PKey::RSAError, "Cannot sign with public key!"
	end
	unless digest.kind_of? OpenSSL::Digest::ANY
	  raise TypeError, "digest alg needed! (got #{digest.class.name})"
	end
	txt = ""
	if data.kind_of? String
	  txt = data
	else
	  begin
	    txt = data.to_s
	  rescue
	    raise TypeError, "string needed! (got #{data.class.name})"
	  end
	end
	self.private_encrypt digest.update(txt).digest
      end #sign
      def verify(digest, signature, data)
	unless digest.kind_of? OpenSSL::Digest::ANY
	  raise TypeError, "digest alg needed! (got #{digest.class.name})"
	end
	txt = ""
	if data.kind_of? String
	  txt = data
	else
	  begin
	    txt = data.to_s
	  rescue
	    raise TypeError, "string needed! (got #{data.class.name})"
	  end
	end
	unless signature.type == String
	  raise TypeError, "Signature as String expected (got #{sign.class.name})"
	end
	hash_s = self.public_decrypt signature
	hash_d = digest.update(txt).digest
	hash_s == hash_d
      end #verify
    end #RSA
  end #PKey

  module SSL
    class SSLSocket
      CallbackMutex = Mutex.new
      include Buffering
      def connect
        CallbackMutex.synchronize{ __connect }
      end
      def accept
        CallbackMutex.synchronize{ __accept }
      end
    end #SSLSocket
  end #SSL
end #OpenSSL