akero 1.0.4 → 1.1.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (103) hide show
  1. checksums.yaml +7 -0
  2. data/.gitattributes +3 -0
  3. data/.gitignore +0 -2
  4. data/.rubocop.yml +43 -0
  5. data/.travis.yml +3 -7
  6. data/Gemfile +1 -0
  7. data/Guardfile +4 -3
  8. data/Makefile +26 -0
  9. data/README.md +28 -10
  10. data/Rakefile +8 -17
  11. data/akero.gemspec +17 -10
  12. data/bin/akero +6 -0
  13. data/coverage/.last_run.json +5 -0
  14. data/coverage/.resultset.json +367 -0
  15. data/coverage/.resultset.json.lock +0 -0
  16. data/coverage/assets/0.10.0/application.css +799 -0
  17. data/coverage/assets/0.10.0/application.js +1707 -0
  18. data/coverage/assets/0.10.0/colorbox/border.png +0 -0
  19. data/coverage/assets/0.10.0/colorbox/controls.png +0 -0
  20. data/coverage/assets/0.10.0/colorbox/loading.gif +0 -0
  21. data/coverage/assets/0.10.0/colorbox/loading_background.png +0 -0
  22. data/coverage/assets/0.10.0/favicon_green.png +0 -0
  23. data/coverage/assets/0.10.0/favicon_red.png +0 -0
  24. data/coverage/assets/0.10.0/favicon_yellow.png +0 -0
  25. data/coverage/assets/0.10.0/loading.gif +0 -0
  26. data/coverage/assets/0.10.0/magnify.png +0 -0
  27. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  28. data/coverage/assets/0.10.0/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  29. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  30. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  31. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  32. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  33. data/coverage/assets/0.10.0/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  34. data/coverage/assets/0.10.0/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  35. data/coverage/assets/0.10.0/smoothness/images/ui-icons_222222_256x240.png +0 -0
  36. data/coverage/assets/0.10.0/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  37. data/coverage/assets/0.10.0/smoothness/images/ui-icons_454545_256x240.png +0 -0
  38. data/coverage/assets/0.10.0/smoothness/images/ui-icons_888888_256x240.png +0 -0
  39. data/coverage/assets/0.10.0/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  40. data/coverage/assets/0.7.1/application.css +1110 -0
  41. data/coverage/assets/0.7.1/application.js +626 -0
  42. data/coverage/assets/0.7.1/fancybox/blank.gif +0 -0
  43. data/coverage/assets/0.7.1/fancybox/fancy_close.png +0 -0
  44. data/coverage/assets/0.7.1/fancybox/fancy_loading.png +0 -0
  45. data/coverage/assets/0.7.1/fancybox/fancy_nav_left.png +0 -0
  46. data/coverage/assets/0.7.1/fancybox/fancy_nav_right.png +0 -0
  47. data/coverage/assets/0.7.1/fancybox/fancy_shadow_e.png +0 -0
  48. data/coverage/assets/0.7.1/fancybox/fancy_shadow_n.png +0 -0
  49. data/coverage/assets/0.7.1/fancybox/fancy_shadow_ne.png +0 -0
  50. data/coverage/assets/0.7.1/fancybox/fancy_shadow_nw.png +0 -0
  51. data/coverage/assets/0.7.1/fancybox/fancy_shadow_s.png +0 -0
  52. data/coverage/assets/0.7.1/fancybox/fancy_shadow_se.png +0 -0
  53. data/coverage/assets/0.7.1/fancybox/fancy_shadow_sw.png +0 -0
  54. data/coverage/assets/0.7.1/fancybox/fancy_shadow_w.png +0 -0
  55. data/coverage/assets/0.7.1/fancybox/fancy_title_left.png +0 -0
  56. data/coverage/assets/0.7.1/fancybox/fancy_title_main.png +0 -0
  57. data/coverage/assets/0.7.1/fancybox/fancy_title_over.png +0 -0
  58. data/coverage/assets/0.7.1/fancybox/fancy_title_right.png +0 -0
  59. data/coverage/assets/0.7.1/fancybox/fancybox-x.png +0 -0
  60. data/coverage/assets/0.7.1/fancybox/fancybox-y.png +0 -0
  61. data/coverage/assets/0.7.1/fancybox/fancybox.png +0 -0
  62. data/coverage/assets/0.7.1/favicon_green.png +0 -0
  63. data/coverage/assets/0.7.1/favicon_red.png +0 -0
  64. data/coverage/assets/0.7.1/favicon_yellow.png +0 -0
  65. data/coverage/assets/0.7.1/loading.gif +0 -0
  66. data/coverage/assets/0.7.1/magnify.png +0 -0
  67. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_0_aaaaaa_40x100.png +0 -0
  68. data/coverage/assets/0.7.1/smoothness/images/ui-bg_flat_75_ffffff_40x100.png +0 -0
  69. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_55_fbf9ee_1x400.png +0 -0
  70. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_65_ffffff_1x400.png +0 -0
  71. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_dadada_1x400.png +0 -0
  72. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_75_e6e6e6_1x400.png +0 -0
  73. data/coverage/assets/0.7.1/smoothness/images/ui-bg_glass_95_fef1ec_1x400.png +0 -0
  74. data/coverage/assets/0.7.1/smoothness/images/ui-bg_highlight-soft_75_cccccc_1x100.png +0 -0
  75. data/coverage/assets/0.7.1/smoothness/images/ui-icons_222222_256x240.png +0 -0
  76. data/coverage/assets/0.7.1/smoothness/images/ui-icons_2e83ff_256x240.png +0 -0
  77. data/coverage/assets/0.7.1/smoothness/images/ui-icons_454545_256x240.png +0 -0
  78. data/coverage/assets/0.7.1/smoothness/images/ui-icons_888888_256x240.png +0 -0
  79. data/coverage/assets/0.7.1/smoothness/images/ui-icons_cd0a0a_256x240.png +0 -0
  80. data/coverage/index.html +2248 -0
  81. data/doc/Akero/Message.html +475 -0
  82. data/doc/Akero.html +1148 -0
  83. data/doc/_index.html +125 -0
  84. data/doc/class_list.html +53 -0
  85. data/doc/css/common.css +1 -0
  86. data/doc/css/full_list.css +57 -0
  87. data/doc/css/style.css +338 -0
  88. data/doc/file.README.html +186 -0
  89. data/doc/file_list.html +55 -0
  90. data/doc/frames.html +28 -0
  91. data/doc/index.html +186 -0
  92. data/doc/js/app.js +214 -0
  93. data/doc/js/full_list.js +173 -0
  94. data/doc/js/jquery.js +4 -0
  95. data/doc/method_list.html +148 -0
  96. data/doc/top-level-namespace.html +112 -0
  97. data/lib/akero/benchmark.rb +21 -20
  98. data/lib/akero/cli.rb +74 -0
  99. data/lib/akero/version.rb +2 -1
  100. data/lib/akero.rb +92 -90
  101. data/spec/akero_spec.rb +66 -65
  102. data/spec/spec_helper.rb +1 -0
  103. metadata +164 -52
@@ -0,0 +1,2248 @@
1
+ <!DOCTYPE html>
2
+ <html xmlns='http://www.w3.org/1999/xhtml'>
3
+ <head>
4
+ <title>Code coverage for Akero</title>
5
+ <meta http-equiv="content-type" content="text/html; charset=utf-8" />
6
+ <script src='./assets/0.10.0/application.js' type='text/javascript'></script>
7
+ <link href='./assets/0.10.0/application.css' media='screen, projection, print' rel='stylesheet' type='text/css'>
8
+ <link rel="shortcut icon" type="image/png" href="./assets/0.10.0/favicon_green.png" />
9
+ <link rel="icon" type="image/png" href="./assets/0.10.0/favicon.png" />
10
+ </head>
11
+
12
+ <body>
13
+ <div id="loading">
14
+ <img src="./assets/0.10.0/loading.gif" alt="loading"/>
15
+ </div>
16
+ <div id="wrapper" style="display:none;">
17
+ <div class="timestamp">Generated <abbr class="timeago" title="2016-06-11T05:02:19+02:00">2016-06-11T05:02:19+02:00</abbr></div>
18
+ <ul class="group_tabs"></ul>
19
+
20
+ <div id="content">
21
+ <div class="file_list_container" id="AllFiles">
22
+ <h2>
23
+ <span class="group_name">All Files</span>
24
+ (<span class="covered_percent"><span class="green">100.0%</span></span>
25
+ covered at
26
+ <span class="covered_strength">
27
+ <span class="green">
28
+ 15.0
29
+ </span>
30
+ </span> hits/line)
31
+ </h2>
32
+ <a name="AllFiles"></a>
33
+ <div>
34
+ <b>1</b> files in total.
35
+ <b>139</b> relevant lines.
36
+ <span class="green"><b>139</b> lines covered</span> and
37
+ <span class="red"><b>0</b> lines missed </span>
38
+ </div>
39
+ <table class="file_list">
40
+ <thead>
41
+ <tr>
42
+ <th>File</th>
43
+ <th>% covered</th>
44
+ <th>Lines</th>
45
+ <th>Relevant Lines</th>
46
+ <th>Lines covered</th>
47
+ <th>Lines missed</th>
48
+ <th>Avg. Hits / Line</th>
49
+ </tr>
50
+ </thead>
51
+ <tbody>
52
+
53
+ <tr>
54
+ <td class="strong"><a href="#ad481d62c68ecf4617e688dfcdb07c844e51ed9c" class="src_link" title="lib/akero.rb">lib/akero.rb</a></td>
55
+ <td class="green strong">100.0 %</td>
56
+ <td>358</td>
57
+ <td>139</td>
58
+ <td>139</td>
59
+ <td>0</td>
60
+ <td>15.0</td>
61
+ </tr>
62
+
63
+ </tbody>
64
+ </table>
65
+ </div>
66
+
67
+
68
+
69
+ </div>
70
+
71
+ <div id="footer">
72
+ Generated by <a href="http://github.com/colszowka/simplecov">simplecov</a> v0.11.2
73
+ and simplecov-html v0.10.0<br/>
74
+ using RSpec
75
+ </div>
76
+
77
+ <div class="source_files">
78
+
79
+ <div class="source_table" id="ad481d62c68ecf4617e688dfcdb07c844e51ed9c">
80
+ <div class="header">
81
+ <h3>lib/akero.rb</h3>
82
+ <h4><span class="green">100.0 %</span> covered</h4>
83
+ <div>
84
+ <b>139</b> relevant lines.
85
+ <span class="green"><b>139</b> lines covered</span> and
86
+ <span class="red"><b>0</b> lines missed.</span>
87
+ </div>
88
+ </div>
89
+
90
+ <pre>
91
+ <ol>
92
+
93
+ <li class="never" data-hits="" data-linenumber="1">
94
+
95
+
96
+ <code class="ruby"># frozen_string_literal: true</code>
97
+ </li>
98
+
99
+ <li class="never" data-hits="" data-linenumber="2">
100
+
101
+
102
+ <code class="ruby"># Copyright (c) 2012 moe@busyloop.net</code>
103
+ </li>
104
+
105
+ <li class="never" data-hits="" data-linenumber="3">
106
+
107
+
108
+ <code class="ruby">#</code>
109
+ </li>
110
+
111
+ <li class="never" data-hits="" data-linenumber="4">
112
+
113
+
114
+ <code class="ruby"># MIT License</code>
115
+ </li>
116
+
117
+ <li class="never" data-hits="" data-linenumber="5">
118
+
119
+
120
+ <code class="ruby">#</code>
121
+ </li>
122
+
123
+ <li class="never" data-hits="" data-linenumber="6">
124
+
125
+
126
+ <code class="ruby"># Permission is hereby granted, free of charge, to any person obtaining</code>
127
+ </li>
128
+
129
+ <li class="never" data-hits="" data-linenumber="7">
130
+
131
+
132
+ <code class="ruby"># a copy of this software and associated documentation files (the</code>
133
+ </li>
134
+
135
+ <li class="never" data-hits="" data-linenumber="8">
136
+
137
+
138
+ <code class="ruby"># &quot;Software&quot;), to deal in the Software without restriction, including</code>
139
+ </li>
140
+
141
+ <li class="never" data-hits="" data-linenumber="9">
142
+
143
+
144
+ <code class="ruby"># without limitation the rights to use, copy, modify, merge, publish,</code>
145
+ </li>
146
+
147
+ <li class="never" data-hits="" data-linenumber="10">
148
+
149
+
150
+ <code class="ruby"># distribute, sublicense, and/or sell copies of the Software, and to</code>
151
+ </li>
152
+
153
+ <li class="never" data-hits="" data-linenumber="11">
154
+
155
+
156
+ <code class="ruby"># permit persons to whom the Software is furnished to do so, subject to</code>
157
+ </li>
158
+
159
+ <li class="never" data-hits="" data-linenumber="12">
160
+
161
+
162
+ <code class="ruby"># the following conditions:</code>
163
+ </li>
164
+
165
+ <li class="never" data-hits="" data-linenumber="13">
166
+
167
+
168
+ <code class="ruby">#</code>
169
+ </li>
170
+
171
+ <li class="never" data-hits="" data-linenumber="14">
172
+
173
+
174
+ <code class="ruby"># The above copyright notice and this permission notice shall be</code>
175
+ </li>
176
+
177
+ <li class="never" data-hits="" data-linenumber="15">
178
+
179
+
180
+ <code class="ruby"># included in all copies or substantial portions of the Software.</code>
181
+ </li>
182
+
183
+ <li class="never" data-hits="" data-linenumber="16">
184
+
185
+
186
+ <code class="ruby">#</code>
187
+ </li>
188
+
189
+ <li class="never" data-hits="" data-linenumber="17">
190
+
191
+
192
+ <code class="ruby"># THE SOFTWARE IS PROVIDED &quot;AS IS&quot;, WITHOUT WARRANTY OF ANY KIND,</code>
193
+ </li>
194
+
195
+ <li class="never" data-hits="" data-linenumber="18">
196
+
197
+
198
+ <code class="ruby"># EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF</code>
199
+ </li>
200
+
201
+ <li class="never" data-hits="" data-linenumber="19">
202
+
203
+
204
+ <code class="ruby"># MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND</code>
205
+ </li>
206
+
207
+ <li class="never" data-hits="" data-linenumber="20">
208
+
209
+
210
+ <code class="ruby"># NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE</code>
211
+ </li>
212
+
213
+ <li class="never" data-hits="" data-linenumber="21">
214
+
215
+
216
+ <code class="ruby"># LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION</code>
217
+ </li>
218
+
219
+ <li class="never" data-hits="" data-linenumber="22">
220
+
221
+
222
+ <code class="ruby"># OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION</code>
223
+ </li>
224
+
225
+ <li class="never" data-hits="" data-linenumber="23">
226
+
227
+
228
+ <code class="ruby"># WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.</code>
229
+ </li>
230
+
231
+ <li class="never" data-hits="" data-linenumber="24">
232
+
233
+
234
+ <code class="ruby"></code>
235
+ </li>
236
+
237
+ <li class="covered" data-hits="1" data-linenumber="25">
238
+ <span class="hits">1</span>
239
+
240
+ <code class="ruby">require &#39;akero/version&#39;</code>
241
+ </li>
242
+
243
+ <li class="never" data-hits="" data-linenumber="26">
244
+
245
+
246
+ <code class="ruby"></code>
247
+ </li>
248
+
249
+ <li class="covered" data-hits="1" data-linenumber="27">
250
+ <span class="hits">1</span>
251
+
252
+ <code class="ruby">require &#39;openssl&#39;</code>
253
+ </li>
254
+
255
+ <li class="covered" data-hits="1" data-linenumber="28">
256
+ <span class="hits">1</span>
257
+
258
+ <code class="ruby">require &#39;base64&#39;</code>
259
+ </li>
260
+
261
+ <li class="never" data-hits="" data-linenumber="29">
262
+
263
+
264
+ <code class="ruby"></code>
265
+ </li>
266
+
267
+ <li class="never" data-hits="" data-linenumber="30">
268
+
269
+
270
+ <code class="ruby"># Akero is an easy-to-use library for peer-to-peer public key cryptography.</code>
271
+ </li>
272
+
273
+ <li class="never" data-hits="" data-linenumber="31">
274
+
275
+
276
+ <code class="ruby">#</code>
277
+ </li>
278
+
279
+ <li class="never" data-hits="" data-linenumber="32">
280
+
281
+
282
+ <code class="ruby"># The only officially supported ruby runtime is MRI (latest version).</code>
283
+ </li>
284
+
285
+ <li class="never" data-hits="" data-linenumber="33">
286
+
287
+
288
+ <code class="ruby"># Regardless, Akero is known to work on any recent ruby version except JRuby.</code>
289
+ </li>
290
+
291
+ <li class="never" data-hits="" data-linenumber="34">
292
+
293
+
294
+ <code class="ruby"># Tested on: MRI 1.8.7, MRI 1.9.2, MRI 1.9.3, RBX 1.8, RBX 1.9, MRI 2.3.*, and more.</code>
295
+ </li>
296
+
297
+ <li class="covered" data-hits="1" data-linenumber="35">
298
+ <span class="hits">1</span>
299
+
300
+ <code class="ruby">class Akero</code>
301
+ </li>
302
+
303
+ <li class="never" data-hits="" data-linenumber="36">
304
+
305
+
306
+ <code class="ruby"> # Akero::Message wraps a received message.</code>
307
+ </li>
308
+
309
+ <li class="covered" data-hits="1" data-linenumber="37">
310
+ <span class="hits">1</span>
311
+
312
+ <code class="ruby"> class Message</code>
313
+ </li>
314
+
315
+ <li class="never" data-hits="" data-linenumber="38">
316
+
317
+
318
+ <code class="ruby"> # @return [String] Message body</code>
319
+ </li>
320
+
321
+ <li class="covered" data-hits="1" data-linenumber="39">
322
+ <span class="hits">1</span>
323
+
324
+ <code class="ruby"> attr_reader :body</code>
325
+ </li>
326
+
327
+ <li class="never" data-hits="" data-linenumber="40">
328
+
329
+
330
+ <code class="ruby"> # @return [Symbol] Message type (:signed or :encrypted)</code>
331
+ </li>
332
+
333
+ <li class="covered" data-hits="1" data-linenumber="41">
334
+ <span class="hits">1</span>
335
+
336
+ <code class="ruby"> attr_reader :type</code>
337
+ </li>
338
+
339
+ <li class="never" data-hits="" data-linenumber="42">
340
+
341
+
342
+ <code class="ruby"></code>
343
+ </li>
344
+
345
+ <li class="never" data-hits="" data-linenumber="43">
346
+
347
+
348
+ <code class="ruby"> # @private</code>
349
+ </li>
350
+
351
+ <li class="covered" data-hits="1" data-linenumber="44">
352
+ <span class="hits">1</span>
353
+
354
+ <code class="ruby"> def initialize(body, signer_cert, type)</code>
355
+ </li>
356
+
357
+ <li class="covered" data-hits="9" data-linenumber="45">
358
+ <span class="hits">9</span>
359
+
360
+ <code class="ruby"> @body = body</code>
361
+ </li>
362
+
363
+ <li class="covered" data-hits="9" data-linenumber="46">
364
+ <span class="hits">9</span>
365
+
366
+ <code class="ruby"> @signer_cert = signer_cert</code>
367
+ </li>
368
+
369
+ <li class="covered" data-hits="9" data-linenumber="47">
370
+ <span class="hits">9</span>
371
+
372
+ <code class="ruby"> @type = type</code>
373
+ </li>
374
+
375
+ <li class="never" data-hits="" data-linenumber="48">
376
+
377
+
378
+ <code class="ruby"> end</code>
379
+ </li>
380
+
381
+ <li class="never" data-hits="" data-linenumber="49">
382
+
383
+
384
+ <code class="ruby"></code>
385
+ </li>
386
+
387
+ <li class="never" data-hits="" data-linenumber="50">
388
+
389
+
390
+ <code class="ruby"> # @private</code>
391
+ </li>
392
+
393
+ <li class="covered" data-hits="1" data-linenumber="51">
394
+ <span class="hits">1</span>
395
+
396
+ <code class="ruby"> def inspect</code>
397
+ </li>
398
+
399
+ <li class="covered" data-hits="1" data-linenumber="52">
400
+ <span class="hits">1</span>
401
+
402
+ <code class="ruby"> &quot;#&lt;Akero::Message @type=#{@type} @from=#{from} @body=(#{@body.length} bytes)&gt;&quot;</code>
403
+ </li>
404
+
405
+ <li class="never" data-hits="" data-linenumber="53">
406
+
407
+
408
+ <code class="ruby"> end</code>
409
+ </li>
410
+
411
+ <li class="never" data-hits="" data-linenumber="54">
412
+
413
+
414
+ <code class="ruby"></code>
415
+ </li>
416
+
417
+ <li class="never" data-hits="" data-linenumber="55">
418
+
419
+
420
+ <code class="ruby"> # @!attribute [r] from</code>
421
+ </li>
422
+
423
+ <li class="never" data-hits="" data-linenumber="56">
424
+
425
+
426
+ <code class="ruby"> # @return [String] Sender Fingerprint</code>
427
+ </li>
428
+
429
+ <li class="covered" data-hits="1" data-linenumber="57">
430
+ <span class="hits">1</span>
431
+
432
+ <code class="ruby"> def from</code>
433
+ </li>
434
+
435
+ <li class="covered" data-hits="3" data-linenumber="58">
436
+ <span class="hits">3</span>
437
+
438
+ <code class="ruby"> Akero.fingerprint_from_cert(@signer_cert)</code>
439
+ </li>
440
+
441
+ <li class="never" data-hits="" data-linenumber="59">
442
+
443
+
444
+ <code class="ruby"> end</code>
445
+ </li>
446
+
447
+ <li class="never" data-hits="" data-linenumber="60">
448
+
449
+
450
+ <code class="ruby"></code>
451
+ </li>
452
+
453
+ <li class="never" data-hits="" data-linenumber="61">
454
+
455
+
456
+ <code class="ruby"> # @!attribute [r] from_pk</code>
457
+ </li>
458
+
459
+ <li class="never" data-hits="" data-linenumber="62">
460
+
461
+
462
+ <code class="ruby"> # @return [String] Sender public key</code>
463
+ </li>
464
+
465
+ <li class="covered" data-hits="1" data-linenumber="63">
466
+ <span class="hits">1</span>
467
+
468
+ <code class="ruby"> def from_pk</code>
469
+ </li>
470
+
471
+ <li class="covered" data-hits="2" data-linenumber="64">
472
+ <span class="hits">2</span>
473
+
474
+ <code class="ruby"> Akero.replate(@signer_cert.to_s, PLATE_CERT)</code>
475
+ </li>
476
+
477
+ <li class="never" data-hits="" data-linenumber="65">
478
+
479
+
480
+ <code class="ruby"> end</code>
481
+ </li>
482
+
483
+ <li class="never" data-hits="" data-linenumber="66">
484
+
485
+
486
+ <code class="ruby"> end</code>
487
+ </li>
488
+
489
+ <li class="never" data-hits="" data-linenumber="67">
490
+
491
+
492
+ <code class="ruby">end</code>
493
+ </li>
494
+
495
+ <li class="never" data-hits="" data-linenumber="68">
496
+
497
+
498
+ <code class="ruby"></code>
499
+ </li>
500
+
501
+ <li class="never" data-hits="" data-linenumber="69">
502
+
503
+
504
+ <code class="ruby"># Akero</code>
505
+ </li>
506
+
507
+ <li class="covered" data-hits="1" data-linenumber="70">
508
+ <span class="hits">1</span>
509
+
510
+ <code class="ruby">class Akero</code>
511
+ </li>
512
+
513
+ <li class="covered" data-hits="1" data-linenumber="71">
514
+ <span class="hits">1</span>
515
+
516
+ <code class="ruby"> ERR_MSG_MALFORMED_ENV = &#39;Malformed message: Could not parse envelope&#39; # @private</code>
517
+ </li>
518
+
519
+ <li class="covered" data-hits="1" data-linenumber="72">
520
+ <span class="hits">1</span>
521
+
522
+ <code class="ruby"> ERR_MSG_MALFORMED_BODY = &#39;Malformed message: Could not parse body; POSSIBLE SPOOF ATTEMPT&#39; # @private</code>
523
+ </li>
524
+
525
+ <li class="covered" data-hits="1" data-linenumber="73">
526
+ <span class="hits">1</span>
527
+
528
+ <code class="ruby"> ERR_PKEY_CORRUPT = &#39;Invalid private key (checksum mismatch)&#39; # @private</code>
529
+ </li>
530
+
531
+ <li class="covered" data-hits="1" data-linenumber="74">
532
+ <span class="hits">1</span>
533
+
534
+ <code class="ruby"> ERR_CERT_CORRUPT = &#39;Invalid certificate&#39; # @private</code>
535
+ </li>
536
+
537
+ <li class="covered" data-hits="1" data-linenumber="75">
538
+ <span class="hits">1</span>
539
+
540
+ <code class="ruby"> ERR_INVALID_RECIPIENT = &#39;Invalid recipient (must be a String)&#39; # @private</code>
541
+ </li>
542
+
543
+ <li class="covered" data-hits="1" data-linenumber="76">
544
+ <span class="hits">1</span>
545
+
546
+ <code class="ruby"> ERR_INVALID_RECIPIENT_CERT = &#39;Invalid recipient (corrupt public key?)&#39; # @private</code>
547
+ </li>
548
+
549
+ <li class="covered" data-hits="1" data-linenumber="77">
550
+ <span class="hits">1</span>
551
+
552
+ <code class="ruby"> ERR_DECRYPT = &#39;Could not decrypt message&#39; # @private</code>
553
+ </li>
554
+
555
+ <li class="covered" data-hits="1" data-linenumber="78">
556
+ <span class="hits">1</span>
557
+
558
+ <code class="ruby"> ERR_MSG_NOT_STRING_NOR_PKCS7 = &#39;Message must be of type String or OpenSSL::PKCS7&#39; # @private</code>
559
+ </li>
560
+
561
+ <li class="covered" data-hits="1" data-linenumber="79">
562
+ <span class="hits">1</span>
563
+
564
+ <code class="ruby"> ERR_MSG_CORRUPT_CERT = &#39;Malformed message: Embedded certificate could not be verified; POSSIBLE SPOOF ATTEMPT!&#39; # @private</code>
565
+ </li>
566
+
567
+ <li class="covered" data-hits="1" data-linenumber="80">
568
+ <span class="hits">1</span>
569
+
570
+ <code class="ruby"> ERR_MSG_TOO_MANY_SIGNERS = &#39;Corrupt message: Zero or multiple signers, expected exactly 1; POSSIBLE SPOOF ATTEMPT&#39; # @private</code>
571
+ </li>
572
+
573
+ <li class="never" data-hits="" data-linenumber="81">
574
+
575
+
576
+ <code class="ruby"></code>
577
+ </li>
578
+
579
+ <li class="covered" data-hits="1" data-linenumber="82">
580
+ <span class="hits">1</span>
581
+
582
+ <code class="ruby"> PKEY_HEADER = &quot;-----BEGIN AKERO PRIVATE KEY-----\n&quot; # @private</code>
583
+ </li>
584
+
585
+ <li class="covered" data-hits="1" data-linenumber="83">
586
+ <span class="hits">1</span>
587
+
588
+ <code class="ruby"> PKEY_FOOTER = &quot;-----END AKERO PRIVATE KEY-----\n&quot; # @private</code>
589
+ </li>
590
+
591
+ <li class="covered" data-hits="1" data-linenumber="84">
592
+ <span class="hits">1</span>
593
+
594
+ <code class="ruby"> PLATE_CERT = [&#39;CERTIFICATE&#39;, &#39;AKERO PUBLIC KEY&#39;].freeze # @private</code>
595
+ </li>
596
+
597
+ <li class="covered" data-hits="1" data-linenumber="85">
598
+ <span class="hits">1</span>
599
+
600
+ <code class="ruby"> PLATE_SIGNED = [&#39;PKCS7&#39;, &#39;AKERO SIGNED MESSAGE&#39;].freeze # @private</code>
601
+ </li>
602
+
603
+ <li class="covered" data-hits="1" data-linenumber="86">
604
+ <span class="hits">1</span>
605
+
606
+ <code class="ruby"> PLATE_CRYPTED = [&#39;PKCS7&#39;, &#39;AKERO SECRET MESSAGE&#39;].freeze # @private</code>
607
+ </li>
608
+
609
+ <li class="never" data-hits="" data-linenumber="87">
610
+
611
+
612
+ <code class="ruby"></code>
613
+ </li>
614
+
615
+ <li class="covered" data-hits="1" data-linenumber="88">
616
+ <span class="hits">1</span>
617
+
618
+ <code class="ruby"> DEFAULT_RSA_BITS = 4096</code>
619
+ </li>
620
+
621
+ <li class="covered" data-hits="1" data-linenumber="89">
622
+ <span class="hits">1</span>
623
+
624
+ <code class="ruby"> DEFAULT_DIGEST = OpenSSL::Digest::SHA512</code>
625
+ </li>
626
+
627
+ <li class="never" data-hits="" data-linenumber="90">
628
+
629
+
630
+ <code class="ruby"></code>
631
+ </li>
632
+
633
+ <li class="never" data-hits="" data-linenumber="91">
634
+
635
+
636
+ <code class="ruby"> # Unique fingerprint of this Akero keypair.</code>
637
+ </li>
638
+
639
+ <li class="never" data-hits="" data-linenumber="92">
640
+
641
+
642
+ <code class="ruby"> #</code>
643
+ </li>
644
+
645
+ <li class="never" data-hits="" data-linenumber="93">
646
+
647
+
648
+ <code class="ruby"> # @return [String] Akero fingerprint</code>
649
+ </li>
650
+
651
+ <li class="covered" data-hits="1" data-linenumber="94">
652
+ <span class="hits">1</span>
653
+
654
+ <code class="ruby"> def id</code>
655
+ </li>
656
+
657
+ <li class="covered" data-hits="19" data-linenumber="95">
658
+ <span class="hits">19</span>
659
+
660
+ <code class="ruby"> Akero.fingerprint_from_cert(@cert)</code>
661
+ </li>
662
+
663
+ <li class="never" data-hits="" data-linenumber="96">
664
+
665
+
666
+ <code class="ruby"> end</code>
667
+ </li>
668
+
669
+ <li class="never" data-hits="" data-linenumber="97">
670
+
671
+
672
+ <code class="ruby"></code>
673
+ </li>
674
+
675
+ <li class="never" data-hits="" data-linenumber="98">
676
+
677
+
678
+ <code class="ruby"> # Create a new Akero instance.</code>
679
+ </li>
680
+
681
+ <li class="never" data-hits="" data-linenumber="99">
682
+
683
+
684
+ <code class="ruby"> #</code>
685
+ </li>
686
+
687
+ <li class="never" data-hits="" data-linenumber="100">
688
+
689
+
690
+ <code class="ruby"> # @example Create new Akero instance with default settings</code>
691
+ </li>
692
+
693
+ <li class="never" data-hits="" data-linenumber="101">
694
+
695
+
696
+ <code class="ruby"> # Akero.new</code>
697
+ </li>
698
+
699
+ <li class="never" data-hits="" data-linenumber="102">
700
+
701
+
702
+ <code class="ruby"> #</code>
703
+ </li>
704
+
705
+ <li class="never" data-hits="" data-linenumber="103">
706
+
707
+
708
+ <code class="ruby"> # @example Create new Akero instance with a 4096-bit key</code>
709
+ </li>
710
+
711
+ <li class="never" data-hits="" data-linenumber="104">
712
+
713
+
714
+ <code class="ruby"> # Akero.new(4096)</code>
715
+ </li>
716
+
717
+ <li class="never" data-hits="" data-linenumber="105">
718
+
719
+
720
+ <code class="ruby"> #</code>
721
+ </li>
722
+
723
+ <li class="never" data-hits="" data-linenumber="106">
724
+
725
+
726
+ <code class="ruby"> # @example Create new Akero instance with a 4096-bit key and SHA512 digest</code>
727
+ </li>
728
+
729
+ <li class="never" data-hits="" data-linenumber="107">
730
+
731
+
732
+ <code class="ruby"> # Akero.new(4096, OpenSSL::Digest::SHA512)</code>
733
+ </li>
734
+
735
+ <li class="never" data-hits="" data-linenumber="108">
736
+
737
+
738
+ <code class="ruby"> #</code>
739
+ </li>
740
+
741
+ <li class="never" data-hits="" data-linenumber="109">
742
+
743
+
744
+ <code class="ruby"> # @param [Integer] rsa_bits RSA key length</code>
745
+ </li>
746
+
747
+ <li class="never" data-hits="" data-linenumber="110">
748
+
749
+
750
+ <code class="ruby"> # @param [OpenSSL::Digest] digest Signature digest</code>
751
+ </li>
752
+
753
+ <li class="never" data-hits="" data-linenumber="111">
754
+
755
+
756
+ <code class="ruby"> # @return [Akero] New Akero instance</code>
757
+ </li>
758
+
759
+ <li class="covered" data-hits="1" data-linenumber="112">
760
+ <span class="hits">1</span>
761
+
762
+ <code class="ruby"> def initialize(rsa_bits = DEFAULT_RSA_BITS, digest = DEFAULT_DIGEST)</code>
763
+ </li>
764
+
765
+ <li class="covered" data-hits="60" data-linenumber="113">
766
+ <span class="hits">60</span>
767
+
768
+ <code class="ruby"> @key, @cert = generate_keypair(rsa_bits, digest) unless rsa_bits.nil?</code>
769
+ </li>
770
+
771
+ <li class="never" data-hits="" data-linenumber="114">
772
+
773
+
774
+ <code class="ruby"> end</code>
775
+ </li>
776
+
777
+ <li class="never" data-hits="" data-linenumber="115">
778
+
779
+
780
+ <code class="ruby"></code>
781
+ </li>
782
+
783
+ <li class="never" data-hits="" data-linenumber="116">
784
+
785
+
786
+ <code class="ruby"> # Load an Akero identity.</code>
787
+ </li>
788
+
789
+ <li class="never" data-hits="" data-linenumber="117">
790
+
791
+
792
+ <code class="ruby"> #</code>
793
+ </li>
794
+
795
+ <li class="never" data-hits="" data-linenumber="118">
796
+
797
+
798
+ <code class="ruby"> # @example Load previously stored private key</code>
799
+ </li>
800
+
801
+ <li class="never" data-hits="" data-linenumber="119">
802
+
803
+
804
+ <code class="ruby"> # Akero.load(File.read(&#39;/tmp/alice.akr&#39;))</code>
805
+ </li>
806
+
807
+ <li class="never" data-hits="" data-linenumber="120">
808
+
809
+
810
+ <code class="ruby"> #</code>
811
+ </li>
812
+
813
+ <li class="never" data-hits="" data-linenumber="121">
814
+
815
+
816
+ <code class="ruby"> # @param [String] private_key Akero private key</code>
817
+ </li>
818
+
819
+ <li class="never" data-hits="" data-linenumber="122">
820
+
821
+
822
+ <code class="ruby"> # @return [Akero] New Akero instance</code>
823
+ </li>
824
+
825
+ <li class="covered" data-hits="1" data-linenumber="123">
826
+ <span class="hits">1</span>
827
+
828
+ <code class="ruby"> def self.load(private_key)</code>
829
+ </li>
830
+
831
+ <li class="covered" data-hits="2" data-linenumber="124">
832
+ <span class="hits">2</span>
833
+
834
+ <code class="ruby"> inner = Base64.decode64(private_key[PKEY_HEADER.length..private_key.length - PKEY_FOOTER.length])</code>
835
+ </li>
836
+
837
+ <li class="covered" data-hits="2" data-linenumber="125">
838
+ <span class="hits">2</span>
839
+
840
+ <code class="ruby"> if inner[0..63] != OpenSSL::Digest::SHA512.new(inner[64..-1]).digest</code>
841
+ </li>
842
+
843
+ <li class="covered" data-hits="1" data-linenumber="126">
844
+ <span class="hits">1</span>
845
+
846
+ <code class="ruby"> raise ERR_PKEY_CORRUPT</code>
847
+ </li>
848
+
849
+ <li class="never" data-hits="" data-linenumber="127">
850
+
851
+
852
+ <code class="ruby"> end</code>
853
+ </li>
854
+
855
+ <li class="covered" data-hits="1" data-linenumber="128">
856
+ <span class="hits">1</span>
857
+
858
+ <code class="ruby"> cert_len = inner[64..65].unpack(&#39;S&#39;)[0]</code>
859
+ </li>
860
+
861
+ <li class="covered" data-hits="1" data-linenumber="129">
862
+ <span class="hits">1</span>
863
+
864
+ <code class="ruby"> akero = Akero.new(nil)</code>
865
+ </li>
866
+
867
+ <li class="covered" data-hits="1" data-linenumber="130">
868
+ <span class="hits">1</span>
869
+
870
+ <code class="ruby"> akero.instance_variable_set(:@cert, OpenSSL::X509::Certificate.new(inner[66..66 + cert_len]))</code>
871
+ </li>
872
+
873
+ <li class="covered" data-hits="1" data-linenumber="131">
874
+ <span class="hits">1</span>
875
+
876
+ <code class="ruby"> akero.instance_variable_set(:@key, OpenSSL::PKey::RSA.new(inner[66 + cert_len..-1]))</code>
877
+ </li>
878
+
879
+ <li class="covered" data-hits="1" data-linenumber="132">
880
+ <span class="hits">1</span>
881
+
882
+ <code class="ruby"> akero</code>
883
+ </li>
884
+
885
+ <li class="never" data-hits="" data-linenumber="133">
886
+
887
+
888
+ <code class="ruby"> end</code>
889
+ </li>
890
+
891
+ <li class="never" data-hits="" data-linenumber="134">
892
+
893
+
894
+ <code class="ruby"></code>
895
+ </li>
896
+
897
+ <li class="never" data-hits="" data-linenumber="135">
898
+
899
+
900
+ <code class="ruby"> # Akero public key.</code>
901
+ </li>
902
+
903
+ <li class="never" data-hits="" data-linenumber="136">
904
+
905
+
906
+ <code class="ruby"> #</code>
907
+ </li>
908
+
909
+ <li class="never" data-hits="" data-linenumber="137">
910
+
911
+
912
+ <code class="ruby"> # Share this with other Akero instances that you</code>
913
+ </li>
914
+
915
+ <li class="never" data-hits="" data-linenumber="138">
916
+
917
+
918
+ <code class="ruby"> # wish to receive encrypted messages from.</code>
919
+ </li>
920
+
921
+ <li class="never" data-hits="" data-linenumber="139">
922
+
923
+
924
+ <code class="ruby"> #</code>
925
+ </li>
926
+
927
+ <li class="never" data-hits="" data-linenumber="140">
928
+
929
+
930
+ <code class="ruby"> # @return [String] Public key (ascii armored)</code>
931
+ </li>
932
+
933
+ <li class="covered" data-hits="1" data-linenumber="141">
934
+ <span class="hits">1</span>
935
+
936
+ <code class="ruby"> def public_key</code>
937
+ </li>
938
+
939
+ <li class="covered" data-hits="27" data-linenumber="142">
940
+ <span class="hits">27</span>
941
+
942
+ <code class="ruby"> Akero.replate(@cert.to_s, Akero::PLATE_CERT)</code>
943
+ </li>
944
+
945
+ <li class="never" data-hits="" data-linenumber="143">
946
+
947
+
948
+ <code class="ruby"> end</code>
949
+ </li>
950
+
951
+ <li class="never" data-hits="" data-linenumber="144">
952
+
953
+
954
+ <code class="ruby"></code>
955
+ </li>
956
+
957
+ <li class="never" data-hits="" data-linenumber="145">
958
+
959
+
960
+ <code class="ruby"> # Private key (do not share this with anyone!)</code>
961
+ </li>
962
+
963
+ <li class="never" data-hits="" data-linenumber="146">
964
+
965
+
966
+ <code class="ruby"> #</code>
967
+ </li>
968
+
969
+ <li class="never" data-hits="" data-linenumber="147">
970
+
971
+
972
+ <code class="ruby"> # @example Save and load an Akero identity</code>
973
+ </li>
974
+
975
+ <li class="never" data-hits="" data-linenumber="148">
976
+
977
+
978
+ <code class="ruby"> # alice = Akero.new</code>
979
+ </li>
980
+
981
+ <li class="never" data-hits="" data-linenumber="149">
982
+
983
+
984
+ <code class="ruby"> # # Save</code>
985
+ </li>
986
+
987
+ <li class="never" data-hits="" data-linenumber="150">
988
+
989
+
990
+ <code class="ruby"> # File.open(&#39;/tmp/alice.akr&#39;, &#39;w&#39;) { |f| f.write(alice.private_key) }</code>
991
+ </li>
992
+
993
+ <li class="never" data-hits="" data-linenumber="151">
994
+
995
+
996
+ <code class="ruby"> # # Load</code>
997
+ </li>
998
+
999
+ <li class="never" data-hits="" data-linenumber="152">
1000
+
1001
+
1002
+ <code class="ruby"> # new_alice = Akero.load(File.read(&#39;/tmp/alice.akr&#39;))</code>
1003
+ </li>
1004
+
1005
+ <li class="never" data-hits="" data-linenumber="153">
1006
+
1007
+
1008
+ <code class="ruby"> #</code>
1009
+ </li>
1010
+
1011
+ <li class="never" data-hits="" data-linenumber="154">
1012
+
1013
+
1014
+ <code class="ruby"> # @return [String] Private key (ascii armored)</code>
1015
+ </li>
1016
+
1017
+ <li class="never" data-hits="" data-linenumber="155">
1018
+
1019
+
1020
+ <code class="ruby"> # @see Akero#load</code>
1021
+ </li>
1022
+
1023
+ <li class="covered" data-hits="1" data-linenumber="156">
1024
+ <span class="hits">1</span>
1025
+
1026
+ <code class="ruby"> def private_key</code>
1027
+ </li>
1028
+
1029
+ <li class="never" data-hits="" data-linenumber="157">
1030
+
1031
+
1032
+ <code class="ruby"> # We do not use PKCS#12 (&quot;PFX&quot;) for serialization here</code>
1033
+ </li>
1034
+
1035
+ <li class="never" data-hits="" data-linenumber="158">
1036
+
1037
+
1038
+ <code class="ruby"> # because of http://www.cs.auckland.ac.nz/~pgut001/pubs/pfx.html</code>
1039
+ </li>
1040
+
1041
+ <li class="covered" data-hits="4" data-linenumber="159">
1042
+ <span class="hits">4</span>
1043
+
1044
+ <code class="ruby"> cert_der = @cert.to_der</code>
1045
+ </li>
1046
+
1047
+ <li class="covered" data-hits="4" data-linenumber="160">
1048
+ <span class="hits">4</span>
1049
+
1050
+ <code class="ruby"> out = [cert_der.length].pack(&#39;S&#39;)</code>
1051
+ </li>
1052
+
1053
+ <li class="covered" data-hits="4" data-linenumber="161">
1054
+ <span class="hits">4</span>
1055
+
1056
+ <code class="ruby"> out &lt;&lt; cert_der</code>
1057
+ </li>
1058
+
1059
+ <li class="covered" data-hits="4" data-linenumber="162">
1060
+ <span class="hits">4</span>
1061
+
1062
+ <code class="ruby"> out &lt;&lt; @key.to_der</code>
1063
+ </li>
1064
+
1065
+ <li class="covered" data-hits="4" data-linenumber="163">
1066
+ <span class="hits">4</span>
1067
+
1068
+ <code class="ruby"> out.insert(0, OpenSSL::Digest::SHA512.new(out).digest)</code>
1069
+ </li>
1070
+
1071
+ <li class="covered" data-hits="4" data-linenumber="164">
1072
+ <span class="hits">4</span>
1073
+
1074
+ <code class="ruby"> PKEY_HEADER + Base64.encode64(out) + PKEY_FOOTER</code>
1075
+ </li>
1076
+
1077
+ <li class="never" data-hits="" data-linenumber="165">
1078
+
1079
+
1080
+ <code class="ruby"> end</code>
1081
+ </li>
1082
+
1083
+ <li class="never" data-hits="" data-linenumber="166">
1084
+
1085
+
1086
+ <code class="ruby"></code>
1087
+ </li>
1088
+
1089
+ <li class="never" data-hits="" data-linenumber="167">
1090
+
1091
+
1092
+ <code class="ruby"> # Sign a message.</code>
1093
+ </li>
1094
+
1095
+ <li class="never" data-hits="" data-linenumber="168">
1096
+
1097
+
1098
+ <code class="ruby"> #</code>
1099
+ </li>
1100
+
1101
+ <li class="never" data-hits="" data-linenumber="169">
1102
+
1103
+
1104
+ <code class="ruby"> # @param [String] plaintext The message to sign (binary safe)</code>
1105
+ </li>
1106
+
1107
+ <li class="never" data-hits="" data-linenumber="170">
1108
+
1109
+
1110
+ <code class="ruby"> # @param [Boolean] ascii_armor Convert the output in base64?</code>
1111
+ </li>
1112
+
1113
+ <li class="never" data-hits="" data-linenumber="171">
1114
+
1115
+
1116
+ <code class="ruby"> # @return [String] Akero signed message</code>
1117
+ </li>
1118
+
1119
+ <li class="covered" data-hits="1" data-linenumber="172">
1120
+ <span class="hits">1</span>
1121
+
1122
+ <code class="ruby"> def sign(plaintext, ascii_armor = true)</code>
1123
+ </li>
1124
+
1125
+ <li class="covered" data-hits="6" data-linenumber="173">
1126
+ <span class="hits">6</span>
1127
+
1128
+ <code class="ruby"> out = _sign(plaintext)</code>
1129
+ </li>
1130
+
1131
+ <li class="covered" data-hits="6" data-linenumber="174">
1132
+ <span class="hits">6</span>
1133
+
1134
+ <code class="ruby"> ascii_armor ? Akero.replate(out.to_s, Akero::PLATE_SIGNED) : out.to_der</code>
1135
+ </li>
1136
+
1137
+ <li class="never" data-hits="" data-linenumber="175">
1138
+
1139
+
1140
+ <code class="ruby"> end</code>
1141
+ </li>
1142
+
1143
+ <li class="never" data-hits="" data-linenumber="176">
1144
+
1145
+
1146
+ <code class="ruby"></code>
1147
+ </li>
1148
+
1149
+ <li class="never" data-hits="" data-linenumber="177">
1150
+
1151
+
1152
+ <code class="ruby"> # Sign-&gt;encrypt-&gt;sign a message for 1 or more recipients.</code>
1153
+ </li>
1154
+
1155
+ <li class="never" data-hits="" data-linenumber="178">
1156
+
1157
+
1158
+ <code class="ruby"> #</code>
1159
+ </li>
1160
+
1161
+ <li class="never" data-hits="" data-linenumber="179">
1162
+
1163
+
1164
+ <code class="ruby"> # Only the listed recipients can decrypt the message-body</code>
1165
+ </li>
1166
+
1167
+ <li class="never" data-hits="" data-linenumber="180">
1168
+
1169
+
1170
+ <code class="ruby"> # but anyone can extract the sender&#39;s public key.</code>
1171
+ </li>
1172
+
1173
+ <li class="never" data-hits="" data-linenumber="181">
1174
+
1175
+
1176
+ <code class="ruby"> #</code>
1177
+ </li>
1178
+
1179
+ <li class="never" data-hits="" data-linenumber="182">
1180
+
1181
+
1182
+ <code class="ruby"> # @example Alice encrypts a message to Bob</code>
1183
+ </li>
1184
+
1185
+ <li class="never" data-hits="" data-linenumber="183">
1186
+
1187
+
1188
+ <code class="ruby"> # alice = Akero.new</code>
1189
+ </li>
1190
+
1191
+ <li class="never" data-hits="" data-linenumber="184">
1192
+
1193
+
1194
+ <code class="ruby"> # bob = Akero.new</code>
1195
+ </li>
1196
+
1197
+ <li class="never" data-hits="" data-linenumber="185">
1198
+
1199
+
1200
+ <code class="ruby"> # ciphertext = alice.encrypt(bob.public_key, &quot;Hello Bob!&quot;)</code>
1201
+ </li>
1202
+
1203
+ <li class="never" data-hits="" data-linenumber="186">
1204
+
1205
+
1206
+ <code class="ruby"> #</code>
1207
+ </li>
1208
+
1209
+ <li class="never" data-hits="" data-linenumber="187">
1210
+
1211
+
1212
+ <code class="ruby"> # @example Alice encrypts a message to Bob and Charlie</code>
1213
+ </li>
1214
+
1215
+ <li class="never" data-hits="" data-linenumber="188">
1216
+
1217
+
1218
+ <code class="ruby"> # alice = Akero.new</code>
1219
+ </li>
1220
+
1221
+ <li class="never" data-hits="" data-linenumber="189">
1222
+
1223
+
1224
+ <code class="ruby"> # bob = Akero.new</code>
1225
+ </li>
1226
+
1227
+ <li class="never" data-hits="" data-linenumber="190">
1228
+
1229
+
1230
+ <code class="ruby"> # charlie = Akero.new</code>
1231
+ </li>
1232
+
1233
+ <li class="never" data-hits="" data-linenumber="191">
1234
+
1235
+
1236
+ <code class="ruby"> # ciphertext = alice.encrypt([bob.public_key, charlie.public_key], &quot;Hello Bob and Charlie!&quot;)</code>
1237
+ </li>
1238
+
1239
+ <li class="never" data-hits="" data-linenumber="192">
1240
+
1241
+
1242
+ <code class="ruby"> #</code>
1243
+ </li>
1244
+
1245
+ <li class="never" data-hits="" data-linenumber="193">
1246
+
1247
+
1248
+ <code class="ruby"> # @param [Array] to Akero public keys of recipients</code>
1249
+ </li>
1250
+
1251
+ <li class="never" data-hits="" data-linenumber="194">
1252
+
1253
+
1254
+ <code class="ruby"> # @param [String] plaintext The message to encrypt (binary safe)</code>
1255
+ </li>
1256
+
1257
+ <li class="never" data-hits="" data-linenumber="195">
1258
+
1259
+
1260
+ <code class="ruby"> # @param [Boolean] ascii_armor Convert the output to base64?</code>
1261
+ </li>
1262
+
1263
+ <li class="never" data-hits="" data-linenumber="196">
1264
+
1265
+
1266
+ <code class="ruby"> # @return [String] Akero secret message</code>
1267
+ </li>
1268
+
1269
+ <li class="covered" data-hits="1" data-linenumber="197">
1270
+ <span class="hits">1</span>
1271
+
1272
+ <code class="ruby"> def encrypt(to, plaintext, ascii_armor = true)</code>
1273
+ </li>
1274
+
1275
+ <li class="covered" data-hits="13" data-linenumber="198">
1276
+ <span class="hits">13</span>
1277
+
1278
+ <code class="ruby"> to = [to] unless to.is_a? Array</code>
1279
+ </li>
1280
+
1281
+ <li class="covered" data-hits="13" data-linenumber="199">
1282
+ <span class="hits">13</span>
1283
+
1284
+ <code class="ruby"> to = to.map do |e|</code>
1285
+ </li>
1286
+
1287
+ <li class="covered" data-hits="23" data-linenumber="200">
1288
+ <span class="hits">23</span>
1289
+
1290
+ <code class="ruby"> case e</code>
1291
+ </li>
1292
+
1293
+ <li class="never" data-hits="" data-linenumber="201">
1294
+
1295
+
1296
+ <code class="ruby"> when String</code>
1297
+ </li>
1298
+
1299
+ <li class="covered" data-hits="21" data-linenumber="202">
1300
+ <span class="hits">21</span>
1301
+
1302
+ <code class="ruby"> begin</code>
1303
+ </li>
1304
+
1305
+ <li class="covered" data-hits="21" data-linenumber="203">
1306
+ <span class="hits">21</span>
1307
+
1308
+ <code class="ruby"> OpenSSL::X509::Certificate.new(Akero.replate(e, Akero::PLATE_CERT, true))</code>
1309
+ </li>
1310
+
1311
+ <li class="never" data-hits="" data-linenumber="204">
1312
+
1313
+
1314
+ <code class="ruby"> rescue OpenSSL::X509::CertificateError</code>
1315
+ </li>
1316
+
1317
+ <li class="covered" data-hits="2" data-linenumber="205">
1318
+ <span class="hits">2</span>
1319
+
1320
+ <code class="ruby"> raise ERR_INVALID_RECIPIENT_CERT</code>
1321
+ </li>
1322
+
1323
+ <li class="never" data-hits="" data-linenumber="206">
1324
+
1325
+
1326
+ <code class="ruby"> end</code>
1327
+ </li>
1328
+
1329
+ <li class="never" data-hits="" data-linenumber="207">
1330
+
1331
+
1332
+ <code class="ruby"> else</code>
1333
+ </li>
1334
+
1335
+ <li class="covered" data-hits="2" data-linenumber="208">
1336
+ <span class="hits">2</span>
1337
+
1338
+ <code class="ruby"> raise ERR_INVALID_RECIPIENT</code>
1339
+ </li>
1340
+
1341
+ <li class="never" data-hits="" data-linenumber="209">
1342
+
1343
+
1344
+ <code class="ruby"> end</code>
1345
+ </li>
1346
+
1347
+ <li class="never" data-hits="" data-linenumber="210">
1348
+
1349
+
1350
+ <code class="ruby"> end</code>
1351
+ </li>
1352
+
1353
+ <li class="covered" data-hits="9" data-linenumber="211">
1354
+ <span class="hits">9</span>
1355
+
1356
+ <code class="ruby"> out = _sign(_encrypt(to, _sign(plaintext, false)))</code>
1357
+ </li>
1358
+
1359
+ <li class="covered" data-hits="7" data-linenumber="212">
1360
+ <span class="hits">7</span>
1361
+
1362
+ <code class="ruby"> ascii_armor ? Akero.replate(out.to_s, PLATE_CRYPTED) : out.to_der</code>
1363
+ </li>
1364
+
1365
+ <li class="never" data-hits="" data-linenumber="213">
1366
+
1367
+
1368
+ <code class="ruby"> end</code>
1369
+ </li>
1370
+
1371
+ <li class="never" data-hits="" data-linenumber="214">
1372
+
1373
+
1374
+ <code class="ruby"></code>
1375
+ </li>
1376
+
1377
+ <li class="never" data-hits="" data-linenumber="215">
1378
+
1379
+
1380
+ <code class="ruby"> # Receive an Akero message.</code>
1381
+ </li>
1382
+
1383
+ <li class="never" data-hits="" data-linenumber="216">
1384
+
1385
+
1386
+ <code class="ruby"> #</code>
1387
+ </li>
1388
+
1389
+ <li class="never" data-hits="" data-linenumber="217">
1390
+
1391
+
1392
+ <code class="ruby"> # @param [String] ciphertext Akero Message</code>
1393
+ </li>
1394
+
1395
+ <li class="never" data-hits="" data-linenumber="218">
1396
+
1397
+
1398
+ <code class="ruby"> # @return [Akero::Message] Message_body, signer_certificate, body_type</code>
1399
+ </li>
1400
+
1401
+ <li class="covered" data-hits="1" data-linenumber="219">
1402
+ <span class="hits">1</span>
1403
+
1404
+ <code class="ruby"> def receive(ciphertext)</code>
1405
+ </li>
1406
+
1407
+ <li class="covered" data-hits="19" data-linenumber="220">
1408
+ <span class="hits">19</span>
1409
+
1410
+ <code class="ruby"> if ciphertext.start_with? &#39;-----BEGIN &#39;</code>
1411
+ </li>
1412
+
1413
+ <li class="covered" data-hits="11" data-linenumber="221">
1414
+ <span class="hits">11</span>
1415
+
1416
+ <code class="ruby"> ciphertext = Akero.replate(ciphertext, Akero::PLATE_CRYPTED, true)</code>
1417
+ </li>
1418
+
1419
+ <li class="never" data-hits="" data-linenumber="222">
1420
+
1421
+
1422
+ <code class="ruby"> end</code>
1423
+ </li>
1424
+
1425
+ <li class="covered" data-hits="19" data-linenumber="223">
1426
+ <span class="hits">19</span>
1427
+
1428
+ <code class="ruby"> begin</code>
1429
+ </li>
1430
+
1431
+ <li class="covered" data-hits="19" data-linenumber="224">
1432
+ <span class="hits">19</span>
1433
+
1434
+ <code class="ruby"> body, signer_cert, body_type = verify(ciphertext, nil)</code>
1435
+ </li>
1436
+
1437
+ <li class="never" data-hits="" data-linenumber="225">
1438
+
1439
+
1440
+ <code class="ruby"> rescue ArgumentError</code>
1441
+ </li>
1442
+
1443
+ <li class="covered" data-hits="2" data-linenumber="226">
1444
+ <span class="hits">2</span>
1445
+
1446
+ <code class="ruby"> raise ERR_MSG_MALFORMED_ENV</code>
1447
+ </li>
1448
+
1449
+ <li class="never" data-hits="" data-linenumber="227">
1450
+
1451
+
1452
+ <code class="ruby"> end</code>
1453
+ </li>
1454
+
1455
+ <li class="never" data-hits="" data-linenumber="228">
1456
+
1457
+
1458
+ <code class="ruby"></code>
1459
+ </li>
1460
+
1461
+ <li class="covered" data-hits="15" data-linenumber="229">
1462
+ <span class="hits">15</span>
1463
+
1464
+ <code class="ruby"> case body_type.ord</code>
1465
+ </li>
1466
+
1467
+ <li class="never" data-hits="" data-linenumber="230">
1468
+
1469
+
1470
+ <code class="ruby"> when 0x00</code>
1471
+ </li>
1472
+
1473
+ <li class="never" data-hits="" data-linenumber="231">
1474
+
1475
+
1476
+ <code class="ruby"> # public message (signed)</code>
1477
+ </li>
1478
+
1479
+ <li class="covered" data-hits="5" data-linenumber="232">
1480
+ <span class="hits">5</span>
1481
+
1482
+ <code class="ruby"> return Message.new(body, signer_cert, :signed)</code>
1483
+ </li>
1484
+
1485
+ <li class="never" data-hits="" data-linenumber="233">
1486
+
1487
+
1488
+ <code class="ruby"> when 0x01</code>
1489
+ </li>
1490
+
1491
+ <li class="never" data-hits="" data-linenumber="234">
1492
+
1493
+
1494
+ <code class="ruby"> # private message (signed, crypted, signed)</code>
1495
+ </li>
1496
+
1497
+ <li class="covered" data-hits="8" data-linenumber="235">
1498
+ <span class="hits">8</span>
1499
+
1500
+ <code class="ruby"> signed_plaintext = _decrypt(body)</code>
1501
+ </li>
1502
+
1503
+ <li class="covered" data-hits="6" data-linenumber="236">
1504
+ <span class="hits">6</span>
1505
+
1506
+ <code class="ruby"> plaintext, _verified_cert, _body_type = verify(signed_plaintext, signer_cert)</code>
1507
+ </li>
1508
+
1509
+ <li class="covered" data-hits="4" data-linenumber="237">
1510
+ <span class="hits">4</span>
1511
+
1512
+ <code class="ruby"> msg = Message.new(plaintext, signer_cert, :encrypted)</code>
1513
+ </li>
1514
+
1515
+ <li class="covered" data-hits="4" data-linenumber="238">
1516
+ <span class="hits">4</span>
1517
+
1518
+ <code class="ruby"> return msg</code>
1519
+ </li>
1520
+
1521
+ <li class="never" data-hits="" data-linenumber="239">
1522
+
1523
+
1524
+ <code class="ruby"> end</code>
1525
+ </li>
1526
+
1527
+ <li class="covered" data-hits="2" data-linenumber="240">
1528
+ <span class="hits">2</span>
1529
+
1530
+ <code class="ruby"> raise ERR_MSG_MALFORMED_BODY</code>
1531
+ </li>
1532
+
1533
+ <li class="never" data-hits="" data-linenumber="241">
1534
+
1535
+
1536
+ <code class="ruby"> end</code>
1537
+ </li>
1538
+
1539
+ <li class="never" data-hits="" data-linenumber="242">
1540
+
1541
+
1542
+ <code class="ruby"></code>
1543
+ </li>
1544
+
1545
+ <li class="never" data-hits="" data-linenumber="243">
1546
+
1547
+
1548
+ <code class="ruby"> # @private</code>
1549
+ </li>
1550
+
1551
+ <li class="covered" data-hits="1" data-linenumber="244">
1552
+ <span class="hits">1</span>
1553
+
1554
+ <code class="ruby"> def inspect</code>
1555
+ </li>
1556
+
1557
+ <li class="covered" data-hits="3" data-linenumber="245">
1558
+ <span class="hits">3</span>
1559
+
1560
+ <code class="ruby"> &quot;#&lt;Akero id=#{id}&gt;&quot;</code>
1561
+ </li>
1562
+
1563
+ <li class="never" data-hits="" data-linenumber="246">
1564
+
1565
+
1566
+ <code class="ruby"> end</code>
1567
+ </li>
1568
+
1569
+ <li class="never" data-hits="" data-linenumber="247">
1570
+
1571
+
1572
+ <code class="ruby"></code>
1573
+ </li>
1574
+
1575
+ <li class="never" data-hits="" data-linenumber="248">
1576
+
1577
+
1578
+ <code class="ruby"> # @private</code>
1579
+ </li>
1580
+
1581
+ <li class="covered" data-hits="1" data-linenumber="249">
1582
+ <span class="hits">1</span>
1583
+
1584
+ <code class="ruby"> def to_s</code>
1585
+ </li>
1586
+
1587
+ <li class="covered" data-hits="1" data-linenumber="250">
1588
+ <span class="hits">1</span>
1589
+
1590
+ <code class="ruby"> inspect</code>
1591
+ </li>
1592
+
1593
+ <li class="never" data-hits="" data-linenumber="251">
1594
+
1595
+
1596
+ <code class="ruby"> end</code>
1597
+ </li>
1598
+
1599
+ <li class="never" data-hits="" data-linenumber="252">
1600
+
1601
+
1602
+ <code class="ruby"></code>
1603
+ </li>
1604
+
1605
+ <li class="never" data-hits="" data-linenumber="253">
1606
+
1607
+
1608
+ <code class="ruby"> #---------------------------------------------------------------------------</code>
1609
+ </li>
1610
+
1611
+ <li class="covered" data-hits="2" data-linenumber="254">
1612
+ <span class="hits">2</span>
1613
+
1614
+ <code class="ruby"> class &lt;&lt; self; protected; end</code>
1615
+ </li>
1616
+
1617
+ <li class="never" data-hits="" data-linenumber="255">
1618
+
1619
+
1620
+ <code class="ruby"></code>
1621
+ </li>
1622
+
1623
+ <li class="never" data-hits="" data-linenumber="256">
1624
+
1625
+
1626
+ <code class="ruby"> # Swap the &quot;license plates&quot; on an ascii-armored message.</code>
1627
+ </li>
1628
+
1629
+ <li class="never" data-hits="" data-linenumber="257">
1630
+
1631
+
1632
+ <code class="ruby"> # This is done for user-friendliness, so stored Akero</code>
1633
+ </li>
1634
+
1635
+ <li class="never" data-hits="" data-linenumber="258">
1636
+
1637
+
1638
+ <code class="ruby"> # messages and keys can be easily identified at a glance.</code>
1639
+ </li>
1640
+
1641
+ <li class="never" data-hits="" data-linenumber="259">
1642
+
1643
+
1644
+ <code class="ruby"> #</code>
1645
+ </li>
1646
+
1647
+ <li class="never" data-hits="" data-linenumber="260">
1648
+
1649
+
1650
+ <code class="ruby"> # @param [String] msg Message to be replated</code>
1651
+ </li>
1652
+
1653
+ <li class="never" data-hits="" data-linenumber="261">
1654
+
1655
+
1656
+ <code class="ruby"> # @param [Array] plates Array of the two plates to swap</code>
1657
+ </li>
1658
+
1659
+ <li class="never" data-hits="" data-linenumber="262">
1660
+
1661
+
1662
+ <code class="ruby"> # @param [Boolean] reverse Reverse the swap?</code>
1663
+ </li>
1664
+
1665
+ <li class="never" data-hits="" data-linenumber="263">
1666
+
1667
+
1668
+ <code class="ruby"> # @return [String] The replated message</code>
1669
+ </li>
1670
+
1671
+ <li class="covered" data-hits="1" data-linenumber="264">
1672
+ <span class="hits">1</span>
1673
+
1674
+ <code class="ruby"> def self.replate(msg, plates, reverse = false)</code>
1675
+ </li>
1676
+
1677
+ <li class="covered" data-hits="74" data-linenumber="265">
1678
+ <span class="hits">74</span>
1679
+
1680
+ <code class="ruby"> a, b = reverse ? [1, 0] : [0, 1]</code>
1681
+ </li>
1682
+
1683
+ <li class="covered" data-hits="74" data-linenumber="266">
1684
+ <span class="hits">74</span>
1685
+
1686
+ <code class="ruby"> &quot;-----BEGIN #{plates[b]}-----#{msg.strip[plates[a].length + 16..-(plates[a].length + 15)]}-----END #{plates[b]}-----\n&quot;</code>
1687
+ </li>
1688
+
1689
+ <li class="never" data-hits="" data-linenumber="267">
1690
+
1691
+
1692
+ <code class="ruby"> end</code>
1693
+ </li>
1694
+
1695
+ <li class="never" data-hits="" data-linenumber="268">
1696
+
1697
+
1698
+ <code class="ruby"></code>
1699
+ </li>
1700
+
1701
+ <li class="never" data-hits="" data-linenumber="269">
1702
+
1703
+
1704
+ <code class="ruby"> # Extract fingerprint from an Akero public key.</code>
1705
+ </li>
1706
+
1707
+ <li class="never" data-hits="" data-linenumber="270">
1708
+
1709
+
1710
+ <code class="ruby"> #</code>
1711
+ </li>
1712
+
1713
+ <li class="never" data-hits="" data-linenumber="271">
1714
+
1715
+
1716
+ <code class="ruby"> # @return [String] Akero fingerprint</code>
1717
+ </li>
1718
+
1719
+ <li class="covered" data-hits="1" data-linenumber="272">
1720
+ <span class="hits">1</span>
1721
+
1722
+ <code class="ruby"> def self.fingerprint_from_cert(cert)</code>
1723
+ </li>
1724
+
1725
+ <li class="covered" data-hits="23" data-linenumber="273">
1726
+ <span class="hits">23</span>
1727
+
1728
+ <code class="ruby"> cert.extensions.map.each do |e|</code>
1729
+ </li>
1730
+
1731
+ <li class="covered" data-hits="44" data-linenumber="274">
1732
+ <span class="hits">44</span>
1733
+
1734
+ <code class="ruby"> return &quot;AK:#{e.value}&quot; if e.oid == &#39;subjectKeyIdentifier&#39;</code>
1735
+ </li>
1736
+
1737
+ <li class="never" data-hits="" data-linenumber="275">
1738
+
1739
+
1740
+ <code class="ruby"> end</code>
1741
+ </li>
1742
+
1743
+ <li class="covered" data-hits="1" data-linenumber="276">
1744
+ <span class="hits">1</span>
1745
+
1746
+ <code class="ruby"> raise ERR_CERT_CORRUPT</code>
1747
+ </li>
1748
+
1749
+ <li class="never" data-hits="" data-linenumber="277">
1750
+
1751
+
1752
+ <code class="ruby"> end</code>
1753
+ </li>
1754
+
1755
+ <li class="never" data-hits="" data-linenumber="278">
1756
+
1757
+
1758
+ <code class="ruby"></code>
1759
+ </li>
1760
+
1761
+ <li class="never" data-hits="" data-linenumber="279">
1762
+
1763
+
1764
+ <code class="ruby"> #---------------------------------------------------------------------------</code>
1765
+ </li>
1766
+
1767
+ <li class="covered" data-hits="1" data-linenumber="280">
1768
+ <span class="hits">1</span>
1769
+
1770
+ <code class="ruby"> private</code>
1771
+ </li>
1772
+
1773
+ <li class="never" data-hits="" data-linenumber="281">
1774
+
1775
+
1776
+ <code class="ruby"></code>
1777
+ </li>
1778
+
1779
+ <li class="covered" data-hits="1" data-linenumber="282">
1780
+ <span class="hits">1</span>
1781
+
1782
+ <code class="ruby"> def _decrypt(crypted_msg)</code>
1783
+ </li>
1784
+
1785
+ <li class="covered" data-hits="8" data-linenumber="283">
1786
+ <span class="hits">8</span>
1787
+
1788
+ <code class="ruby"> OpenSSL::PKCS7.new(crypted_msg).decrypt(@key, @cert)</code>
1789
+ </li>
1790
+
1791
+ <li class="never" data-hits="" data-linenumber="284">
1792
+
1793
+
1794
+ <code class="ruby"> rescue OpenSSL::PKCS7::PKCS7Error, &#39;decrypt error&#39;</code>
1795
+ </li>
1796
+
1797
+ <li class="covered" data-hits="2" data-linenumber="285">
1798
+ <span class="hits">2</span>
1799
+
1800
+ <code class="ruby"> raise ERR_DECRYPT</code>
1801
+ </li>
1802
+
1803
+ <li class="never" data-hits="" data-linenumber="286">
1804
+
1805
+
1806
+ <code class="ruby"> end</code>
1807
+ </li>
1808
+
1809
+ <li class="never" data-hits="" data-linenumber="287">
1810
+
1811
+
1812
+ <code class="ruby"></code>
1813
+ </li>
1814
+
1815
+ <li class="covered" data-hits="1" data-linenumber="288">
1816
+ <span class="hits">1</span>
1817
+
1818
+ <code class="ruby"> def _encrypt(to, msg, cipher = nil)</code>
1819
+ </li>
1820
+
1821
+ <li class="covered" data-hits="9" data-linenumber="289">
1822
+ <span class="hits">9</span>
1823
+
1824
+ <code class="ruby"> cipher ||= OpenSSL::Cipher.new(&#39;AES-256-CFB&#39;)</code>
1825
+ </li>
1826
+
1827
+ <li class="covered" data-hits="9" data-linenumber="290">
1828
+ <span class="hits">9</span>
1829
+
1830
+ <code class="ruby"> OpenSSL::PKCS7.encrypt(to, msg.to_der, cipher, OpenSSL::PKCS7::BINARY)</code>
1831
+ </li>
1832
+
1833
+ <li class="never" data-hits="" data-linenumber="291">
1834
+
1835
+
1836
+ <code class="ruby"> end</code>
1837
+ </li>
1838
+
1839
+ <li class="never" data-hits="" data-linenumber="292">
1840
+
1841
+
1842
+ <code class="ruby"></code>
1843
+ </li>
1844
+
1845
+ <li class="covered" data-hits="1" data-linenumber="293">
1846
+ <span class="hits">1</span>
1847
+
1848
+ <code class="ruby"> def _sign(message, embed_cert = true)</code>
1849
+ </li>
1850
+
1851
+ <li class="covered" data-hits="26" data-linenumber="294">
1852
+ <span class="hits">26</span>
1853
+
1854
+ <code class="ruby"> flags = embed_cert ? OpenSSL::PKCS7::BINARY : (OpenSSL::PKCS7::BINARY | OpenSSL::PKCS7::NOCERTS)</code>
1855
+ </li>
1856
+
1857
+ <li class="covered" data-hits="26" data-linenumber="295">
1858
+ <span class="hits">26</span>
1859
+
1860
+ <code class="ruby"> case message</code>
1861
+ </li>
1862
+
1863
+ <li class="never" data-hits="" data-linenumber="296">
1864
+
1865
+
1866
+ <code class="ruby"> when String</code>
1867
+ </li>
1868
+
1869
+ <li class="covered" data-hits="15" data-linenumber="297">
1870
+ <span class="hits">15</span>
1871
+
1872
+ <code class="ruby"> type = 0x00</code>
1873
+ </li>
1874
+
1875
+ <li class="never" data-hits="" data-linenumber="298">
1876
+
1877
+
1878
+ <code class="ruby"> when OpenSSL::PKCS7</code>
1879
+ </li>
1880
+
1881
+ <li class="covered" data-hits="9" data-linenumber="299">
1882
+ <span class="hits">9</span>
1883
+
1884
+ <code class="ruby"> type = 0x01</code>
1885
+ </li>
1886
+
1887
+ <li class="never" data-hits="" data-linenumber="300">
1888
+
1889
+
1890
+ <code class="ruby"> else</code>
1891
+ </li>
1892
+
1893
+ <li class="covered" data-hits="2" data-linenumber="301">
1894
+ <span class="hits">2</span>
1895
+
1896
+ <code class="ruby"> raise ERR_MSG_NOT_STRING_NOR_PKCS7</code>
1897
+ </li>
1898
+
1899
+ <li class="never" data-hits="" data-linenumber="302">
1900
+
1901
+
1902
+ <code class="ruby"> end</code>
1903
+ </li>
1904
+
1905
+ <li class="covered" data-hits="24" data-linenumber="303">
1906
+ <span class="hits">24</span>
1907
+
1908
+ <code class="ruby"> message = message.to_der if message.is_a? OpenSSL::PKCS7</code>
1909
+ </li>
1910
+
1911
+ <li class="covered" data-hits="24" data-linenumber="304">
1912
+ <span class="hits">24</span>
1913
+
1914
+ <code class="ruby"> OpenSSL::PKCS7.sign(@cert, @key, type.chr + message, [], flags)</code>
1915
+ </li>
1916
+
1917
+ <li class="never" data-hits="" data-linenumber="305">
1918
+
1919
+
1920
+ <code class="ruby"> end</code>
1921
+ </li>
1922
+
1923
+ <li class="never" data-hits="" data-linenumber="306">
1924
+
1925
+
1926
+ <code class="ruby"></code>
1927
+ </li>
1928
+
1929
+ <li class="covered" data-hits="1" data-linenumber="307">
1930
+ <span class="hits">1</span>
1931
+
1932
+ <code class="ruby"> def verify(signed_msg, cert)</code>
1933
+ </li>
1934
+
1935
+ <li class="covered" data-hits="26" data-linenumber="308">
1936
+ <span class="hits">26</span>
1937
+
1938
+ <code class="ruby"> signed_msg = OpenSSL::PKCS7.new(signed_msg) if signed_msg.is_a? String</code>
1939
+ </li>
1940
+
1941
+ <li class="covered" data-hits="24" data-linenumber="309">
1942
+ <span class="hits">24</span>
1943
+
1944
+ <code class="ruby"> store = OpenSSL::X509::Store.new</code>
1945
+ </li>
1946
+
1947
+ <li class="never" data-hits="" data-linenumber="310">
1948
+
1949
+
1950
+ <code class="ruby"></code>
1951
+ </li>
1952
+
1953
+ <li class="covered" data-hits="24" data-linenumber="311">
1954
+ <span class="hits">24</span>
1955
+
1956
+ <code class="ruby"> if cert.nil?</code>
1957
+ </li>
1958
+
1959
+ <li class="covered" data-hits="18" data-linenumber="312">
1960
+ <span class="hits">18</span>
1961
+
1962
+ <code class="ruby"> if signed_msg.certificates.nil? || signed_msg.certificates.length != 1</code>
1963
+ </li>
1964
+
1965
+ <li class="covered" data-hits="2" data-linenumber="313">
1966
+ <span class="hits">2</span>
1967
+
1968
+ <code class="ruby"> raise ERR_MSG_TOO_MANY_SIGNERS</code>
1969
+ </li>
1970
+
1971
+ <li class="never" data-hits="" data-linenumber="314">
1972
+
1973
+
1974
+ <code class="ruby"> end</code>
1975
+ </li>
1976
+
1977
+ <li class="never" data-hits="" data-linenumber="315">
1978
+
1979
+
1980
+ <code class="ruby"></code>
1981
+ </li>
1982
+
1983
+ <li class="covered" data-hits="16" data-linenumber="316">
1984
+ <span class="hits">16</span>
1985
+
1986
+ <code class="ruby"> cert = signed_msg.certificates[0]</code>
1987
+ </li>
1988
+
1989
+ <li class="never" data-hits="" data-linenumber="317">
1990
+
1991
+
1992
+ <code class="ruby"> end</code>
1993
+ </li>
1994
+
1995
+ <li class="never" data-hits="" data-linenumber="318">
1996
+
1997
+
1998
+ <code class="ruby"></code>
1999
+ </li>
2000
+
2001
+ <li class="covered" data-hits="22" data-linenumber="319">
2002
+ <span class="hits">22</span>
2003
+
2004
+ <code class="ruby"> unless signed_msg.verify([cert], store, nil, OpenSSL::PKCS7::NOINTERN | OpenSSL::PKCS7::NOVERIFY)</code>
2005
+ </li>
2006
+
2007
+ <li class="covered" data-hits="3" data-linenumber="320">
2008
+ <span class="hits">3</span>
2009
+
2010
+ <code class="ruby"> raise ERR_MSG_CORRUPT_CERT</code>
2011
+ </li>
2012
+
2013
+ <li class="never" data-hits="" data-linenumber="321">
2014
+
2015
+
2016
+ <code class="ruby"> end</code>
2017
+ </li>
2018
+
2019
+ <li class="never" data-hits="" data-linenumber="322">
2020
+
2021
+
2022
+ <code class="ruby"></code>
2023
+ </li>
2024
+
2025
+ <li class="covered" data-hits="19" data-linenumber="323">
2026
+ <span class="hits">19</span>
2027
+
2028
+ <code class="ruby"> [signed_msg.data[1..-1], cert, signed_msg.data[0]]</code>
2029
+ </li>
2030
+
2031
+ <li class="never" data-hits="" data-linenumber="324">
2032
+
2033
+
2034
+ <code class="ruby"> end</code>
2035
+ </li>
2036
+
2037
+ <li class="never" data-hits="" data-linenumber="325">
2038
+
2039
+
2040
+ <code class="ruby"></code>
2041
+ </li>
2042
+
2043
+ <li class="never" data-hits="" data-linenumber="326">
2044
+
2045
+
2046
+ <code class="ruby"> # Generate new RSA keypair and certificate.</code>
2047
+ </li>
2048
+
2049
+ <li class="never" data-hits="" data-linenumber="327">
2050
+
2051
+
2052
+ <code class="ruby"> #</code>
2053
+ </li>
2054
+
2055
+ <li class="never" data-hits="" data-linenumber="328">
2056
+
2057
+
2058
+ <code class="ruby"> # @param [Integer] rsa_bits RSA key length</code>
2059
+ </li>
2060
+
2061
+ <li class="never" data-hits="" data-linenumber="329">
2062
+
2063
+
2064
+ <code class="ruby"> # @param [OpenSSL::Digest] digest Signature digest</code>
2065
+ </li>
2066
+
2067
+ <li class="never" data-hits="" data-linenumber="330">
2068
+
2069
+
2070
+ <code class="ruby"> # @return [Array] rsa_keypair, certificate</code>
2071
+ </li>
2072
+
2073
+ <li class="covered" data-hits="1" data-linenumber="331">
2074
+ <span class="hits">1</span>
2075
+
2076
+ <code class="ruby"> def generate_keypair(rsa_bits = DEFAULT_RSA_BITS, digest = DEFAULT_DIGEST)</code>
2077
+ </li>
2078
+
2079
+ <li class="covered" data-hits="61" data-linenumber="332">
2080
+ <span class="hits">61</span>
2081
+
2082
+ <code class="ruby"> cn = &quot;Akero #{Akero::VERSION}&quot;</code>
2083
+ </li>
2084
+
2085
+ <li class="covered" data-hits="61" data-linenumber="333">
2086
+ <span class="hits">61</span>
2087
+
2088
+ <code class="ruby"> rsa = OpenSSL::PKey::RSA.new(rsa_bits)</code>
2089
+ </li>
2090
+
2091
+ <li class="never" data-hits="" data-linenumber="334">
2092
+
2093
+
2094
+ <code class="ruby"></code>
2095
+ </li>
2096
+
2097
+ <li class="covered" data-hits="61" data-linenumber="335">
2098
+ <span class="hits">61</span>
2099
+
2100
+ <code class="ruby"> cert = OpenSSL::X509::Certificate.new</code>
2101
+ </li>
2102
+
2103
+ <li class="covered" data-hits="61" data-linenumber="336">
2104
+ <span class="hits">61</span>
2105
+
2106
+ <code class="ruby"> cert.version = 3</code>
2107
+ </li>
2108
+
2109
+ <li class="covered" data-hits="61" data-linenumber="337">
2110
+ <span class="hits">61</span>
2111
+
2112
+ <code class="ruby"> cert.serial = rand(2**42)</code>
2113
+ </li>
2114
+
2115
+ <li class="covered" data-hits="61" data-linenumber="338">
2116
+ <span class="hits">61</span>
2117
+
2118
+ <code class="ruby"> name = OpenSSL::X509::Name.parse(&quot;/CN=#{cn}&quot;)</code>
2119
+ </li>
2120
+
2121
+ <li class="covered" data-hits="61" data-linenumber="339">
2122
+ <span class="hits">61</span>
2123
+
2124
+ <code class="ruby"> cert.subject = name</code>
2125
+ </li>
2126
+
2127
+ <li class="covered" data-hits="61" data-linenumber="340">
2128
+ <span class="hits">61</span>
2129
+
2130
+ <code class="ruby"> cert.issuer = name</code>
2131
+ </li>
2132
+
2133
+ <li class="covered" data-hits="61" data-linenumber="341">
2134
+ <span class="hits">61</span>
2135
+
2136
+ <code class="ruby"> cert.not_before = Time.now</code>
2137
+ </li>
2138
+
2139
+ <li class="never" data-hits="" data-linenumber="342">
2140
+
2141
+
2142
+ <code class="ruby"> # valid until 2038-01-19 04:14:06 +0100</code>
2143
+ </li>
2144
+
2145
+ <li class="covered" data-hits="61" data-linenumber="343">
2146
+ <span class="hits">61</span>
2147
+
2148
+ <code class="ruby"> cert.not_after = Time.at(2_147_483_646)</code>
2149
+ </li>
2150
+
2151
+ <li class="covered" data-hits="61" data-linenumber="344">
2152
+ <span class="hits">61</span>
2153
+
2154
+ <code class="ruby"> cert.public_key = rsa.public_key</code>
2155
+ </li>
2156
+
2157
+ <li class="never" data-hits="" data-linenumber="345">
2158
+
2159
+
2160
+ <code class="ruby"></code>
2161
+ </li>
2162
+
2163
+ <li class="covered" data-hits="61" data-linenumber="346">
2164
+ <span class="hits">61</span>
2165
+
2166
+ <code class="ruby"> ef = OpenSSL::X509::ExtensionFactory.new(nil, cert)</code>
2167
+ </li>
2168
+
2169
+ <li class="covered" data-hits="61" data-linenumber="347">
2170
+ <span class="hits">61</span>
2171
+
2172
+ <code class="ruby"> ef.issuer_certificate = cert</code>
2173
+ </li>
2174
+
2175
+ <li class="covered" data-hits="61" data-linenumber="348">
2176
+ <span class="hits">61</span>
2177
+
2178
+ <code class="ruby"> cert.extensions = [</code>
2179
+ </li>
2180
+
2181
+ <li class="never" data-hits="" data-linenumber="349">
2182
+
2183
+
2184
+ <code class="ruby"> ef.create_extension(&#39;basicConstraints&#39;, &#39;CA:FALSE&#39;),</code>
2185
+ </li>
2186
+
2187
+ <li class="never" data-hits="" data-linenumber="350">
2188
+
2189
+
2190
+ <code class="ruby"> ef.create_extension(&#39;subjectKeyIdentifier&#39;, &#39;hash&#39;)</code>
2191
+ </li>
2192
+
2193
+ <li class="never" data-hits="" data-linenumber="351">
2194
+
2195
+
2196
+ <code class="ruby"> ]</code>
2197
+ </li>
2198
+
2199
+ <li class="covered" data-hits="61" data-linenumber="352">
2200
+ <span class="hits">61</span>
2201
+
2202
+ <code class="ruby"> aki = ef.create_extension(&#39;authorityKeyIdentifier&#39;,</code>
2203
+ </li>
2204
+
2205
+ <li class="never" data-hits="" data-linenumber="353">
2206
+
2207
+
2208
+ <code class="ruby"> &#39;keyid:always,issuer:always&#39;)</code>
2209
+ </li>
2210
+
2211
+ <li class="covered" data-hits="61" data-linenumber="354">
2212
+ <span class="hits">61</span>
2213
+
2214
+ <code class="ruby"> cert.add_extension(aki)</code>
2215
+ </li>
2216
+
2217
+ <li class="covered" data-hits="61" data-linenumber="355">
2218
+ <span class="hits">61</span>
2219
+
2220
+ <code class="ruby"> cert.sign(rsa, digest.new)</code>
2221
+ </li>
2222
+
2223
+ <li class="covered" data-hits="61" data-linenumber="356">
2224
+ <span class="hits">61</span>
2225
+
2226
+ <code class="ruby"> [rsa, cert]</code>
2227
+ </li>
2228
+
2229
+ <li class="never" data-hits="" data-linenumber="357">
2230
+
2231
+
2232
+ <code class="ruby"> end</code>
2233
+ </li>
2234
+
2235
+ <li class="never" data-hits="" data-linenumber="358">
2236
+
2237
+
2238
+ <code class="ruby">end</code>
2239
+ </li>
2240
+
2241
+ </ol>
2242
+ </pre>
2243
+ </div>
2244
+
2245
+ </div>
2246
+ </div>
2247
+ </body>
2248
+ </html>