carps 0.2.3 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/PostInstall.txt +1 -1
- data/lib/carps/crypt/mailbox.rb +19 -14
- data/lib/carps/crypt/mailer.rb +29 -13
- data/lib/carps.rb +1 -1
- metadata +3 -3
data/PostInstall.txt
CHANGED
data/lib/carps/crypt/mailbox.rb
CHANGED
@@ -45,7 +45,6 @@ module CARPS
|
|
45
45
|
@sender = sender
|
46
46
|
@mail = []
|
47
47
|
@peers = {}
|
48
|
-
@secure = false
|
49
48
|
# Semaphore to make sure only one thread can send mail at any one time
|
50
49
|
@ssemaphore = Mutex.new
|
51
50
|
# Semaphore to make sure only one thread can receive mail at any one time
|
@@ -125,16 +124,17 @@ module CARPS
|
|
125
124
|
@mail.each_index do |index|
|
126
125
|
mail = @mail[index]
|
127
126
|
from = mail.from
|
128
|
-
|
129
|
-
|
127
|
+
peer = @peers[from]
|
128
|
+
if peer
|
129
|
+
unless peer.verify mail
|
130
130
|
remove_mail index
|
131
131
|
next
|
132
132
|
end
|
133
|
-
|
134
|
-
|
135
|
-
|
136
|
-
|
137
|
-
|
133
|
+
pass = appropriate? mail, type, must_be_from
|
134
|
+
if pass
|
135
|
+
remove_mail index
|
136
|
+
return mail
|
137
|
+
end
|
138
138
|
end
|
139
139
|
end
|
140
140
|
nil
|
@@ -150,23 +150,28 @@ module CARPS
|
|
150
150
|
pass and @manager.belong? mail
|
151
151
|
end
|
152
152
|
|
153
|
+
# Was the mail message appropriate? (To a degree)
|
154
|
+
def insecure_appropriate? mail, type, must_be_from
|
155
|
+
pass = mail.class == type
|
156
|
+
if must_be_from
|
157
|
+
pass = pass and mail.from == must_be_from
|
158
|
+
end
|
159
|
+
pass
|
160
|
+
end
|
161
|
+
|
162
|
+
|
153
163
|
# Remove a mail message
|
154
164
|
def remove_mail index
|
155
165
|
@mail[index].delete
|
156
166
|
@mail.delete_at index
|
157
167
|
end
|
158
168
|
|
159
|
-
# Communication with someone is secure if there is a peer for them
|
160
|
-
def secure addr
|
161
|
-
@peers.member? addr
|
162
|
-
end
|
163
|
-
|
164
169
|
# Insecurely see if there is an appropriate message in the mail box
|
165
170
|
def insecure_search type, must_be_from
|
166
171
|
@rsemaphore.synchronize do
|
167
172
|
@mail.each_index do |index|
|
168
173
|
mail = @mail[index]
|
169
|
-
pass =
|
174
|
+
pass = insecure_appropriate? mail, type, must_be_from
|
170
175
|
if pass
|
171
176
|
remove_mail index
|
172
177
|
return mail
|
data/lib/carps/crypt/mailer.rb
CHANGED
@@ -33,6 +33,8 @@ require "digest/md5"
|
|
33
33
|
|
34
34
|
require "openssl"
|
35
35
|
|
36
|
+
require "set"
|
37
|
+
|
36
38
|
module CARPS
|
37
39
|
|
38
40
|
# High level CARPS mail client supporting strong cryptographic message signing.
|
@@ -51,6 +53,7 @@ module CARPS
|
|
51
53
|
@mailbox = mailbox
|
52
54
|
@private_key = get_keys
|
53
55
|
@public_key = @private_key.public_key
|
56
|
+
@current_handshakes = Set.new
|
54
57
|
# Load the old peers
|
55
58
|
load_peers
|
56
59
|
end
|
@@ -61,6 +64,7 @@ module CARPS
|
|
61
64
|
puts "No need for handshake: " + to + " is already a known peer."
|
62
65
|
else
|
63
66
|
puts "Offering cryptographic handshake to #{to}"
|
67
|
+
@current_handshakes.add to
|
64
68
|
# Create a new peer
|
65
69
|
peer = Peer.new to
|
66
70
|
@mailbox.add_peer peer
|
@@ -73,7 +77,11 @@ module CARPS
|
|
73
77
|
# Send our key
|
74
78
|
send to, PublicKey.new(@public_key)
|
75
79
|
# Receive an okay message
|
76
|
-
|
80
|
+
#
|
81
|
+
# Has to be insecure for now... :(
|
82
|
+
#
|
83
|
+
# This is because the client may not know the session yet.
|
84
|
+
@mailbox.insecure_read AcceptHandshake, to
|
77
85
|
puts "Established spoof-proof communications with #{to}"
|
78
86
|
end
|
79
87
|
end
|
@@ -99,18 +107,21 @@ module CARPS
|
|
99
107
|
# See if the user accepts the handshake.
|
100
108
|
accept = accept_handshake? from
|
101
109
|
if accept
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
|
107
|
-
|
108
|
-
|
109
|
-
|
110
|
-
|
111
|
-
|
112
|
-
|
113
|
-
|
110
|
+
Thread.fork do
|
111
|
+
@current_handshakes.add from
|
112
|
+
# Send our key to the peer
|
113
|
+
send from, PublicKey.new(@public_key)
|
114
|
+
# Get their key
|
115
|
+
peer_key = @mailbox.insecure_read PublicKey, from
|
116
|
+
# Create a new peer
|
117
|
+
peer = Peer.new from
|
118
|
+
@mailbox.add_peer peer
|
119
|
+
peer.your_key peer_key.key
|
120
|
+
peer.save
|
121
|
+
# Send an okay message
|
122
|
+
send from, AcceptHandshake.new
|
123
|
+
puts "Established spoof-proof communications with #{from}."
|
124
|
+
end
|
114
125
|
end
|
115
126
|
end
|
116
127
|
end
|
@@ -122,6 +133,11 @@ module CARPS
|
|
122
133
|
|
123
134
|
# Send a message
|
124
135
|
def send to, message
|
136
|
+
unless @mailbox.peer?(to) or @current_handshakes.include?(to)
|
137
|
+
Thread.fork do
|
138
|
+
handshake to
|
139
|
+
end
|
140
|
+
end
|
125
141
|
text = message.emit
|
126
142
|
# The mailbox tags the message with a session key
|
127
143
|
text = @mailbox.tag text
|
data/lib/carps.rb
CHANGED
metadata
CHANGED
@@ -4,9 +4,9 @@ version: !ruby/object:Gem::Version
|
|
4
4
|
prerelease: false
|
5
5
|
segments:
|
6
6
|
- 0
|
7
|
-
- 2
|
8
7
|
- 3
|
9
|
-
|
8
|
+
- 0
|
9
|
+
version: 0.3.0
|
10
10
|
platform: ruby
|
11
11
|
authors:
|
12
12
|
- John Morrice
|
@@ -257,7 +257,7 @@ post_install_message: |
|
|
257
257
|
o
|
258
258
|
><> ><> ><>
|
259
259
|
|
260
|
-
Thank you for installing CARPS 0.
|
260
|
+
Thank you for installing CARPS 0.3.0
|
261
261
|
|
262
262
|
For help, run:
|
263
263
|
|