ffi-rzmq 2.0.0 → 2.0.7
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.
- checksums.yaml +5 -5
- data/.travis.yml +5 -6
- data/AUTHORS.txt +3 -1
- data/History.txt +60 -0
- data/README.rdoc +65 -25
- data/Rakefile +15 -0
- data/examples/repreq_over_curve.rb +60 -0
- data/ffi-rzmq.gemspec +2 -2
- data/lib/ffi-rzmq/context.rb +3 -3
- data/lib/ffi-rzmq/exceptions.rb +3 -0
- data/lib/ffi-rzmq/poll_item.rb +0 -1
- data/lib/ffi-rzmq/socket.rb +3 -4
- data/lib/ffi-rzmq/util.rb +17 -0
- data/lib/ffi-rzmq/version.rb +1 -1
- data/lib/ffi-rzmq.rb +2 -1
- data/lib/io_extensions.rb +1 -1
- data/spec/context_spec.rb +16 -16
- data/spec/device_spec.rb +6 -6
- data/spec/message_spec.rb +13 -13
- data/spec/multipart_spec.rb +11 -11
- data/spec/nonblocking_recv_spec.rb +15 -15
- data/spec/poll_spec.rb +49 -49
- data/spec/pushpull_spec.rb +8 -8
- data/spec/reqrep_spec.rb +9 -9
- data/spec/socket_spec.rb +77 -77
- data/spec/support/generate_keys_and_certs.rb +41 -0
- data/spec/support/test.crt +26 -13
- data/spec/support/test.key +49 -13
- data/spec/util_spec.rb +29 -0
- data/travis_build_script.sh +27 -0
- metadata +24 -18
data/spec/socket_spec.rb
CHANGED
@@ -16,21 +16,21 @@ module ZMQ
|
|
16
16
|
|
17
17
|
|
18
18
|
it "should raise an error for a nil context" do
|
19
|
-
|
19
|
+
expect { Socket.new(FFI::Pointer.new(0), ZMQ::REQ) }.to raise_exception(ZMQ::ContextError)
|
20
20
|
end
|
21
21
|
|
22
22
|
it "works with a Context#pointer as the context_ptr" do
|
23
|
-
|
23
|
+
expect do
|
24
24
|
s = Socket.new(@ctx.pointer, ZMQ::REQ)
|
25
25
|
s.close
|
26
|
-
end.
|
26
|
+
end.not_to raise_exception
|
27
27
|
end
|
28
28
|
|
29
29
|
it "works with a Context instance as the context_ptr" do
|
30
|
-
|
30
|
+
expect do
|
31
31
|
s = Socket.new(@ctx, ZMQ::SUB)
|
32
32
|
s.close
|
33
|
-
end.
|
33
|
+
end.not_to raise_exception
|
34
34
|
end
|
35
35
|
|
36
36
|
|
@@ -38,22 +38,22 @@ module ZMQ
|
|
38
38
|
|
39
39
|
it "should not raise an error for a [#{ZMQ::SocketTypeNameMap[socket_type]}] socket type" do
|
40
40
|
sock = nil
|
41
|
-
|
41
|
+
expect { sock = Socket.new(@ctx.pointer, socket_type) }.not_to raise_error
|
42
42
|
sock.close
|
43
43
|
end
|
44
44
|
end # each socket_type
|
45
45
|
|
46
46
|
it "should set the :socket accessor to the raw socket allocated by libzmq" do
|
47
47
|
socket = double('socket')
|
48
|
-
socket.
|
49
|
-
LibZMQ.
|
48
|
+
allow(socket).to receive(:null?).and_return(false)
|
49
|
+
expect(LibZMQ).to receive(:zmq_socket).and_return(socket)
|
50
50
|
|
51
51
|
sock = Socket.new(@ctx.pointer, ZMQ::REQ)
|
52
|
-
sock.socket.
|
52
|
+
expect(sock.socket).to eq(socket)
|
53
53
|
end
|
54
54
|
|
55
55
|
it "should define a finalizer on this object" do
|
56
|
-
ObjectSpace.
|
56
|
+
expect(ObjectSpace).to receive(:define_finalizer).at_least(1)
|
57
57
|
sock = Socket.new(@ctx.pointer, ZMQ::REQ)
|
58
58
|
sock.close
|
59
59
|
end
|
@@ -77,7 +77,7 @@ module ZMQ
|
|
77
77
|
sock = Socket.new @ctx.pointer, ZMQ::REQ
|
78
78
|
raw_socket = sock.socket
|
79
79
|
|
80
|
-
LibZMQ.
|
80
|
+
expect(LibZMQ).to receive(:close).with(raw_socket)
|
81
81
|
sock.close
|
82
82
|
sock.close
|
83
83
|
LibZMQ.close raw_socket # *really close it otherwise the context will block indefinitely
|
@@ -94,7 +94,7 @@ module ZMQ
|
|
94
94
|
sock = Socket.new @ctx.pointer, ZMQ::REQ
|
95
95
|
|
96
96
|
sock.identity = ('a' * 256)
|
97
|
-
sock.identity.
|
97
|
+
expect(sock.identity).to eq('')
|
98
98
|
sock.close
|
99
99
|
end
|
100
100
|
|
@@ -102,7 +102,7 @@ module ZMQ
|
|
102
102
|
sock = Socket.new @ctx.pointer, ZMQ::REQ
|
103
103
|
|
104
104
|
sock.identity = ''
|
105
|
-
sock.identity.
|
105
|
+
expect(sock.identity).to eq('')
|
106
106
|
sock.close
|
107
107
|
end
|
108
108
|
|
@@ -110,7 +110,7 @@ module ZMQ
|
|
110
110
|
sock = Socket.new @ctx.pointer, ZMQ::REQ
|
111
111
|
|
112
112
|
sock.identity = 'a'
|
113
|
-
sock.identity.
|
113
|
+
expect(sock.identity).to eq('a')
|
114
114
|
sock.close
|
115
115
|
end
|
116
116
|
|
@@ -118,7 +118,7 @@ module ZMQ
|
|
118
118
|
sock = Socket.new @ctx.pointer, ZMQ::REQ
|
119
119
|
|
120
120
|
sock.identity = ('a' * 255)
|
121
|
-
sock.identity.
|
121
|
+
expect(sock.identity).to eq('a' * 255)
|
122
122
|
sock.close
|
123
123
|
end
|
124
124
|
|
@@ -126,7 +126,7 @@ module ZMQ
|
|
126
126
|
sock = Socket.new @ctx.pointer, ZMQ::REQ
|
127
127
|
|
128
128
|
sock.identity = 7
|
129
|
-
sock.identity.
|
129
|
+
expect(sock.identity).to eq('7')
|
130
130
|
sock.close
|
131
131
|
end
|
132
132
|
end # context identity=
|
@@ -157,8 +157,8 @@ module ZMQ
|
|
157
157
|
|
158
158
|
array = []
|
159
159
|
rc = socket.getsockopt(ZMQ::IDENTITY, array)
|
160
|
-
rc.
|
161
|
-
array[0].
|
160
|
+
expect(rc).to eq(0)
|
161
|
+
expect(array[0]).to eq(identity)
|
162
162
|
end
|
163
163
|
end
|
164
164
|
|
@@ -166,7 +166,7 @@ module ZMQ
|
|
166
166
|
identity = 'a' * 256
|
167
167
|
array = []
|
168
168
|
rc = socket.setsockopt(ZMQ::IDENTITY, identity)
|
169
|
-
rc.
|
169
|
+
expect(rc).to eq(-1)
|
170
170
|
end
|
171
171
|
end # context using option ZMQ::IDENTITY
|
172
172
|
|
@@ -176,28 +176,28 @@ module ZMQ
|
|
176
176
|
socket.setsockopt ZMQ::IPV4ONLY, value
|
177
177
|
array = []
|
178
178
|
rc = socket.getsockopt(ZMQ::IPV4ONLY, array)
|
179
|
-
rc.
|
180
|
-
array[0].
|
179
|
+
expect(rc).to eq(0)
|
180
|
+
expect(array[0]).to eq(value)
|
181
181
|
end
|
182
182
|
|
183
183
|
it "should default to a value of 1" do
|
184
184
|
value = 1
|
185
185
|
array = []
|
186
186
|
rc = socket.getsockopt(ZMQ::IPV4ONLY, array)
|
187
|
-
rc.
|
188
|
-
array[0].
|
187
|
+
expect(rc).to eq(0)
|
188
|
+
expect(array[0]).to eq(value)
|
189
189
|
end
|
190
190
|
|
191
191
|
it "returns -1 given a negative value" do
|
192
192
|
value = -1
|
193
193
|
rc = socket.setsockopt ZMQ::IPV4ONLY, value
|
194
|
-
rc.
|
194
|
+
expect(rc).to eq(-1)
|
195
195
|
end
|
196
196
|
|
197
197
|
it "returns -1 given a value > 1" do
|
198
198
|
value = 2
|
199
199
|
rc = socket.setsockopt ZMQ::IPV4ONLY, value
|
200
|
-
rc.
|
200
|
+
expect(rc).to eq(-1)
|
201
201
|
end
|
202
202
|
end # context using option ZMQ::IPV4ONLY
|
203
203
|
|
@@ -206,10 +206,10 @@ module ZMQ
|
|
206
206
|
random_port = bind_to_random_tcp_port(socket, max_tries = 500)
|
207
207
|
array = []
|
208
208
|
rc = socket.getsockopt(ZMQ::LAST_ENDPOINT, array)
|
209
|
-
ZMQ::Util.resultcode_ok?(rc).
|
209
|
+
expect(ZMQ::Util.resultcode_ok?(rc)).to eq(true)
|
210
210
|
endpoint_regex = %r{\Atcp://(.*):(\d+)\0\z}
|
211
|
-
array[0].
|
212
|
-
Integer(array[0][endpoint_regex, 2]).
|
211
|
+
expect(array[0]).to match(endpoint_regex)
|
212
|
+
expect(Integer(array[0][endpoint_regex, 2])).to eq(random_port)
|
213
213
|
end
|
214
214
|
end
|
215
215
|
|
@@ -217,12 +217,12 @@ module ZMQ
|
|
217
217
|
if ZMQ::SUB == socket_type
|
218
218
|
it "returns 0 for a SUB socket" do
|
219
219
|
rc = socket.setsockopt(ZMQ::SUBSCRIBE, "topic.string")
|
220
|
-
rc.
|
220
|
+
expect(rc).to eq(0)
|
221
221
|
end
|
222
222
|
else
|
223
223
|
it "returns -1 for non-SUB sockets" do
|
224
224
|
rc = socket.setsockopt(ZMQ::SUBSCRIBE, "topic.string")
|
225
|
-
rc.
|
225
|
+
expect(rc).to eq(-1)
|
226
226
|
end
|
227
227
|
end
|
228
228
|
end # context using option ZMQ::SUBSCRIBE
|
@@ -233,13 +233,13 @@ module ZMQ
|
|
233
233
|
it "returns 0 given a topic string that was previously subscribed" do
|
234
234
|
socket.setsockopt ZMQ::SUBSCRIBE, "topic.string"
|
235
235
|
rc = socket.setsockopt(ZMQ::UNSUBSCRIBE, "topic.string")
|
236
|
-
rc.
|
236
|
+
expect(rc).to eq(0)
|
237
237
|
end
|
238
238
|
|
239
239
|
else
|
240
240
|
it "returns -1 for non-SUB sockets" do
|
241
241
|
rc = socket.setsockopt(ZMQ::UNSUBSCRIBE, "topic.string")
|
242
|
-
rc.
|
242
|
+
expect(rc).to eq(-1)
|
243
243
|
end
|
244
244
|
end
|
245
245
|
end # context using option ZMQ::UNSUBSCRIBE
|
@@ -251,8 +251,8 @@ module ZMQ
|
|
251
251
|
socket.setsockopt ZMQ::AFFINITY, affinity
|
252
252
|
array = []
|
253
253
|
rc = socket.getsockopt(ZMQ::AFFINITY, array)
|
254
|
-
rc.
|
255
|
-
array[0].
|
254
|
+
expect(rc).to eq(0)
|
255
|
+
expect(array[0]).to eq(affinity)
|
256
256
|
end
|
257
257
|
end # context using option ZMQ::AFFINITY
|
258
258
|
|
@@ -263,14 +263,14 @@ module ZMQ
|
|
263
263
|
socket.setsockopt ZMQ::RATE, rate
|
264
264
|
array = []
|
265
265
|
rc = socket.getsockopt(ZMQ::RATE, array)
|
266
|
-
rc.
|
267
|
-
array[0].
|
266
|
+
expect(rc).to eq(0)
|
267
|
+
expect(array[0]).to eq(rate)
|
268
268
|
end
|
269
269
|
|
270
270
|
it "returns -1 given a negative value" do
|
271
271
|
rate = -200
|
272
272
|
rc = socket.setsockopt ZMQ::RATE, rate
|
273
|
-
rc.
|
273
|
+
expect(rc).to eq(-1)
|
274
274
|
end
|
275
275
|
end # context using option ZMQ::RATE
|
276
276
|
|
@@ -281,14 +281,14 @@ module ZMQ
|
|
281
281
|
socket.setsockopt ZMQ::RECOVERY_IVL, rate
|
282
282
|
array = []
|
283
283
|
rc = socket.getsockopt(ZMQ::RECOVERY_IVL, array)
|
284
|
-
rc.
|
285
|
-
array[0].
|
284
|
+
expect(rc).to eq(0)
|
285
|
+
expect(array[0]).to eq(rate)
|
286
286
|
end
|
287
287
|
|
288
288
|
it "returns -1 given a negative value" do
|
289
289
|
rate = -200
|
290
290
|
rc = socket.setsockopt ZMQ::RECOVERY_IVL, rate
|
291
|
-
rc.
|
291
|
+
expect(rc).to eq(-1)
|
292
292
|
end
|
293
293
|
end # context using option ZMQ::RECOVERY_IVL
|
294
294
|
|
@@ -299,8 +299,8 @@ module ZMQ
|
|
299
299
|
socket.setsockopt ZMQ::SNDBUF, size
|
300
300
|
array = []
|
301
301
|
rc = socket.getsockopt(ZMQ::SNDBUF, array)
|
302
|
-
rc.
|
303
|
-
array[0].
|
302
|
+
expect(rc).to eq(0)
|
303
|
+
expect(array[0]).to eq(size)
|
304
304
|
end
|
305
305
|
end # context using option ZMQ::SNDBUF
|
306
306
|
|
@@ -311,8 +311,8 @@ module ZMQ
|
|
311
311
|
socket.setsockopt ZMQ::RCVBUF, size
|
312
312
|
array = []
|
313
313
|
rc = socket.getsockopt(ZMQ::RCVBUF, array)
|
314
|
-
rc.
|
315
|
-
array[0].
|
314
|
+
expect(rc).to eq(0)
|
315
|
+
expect(array[0]).to eq(size)
|
316
316
|
end
|
317
317
|
end # context using option ZMQ::RCVBUF
|
318
318
|
|
@@ -323,8 +323,8 @@ module ZMQ
|
|
323
323
|
socket.setsockopt ZMQ::LINGER, value
|
324
324
|
array = []
|
325
325
|
rc = socket.getsockopt(ZMQ::LINGER, array)
|
326
|
-
rc.
|
327
|
-
array[0].
|
326
|
+
expect(rc).to eq(0)
|
327
|
+
expect(array[0]).to eq(value)
|
328
328
|
end
|
329
329
|
|
330
330
|
it "should set the socket message linger option to 0 for dropping packets" do
|
@@ -332,16 +332,16 @@ module ZMQ
|
|
332
332
|
socket.setsockopt ZMQ::LINGER, value
|
333
333
|
array = []
|
334
334
|
rc = socket.getsockopt(ZMQ::LINGER, array)
|
335
|
-
rc.
|
336
|
-
array[0].
|
335
|
+
expect(rc).to eq(0)
|
336
|
+
expect(array[0]).to eq(value)
|
337
337
|
end
|
338
338
|
|
339
339
|
it "should default to a value of 0" do
|
340
340
|
value = [SUB, XSUB].include?(socket_type) ? 0 : -1
|
341
341
|
array = []
|
342
342
|
rc = socket.getsockopt(ZMQ::LINGER, array)
|
343
|
-
rc.
|
344
|
-
array[0].
|
343
|
+
expect(rc).to eq(0)
|
344
|
+
expect(array[0]).to eq(value)
|
345
345
|
end
|
346
346
|
end # context using option ZMQ::LINGER
|
347
347
|
|
@@ -352,16 +352,16 @@ module ZMQ
|
|
352
352
|
socket.setsockopt ZMQ::RECONNECT_IVL, value
|
353
353
|
array = []
|
354
354
|
rc = socket.getsockopt(ZMQ::RECONNECT_IVL, array)
|
355
|
-
rc.
|
356
|
-
array[0].
|
355
|
+
expect(rc).to eq(0)
|
356
|
+
expect(array[0]).to eq(value)
|
357
357
|
end
|
358
358
|
|
359
359
|
it "should default to a value of 100" do
|
360
360
|
value = 100
|
361
361
|
array = []
|
362
362
|
rc = socket.getsockopt(ZMQ::RECONNECT_IVL, array)
|
363
|
-
rc.
|
364
|
-
array[0].
|
363
|
+
expect(rc).to eq(0)
|
364
|
+
expect(array[0]).to eq(value)
|
365
365
|
end
|
366
366
|
end # context using option ZMQ::RECONNECT_IVL
|
367
367
|
|
@@ -370,19 +370,19 @@ module ZMQ
|
|
370
370
|
it "should set the maximum number of pending socket connections given a positive value" do
|
371
371
|
value = 200
|
372
372
|
rc = socket.setsockopt ZMQ::BACKLOG, value
|
373
|
-
rc.
|
373
|
+
expect(rc).to eq(0)
|
374
374
|
array = []
|
375
375
|
rc = socket.getsockopt(ZMQ::BACKLOG, array)
|
376
|
-
rc.
|
377
|
-
array[0].
|
376
|
+
expect(rc).to eq(0)
|
377
|
+
expect(array[0]).to eq(value)
|
378
378
|
end
|
379
379
|
|
380
380
|
it "should default to a value of 100" do
|
381
381
|
value = 100
|
382
382
|
array = []
|
383
383
|
rc = socket.getsockopt(ZMQ::BACKLOG, array)
|
384
|
-
rc.
|
385
|
-
array[0].
|
384
|
+
expect(rc).to eq(0)
|
385
|
+
expect(array[0]).to eq(value)
|
386
386
|
end
|
387
387
|
end # context using option ZMQ::BACKLOG
|
388
388
|
|
@@ -408,8 +408,8 @@ module ZMQ
|
|
408
408
|
it "should return an FD as a positive integer" do
|
409
409
|
array = []
|
410
410
|
rc = socket.getsockopt(ZMQ::FD, array)
|
411
|
-
rc.
|
412
|
-
array[0].
|
411
|
+
expect(rc).to eq(0)
|
412
|
+
expect(array[0]).to be > 0
|
413
413
|
end
|
414
414
|
|
415
415
|
it "returns a valid FD that is accepted by the system poll() function" do
|
@@ -434,7 +434,7 @@ module ZMQ
|
|
434
434
|
|
435
435
|
array = []
|
436
436
|
rc = socket.getsockopt(ZMQ::FD, array)
|
437
|
-
rc.
|
437
|
+
expect(rc).to eq(0)
|
438
438
|
fd = array[0]
|
439
439
|
|
440
440
|
# setup the BSD poll_fd struct
|
@@ -444,18 +444,18 @@ module ZMQ
|
|
444
444
|
pollfd[:revents] = 0
|
445
445
|
|
446
446
|
rc = LibSocket.poll(pollfd, 1, 0)
|
447
|
-
rc.
|
447
|
+
expect(rc).to eq(0)
|
448
448
|
end
|
449
449
|
end
|
450
450
|
|
451
451
|
end # posix platform
|
452
452
|
|
453
453
|
context "using option ZMQ::EVENTS" do
|
454
|
-
it "should return a mask of events as
|
454
|
+
it "should return a mask of events as an Integer" do
|
455
455
|
array = []
|
456
456
|
rc = socket.getsockopt(ZMQ::EVENTS, array)
|
457
|
-
rc.
|
458
|
-
array[0].
|
457
|
+
expect(rc).to eq(0)
|
458
|
+
expect(array[0]).to be_a(Integer)
|
459
459
|
end
|
460
460
|
end
|
461
461
|
|
@@ -463,8 +463,8 @@ module ZMQ
|
|
463
463
|
it "should return the socket type" do
|
464
464
|
array = []
|
465
465
|
rc = socket.getsockopt(ZMQ::TYPE, array)
|
466
|
-
rc.
|
467
|
-
array[0].
|
466
|
+
expect(rc).to eq(0)
|
467
|
+
expect(array[0]).to eq(socket_type)
|
468
468
|
end
|
469
469
|
end
|
470
470
|
end # context #getsockopt
|
@@ -479,29 +479,29 @@ module ZMQ
|
|
479
479
|
it "SUB socket that received a message always has POLLIN set" do
|
480
480
|
events = []
|
481
481
|
rc = @sub.getsockopt(ZMQ::EVENTS, events)
|
482
|
-
rc.
|
483
|
-
events[0].
|
482
|
+
expect(rc).to eq(0)
|
483
|
+
expect(events[0]).to eq ZMQ::POLLIN
|
484
484
|
end
|
485
485
|
|
486
486
|
it "PUB socket always has POLLOUT set" do
|
487
487
|
events = []
|
488
488
|
rc = @pub.getsockopt(ZMQ::EVENTS, events)
|
489
|
-
rc.
|
490
|
-
events[0].
|
489
|
+
expect(rc).to eq(0)
|
490
|
+
expect(events[0]).to eq ZMQ::POLLOUT
|
491
491
|
end
|
492
492
|
|
493
493
|
it "PUB socket never has POLLIN set" do
|
494
494
|
events = []
|
495
495
|
rc = @pub.getsockopt(ZMQ::EVENTS, events)
|
496
|
-
rc.
|
497
|
-
events[0].
|
496
|
+
expect(rc).to eq(0)
|
497
|
+
expect(events[0]).not_to eq ZMQ::POLLIN
|
498
498
|
end
|
499
499
|
|
500
500
|
it "SUB socket never has POLLOUT set" do
|
501
501
|
events = []
|
502
502
|
rc = @sub.getsockopt(ZMQ::EVENTS, events)
|
503
|
-
rc.
|
504
|
-
events[0].
|
503
|
+
expect(rc).to eq(0)
|
504
|
+
expect(events[0]).not_to eq ZMQ::POLLOUT
|
505
505
|
end
|
506
506
|
end # shared example for pubsub
|
507
507
|
|
@@ -514,7 +514,7 @@ module ZMQ
|
|
514
514
|
endpoint = "inproc://socket_test"
|
515
515
|
@sub = @ctx.socket ZMQ::SUB
|
516
516
|
rc = @sub.setsockopt ZMQ::SUBSCRIBE, ''
|
517
|
-
rc.
|
517
|
+
expect(rc).to eq(0)
|
518
518
|
|
519
519
|
@pub = @ctx.socket ZMQ::PUB
|
520
520
|
@sub.bind(endpoint)
|
@@ -0,0 +1,41 @@
|
|
1
|
+
# Copied from Debian:
|
2
|
+
# https://salsa.debian.org/ruby-team/ruby-ffi-rzmq/commit/15ad9dd6f4c3358acbd7db2c7e288aae2d5efcf8
|
3
|
+
#
|
4
|
+
# Script should be run from the spec/support directory.
|
5
|
+
#
|
6
|
+
|
7
|
+
require "openssl"
|
8
|
+
|
9
|
+
key = OpenSSL::PKey::RSA.new 4096
|
10
|
+
|
11
|
+
open 'private_key.pem', 'w' do |io| io.write key.to_pem end
|
12
|
+
open 'public_key.pem', 'w' do |io| io.write key.public_key.to_pem end
|
13
|
+
|
14
|
+
|
15
|
+
name = OpenSSL::X509::Name.parse 'CN=nobody/DC=example'
|
16
|
+
|
17
|
+
cert = OpenSSL::X509::Certificate.new
|
18
|
+
cert.version = 2
|
19
|
+
cert.serial = 0
|
20
|
+
cert.not_before = Time.now
|
21
|
+
cert.not_after = Time.now + 3600*24*365*10
|
22
|
+
|
23
|
+
cert.public_key = key.public_key
|
24
|
+
cert.subject = name
|
25
|
+
cert.issuer = name
|
26
|
+
|
27
|
+
extension_factory = OpenSSL::X509::ExtensionFactory.new
|
28
|
+
extension_factory.subject_certificate = cert
|
29
|
+
extension_factory.issuer_certificate = cert
|
30
|
+
|
31
|
+
cert.add_extension \
|
32
|
+
extension_factory.create_extension('subjectKeyIdentifier', 'hash')
|
33
|
+
cert.sign key, OpenSSL::Digest::SHA1.new
|
34
|
+
open 'ca.pem', 'w' do |io|
|
35
|
+
io.write cert.to_pem
|
36
|
+
end
|
37
|
+
|
38
|
+
require 'fileutils'
|
39
|
+
|
40
|
+
FileUtils.cp 'ca.pem', 'test.crt'
|
41
|
+
FileUtils.cp 'private_key.pem', 'test.key'
|
data/spec/support/test.crt
CHANGED
@@ -1,15 +1,28 @@
|
|
1
1
|
-----BEGIN CERTIFICATE-----
|
2
|
-
|
3
|
-
|
4
|
-
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
2
|
+
MIIE1DCCArygAwIBAgIBADANBgkqhkiG9w0BAQUFADAcMRowGAYDVQQDDBFub2Jv
|
3
|
+
ZHkvREM9ZXhhbXBsZTAeFw0xOTAxMDUxNjAxMThaFw0yOTAxMDIxNjAxMThaMBwx
|
4
|
+
GjAYBgNVBAMMEW5vYm9keS9EQz1leGFtcGxlMIICIjANBgkqhkiG9w0BAQEFAAOC
|
5
|
+
Ag8AMIICCgKCAgEA5oQhrlSbC9UjEihMsnoF4JFk38HVOkiVRRtLr+UWBYEXI5Xt
|
6
|
+
aKXoz1OFgZuVUQWuNrZ7HKaSGzZUSlp1AKx9svLzlCrDP4q/s31ZYE3fnAOvbEVH
|
7
|
+
+Xfns1gLYhSZEbYIzv5waW3hFLXQmZMSgvU6XB2cO7vZivTzjhvhPwkkIY5G23Ta
|
8
|
+
20hemZKd7cKI+ricyTeg7eQ3QoNmCbSDvcAz/CiePX4qYwKfE6wBEcKRPB2F2LfW
|
9
|
+
U3V8oNdAY2otSXOKLvxXgqsMaUUo/+TZAdOAdCG1bhInV2z30KbtjYuoldN6Qpml
|
10
|
+
v+jmzlTkEIg2JO0VwkSrkI3F7UBz/sNFj1xYx8KY76KsfFQ7TyCMMuJJ8WC58Q9J
|
11
|
+
+tz/tx2uLxWU/hFjc7OPJ2lL4pNxAi3r6D5KYHQOplLGGB9x5F2ulkjo0Ea4CUR5
|
12
|
+
2yh8mxHSTrETjLzV+Z6bjbqL178Kfelvpd0ZjuqvrUBXDdj6t+VglICw78bX+GQR
|
13
|
+
QpCzl4n65A1WZYJSQzccGKlipgfypEMalv3QLZxyJe1w8xtkuB+rBGb3m5c6xSok
|
14
|
+
K4q11szlBS7lN439oY5NEKULRUyMqt++0y/l7bWsGmJpl5I03HA044cYXGm4WwCE
|
15
|
+
Ldp+geNAF6DP1vIcrvCJSzJZX78NaxSHQ8WFvTt+W9WnMnmiQnAjBk8TP88CAwEA
|
16
|
+
AaMhMB8wHQYDVR0OBBYEFFY+V2zaAFjUn9dZHWzXOzmR6GoIMA0GCSqGSIb3DQEB
|
17
|
+
BQUAA4ICAQBO2snAHYhn0lwSpp6rql1VUJexndMhTdDMpYV+VAyqGsVsmq3iD2aC
|
18
|
+
O9CWtyGRfiK3AsxjCIQjP/n19YzYoxs6/eSCWnpMd4WlL+W2Nkgj/2fUdvV3qM7Y
|
19
|
+
dv+jd5ov1Dxoz/nUbhxXozMd7V7k0EdqpjObp8sED/eO3niuSfbGO6Ef2DwjqOWK
|
20
|
+
ukLMO7l67sAcHH1tW8fbvSPpVZ8NJdJx6Q5C+/lTDpDQP7OlRjXe5T7h4fl1OOEZ
|
21
|
+
hCpW+Hq3Jf/uqH9zbjynVncqgd6PkO2BCuD9P+aDBZ6no5+3jebTlx+OHndrgXgH
|
22
|
+
9QN0ifiQGMcBYh4Iv0JQgSiW8dGzYuP8BsxJ3fOWGW9wZAelvI3lS9Yii6GVH44D
|
23
|
+
QdhQlYwpoiZq1A2kOzsKy86nejRpeQg965ddNLw1yNMJO9yL1FtmwEiF9VLvhdTd
|
24
|
+
gh92imoxNtOyBiGvqn537+ZrQmQPU8OM0zySI9+mhC6E7ASTVquGUC5bCHSjavVR
|
25
|
+
AaeQoXQp0NwqoO6Qw9QIAVRaW0cPw3lnIZLGk++XHuWkrgkqdQMcKit80oiGZ+Bq
|
26
|
+
usfXTVeXMoYjw2MJ+RRxkePD4FXCulErG10Dqga36zMTrq1UqbVDVMjkO2OAbypW
|
27
|
+
Z5PCmTr1vgYgzSHr/bx833wWP/8KyClU78YF4nZSmAgywXfSjo2rpA==
|
15
28
|
-----END CERTIFICATE-----
|
data/spec/support/test.key
CHANGED
@@ -1,15 +1,51 @@
|
|
1
1
|
-----BEGIN RSA PRIVATE KEY-----
|
2
|
-
|
3
|
-
|
4
|
-
+
|
5
|
-
|
6
|
-
|
7
|
-
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
2
|
+
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
|
15
51
|
-----END RSA PRIVATE KEY-----
|
data/spec/util_spec.rb
ADDED
@@ -0,0 +1,29 @@
|
|
1
|
+
require File.join(File.dirname(__FILE__), %w[spec_helper])
|
2
|
+
|
3
|
+
module ZMQ
|
4
|
+
describe Util do
|
5
|
+
|
6
|
+
if LibZMQ.version4?
|
7
|
+
describe "curve_keypair" do
|
8
|
+
|
9
|
+
it "returns a set of public and private keys (libsodium linked)" do
|
10
|
+
expect(ZMQ::Util).to receive(:curve_keypair).and_return([0, 1])
|
11
|
+
public_key, private_key = ZMQ::Util.curve_keypair
|
12
|
+
|
13
|
+
expect(public_key).not_to eq private_key
|
14
|
+
expect(public_key).not_to be_nil
|
15
|
+
expect(private_key).not_to be_nil
|
16
|
+
end
|
17
|
+
|
18
|
+
it "raises if zmq does not support CURVE (libsodium not linked)" do
|
19
|
+
expect do
|
20
|
+
allow(LibZMQ).to receive(:zmq_curve_keypair).and_return(-1)
|
21
|
+
ZMQ::Util.curve_keypair
|
22
|
+
end.to raise_exception(ZMQ::NotSupportedError)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
#/bin/bash
|
2
|
+
set -ev
|
3
|
+
|
4
|
+
bundle install
|
5
|
+
|
6
|
+
sudo apt-get -qq update
|
7
|
+
sudo apt-get install libtool pkg-config build-essential autoconf automake wget
|
8
|
+
|
9
|
+
git clone https://github.com/jedisct1/libsodium --branch stable
|
10
|
+
cd libsodium
|
11
|
+
./autogen.sh
|
12
|
+
./configure && make check
|
13
|
+
sudo make install
|
14
|
+
cd ..
|
15
|
+
|
16
|
+
VERSION="4.2.2"
|
17
|
+
BASE="zeromq-${VERSION}"
|
18
|
+
TARBALL="${BASE}.tar.gz"
|
19
|
+
wget https://github.com/zeromq/libzmq/releases/download/v$VERSION/$TARBALL
|
20
|
+
tar -xvf $TARBALL
|
21
|
+
cd $BASE
|
22
|
+
./autogen.sh
|
23
|
+
./configure && make check
|
24
|
+
sudo make install
|
25
|
+
sudo ldconfig
|
26
|
+
|
27
|
+
bundle exec rake spec
|