akero 1.0.4 → 1.1.0

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