nuntius 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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
|