ring-native 0.0.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 (261) hide show
  1. checksums.yaml +7 -0
  2. data/.gitignore +9 -0
  3. data/Gemfile +3 -0
  4. data/README.md +22 -0
  5. data/Rakefile +1 -0
  6. data/ext/ring/extconf.rb +29 -0
  7. data/lib/ring/native.rb +8 -0
  8. data/lib/ring/native/version.rb +5 -0
  9. data/ring-native.gemspec +25 -0
  10. data/vendor/ring/BUILDING.md +40 -0
  11. data/vendor/ring/Cargo.toml +43 -0
  12. data/vendor/ring/LICENSE +185 -0
  13. data/vendor/ring/Makefile +35 -0
  14. data/vendor/ring/PORTING.md +163 -0
  15. data/vendor/ring/README.md +113 -0
  16. data/vendor/ring/STYLE.md +197 -0
  17. data/vendor/ring/appveyor.yml +27 -0
  18. data/vendor/ring/build.rs +108 -0
  19. data/vendor/ring/crypto/aes/aes.c +1142 -0
  20. data/vendor/ring/crypto/aes/aes_test.Windows.vcxproj +25 -0
  21. data/vendor/ring/crypto/aes/aes_test.cc +93 -0
  22. data/vendor/ring/crypto/aes/asm/aes-586.pl +2368 -0
  23. data/vendor/ring/crypto/aes/asm/aes-armv4.pl +1249 -0
  24. data/vendor/ring/crypto/aes/asm/aes-x86_64.pl +2246 -0
  25. data/vendor/ring/crypto/aes/asm/aesni-x86.pl +1318 -0
  26. data/vendor/ring/crypto/aes/asm/aesni-x86_64.pl +2084 -0
  27. data/vendor/ring/crypto/aes/asm/aesv8-armx.pl +675 -0
  28. data/vendor/ring/crypto/aes/asm/bsaes-armv7.pl +1364 -0
  29. data/vendor/ring/crypto/aes/asm/bsaes-x86_64.pl +1565 -0
  30. data/vendor/ring/crypto/aes/asm/vpaes-x86.pl +841 -0
  31. data/vendor/ring/crypto/aes/asm/vpaes-x86_64.pl +1116 -0
  32. data/vendor/ring/crypto/aes/internal.h +87 -0
  33. data/vendor/ring/crypto/aes/mode_wrappers.c +61 -0
  34. data/vendor/ring/crypto/bn/add.c +394 -0
  35. data/vendor/ring/crypto/bn/asm/armv4-mont.pl +694 -0
  36. data/vendor/ring/crypto/bn/asm/armv8-mont.pl +1503 -0
  37. data/vendor/ring/crypto/bn/asm/bn-586.pl +774 -0
  38. data/vendor/ring/crypto/bn/asm/co-586.pl +287 -0
  39. data/vendor/ring/crypto/bn/asm/rsaz-avx2.pl +1882 -0
  40. data/vendor/ring/crypto/bn/asm/x86-mont.pl +592 -0
  41. data/vendor/ring/crypto/bn/asm/x86_64-gcc.c +599 -0
  42. data/vendor/ring/crypto/bn/asm/x86_64-mont.pl +1393 -0
  43. data/vendor/ring/crypto/bn/asm/x86_64-mont5.pl +3507 -0
  44. data/vendor/ring/crypto/bn/bn.c +352 -0
  45. data/vendor/ring/crypto/bn/bn_asn1.c +74 -0
  46. data/vendor/ring/crypto/bn/bn_test.Windows.vcxproj +25 -0
  47. data/vendor/ring/crypto/bn/bn_test.cc +1696 -0
  48. data/vendor/ring/crypto/bn/cmp.c +200 -0
  49. data/vendor/ring/crypto/bn/convert.c +433 -0
  50. data/vendor/ring/crypto/bn/ctx.c +311 -0
  51. data/vendor/ring/crypto/bn/div.c +594 -0
  52. data/vendor/ring/crypto/bn/exponentiation.c +1335 -0
  53. data/vendor/ring/crypto/bn/gcd.c +711 -0
  54. data/vendor/ring/crypto/bn/generic.c +1019 -0
  55. data/vendor/ring/crypto/bn/internal.h +316 -0
  56. data/vendor/ring/crypto/bn/montgomery.c +516 -0
  57. data/vendor/ring/crypto/bn/mul.c +888 -0
  58. data/vendor/ring/crypto/bn/prime.c +829 -0
  59. data/vendor/ring/crypto/bn/random.c +334 -0
  60. data/vendor/ring/crypto/bn/rsaz_exp.c +262 -0
  61. data/vendor/ring/crypto/bn/rsaz_exp.h +53 -0
  62. data/vendor/ring/crypto/bn/shift.c +276 -0
  63. data/vendor/ring/crypto/bytestring/bytestring_test.Windows.vcxproj +25 -0
  64. data/vendor/ring/crypto/bytestring/bytestring_test.cc +421 -0
  65. data/vendor/ring/crypto/bytestring/cbb.c +399 -0
  66. data/vendor/ring/crypto/bytestring/cbs.c +227 -0
  67. data/vendor/ring/crypto/bytestring/internal.h +46 -0
  68. data/vendor/ring/crypto/chacha/chacha_generic.c +140 -0
  69. data/vendor/ring/crypto/chacha/chacha_vec.c +323 -0
  70. data/vendor/ring/crypto/chacha/chacha_vec_arm.S +1447 -0
  71. data/vendor/ring/crypto/chacha/chacha_vec_arm_generate.go +153 -0
  72. data/vendor/ring/crypto/cipher/cipher_test.Windows.vcxproj +25 -0
  73. data/vendor/ring/crypto/cipher/e_aes.c +390 -0
  74. data/vendor/ring/crypto/cipher/e_chacha20poly1305.c +208 -0
  75. data/vendor/ring/crypto/cipher/internal.h +173 -0
  76. data/vendor/ring/crypto/cipher/test/aes_128_gcm_tests.txt +543 -0
  77. data/vendor/ring/crypto/cipher/test/aes_128_key_wrap_tests.txt +9 -0
  78. data/vendor/ring/crypto/cipher/test/aes_256_gcm_tests.txt +475 -0
  79. data/vendor/ring/crypto/cipher/test/aes_256_key_wrap_tests.txt +23 -0
  80. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_old_tests.txt +422 -0
  81. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_tests.txt +484 -0
  82. data/vendor/ring/crypto/cipher/test/cipher_test.txt +100 -0
  83. data/vendor/ring/crypto/constant_time_test.Windows.vcxproj +25 -0
  84. data/vendor/ring/crypto/constant_time_test.c +304 -0
  85. data/vendor/ring/crypto/cpu-arm-asm.S +32 -0
  86. data/vendor/ring/crypto/cpu-arm.c +199 -0
  87. data/vendor/ring/crypto/cpu-intel.c +261 -0
  88. data/vendor/ring/crypto/crypto.c +151 -0
  89. data/vendor/ring/crypto/curve25519/asm/x25519-arm.S +2118 -0
  90. data/vendor/ring/crypto/curve25519/curve25519.c +4888 -0
  91. data/vendor/ring/crypto/curve25519/x25519_test.cc +128 -0
  92. data/vendor/ring/crypto/digest/md32_common.h +181 -0
  93. data/vendor/ring/crypto/ec/asm/p256-x86_64-asm.pl +2725 -0
  94. data/vendor/ring/crypto/ec/ec.c +193 -0
  95. data/vendor/ring/crypto/ec/ec_curves.c +61 -0
  96. data/vendor/ring/crypto/ec/ec_key.c +228 -0
  97. data/vendor/ring/crypto/ec/ec_montgomery.c +114 -0
  98. data/vendor/ring/crypto/ec/example_mul.Windows.vcxproj +25 -0
  99. data/vendor/ring/crypto/ec/internal.h +243 -0
  100. data/vendor/ring/crypto/ec/oct.c +253 -0
  101. data/vendor/ring/crypto/ec/p256-64.c +1794 -0
  102. data/vendor/ring/crypto/ec/p256-x86_64-table.h +9548 -0
  103. data/vendor/ring/crypto/ec/p256-x86_64.c +509 -0
  104. data/vendor/ring/crypto/ec/simple.c +1007 -0
  105. data/vendor/ring/crypto/ec/util-64.c +183 -0
  106. data/vendor/ring/crypto/ec/wnaf.c +508 -0
  107. data/vendor/ring/crypto/ecdh/ecdh.c +155 -0
  108. data/vendor/ring/crypto/ecdsa/ecdsa.c +304 -0
  109. data/vendor/ring/crypto/ecdsa/ecdsa_asn1.c +193 -0
  110. data/vendor/ring/crypto/ecdsa/ecdsa_test.Windows.vcxproj +25 -0
  111. data/vendor/ring/crypto/ecdsa/ecdsa_test.cc +327 -0
  112. data/vendor/ring/crypto/header_removed.h +17 -0
  113. data/vendor/ring/crypto/internal.h +495 -0
  114. data/vendor/ring/crypto/libring.Windows.vcxproj +101 -0
  115. data/vendor/ring/crypto/mem.c +98 -0
  116. data/vendor/ring/crypto/modes/asm/aesni-gcm-x86_64.pl +1045 -0
  117. data/vendor/ring/crypto/modes/asm/ghash-armv4.pl +517 -0
  118. data/vendor/ring/crypto/modes/asm/ghash-x86.pl +1393 -0
  119. data/vendor/ring/crypto/modes/asm/ghash-x86_64.pl +1741 -0
  120. data/vendor/ring/crypto/modes/asm/ghashv8-armx.pl +422 -0
  121. data/vendor/ring/crypto/modes/ctr.c +226 -0
  122. data/vendor/ring/crypto/modes/gcm.c +1206 -0
  123. data/vendor/ring/crypto/modes/gcm_test.Windows.vcxproj +25 -0
  124. data/vendor/ring/crypto/modes/gcm_test.c +348 -0
  125. data/vendor/ring/crypto/modes/internal.h +299 -0
  126. data/vendor/ring/crypto/perlasm/arm-xlate.pl +170 -0
  127. data/vendor/ring/crypto/perlasm/readme +100 -0
  128. data/vendor/ring/crypto/perlasm/x86_64-xlate.pl +1164 -0
  129. data/vendor/ring/crypto/perlasm/x86asm.pl +292 -0
  130. data/vendor/ring/crypto/perlasm/x86gas.pl +263 -0
  131. data/vendor/ring/crypto/perlasm/x86masm.pl +200 -0
  132. data/vendor/ring/crypto/perlasm/x86nasm.pl +187 -0
  133. data/vendor/ring/crypto/poly1305/poly1305.c +331 -0
  134. data/vendor/ring/crypto/poly1305/poly1305_arm.c +301 -0
  135. data/vendor/ring/crypto/poly1305/poly1305_arm_asm.S +2015 -0
  136. data/vendor/ring/crypto/poly1305/poly1305_test.Windows.vcxproj +25 -0
  137. data/vendor/ring/crypto/poly1305/poly1305_test.cc +80 -0
  138. data/vendor/ring/crypto/poly1305/poly1305_test.txt +52 -0
  139. data/vendor/ring/crypto/poly1305/poly1305_vec.c +892 -0
  140. data/vendor/ring/crypto/rand/asm/rdrand-x86_64.pl +75 -0
  141. data/vendor/ring/crypto/rand/internal.h +32 -0
  142. data/vendor/ring/crypto/rand/rand.c +189 -0
  143. data/vendor/ring/crypto/rand/urandom.c +219 -0
  144. data/vendor/ring/crypto/rand/windows.c +56 -0
  145. data/vendor/ring/crypto/refcount_c11.c +66 -0
  146. data/vendor/ring/crypto/refcount_lock.c +53 -0
  147. data/vendor/ring/crypto/refcount_test.Windows.vcxproj +25 -0
  148. data/vendor/ring/crypto/refcount_test.c +58 -0
  149. data/vendor/ring/crypto/rsa/blinding.c +462 -0
  150. data/vendor/ring/crypto/rsa/internal.h +108 -0
  151. data/vendor/ring/crypto/rsa/padding.c +300 -0
  152. data/vendor/ring/crypto/rsa/rsa.c +450 -0
  153. data/vendor/ring/crypto/rsa/rsa_asn1.c +261 -0
  154. data/vendor/ring/crypto/rsa/rsa_impl.c +944 -0
  155. data/vendor/ring/crypto/rsa/rsa_test.Windows.vcxproj +25 -0
  156. data/vendor/ring/crypto/rsa/rsa_test.cc +437 -0
  157. data/vendor/ring/crypto/sha/asm/sha-armv8.pl +436 -0
  158. data/vendor/ring/crypto/sha/asm/sha-x86_64.pl +2390 -0
  159. data/vendor/ring/crypto/sha/asm/sha256-586.pl +1275 -0
  160. data/vendor/ring/crypto/sha/asm/sha256-armv4.pl +735 -0
  161. data/vendor/ring/crypto/sha/asm/sha256-armv8.pl +14 -0
  162. data/vendor/ring/crypto/sha/asm/sha256-x86_64.pl +14 -0
  163. data/vendor/ring/crypto/sha/asm/sha512-586.pl +911 -0
  164. data/vendor/ring/crypto/sha/asm/sha512-armv4.pl +666 -0
  165. data/vendor/ring/crypto/sha/asm/sha512-armv8.pl +14 -0
  166. data/vendor/ring/crypto/sha/asm/sha512-x86_64.pl +14 -0
  167. data/vendor/ring/crypto/sha/sha1.c +271 -0
  168. data/vendor/ring/crypto/sha/sha256.c +204 -0
  169. data/vendor/ring/crypto/sha/sha512.c +355 -0
  170. data/vendor/ring/crypto/test/file_test.cc +326 -0
  171. data/vendor/ring/crypto/test/file_test.h +181 -0
  172. data/vendor/ring/crypto/test/malloc.cc +150 -0
  173. data/vendor/ring/crypto/test/scoped_types.h +95 -0
  174. data/vendor/ring/crypto/test/test.Windows.vcxproj +35 -0
  175. data/vendor/ring/crypto/test/test_util.cc +46 -0
  176. data/vendor/ring/crypto/test/test_util.h +41 -0
  177. data/vendor/ring/crypto/thread_none.c +55 -0
  178. data/vendor/ring/crypto/thread_pthread.c +165 -0
  179. data/vendor/ring/crypto/thread_test.Windows.vcxproj +25 -0
  180. data/vendor/ring/crypto/thread_test.c +200 -0
  181. data/vendor/ring/crypto/thread_win.c +282 -0
  182. data/vendor/ring/examples/checkdigest.rs +103 -0
  183. data/vendor/ring/include/openssl/aes.h +121 -0
  184. data/vendor/ring/include/openssl/arm_arch.h +129 -0
  185. data/vendor/ring/include/openssl/base.h +156 -0
  186. data/vendor/ring/include/openssl/bn.h +794 -0
  187. data/vendor/ring/include/openssl/buffer.h +18 -0
  188. data/vendor/ring/include/openssl/bytestring.h +235 -0
  189. data/vendor/ring/include/openssl/chacha.h +37 -0
  190. data/vendor/ring/include/openssl/cmac.h +76 -0
  191. data/vendor/ring/include/openssl/cpu.h +184 -0
  192. data/vendor/ring/include/openssl/crypto.h +43 -0
  193. data/vendor/ring/include/openssl/curve25519.h +88 -0
  194. data/vendor/ring/include/openssl/ec.h +225 -0
  195. data/vendor/ring/include/openssl/ec_key.h +129 -0
  196. data/vendor/ring/include/openssl/ecdh.h +110 -0
  197. data/vendor/ring/include/openssl/ecdsa.h +156 -0
  198. data/vendor/ring/include/openssl/err.h +201 -0
  199. data/vendor/ring/include/openssl/mem.h +101 -0
  200. data/vendor/ring/include/openssl/obj_mac.h +71 -0
  201. data/vendor/ring/include/openssl/opensslfeatures.h +68 -0
  202. data/vendor/ring/include/openssl/opensslv.h +18 -0
  203. data/vendor/ring/include/openssl/ossl_typ.h +18 -0
  204. data/vendor/ring/include/openssl/poly1305.h +51 -0
  205. data/vendor/ring/include/openssl/rand.h +70 -0
  206. data/vendor/ring/include/openssl/rsa.h +399 -0
  207. data/vendor/ring/include/openssl/thread.h +133 -0
  208. data/vendor/ring/include/openssl/type_check.h +71 -0
  209. data/vendor/ring/mk/Common.props +63 -0
  210. data/vendor/ring/mk/Windows.props +42 -0
  211. data/vendor/ring/mk/WindowsTest.props +18 -0
  212. data/vendor/ring/mk/appveyor.bat +62 -0
  213. data/vendor/ring/mk/bottom_of_makefile.mk +54 -0
  214. data/vendor/ring/mk/ring.mk +266 -0
  215. data/vendor/ring/mk/top_of_makefile.mk +214 -0
  216. data/vendor/ring/mk/travis.sh +40 -0
  217. data/vendor/ring/mk/update-travis-yml.py +229 -0
  218. data/vendor/ring/ring.sln +153 -0
  219. data/vendor/ring/src/aead.rs +682 -0
  220. data/vendor/ring/src/agreement.rs +248 -0
  221. data/vendor/ring/src/c.rs +129 -0
  222. data/vendor/ring/src/constant_time.rs +37 -0
  223. data/vendor/ring/src/der.rs +96 -0
  224. data/vendor/ring/src/digest.rs +690 -0
  225. data/vendor/ring/src/digest_tests.txt +57 -0
  226. data/vendor/ring/src/ecc.rs +28 -0
  227. data/vendor/ring/src/ecc_build.rs +279 -0
  228. data/vendor/ring/src/ecc_curves.rs +117 -0
  229. data/vendor/ring/src/ed25519_tests.txt +2579 -0
  230. data/vendor/ring/src/exe_tests.rs +46 -0
  231. data/vendor/ring/src/ffi.rs +29 -0
  232. data/vendor/ring/src/file_test.rs +187 -0
  233. data/vendor/ring/src/hkdf.rs +153 -0
  234. data/vendor/ring/src/hkdf_tests.txt +59 -0
  235. data/vendor/ring/src/hmac.rs +414 -0
  236. data/vendor/ring/src/hmac_tests.txt +97 -0
  237. data/vendor/ring/src/input.rs +312 -0
  238. data/vendor/ring/src/lib.rs +41 -0
  239. data/vendor/ring/src/pbkdf2.rs +265 -0
  240. data/vendor/ring/src/pbkdf2_tests.txt +113 -0
  241. data/vendor/ring/src/polyfill.rs +57 -0
  242. data/vendor/ring/src/rand.rs +28 -0
  243. data/vendor/ring/src/signature.rs +314 -0
  244. data/vendor/ring/third-party/NIST/README.md +9 -0
  245. data/vendor/ring/third-party/NIST/SHAVS/SHA1LongMsg.rsp +263 -0
  246. data/vendor/ring/third-party/NIST/SHAVS/SHA1Monte.rsp +309 -0
  247. data/vendor/ring/third-party/NIST/SHAVS/SHA1ShortMsg.rsp +267 -0
  248. data/vendor/ring/third-party/NIST/SHAVS/SHA224LongMsg.rsp +263 -0
  249. data/vendor/ring/third-party/NIST/SHAVS/SHA224Monte.rsp +309 -0
  250. data/vendor/ring/third-party/NIST/SHAVS/SHA224ShortMsg.rsp +267 -0
  251. data/vendor/ring/third-party/NIST/SHAVS/SHA256LongMsg.rsp +263 -0
  252. data/vendor/ring/third-party/NIST/SHAVS/SHA256Monte.rsp +309 -0
  253. data/vendor/ring/third-party/NIST/SHAVS/SHA256ShortMsg.rsp +267 -0
  254. data/vendor/ring/third-party/NIST/SHAVS/SHA384LongMsg.rsp +519 -0
  255. data/vendor/ring/third-party/NIST/SHAVS/SHA384Monte.rsp +309 -0
  256. data/vendor/ring/third-party/NIST/SHAVS/SHA384ShortMsg.rsp +523 -0
  257. data/vendor/ring/third-party/NIST/SHAVS/SHA512LongMsg.rsp +519 -0
  258. data/vendor/ring/third-party/NIST/SHAVS/SHA512Monte.rsp +309 -0
  259. data/vendor/ring/third-party/NIST/SHAVS/SHA512ShortMsg.rsp +523 -0
  260. data/vendor/ring/third-party/NIST/sha256sums.txt +1 -0
  261. metadata +333 -0
@@ -0,0 +1,312 @@
1
+ // Copyright 2015 Brian Smith.
2
+ //
3
+ // Permission to use, copy, modify, and/or distribute this software for any
4
+ // purpose with or without fee is hereby granted, provided that the above
5
+ // copyright notice and this permission notice appear in all copies.
6
+ //
7
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
8
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
10
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ //! The Input/Reader framework for safe, fast, zero-heap-usage protocol parsing.
16
+ //!
17
+ //! The Input/Reader framework goes beyond Rust's normal safety guarantees by
18
+ //! also guaranteeing that parsing will be panic-free, as long as
19
+ //! `Input::as_slice_less_safe` is not used. It avoids copying data and heap
20
+ //! allocation and strives to prevent common pitfalls such as accidentally
21
+ //! parsing input bytes multiple times. In order to meet these goals, the
22
+ //! Input/Reader framework is limited in functionality such that it works best
23
+ //! for input languages with a small fixed amount of lookahead such as ASN.1,
24
+ //! TLS, TCP/IP, and many other networking, IPC, and related protocols.
25
+ //! Input languages that require more lookahead and/or backtracking require
26
+ //! some significant contortions to parse using this framework. It would not be
27
+ //! realistic to use it for parsing programming language code or natural
28
+ //! language text, for example.
29
+ //!
30
+ //! The overall pattern for using the Input/Reader framework is:
31
+ //!
32
+ //! 1. Write a recursive-descent-style parser for the input language, where the
33
+ //! input data is given as a `&mut Reader` parameter to each function. Each
34
+ //! function should have a return type of `Result<V, E>` for some value type
35
+ //! `V` and some error type `E`, either or both of which may be `()`.
36
+ //! Functions for parsing the lowest-level language constructs should be
37
+ //! defined. Those lowest-level functions will parse their inputs using
38
+ //! `Reader::read_byte`, `Reader::peek`, and similar functions. Higher-level
39
+ //! language constructs are then parsed by calling the lower-level functions
40
+ //! in sequence.
41
+ //!
42
+ //! 2. Wrap the top-most functions of your recursive-descent parser in
43
+ //! functions that take their input data as an `Input`. The wrapper
44
+ //! functions should pass the `Input` to `read_all` or one of the variants.
45
+ //! The wrapper functions are the only ones that should be exposed outside
46
+ //! the parser's module.
47
+ //!
48
+ //! 3. After receiving the input data to parse, wrap it in an `Input` using
49
+ //! `Input::new` as early as possible. Pass the `Input` to the wrapper
50
+ //! functions when they need to be parsed.
51
+ //!
52
+ //! In general parsers built using `Reader` do not need to explicitly check
53
+ //! for end-of-input unless they are parsing optional constructs, because
54
+ //! `Reader::read_byte()` will return `Err(())` on end-of-input. Similarly,
55
+ //! parsers using `Reader` generally don't need to check for extra junk at the
56
+ //! end of the input as long as the parser's API uses the pattern described
57
+ //! above, as `read_all` and its variants automatically check for trailing
58
+ //! junk. `Reader::skip_to_end` should be used when the end of the input should
59
+ //! be ignored without triggering an error.
60
+ //!
61
+ //! The Input/Reader framework works best when all processing of the input data
62
+ //! is done through the `Input` and `Reader` types. In particular, avoid trying
63
+ //! to parse input data using functions that take slices. However, when you
64
+ //! need to access a part of the input data as a slice,
65
+ //! `Input::as_slice_less_safe` can be used. *ring* is in the process of
66
+ //! migrating fully to using `Input` for all inputs to the crypto functions,
67
+ //! which means that `Input::as_slice_less_safe` currently needs to be used
68
+ //! frequently to use *ring*'s crypto functionality. This will change soon.
69
+ //!
70
+ //! [libwebpki](https://github.com/briansmith/webpki)'s X.509 certificate
71
+ //! parser is a good example of a real-world use of the Input/Reader framework
72
+ //! to parse complex data.
73
+
74
+ use std;
75
+
76
+ /// Calls `read` with the given input as a `Reader`, ensuring that `read`
77
+ /// consumed the entire input. If `read` does not consume the entire input,
78
+ /// `incomplete_read` is returned.
79
+ pub fn read_all<'a, F, R, E>(input: Input<'a>, incomplete_read: E, read: F)
80
+ -> Result<R, E>
81
+ where F: FnOnce(&mut Reader<'a>) -> Result<R, E> {
82
+ let mut input = Reader::new(input);
83
+ let result = try!(read(&mut input));
84
+ if input.at_end() {
85
+ Ok(result)
86
+ } else {
87
+ Err(incomplete_read)
88
+ }
89
+ }
90
+
91
+ /// Like `read_all`, except taking an `FnMut`.
92
+ pub fn read_all_mut<'a, F, R, E>(input: Input<'a>, incomplete_read: E, mut read: F)
93
+ -> Result<R, E>
94
+ where F: FnMut(&mut Reader<'a>)
95
+ -> Result<R, E> {
96
+ let mut input = Reader::new(input);
97
+ let result = try!(read(&mut input));
98
+ if input.at_end() {
99
+ Ok(result)
100
+ } else {
101
+ Err(incomplete_read)
102
+ }
103
+ }
104
+
105
+ /// Calls `read` with the given input as a `Reader`, ensuring that `read`
106
+ /// consumed the entire input. When `input` is `None`, `read` will be called
107
+ /// with `None`.
108
+ pub fn read_all_optional<'a, F, R, E>(input: Option<Input<'a>>,
109
+ incomplete_read: E, read: F)
110
+ -> Result<R, E>
111
+ where F: FnOnce(Option<&mut Reader>)
112
+ -> Result<R, E> {
113
+ match input {
114
+ Some(input) => {
115
+ let mut input = Reader::new(input);
116
+ let result = try!(read(Option::Some(&mut input)));
117
+ if input.at_end() {
118
+ Ok(result)
119
+ } else {
120
+ Err(incomplete_read)
121
+ }
122
+ },
123
+ None => read(Option::None)
124
+ }
125
+ }
126
+
127
+ /// A wrapper around `&'a [u8]` that helps in writing panic-free code.
128
+ ///
129
+ /// No methods of `Input` will ever panic.
130
+ #[derive(Clone, Copy, Debug, PartialEq)]
131
+ pub struct Input<'a> {
132
+ value: no_panic::NoPanicSlice<'a>
133
+ }
134
+
135
+ impl<'a> Input<'a> {
136
+ /// Construct a new `Input` for the given input `bytes`.
137
+ pub fn new(bytes: &'a [u8]) -> Result<Input<'a>, ()> {
138
+ // This limit is important for avoiding integer overflow. In particular,
139
+ // `Reader` assumes that an `i + 1 > i` if `input.value.get(i)` does
140
+ // not return `None`.
141
+ if bytes.len() > std::usize::MAX - 1 {
142
+ return Err(())
143
+ }
144
+ Ok(Input { value: no_panic::NoPanicSlice::new(bytes) })
145
+ }
146
+
147
+ /// Returns `true` if the input is empty and false otherwise.
148
+ #[inline]
149
+ pub fn is_empty(&self) -> bool { self.value.len() == 0 }
150
+
151
+ /// Returns the length of the `Input`.
152
+ #[inline]
153
+ pub fn len(&self) -> usize { self.value.len() }
154
+
155
+ /// Access the input as a slice so it can be processed by functions that
156
+ /// are not written using the Input/Reader framework.
157
+ #[inline]
158
+ pub fn as_slice_less_safe(&self) -> &'a [u8] {
159
+ self.value.as_slice_less_safe()
160
+ }
161
+ }
162
+
163
+ /// Returns `true` if the contents of `Input` `a` are equal to the contents of
164
+ /// slice `b`, and `false` otherwise.
165
+ #[inline]
166
+ pub fn input_equals(a: Input, b: &[u8]) -> bool {
167
+ a.value.as_slice_less_safe() == b
168
+ }
169
+
170
+ /// A read-only, forward-only* cursor into the data in an `Input`.
171
+ ///
172
+ /// Using `Reader` to parse input helps to ensure that no byte of the input
173
+ /// will be accidentally processed more than once. Using `Reader` in
174
+ /// conjunction with `read_all`, `read_all_mut`, and `read_all_optional`
175
+ /// helps ensure that no byte of the input is accidentally left unprocessed.
176
+ /// The methods of `Reader` never panic, so `Reader` also assists the writing
177
+ /// of panic-free code.
178
+ ///
179
+ /// \* `Reader` is not strictly forward-only because of the method
180
+ /// `get_input_between_marks`, which is provided mainly to support calculating
181
+ /// digests over parsed data.
182
+ #[derive(Debug)]
183
+ pub struct Reader<'a> {
184
+ input: no_panic::NoPanicSlice<'a>,
185
+ i: usize
186
+ }
187
+
188
+ /// An index into the already-parsed input of a `Reader`.
189
+ pub struct Mark {
190
+ i: usize
191
+ }
192
+
193
+ impl<'a> Reader<'a> {
194
+ /// Construct a new Reader for the given input. Use `read_all`,
195
+ /// `read_all_mut`, or `read_all_optional` instead of `Reader::new`
196
+ /// whenever possible.
197
+ #[inline]
198
+ pub fn new(input: Input<'a>) -> Reader<'a> {
199
+ Reader { input: input.value, i: 0 }
200
+ }
201
+
202
+ /// Returns `true` if the reader is at the end of the input, and `false`
203
+ /// otherwise.
204
+ #[inline]
205
+ pub fn at_end(&self) -> bool { self.i == self.input.len() }
206
+
207
+ /// Returns an `Input` for already-parsed input that has had its boundaries
208
+ /// marked using `mark`.
209
+ #[inline]
210
+ pub fn get_input_between_marks(&self, mark1: Mark, mark2: Mark)
211
+ -> Result<Input<'a>, ()> {
212
+ self.input.subslice(mark1.i, mark2.i)
213
+ .map(|subslice| Input { value: subslice })
214
+ .ok_or(())
215
+ }
216
+
217
+ /// Return the current position of the `Reader` for future use in a call
218
+ /// to `get_input_between_marks`.
219
+ #[inline]
220
+ pub fn mark(&self) -> Mark { Mark { i: self.i } }
221
+
222
+ /// Returns `true` if there is at least one more byte in the input and that
223
+ /// byte is equal to `b`, and false otherwise.
224
+ pub fn peek(&self, b: u8) -> bool {
225
+ match self.input.get(self.i) {
226
+ Some(actual_b) => return b == *actual_b,
227
+ None => false
228
+ }
229
+ }
230
+
231
+ /// Reads the next input byte.
232
+ ///
233
+ /// Returns `Ok(b)` where `b` is the next input byte, or `Err(())` if the
234
+ /// `Reader` is at the end of the input.
235
+ pub fn read_byte(&mut self) -> Result<u8, ()> {
236
+ match self.input.get(self.i) {
237
+ Some(b) => {
238
+ self.i += 1; // safe from overflow; see Input::new.
239
+ Ok(*b)
240
+ }
241
+ None => Err(())
242
+ }
243
+ }
244
+
245
+ /// Skips `num_bytes` of the input.
246
+ ///
247
+ /// Returns `Ok(())` if there are at least `num_bytes` of input remaining,
248
+ /// and `Err(())` otherwise.
249
+ pub fn skip(&mut self, num_bytes: usize) -> Result<(), ()> {
250
+ self.skip_and_get_input(num_bytes).map(|_| ())
251
+ }
252
+
253
+ /// Skips `num_bytes` of the input, returning the skipped input as an `Input`.
254
+ ///
255
+ /// Returns `Ok(i)` where `i` is an `Input` if there are at least
256
+ /// `num_bytes` of input remaining, and `Err(())` otherwise.
257
+ pub fn skip_and_get_input(&mut self, num_bytes: usize)
258
+ -> Result<Input<'a>, ()> {
259
+ match self.i.checked_add(num_bytes) {
260
+ Some(new_i) => {
261
+ let ret = self.input.subslice(self.i, new_i)
262
+ .map(|subslice| Input { value: subslice })
263
+ .ok_or(());
264
+ self.i = new_i;
265
+ ret
266
+ },
267
+ _ => Err(())
268
+ }
269
+ }
270
+
271
+ /// Skips the reader to the end of the input, returning the skipped input
272
+ /// as an `Input`.
273
+ pub fn skip_to_end(&mut self) -> Input<'a> {
274
+ let to_skip = self.input.len() - self.i;
275
+ self.skip_and_get_input(to_skip).unwrap()
276
+ }
277
+ }
278
+
279
+ mod no_panic {
280
+
281
+ /// A wrapper around a slice that exposes no functions that can panic.
282
+ #[derive(Clone, Copy, Debug, PartialEq)]
283
+ pub struct NoPanicSlice<'a> {
284
+ bytes: &'a [u8]
285
+ }
286
+
287
+ impl<'a> NoPanicSlice<'a> {
288
+ #[inline]
289
+ pub fn new(bytes: &'a [u8]) -> NoPanicSlice<'a> {
290
+ NoPanicSlice { bytes: bytes }
291
+ }
292
+
293
+ #[inline]
294
+ pub fn get(&self, i: usize) -> Option<&u8> { self.bytes.get(i) }
295
+
296
+ #[inline]
297
+ pub fn len(&self) -> usize { self.bytes.len() }
298
+
299
+ #[inline]
300
+ pub fn subslice(&self, start: usize, end: usize) -> Option<NoPanicSlice<'a>> {
301
+ if start <= end && end <= self.bytes.len() {
302
+ Some(NoPanicSlice::new(&self.bytes[start..end]))
303
+ } else {
304
+ None
305
+ }
306
+ }
307
+
308
+ #[inline]
309
+ pub fn as_slice_less_safe(&self) -> &'a [u8] { self.bytes }
310
+ }
311
+
312
+ } // mod no_panic
@@ -0,0 +1,41 @@
1
+ // Copyright 2015 Brian Smith.
2
+ //
3
+ // Permission to use, copy, modify, and/or distribute this software for any
4
+ // purpose with or without fee is hereby granted, provided that the above
5
+ // copyright notice and this permission notice appear in all copies.
6
+ //
7
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
8
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
10
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ #[cfg(test)]
16
+ extern crate rustc_serialize;
17
+
18
+ pub mod aead;
19
+ pub mod agreement;
20
+ mod c;
21
+ pub mod constant_time;
22
+
23
+ #[doc(hidden)]
24
+ pub mod der;
25
+
26
+ pub mod digest;
27
+ mod ecc;
28
+ mod ffi;
29
+ pub mod hkdf;
30
+ pub mod hmac;
31
+ pub mod input;
32
+ pub mod pbkdf2;
33
+ mod polyfill;
34
+ pub mod rand;
35
+ pub mod signature;
36
+
37
+ #[cfg(test)]
38
+ mod exe_tests;
39
+
40
+ #[cfg(test)]
41
+ mod file_test;
@@ -0,0 +1,265 @@
1
+ // Copyright 2015 Brian Smith.
2
+ //
3
+ // Permission to use, copy, modify, and/or distribute this software for any
4
+ // purpose with or without fee is hereby granted, provided that the above
5
+ // copyright notice and this permission notice appear in all copies.
6
+ //
7
+ // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHORS DISCLAIM ALL WARRANTIES
8
+ // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
9
+ // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR
10
+ // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
11
+ // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
12
+ // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
13
+ // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
14
+
15
+ //! PBKDF2 derivation and verification.
16
+ //!
17
+ //! Use `derive` to derive PBKDF2 outputs. Use `verify` to verify secret
18
+ //! against previously-derived outputs.
19
+ //!
20
+ //! PBKDF2 is specified in
21
+ //! [RFC 2898 Section 5.2](https://tools.ietf.org/html/rfc2898#section-5.2)
22
+ //! with test vectors given in [RFC 6070](https://tools.ietf.org/html/rfc6070).
23
+ //! See also [NIST Special Publication
24
+ //! 800-132](http://csrc.nist.gov/publications/nistpubs/800-132/nist-sp800-132.pdf).
25
+ //!
26
+ //! # Examples
27
+ //!
28
+ //! ## Password Database Example
29
+ //!
30
+ //! ```
31
+ //! use ring::pbkdf2;
32
+ //! use std::collections::HashMap;
33
+ //!
34
+ //! static PBKDF2_PRF: &'static pbkdf2::PRF = &pbkdf2::HMAC_SHA256;
35
+ //! const CREDENTIAL_LEN: usize = 32; // digest::SHA256.output_len()
36
+ //! pub type Credential = [u8; CREDENTIAL_LEN];
37
+ //!
38
+ //! struct PasswordDatabase {
39
+ //! pbkdf2_iterations: usize,
40
+ //! db_salt_component: [u8; 16],
41
+ //!
42
+ //! // Normally this would be a persistent database.
43
+ //! storage: HashMap<String, Credential>,
44
+ //! }
45
+ //!
46
+ //! impl PasswordDatabase {
47
+ //! pub fn store_password(&mut self, username: &str, password: &str) {
48
+ //! let salt = self.salt(username);
49
+ //! let mut to_store: Credential = [0u8; CREDENTIAL_LEN];
50
+ //! pbkdf2::derive(PBKDF2_PRF, self.pbkdf2_iterations, &salt,
51
+ //! password.as_bytes(), &mut to_store);
52
+ //! self.storage.insert(String::from(username), to_store);
53
+ //! }
54
+ //!
55
+ //! pub fn verify_password(&self, username: &str, attempted_password: &str)
56
+ //! -> Result<(), ()> {
57
+ //! match self.storage.get(username) {
58
+ //! Some(actual_password) => {
59
+ //! let salt = self.salt(username);
60
+ //! pbkdf2::verify(PBKDF2_PRF, self.pbkdf2_iterations, &salt,
61
+ //! attempted_password.as_bytes(),
62
+ //! actual_password)
63
+ //! },
64
+ //!
65
+ //! None => Err(())
66
+ //! }
67
+ //! }
68
+ //!
69
+ //! // The salt should have a user-specific component so that an attacker
70
+ //! // cannot crack one password for multiple users in the database. It
71
+ //! // should have a database-unique component so that an attacker cannot
72
+ //! // crack the same user's password across databases in the unfortunate
73
+ //! // but common case that the user has used the same password for
74
+ //! // multiple systems.
75
+ //! fn salt(&self, username: &str) -> Vec<u8> {
76
+ //! let mut salt = Vec::with_capacity(self.db_salt_component.len() +
77
+ //! username.as_bytes().len());
78
+ //! salt.extend(self.db_salt_component.as_ref());
79
+ //! salt.extend(username.as_bytes());
80
+ //! salt
81
+ //! }
82
+ //! }
83
+ //!
84
+ //! fn main() {
85
+ //! // Normally these parameters would be loaded from a configuration file.
86
+ //! let mut db = PasswordDatabase {
87
+ //! pbkdf2_iterations: 100_000,
88
+ //! db_salt_component: [
89
+ //! // This value was generated from a secure PRNG.
90
+ //! 0xd6, 0x26, 0x98, 0xda, 0xf4, 0xdc, 0x50, 0x52,
91
+ //! 0x24, 0xf2, 0x27, 0xd1, 0xfe, 0x39, 0x01, 0x8a
92
+ //! ],
93
+ //! storage: HashMap::new(),
94
+ //! };
95
+ //!
96
+ //! db.store_password("alice", "@74d7]404j|W}6u");
97
+ //!
98
+ //! // An attempt to log in with the wrong password fails.
99
+ //! assert!(db.verify_password("alice", "wrong password").is_err());
100
+ //!
101
+ //! // Normally there should be an expoentially-increasing delay between
102
+ //! // attempts to further protect against online attacks.
103
+ //!
104
+ //! // An attempt to log in with the right password succeeds.
105
+ //! assert!(db.verify_password("alice", "@74d7]404j|W}6u").is_ok());
106
+ //! }
107
+
108
+ use super::{constant_time, digest, hmac};
109
+
110
+ /// Fills `out` with the key derived using PBKDF2 with the given inputs.
111
+ ///
112
+ /// Do not use `derive` as part of verifying a secret; use `verify` instead, to
113
+ /// minimize the effectiveness of timing attacks.
114
+ ///
115
+ /// `out.len()` must be no larger than the output length of the digest function
116
+ /// used in the PRF algorithm. This limit is more strict than what the
117
+ /// specification requires. As noted at https://github.com/ctz/fastpbkdf2,
118
+ /// "PBKDF2 is mis-designed and you should avoid asking for more than your hash
119
+ /// function's output length."
120
+ ///
121
+ /// | Parameter | RFC 2898 Section 5.2 Term
122
+ /// |-------------|---------------------------------------
123
+ /// | prf | PRF
124
+ /// | iterations | c (iteration count)
125
+ /// | salt | S (salt)
126
+ /// | secret | P (password)
127
+ /// | out | dk (derived key)
128
+ /// | out.len() | dkLen (derived key length)
129
+ ///
130
+ /// C analog: `PKCS5_PBKDF2_HMAC`
131
+ ///
132
+ /// # Panics
133
+ ///
134
+ /// `derive` panics if `iterations < 1`.
135
+ ///
136
+ /// `derive` panics if `out.len()` is larger than the output length of the
137
+ /// digest function used by the PRF algorithm.
138
+ pub fn derive(prf: &'static PRF, iterations: usize, salt: &[u8], secret: &[u8],
139
+ out: &mut [u8]) {
140
+ assert!(iterations >= 1);
141
+ assert!(out.len() <= prf.digest_alg.output_len);
142
+
143
+ // This implementation's performance is asymptotically optimal as described
144
+ // in https://jbp.io/2015/08/11/pbkdf2-performance-matters/. However, it
145
+ // hasn't been optimized to the same extent as fastpbkdf2. In particular,
146
+ // this implementation is probably doing a lot of unnecessary copying.
147
+
148
+ let secret = hmac::SigningKey::new(prf.digest_alg, secret);
149
+
150
+ // Clear |out|.
151
+ for i in 0..out.len() {
152
+ out[i] = 0;
153
+ }
154
+
155
+ let mut ctx = hmac::SigningContext::with_key(&secret);
156
+ ctx.update(salt);
157
+ ctx.update(&[0, 0, 0, 1]);
158
+ let mut u = ctx.sign();
159
+
160
+ let mut remaining = iterations;
161
+ loop {
162
+ for i in 0..out.len() {
163
+ out[i] ^= u.as_ref()[i];
164
+ }
165
+
166
+ if remaining == 1 {
167
+ break;
168
+ }
169
+ remaining -= 1;
170
+
171
+ u = hmac::sign(&secret, u.as_ref());
172
+ }
173
+ }
174
+
175
+ /// Verifies that a previously-derived (e.g., using `derive`) PBKDF2 value
176
+ /// matches the PBKDF2 value derived from the other inputs.
177
+ ///
178
+ /// The comparison is done in constant time to prevent timing attacks.
179
+ ///
180
+ /// | Parameter | RFC 2898 Section 5.2 Term
181
+ /// |--------------------------|---------------------------------------
182
+ /// | prf | PRF
183
+ /// | iterations | c (iteration count)
184
+ /// | salt | S (salt)
185
+ /// | secret | P (password)
186
+ /// | previously_derived | dk (derived key)
187
+ /// | previously_derived.len() | dkLen (derived key length)
188
+ ///
189
+ /// C analog: `PKCS5_PBKDF2_HMAC` + `CRYPTO_memcmp`
190
+ ///
191
+ /// # Panics
192
+ ///
193
+ /// `verify` panics if `iterations < 1`.
194
+ ///
195
+ /// `verify` panics if `out.len()` is larger than the output length of the
196
+ /// digest function used by the PRF algorithm.
197
+ pub fn verify(prf: &'static PRF, iterations: usize, salt: &[u8], secret: &[u8],
198
+ previously_derived: &[u8]) -> Result<(), ()> {
199
+ let mut derived_buf = [0u8; digest::MAX_OUTPUT_LEN];
200
+ if previously_derived.len() > derived_buf.len() {
201
+ return Err(());
202
+ }
203
+ let derived = &mut derived_buf[0..previously_derived.len()];
204
+ derive(prf, iterations, salt, secret, derived);
205
+ constant_time::verify_slices_are_equal(derived, previously_derived)
206
+ }
207
+
208
+ /// A PRF algorithm for use with `derive` and `verify`.
209
+ pub struct PRF {
210
+ digest_alg: &'static digest::Algorithm,
211
+ }
212
+
213
+ /// HMAC-SHA256.
214
+ pub static HMAC_SHA256: PRF = PRF {
215
+ digest_alg: &digest::SHA256,
216
+ };
217
+
218
+ /// HMAC-SHA512.
219
+ pub static HMAC_SHA512: PRF = PRF {
220
+ digest_alg: &digest::SHA512,
221
+ };
222
+
223
+ /// HMAC-SHA1. *Deprecated*.
224
+ ///
225
+ /// SHA-1 is deprecated in *ring* and its implementation in *ring* will be more
226
+ /// optimized more for size than for speed on some platforms. Since PBKDF2
227
+ /// requires an implementation highly optimized for speed, the size-for-speed
228
+ /// trade-off does not work well for PBKDF2.
229
+ ///
230
+ pub static HMAC_SHA1: PRF = PRF {
231
+ digest_alg: &digest::SHA1,
232
+ };
233
+
234
+ #[cfg(test)]
235
+ mod tests {
236
+ use super::super::{digest, file_test, pbkdf2};
237
+
238
+ #[test]
239
+ pub fn pkbdf2_tests() {
240
+ file_test::run("src/pbkdf2_tests.txt", |section, test_case| {
241
+ assert_eq!(section, "");
242
+ let digest_alg = test_case.consume_digest_alg("Hash").unwrap();
243
+ let iterations = test_case.consume_usize("c");
244
+ let secret = test_case.consume_bytes("P");
245
+ let salt = test_case.consume_bytes("S");
246
+ let dk = test_case.consume_bytes("DK");
247
+
248
+ let prf = if digest_alg.nid == digest::SHA1.nid {
249
+ &pbkdf2::HMAC_SHA1
250
+ } else if digest_alg.nid == digest::SHA256.nid {
251
+ &pbkdf2::HMAC_SHA256
252
+ } else if digest_alg.nid == digest::SHA512.nid {
253
+ &pbkdf2::HMAC_SHA512
254
+ } else {
255
+ unimplemented!();
256
+ };
257
+
258
+ let mut out = vec![0u8; dk.len()];
259
+ pbkdf2::derive(prf, iterations, &salt, &secret, &mut out);
260
+ assert_eq!(dk, out);
261
+ assert!(pbkdf2::verify(prf, iterations, &salt, &secret, &out)
262
+ .is_ok());
263
+ });
264
+ }
265
+ }