nuntius 0.1.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +4 -0
- data/Gemfile +4 -0
- data/README.md +93 -0
- data/Rakefile +1 -0
- data/lib/nuntius.rb +11 -0
- data/lib/nuntius/encodings.rb +9 -0
- data/lib/nuntius/encodings/url_safe_base64.rb +26 -0
- data/lib/nuntius/envelope.rb +45 -0
- data/lib/nuntius/key.rb +30 -0
- data/lib/nuntius/messenger.rb +37 -0
- data/lib/nuntius/version.rb +3 -0
- data/nuntius.gemspec +23 -0
- data/spec/keys/alice.pem +27 -0
- data/spec/keys/alice.pub +9 -0
- data/spec/keys/bob.pem +27 -0
- data/spec/keys/bob.pub +9 -0
- data/spec/nuntius/encodings/url_safe_base64_spec.rb +36 -0
- data/spec/nuntius/envelope_spec.rb +6 -0
- data/spec/nuntius/key_spec.rb +6 -0
- data/spec/nuntius/messenger_spec.rb +26 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/keys.rb +3 -0
- metadata +105 -0
data/.gitignore
ADDED
data/Gemfile
ADDED
data/README.md
ADDED
@@ -0,0 +1,93 @@
|
|
1
|
+
# Nuntius:
|
2
|
+
|
3
|
+
> A messenger, reporter, courier, bearer of news or tidings
|
4
|
+
|
5
|
+
Nuntius is a simple scheme to send and receive messages in a cryptographicaly secure and compatible way.
|
6
|
+
|
7
|
+
## Usage
|
8
|
+
|
9
|
+
### Encript a Message
|
10
|
+
|
11
|
+
```ruby
|
12
|
+
require 'nuntius'
|
13
|
+
|
14
|
+
sender = Nuntius::Key.new( File.read('private_key_path') )
|
15
|
+
messenger = Nuntius::Mesenger.new({
|
16
|
+
:key => sender
|
17
|
+
})
|
18
|
+
|
19
|
+
receiver = Nuntius::Key.new( File.read('public_key_path') )
|
20
|
+
|
21
|
+
envelope = messenger.wrap({
|
22
|
+
:message => "Message Content",
|
23
|
+
:to => receiver
|
24
|
+
})
|
25
|
+
|
26
|
+
envelope.data
|
27
|
+
# => The encripted message
|
28
|
+
envelope.key
|
29
|
+
# => The encripted message key
|
30
|
+
envelope.signature
|
31
|
+
# => The encripted message signature
|
32
|
+
```
|
33
|
+
|
34
|
+
### Decript a message
|
35
|
+
|
36
|
+
```ruby
|
37
|
+
require 'nuntius'
|
38
|
+
|
39
|
+
receiver = Nuntius::Key.new( File.read('private_key_path') )
|
40
|
+
messenger = Nuntius::Mesenger.new({
|
41
|
+
:key => receiver
|
42
|
+
})
|
43
|
+
|
44
|
+
sender = Nuntius::Key.new( File.read('public_key_path') )
|
45
|
+
|
46
|
+
envelope = Nuntius::Envelope.new({
|
47
|
+
:data => 'The encripted message'
|
48
|
+
:key => 'The encripted message key'
|
49
|
+
:signature => 'The encripted message signature'
|
50
|
+
})
|
51
|
+
|
52
|
+
message = messenger.unwrap({
|
53
|
+
:envelope => envelope,
|
54
|
+
:from => sender
|
55
|
+
})
|
56
|
+
|
57
|
+
message
|
58
|
+
# => The verified and decripted raw message
|
59
|
+
```
|
60
|
+
|
61
|
+
## Encription Scheme
|
62
|
+
|
63
|
+
Under the hood Nuntius is just a wrapper around OpenSSL and by default uses [RSA]( http://en.wikipedia.org/wiki/RSA_%28algorithm%29 ), [AES](http://en.wikipedia.org/wiki/Advanced_Encryption_Standard) in [CBC mode](http://en.wikipedia.org/wiki/Block_cipher_modes_of_operation#Cipher-block_chaining_.28CBC.29) and [SHA512](http://en.wikipedia.org/wiki/SHA512) to encript/decript and sign/verify the messages and [URL Safe Base64](http://en.wikipedia.org/wiki/Base64#RFC_4648) to encode/decode the results.
|
64
|
+
|
65
|
+
The whole scheme can be sumarized in 4 steps:
|
66
|
+
|
67
|
+
* The message is encripted using AES-256-CBC with a randomly generated key.
|
68
|
+
* The key is then encrypted using the receiver's public RSA key.
|
69
|
+
* The encripted message's digest is calculated using SHA512 and then signed using the sender's private RSA key.
|
70
|
+
* Finally the encripted message, the encripted key and the signed digest are encoded using the RFC4648 URL Safe Base 64 encoding
|
71
|
+
|
72
|
+
In other terms, encrypting a message with nuntius is the same as doing
|
73
|
+
|
74
|
+
```ruby
|
75
|
+
require 'openssl'
|
76
|
+
|
77
|
+
sender = OpenSSL::PKey::RSA.new( File.read('sender_private_key') )
|
78
|
+
receiver = OpenSSL::PKey::RSA.new( File.read('receiver_public_key') )
|
79
|
+
|
80
|
+
cipher = OpenSSL::Cipher.new("AES-256-CBC").encrypt
|
81
|
+
|
82
|
+
key = receiver.public_encrypt( cipher.random_key )
|
83
|
+
|
84
|
+
data = cipher.update("message") + cipher.final
|
85
|
+
|
86
|
+
signature = receiver.private_encrypt( OpenSSL::Digest::SHA512.new(data).digest )
|
87
|
+
|
88
|
+
result = {
|
89
|
+
:data => [data].pack("m0").tr("+/","-_").gsub("=","")
|
90
|
+
:key => [key].pack("m0").tr("+/","-_").gsub("=","")
|
91
|
+
:signature => [signature].pack("m0").tr("+/","-_").gsub("=","")
|
92
|
+
}
|
93
|
+
```
|
data/Rakefile
ADDED
@@ -0,0 +1 @@
|
|
1
|
+
require "bundler/gem_tasks"
|
data/lib/nuntius.rb
ADDED
@@ -0,0 +1,26 @@
|
|
1
|
+
module Nuntius
|
2
|
+
module Encodings
|
3
|
+
|
4
|
+
# Encode/Decode messages using RFC4648 Base 64 Encoding
|
5
|
+
# with URL and Filename Safe Alphabet {http://tools.ietf.org/html/rfc4648#section-5}
|
6
|
+
module URLSafeBase64
|
7
|
+
BASE_CHARACTERS = "+/"
|
8
|
+
REPLACEMENT_CHARACTERS = "-_"
|
9
|
+
PADDING_CHARACTER = "="
|
10
|
+
|
11
|
+
def self.encode(bin)
|
12
|
+
[bin].pack("m0").tr(BASE_CHARACTERS,REPLACEMENT_CHARACTERS).gsub(PADDING_CHARACTER,'')
|
13
|
+
end
|
14
|
+
|
15
|
+
def self.decode(bin)
|
16
|
+
padding = (4 - (bin.length % 4)) % 4
|
17
|
+
( bin.tr(REPLACEMENT_CHARACTERS, BASE_CHARACTERS) + ( PADDING_CHARACTER * padding ) ).unpack("m0").first
|
18
|
+
rescue ArgumentError
|
19
|
+
raise Nuntius::Encodings::DecodingError.new 'Invalid Base64'
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
|
@@ -0,0 +1,45 @@
|
|
1
|
+
module Nuntius
|
2
|
+
class Envelope
|
3
|
+
include Enumerable
|
4
|
+
attr_accessor :data, :key, :signature
|
5
|
+
|
6
|
+
def initialize(attributes)
|
7
|
+
self.data = attributes[:raw_data] ? encode(attributes[:raw_data]) : attributes[:data]
|
8
|
+
self.key = attributes[:raw_key] ? encode(attributes[:raw_key]) : attributes[:key]
|
9
|
+
self.signature = attributes[:raw_signature] ? encode(attributes[:raw_signature]) : attributes[:signature]
|
10
|
+
end
|
11
|
+
|
12
|
+
def to_hash
|
13
|
+
{
|
14
|
+
:data => data,
|
15
|
+
:key => key,
|
16
|
+
:signature => signature
|
17
|
+
}
|
18
|
+
end
|
19
|
+
|
20
|
+
def raw_data
|
21
|
+
decode data
|
22
|
+
end
|
23
|
+
|
24
|
+
def raw_key
|
25
|
+
decode key
|
26
|
+
end
|
27
|
+
|
28
|
+
def raw_signature
|
29
|
+
decode signature
|
30
|
+
end
|
31
|
+
|
32
|
+
def each(&block)
|
33
|
+
self.to_hash.each(&block)
|
34
|
+
end
|
35
|
+
|
36
|
+
protected
|
37
|
+
def encode(string)
|
38
|
+
Encodings::URLSafeBase64.encode(string)
|
39
|
+
end
|
40
|
+
|
41
|
+
def decode(string)
|
42
|
+
Encodings::URLSafeBase64.decode(string)
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
data/lib/nuntius/key.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
module Nuntius
|
2
|
+
class Key
|
3
|
+
def initialize(key_data)
|
4
|
+
@key = OpenSSL::PKey::RSA.new(key_data)
|
5
|
+
end
|
6
|
+
|
7
|
+
def private?
|
8
|
+
@key.private?
|
9
|
+
end
|
10
|
+
|
11
|
+
def sign(string)
|
12
|
+
digest = OpenSSL::Digest::SHA512.new.digest(string)
|
13
|
+
|
14
|
+
@key.private_encrypt(digest)
|
15
|
+
end
|
16
|
+
|
17
|
+
def validate(message,signature)
|
18
|
+
digest = OpenSSL::Digest::SHA512.new.digest(message)
|
19
|
+
digest == @key.public_decrypt(signature)
|
20
|
+
end
|
21
|
+
|
22
|
+
def encrypt(string)
|
23
|
+
@key.public_encrypt(string)
|
24
|
+
end
|
25
|
+
|
26
|
+
def decrypt(string)
|
27
|
+
@key.private_decrypt(string)
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
module Nuntius
|
2
|
+
class Messenger
|
3
|
+
attr_accessor :key
|
4
|
+
|
5
|
+
def initialize(attributes)
|
6
|
+
self.key = attributes[:key]
|
7
|
+
end
|
8
|
+
|
9
|
+
def wrap(options)
|
10
|
+
cipher = OpenSSL::Cipher.new('AES-256-CBC').encrypt
|
11
|
+
|
12
|
+
key = options[:to].encrypt( cipher.random_key )
|
13
|
+
data = cipher.update( options[:message] ) + cipher.final
|
14
|
+
signature = @key.sign(data)
|
15
|
+
|
16
|
+
Envelope.new({
|
17
|
+
:raw_data => data,
|
18
|
+
:raw_key => key,
|
19
|
+
:raw_signature => signature
|
20
|
+
})
|
21
|
+
end
|
22
|
+
|
23
|
+
def unwrap(options)
|
24
|
+
data = options[:envelope].raw_data
|
25
|
+
signature = options[:envelope].raw_signature
|
26
|
+
|
27
|
+
options[:from].validate(data, signature)
|
28
|
+
|
29
|
+
key = @key.decrypt options[:envelope].raw_key
|
30
|
+
|
31
|
+
cipher = OpenSSL::Cipher.new('AES-256-CBC').decrypt
|
32
|
+
cipher.key = key
|
33
|
+
|
34
|
+
cipher.update(data) + cipher.final
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
data/nuntius.gemspec
ADDED
@@ -0,0 +1,23 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "nuntius/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "nuntius"
|
7
|
+
s.version = Nuntius::VERSION
|
8
|
+
s.author = "Sebastian Gamboa"
|
9
|
+
s.email = "me@sagmor.com"
|
10
|
+
s.homepage = "https://github.com/sagmor/nuntius"
|
11
|
+
s.summary = %q{Nuntius: A messenger, reporter, courier, bearer of news or tidings}
|
12
|
+
s.description = %q{Nuntius is a simple scheme to send and receive messages in a cryptographicaly secure and compatible way.}
|
13
|
+
|
14
|
+
s.rubyforge_project = "nuntius"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_development_dependency "rake"
|
22
|
+
s.add_development_dependency "rspec", ">= 2.7.0"
|
23
|
+
end
|
data/spec/keys/alice.pem
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEpQIBAAKCAQEA5ApVWuSH8hmUU0t855uMnisyJSz4/HpNm+s9pFRCml3AsUKf
|
3
|
+
0pFcLyip12XrzU489lOzO3vDmt5gFKEULRhR2xTqvqGO+PIcjsDtvWOUN07BOlBU
|
4
|
+
PuvkqulNZpb0A0wEuMwEQ40uzcte78e9zxieKt7mXfBcGrWwnFNVH73hX2zQXi2H
|
5
|
+
AW8aWpkTC7RpHx7iSun0eHEo/xwhf33yIL9UIk5ebYuurEXuUZSkbE99QRgGoyYR
|
6
|
+
M+J0IPFsJMpq4Dl+NaiiA9373nxgtdlgE7Ms9xwDuIR+SCnZ30IE+qZZTy8FzjJ8
|
7
|
+
E6/mtDU+VLgYYNJPNhQrUYo+qzwFdcfCSiyjLwIDAQABAoIBAQDBilujBu6ydS9D
|
8
|
+
+n+J+qS/4R1wG9k+P3b67A6nF7RnW0adq1QF3MUGaVasr54P42UuEx+9Tm9XU4Ds
|
9
|
+
QUHkfA2NCRWqsWestZ+zMN8VrBwxTLAGlALMXFz5CYVdmqSC39PqG41K39pnY0Gx
|
10
|
+
9C6OQ/CJpiCSfdtN+AJqyvcmN3u+BfvLBQ7dNXJP4kBgo918trkumPgk8ZO6bnQB
|
11
|
+
7b4JeGZWQ0Tk/GMhdC/j6RYDTtjpqe9wNXmc6T8I/fdIvHW4p4Oo7Wwrnl1aMeY5
|
12
|
+
WJRak4qf9XDVq6IwNo6EhxAbt5mR8QiBaaCUqsVx0o3be8op4LKu1sNcJcVbjXFh
|
13
|
+
otXDLkPxAoGBAPzyfpAWlGeWL+GOGxKSLUNF0Y3lf0rW4vsRTlgg2bQys08AOvBf
|
14
|
+
yVWkoPHDyyH9HLBkAQuB0fxy1o7St+89mafGm4Hw5GW7ov9Wh+AYwsqOcz8Sbx8S
|
15
|
+
rsBlu9bx21aC6usrdv7b03wMwvlECIj76b7dXE9e4ocfLxNGCzzPuiHTAoGBAObK
|
16
|
+
4wKUMnOiHqZtPZdjSk/ODHxq+AN+FijxDfBmuVJvo8Wl2LgMoCiFg2W4nNKF524+
|
17
|
+
T9zz1tgxfgwKubnwTw2dnUU4ffV/TF3/YVfU+mTXW7DtMvdzcgd7sHI7BEv/hELC
|
18
|
+
F9ofcXHlS3HR1fJSXZpMnb5i7rLt5Vw7cbS8lcO1AoGAE8DkPWBmCojiCF1Oo+6i
|
19
|
+
dkR3jvtDK5cIds7tLVizZ60l7592+tqgIH4Qy5CcxnS7ztKgekOTIIHfW5v9HUPU
|
20
|
+
QhPyhP1I+ODkY8hgKBIG9EaXnW9VGjodR40qVCjjFih3LBJi4phMNb3RZCH6AKib
|
21
|
+
onorAU/JpP+8b2bi7cbTJF0CgYEAv26aTZFPJ8rZUYJbDC83fGqUwL6ZaYw0JVGN
|
22
|
+
FlKedVpUpaSi1kbisbnM+5rduWGITVEyPTukgT7MJoDe/PPvHoQV50ysbe1hEra5
|
23
|
+
r3jhGLPpQh/9nnMLqllWSenZ7o/KzPThg/OAzdA7e/VpWM4pBct3LGwzQgdBr/c+
|
24
|
+
oYOrVeECgYEAgGnO7Rq7p9Bih9pEXpcxrV//YpLAUB8bB1Tz96Fiwn4CSFieSVSx
|
25
|
+
unCrKyjOTgomcrUsvSK/xyRFpY+4MQ2KqGAWclt6MaANsJ2ZW4fU/pgFOM2AqlyE
|
26
|
+
zLJ25TBoNYFwAyz3GqkD4rHef4an9a1ZMd3ZzJrI8KY3GdH67NYahL0=
|
27
|
+
-----END RSA PRIVATE KEY-----
|
data/spec/keys/alice.pub
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
2
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5ApVWuSH8hmUU0t855uM
|
3
|
+
nisyJSz4/HpNm+s9pFRCml3AsUKf0pFcLyip12XrzU489lOzO3vDmt5gFKEULRhR
|
4
|
+
2xTqvqGO+PIcjsDtvWOUN07BOlBUPuvkqulNZpb0A0wEuMwEQ40uzcte78e9zxie
|
5
|
+
Kt7mXfBcGrWwnFNVH73hX2zQXi2HAW8aWpkTC7RpHx7iSun0eHEo/xwhf33yIL9U
|
6
|
+
Ik5ebYuurEXuUZSkbE99QRgGoyYRM+J0IPFsJMpq4Dl+NaiiA9373nxgtdlgE7Ms
|
7
|
+
9xwDuIR+SCnZ30IE+qZZTy8FzjJ8E6/mtDU+VLgYYNJPNhQrUYo+qzwFdcfCSiyj
|
8
|
+
LwIDAQAB
|
9
|
+
-----END PUBLIC KEY-----
|
data/spec/keys/bob.pem
ADDED
@@ -0,0 +1,27 @@
|
|
1
|
+
-----BEGIN RSA PRIVATE KEY-----
|
2
|
+
MIIEowIBAAKCAQEAux0cSSixp54Q9O65y3tsUGj3AtKYSo1H6SDlDkGsYu0/y11M
|
3
|
+
JSdRPvI1Pyb3ZYaQ5J2yiWj6OPTGtTHBSyRxemHdRbAVQHukx/LBpeFKzr5YGgiV
|
4
|
+
K5GUsE3MKHY5R8HBtevLv89c56vKaaEApYjMimw5qGciknEMRDNstq45F+RHl1QE
|
5
|
+
0fVx/LEsapj4EfsBnJH0761jMXoW1T3G4krF5PPDvxCydSbZilMCHad0eqr1YQAT
|
6
|
+
rF58HwSaS0WqqeUMJHN8YxHtU7nFVWnnFFtvjLUY/KUFLVfGDju+HXv1FAUrpjSH
|
7
|
+
PY9gGELFP8sepD26Me8iIAkIy3joZXvoyKNprQIDAQABAoIBAQCEh7roKpWihne2
|
8
|
+
NHyOnq36Sk5ixm0tqOH9QtpafbOvIiHkVgG/8xg9wGpsf5oNZAGum+/AGgXZX656
|
9
|
+
2nHxWi+yIi0K1gxHbwwov03fwzIsO2/FiLy3blblhUUMh6hMpfUheJEJG8PPJ8On
|
10
|
+
i20c0kcl6D/ygpJfLQkmKVJgFgjEXSkZ4U9faZrgwXJqsmIPPwLZxcNKbHtO+mWn
|
11
|
+
ZohWqOnUgCXqazfncSr1QecbHdZ8SxEdYwK1mjeaMNbYPb5LVJ7CMhPQcRuFb+Zl
|
12
|
+
rmSRh86rpxZJkXldliC1x8YZ7cEQTblHXjzvnzNw1YdS83aq668r2YoBowh3tbHN
|
13
|
+
XysgETJVAoGBAPYGgp6Ve3t9jsYuNOO3/8B+e048Osw+FJjnwHkKIt1GFIXPAOCT
|
14
|
+
+gz1vMstxKBepUPw8+NTGeo2oYexadO+zZFHaBxgd1qLZ0kQFysK8fvGXR+gxiLQ
|
15
|
+
lOgbxKhb4cMolV5gVh4ZvfZ10hewb0YQDPeWt/MLBQZLNal09LqXGSbfAoGBAMKz
|
16
|
+
KFHSQKCklE4L4HGW/7RVDY0VNRwvSQf2nDeNPpbPHgLdFup0y02VpXvMCfnhf+zJ
|
17
|
+
lSn5u3G8ktOi0T4Gqsd04Nq+Rgo3ra01IeGk09zcORGEMpA9B+E9dfR/PcfM0C2w
|
18
|
+
3LR0CzFZMiG1Wkgn6Egh062Iv1NaIv82rFwWgPzzAoGAHn1sDq9D4GgNG656S4Zw
|
19
|
+
IbELIwT/3HQNJW4DQnzpGTcoL/UZjLuKD7Ucsql3ZtCT9rmT4CZaXdZral+oV9+b
|
20
|
+
pleNJYcnA4enQzzFQkZW+vb4b4UDSSlEaweV9a99aSxMZqfVxGE4U6UCZoEtKSew
|
21
|
+
E7cQEQTamI8VlWyzL7SuH00CgYA8Rbn1mmDnWguPHZ4di+Ecsje/tRD76KdzD6TM
|
22
|
+
ja0SgouH12mAqydEnU7dRAzSjjxL0RucIvMkAnxxh7W+vdGgbU4uaTjFcPcS55/V
|
23
|
+
enEbrhD8mzAL9ti5oY0iY0F82KqZembYdhQA8tvSE5IfRDtkGRSuY+bWptCusP4q
|
24
|
+
g8zqgQKBgB+HShQ1zmaRiwwJthCQ4b3cfaICkczLO2re53MlFcWcQ6bb27nvtT7h
|
25
|
+
/+oHUmnYoDTOuhqYdeR3F50qARIl8im7JBBnJtj5Z5HzefO7MODVgJQlGHB5NPWU
|
26
|
+
7BcrPH0xUlnLAqLes6mPiVCVElUgCf9X3/qepX/2qXlesOehTZfp
|
27
|
+
-----END RSA PRIVATE KEY-----
|
data/spec/keys/bob.pub
ADDED
@@ -0,0 +1,9 @@
|
|
1
|
+
-----BEGIN PUBLIC KEY-----
|
2
|
+
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAux0cSSixp54Q9O65y3ts
|
3
|
+
UGj3AtKYSo1H6SDlDkGsYu0/y11MJSdRPvI1Pyb3ZYaQ5J2yiWj6OPTGtTHBSyRx
|
4
|
+
emHdRbAVQHukx/LBpeFKzr5YGgiVK5GUsE3MKHY5R8HBtevLv89c56vKaaEApYjM
|
5
|
+
imw5qGciknEMRDNstq45F+RHl1QE0fVx/LEsapj4EfsBnJH0761jMXoW1T3G4krF
|
6
|
+
5PPDvxCydSbZilMCHad0eqr1YQATrF58HwSaS0WqqeUMJHN8YxHtU7nFVWnnFFtv
|
7
|
+
jLUY/KUFLVfGDju+HXv1FAUrpjSHPY9gGELFP8sepD26Me8iIAkIy3joZXvoyKNp
|
8
|
+
rQIDAQAB
|
9
|
+
-----END PUBLIC KEY-----
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Nuntius::Encodings::URLSafeBase64 do
|
4
|
+
|
5
|
+
before(:all) do
|
6
|
+
@samples = {
|
7
|
+
"" => "",
|
8
|
+
"Hello World" => "SGVsbG8gV29ybGQ",
|
9
|
+
OpenSSL::Digest::SHA512.new("").digest =>
|
10
|
+
"z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg_SpIdNs6c5H0NE8XYXysP-DGNKHfuwvY7kxvUdBeoGlODJ6-SfaPg",
|
11
|
+
"The quick brown fox jumps over the lazy dog" =>
|
12
|
+
"VGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZw"
|
13
|
+
}
|
14
|
+
end
|
15
|
+
|
16
|
+
before(:each) do
|
17
|
+
@encoder = Nuntius::Encodings::URLSafeBase64
|
18
|
+
end
|
19
|
+
|
20
|
+
it "should encode messages using RFC4648 compatible Base 64 Encoding with URL and Filename Safe Alphabet" do
|
21
|
+
@samples.each do |string,expected|
|
22
|
+
@encoder.encode(string).should == expected
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
it "should decode valid RFC4648 compatible Base 64 Encoding with URL and Filename Safe Alphabet messages" do
|
27
|
+
@samples.each do |expected,string|
|
28
|
+
@encoder.decode(string).should == expected
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
it "should raise an exception on wrongly encoded messages" do
|
33
|
+
expect { @encoder.decode "wrong encoding" }.to raise_error(Nuntius::Encodings::DecodingError)
|
34
|
+
end
|
35
|
+
|
36
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe Nuntius::Messenger do
|
4
|
+
before(:each) do
|
5
|
+
@messenger = Nuntius::Messenger.new key: get_key('bob.pem')
|
6
|
+
@alice = get_key('alice.pub')
|
7
|
+
end
|
8
|
+
|
9
|
+
it "should encrypt and sign messages" do
|
10
|
+
@envelope = @messenger.wrap message: "Hello Allice", to: @alice
|
11
|
+
|
12
|
+
@envelope.key.should_not be_nil
|
13
|
+
@envelope.signature.should_not be_nil
|
14
|
+
@envelope.data.should_not be_nil
|
15
|
+
end
|
16
|
+
|
17
|
+
it "should decrypt valid messages" do
|
18
|
+
@envelope = Nuntius::Envelope.new({
|
19
|
+
data: "EiOgHgmZQ6Lsg1QKobu5AA",
|
20
|
+
key: "PjLZjiwU9kZlOsDYhiiwf_P7Vkvd3l-rtk5MMU7EoYyObTj_H52ujyHlwuzDjgI_KyGKU95U5F8zDrjegsVTkhN6b1t73BQ8ImEOXwsicb1hwsaKbDT3PJLR5c0Zk-x_RbaAEE-7Sd3Vodg0qJul1v0b6us-uJZNX5sqjsfvvQn_LCVtgtvWKru_YzLwxVsZD4tNCu_misl6D-BOewkOHovwGiJPqirvSTR7jPWNPbQHgSL0xvdqFL6kEAwzJ_p5Oj1KH68dNeRhBKU8HwSfc8ZEMCTlcwVWMlc2NcxNhiSbjSxCHjawK5zegviqlhYhzw9J_HDMIMMe7K4gk3O_iA",
|
21
|
+
signature: "FF5BhVNFzcoQQbV9_MOsgBHpaLLWKIe0AxmXwx7dOU5QlRmlwzdJhKdQOCUHmbuJIqTfR444kEznQTyAKF66Pmk7UgFniKcmPLPHSfYf5e5BzUkYb2oXI1yqk3qOl9NTb82oVinBOQweufNyo1rmH6b5GrB811xQmzTco7Frogzt5aWGC7BY9x2FWoes633vOMvC4z3kprL4XQVVH2cqIqIvbBXtFteIagy_90HsLA4mfjf1ku5Sjzv5789L2lUUc2oCic5BqUAx0AQ2y9I_q0J8uu4MXCX3vD53Iq5IsrCr2-h6f1nWoHbYWf6aDU4pYGOqStQJRYkurnlh7docFA"
|
22
|
+
})
|
23
|
+
|
24
|
+
@messenger.unwrap(envelope: @envelope, from: @alice).should == "Hello Bob!"
|
25
|
+
end
|
26
|
+
end
|
data/spec/spec_helper.rb
ADDED
metadata
ADDED
@@ -0,0 +1,105 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: nuntius
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.1.0
|
5
|
+
prerelease:
|
6
|
+
platform: ruby
|
7
|
+
authors:
|
8
|
+
- Sebastian Gamboa
|
9
|
+
autorequire:
|
10
|
+
bindir: bin
|
11
|
+
cert_chain: []
|
12
|
+
date: 2011-12-14 00:00:00.000000000 Z
|
13
|
+
dependencies:
|
14
|
+
- !ruby/object:Gem::Dependency
|
15
|
+
name: rake
|
16
|
+
requirement: &70365147634180 !ruby/object:Gem::Requirement
|
17
|
+
none: false
|
18
|
+
requirements:
|
19
|
+
- - ! '>='
|
20
|
+
- !ruby/object:Gem::Version
|
21
|
+
version: '0'
|
22
|
+
type: :development
|
23
|
+
prerelease: false
|
24
|
+
version_requirements: *70365147634180
|
25
|
+
- !ruby/object:Gem::Dependency
|
26
|
+
name: rspec
|
27
|
+
requirement: &70365147654200 !ruby/object:Gem::Requirement
|
28
|
+
none: false
|
29
|
+
requirements:
|
30
|
+
- - ! '>='
|
31
|
+
- !ruby/object:Gem::Version
|
32
|
+
version: 2.7.0
|
33
|
+
type: :development
|
34
|
+
prerelease: false
|
35
|
+
version_requirements: *70365147654200
|
36
|
+
description: Nuntius is a simple scheme to send and receive messages in a cryptographicaly
|
37
|
+
secure and compatible way.
|
38
|
+
email: me@sagmor.com
|
39
|
+
executables: []
|
40
|
+
extensions: []
|
41
|
+
extra_rdoc_files: []
|
42
|
+
files:
|
43
|
+
- .gitignore
|
44
|
+
- Gemfile
|
45
|
+
- README.md
|
46
|
+
- Rakefile
|
47
|
+
- lib/nuntius.rb
|
48
|
+
- lib/nuntius/encodings.rb
|
49
|
+
- lib/nuntius/encodings/url_safe_base64.rb
|
50
|
+
- lib/nuntius/envelope.rb
|
51
|
+
- lib/nuntius/key.rb
|
52
|
+
- lib/nuntius/messenger.rb
|
53
|
+
- lib/nuntius/version.rb
|
54
|
+
- nuntius.gemspec
|
55
|
+
- spec/keys/alice.pem
|
56
|
+
- spec/keys/alice.pub
|
57
|
+
- spec/keys/bob.pem
|
58
|
+
- spec/keys/bob.pub
|
59
|
+
- spec/nuntius/encodings/url_safe_base64_spec.rb
|
60
|
+
- spec/nuntius/envelope_spec.rb
|
61
|
+
- spec/nuntius/key_spec.rb
|
62
|
+
- spec/nuntius/messenger_spec.rb
|
63
|
+
- spec/spec_helper.rb
|
64
|
+
- spec/support/keys.rb
|
65
|
+
homepage: https://github.com/sagmor/nuntius
|
66
|
+
licenses: []
|
67
|
+
post_install_message:
|
68
|
+
rdoc_options: []
|
69
|
+
require_paths:
|
70
|
+
- lib
|
71
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
72
|
+
none: false
|
73
|
+
requirements:
|
74
|
+
- - ! '>='
|
75
|
+
- !ruby/object:Gem::Version
|
76
|
+
version: '0'
|
77
|
+
segments:
|
78
|
+
- 0
|
79
|
+
hash: -4368469106361827398
|
80
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
81
|
+
none: false
|
82
|
+
requirements:
|
83
|
+
- - ! '>='
|
84
|
+
- !ruby/object:Gem::Version
|
85
|
+
version: '0'
|
86
|
+
segments:
|
87
|
+
- 0
|
88
|
+
hash: -4368469106361827398
|
89
|
+
requirements: []
|
90
|
+
rubyforge_project: nuntius
|
91
|
+
rubygems_version: 1.8.10
|
92
|
+
signing_key:
|
93
|
+
specification_version: 3
|
94
|
+
summary: ! 'Nuntius: A messenger, reporter, courier, bearer of news or tidings'
|
95
|
+
test_files:
|
96
|
+
- spec/keys/alice.pem
|
97
|
+
- spec/keys/alice.pub
|
98
|
+
- spec/keys/bob.pem
|
99
|
+
- spec/keys/bob.pub
|
100
|
+
- spec/nuntius/encodings/url_safe_base64_spec.rb
|
101
|
+
- spec/nuntius/envelope_spec.rb
|
102
|
+
- spec/nuntius/key_spec.rb
|
103
|
+
- spec/nuntius/messenger_spec.rb
|
104
|
+
- spec/spec_helper.rb
|
105
|
+
- spec/support/keys.rb
|