ring-native 0.0.0 → 0.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 (267) hide show
  1. checksums.yaml +4 -4
  2. data/.gitignore +1 -0
  3. data/CHANGES.md +7 -0
  4. data/Makefile +5 -0
  5. data/README.md +12 -5
  6. data/Rakefile +4 -0
  7. data/ext/ring/extconf.rb +4 -5
  8. data/lib/ring/native.rb +3 -1
  9. data/lib/ring/native/version.rb +5 -1
  10. data/ring-native.gemspec +6 -6
  11. data/vendor/ring-ffi/Cargo.lock +26 -0
  12. data/vendor/ring-ffi/Cargo.toml +45 -0
  13. data/vendor/ring-ffi/LICENSE +16 -0
  14. data/vendor/ring-ffi/README.md +59 -0
  15. data/vendor/ring-ffi/src/lib.rs +79 -0
  16. metadata +10 -255
  17. data/vendor/ring/BUILDING.md +0 -40
  18. data/vendor/ring/Cargo.toml +0 -43
  19. data/vendor/ring/LICENSE +0 -185
  20. data/vendor/ring/Makefile +0 -35
  21. data/vendor/ring/PORTING.md +0 -163
  22. data/vendor/ring/README.md +0 -113
  23. data/vendor/ring/STYLE.md +0 -197
  24. data/vendor/ring/appveyor.yml +0 -27
  25. data/vendor/ring/build.rs +0 -108
  26. data/vendor/ring/crypto/aes/aes.c +0 -1142
  27. data/vendor/ring/crypto/aes/aes_test.Windows.vcxproj +0 -25
  28. data/vendor/ring/crypto/aes/aes_test.cc +0 -93
  29. data/vendor/ring/crypto/aes/asm/aes-586.pl +0 -2368
  30. data/vendor/ring/crypto/aes/asm/aes-armv4.pl +0 -1249
  31. data/vendor/ring/crypto/aes/asm/aes-x86_64.pl +0 -2246
  32. data/vendor/ring/crypto/aes/asm/aesni-x86.pl +0 -1318
  33. data/vendor/ring/crypto/aes/asm/aesni-x86_64.pl +0 -2084
  34. data/vendor/ring/crypto/aes/asm/aesv8-armx.pl +0 -675
  35. data/vendor/ring/crypto/aes/asm/bsaes-armv7.pl +0 -1364
  36. data/vendor/ring/crypto/aes/asm/bsaes-x86_64.pl +0 -1565
  37. data/vendor/ring/crypto/aes/asm/vpaes-x86.pl +0 -841
  38. data/vendor/ring/crypto/aes/asm/vpaes-x86_64.pl +0 -1116
  39. data/vendor/ring/crypto/aes/internal.h +0 -87
  40. data/vendor/ring/crypto/aes/mode_wrappers.c +0 -61
  41. data/vendor/ring/crypto/bn/add.c +0 -394
  42. data/vendor/ring/crypto/bn/asm/armv4-mont.pl +0 -694
  43. data/vendor/ring/crypto/bn/asm/armv8-mont.pl +0 -1503
  44. data/vendor/ring/crypto/bn/asm/bn-586.pl +0 -774
  45. data/vendor/ring/crypto/bn/asm/co-586.pl +0 -287
  46. data/vendor/ring/crypto/bn/asm/rsaz-avx2.pl +0 -1882
  47. data/vendor/ring/crypto/bn/asm/x86-mont.pl +0 -592
  48. data/vendor/ring/crypto/bn/asm/x86_64-gcc.c +0 -599
  49. data/vendor/ring/crypto/bn/asm/x86_64-mont.pl +0 -1393
  50. data/vendor/ring/crypto/bn/asm/x86_64-mont5.pl +0 -3507
  51. data/vendor/ring/crypto/bn/bn.c +0 -352
  52. data/vendor/ring/crypto/bn/bn_asn1.c +0 -74
  53. data/vendor/ring/crypto/bn/bn_test.Windows.vcxproj +0 -25
  54. data/vendor/ring/crypto/bn/bn_test.cc +0 -1696
  55. data/vendor/ring/crypto/bn/cmp.c +0 -200
  56. data/vendor/ring/crypto/bn/convert.c +0 -433
  57. data/vendor/ring/crypto/bn/ctx.c +0 -311
  58. data/vendor/ring/crypto/bn/div.c +0 -594
  59. data/vendor/ring/crypto/bn/exponentiation.c +0 -1335
  60. data/vendor/ring/crypto/bn/gcd.c +0 -711
  61. data/vendor/ring/crypto/bn/generic.c +0 -1019
  62. data/vendor/ring/crypto/bn/internal.h +0 -316
  63. data/vendor/ring/crypto/bn/montgomery.c +0 -516
  64. data/vendor/ring/crypto/bn/mul.c +0 -888
  65. data/vendor/ring/crypto/bn/prime.c +0 -829
  66. data/vendor/ring/crypto/bn/random.c +0 -334
  67. data/vendor/ring/crypto/bn/rsaz_exp.c +0 -262
  68. data/vendor/ring/crypto/bn/rsaz_exp.h +0 -53
  69. data/vendor/ring/crypto/bn/shift.c +0 -276
  70. data/vendor/ring/crypto/bytestring/bytestring_test.Windows.vcxproj +0 -25
  71. data/vendor/ring/crypto/bytestring/bytestring_test.cc +0 -421
  72. data/vendor/ring/crypto/bytestring/cbb.c +0 -399
  73. data/vendor/ring/crypto/bytestring/cbs.c +0 -227
  74. data/vendor/ring/crypto/bytestring/internal.h +0 -46
  75. data/vendor/ring/crypto/chacha/chacha_generic.c +0 -140
  76. data/vendor/ring/crypto/chacha/chacha_vec.c +0 -323
  77. data/vendor/ring/crypto/chacha/chacha_vec_arm.S +0 -1447
  78. data/vendor/ring/crypto/chacha/chacha_vec_arm_generate.go +0 -153
  79. data/vendor/ring/crypto/cipher/cipher_test.Windows.vcxproj +0 -25
  80. data/vendor/ring/crypto/cipher/e_aes.c +0 -390
  81. data/vendor/ring/crypto/cipher/e_chacha20poly1305.c +0 -208
  82. data/vendor/ring/crypto/cipher/internal.h +0 -173
  83. data/vendor/ring/crypto/cipher/test/aes_128_gcm_tests.txt +0 -543
  84. data/vendor/ring/crypto/cipher/test/aes_128_key_wrap_tests.txt +0 -9
  85. data/vendor/ring/crypto/cipher/test/aes_256_gcm_tests.txt +0 -475
  86. data/vendor/ring/crypto/cipher/test/aes_256_key_wrap_tests.txt +0 -23
  87. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_old_tests.txt +0 -422
  88. data/vendor/ring/crypto/cipher/test/chacha20_poly1305_tests.txt +0 -484
  89. data/vendor/ring/crypto/cipher/test/cipher_test.txt +0 -100
  90. data/vendor/ring/crypto/constant_time_test.Windows.vcxproj +0 -25
  91. data/vendor/ring/crypto/constant_time_test.c +0 -304
  92. data/vendor/ring/crypto/cpu-arm-asm.S +0 -32
  93. data/vendor/ring/crypto/cpu-arm.c +0 -199
  94. data/vendor/ring/crypto/cpu-intel.c +0 -261
  95. data/vendor/ring/crypto/crypto.c +0 -151
  96. data/vendor/ring/crypto/curve25519/asm/x25519-arm.S +0 -2118
  97. data/vendor/ring/crypto/curve25519/curve25519.c +0 -4888
  98. data/vendor/ring/crypto/curve25519/x25519_test.cc +0 -128
  99. data/vendor/ring/crypto/digest/md32_common.h +0 -181
  100. data/vendor/ring/crypto/ec/asm/p256-x86_64-asm.pl +0 -2725
  101. data/vendor/ring/crypto/ec/ec.c +0 -193
  102. data/vendor/ring/crypto/ec/ec_curves.c +0 -61
  103. data/vendor/ring/crypto/ec/ec_key.c +0 -228
  104. data/vendor/ring/crypto/ec/ec_montgomery.c +0 -114
  105. data/vendor/ring/crypto/ec/example_mul.Windows.vcxproj +0 -25
  106. data/vendor/ring/crypto/ec/internal.h +0 -243
  107. data/vendor/ring/crypto/ec/oct.c +0 -253
  108. data/vendor/ring/crypto/ec/p256-64.c +0 -1794
  109. data/vendor/ring/crypto/ec/p256-x86_64-table.h +0 -9548
  110. data/vendor/ring/crypto/ec/p256-x86_64.c +0 -509
  111. data/vendor/ring/crypto/ec/simple.c +0 -1007
  112. data/vendor/ring/crypto/ec/util-64.c +0 -183
  113. data/vendor/ring/crypto/ec/wnaf.c +0 -508
  114. data/vendor/ring/crypto/ecdh/ecdh.c +0 -155
  115. data/vendor/ring/crypto/ecdsa/ecdsa.c +0 -304
  116. data/vendor/ring/crypto/ecdsa/ecdsa_asn1.c +0 -193
  117. data/vendor/ring/crypto/ecdsa/ecdsa_test.Windows.vcxproj +0 -25
  118. data/vendor/ring/crypto/ecdsa/ecdsa_test.cc +0 -327
  119. data/vendor/ring/crypto/header_removed.h +0 -17
  120. data/vendor/ring/crypto/internal.h +0 -495
  121. data/vendor/ring/crypto/libring.Windows.vcxproj +0 -101
  122. data/vendor/ring/crypto/mem.c +0 -98
  123. data/vendor/ring/crypto/modes/asm/aesni-gcm-x86_64.pl +0 -1045
  124. data/vendor/ring/crypto/modes/asm/ghash-armv4.pl +0 -517
  125. data/vendor/ring/crypto/modes/asm/ghash-x86.pl +0 -1393
  126. data/vendor/ring/crypto/modes/asm/ghash-x86_64.pl +0 -1741
  127. data/vendor/ring/crypto/modes/asm/ghashv8-armx.pl +0 -422
  128. data/vendor/ring/crypto/modes/ctr.c +0 -226
  129. data/vendor/ring/crypto/modes/gcm.c +0 -1206
  130. data/vendor/ring/crypto/modes/gcm_test.Windows.vcxproj +0 -25
  131. data/vendor/ring/crypto/modes/gcm_test.c +0 -348
  132. data/vendor/ring/crypto/modes/internal.h +0 -299
  133. data/vendor/ring/crypto/perlasm/arm-xlate.pl +0 -170
  134. data/vendor/ring/crypto/perlasm/readme +0 -100
  135. data/vendor/ring/crypto/perlasm/x86_64-xlate.pl +0 -1164
  136. data/vendor/ring/crypto/perlasm/x86asm.pl +0 -292
  137. data/vendor/ring/crypto/perlasm/x86gas.pl +0 -263
  138. data/vendor/ring/crypto/perlasm/x86masm.pl +0 -200
  139. data/vendor/ring/crypto/perlasm/x86nasm.pl +0 -187
  140. data/vendor/ring/crypto/poly1305/poly1305.c +0 -331
  141. data/vendor/ring/crypto/poly1305/poly1305_arm.c +0 -301
  142. data/vendor/ring/crypto/poly1305/poly1305_arm_asm.S +0 -2015
  143. data/vendor/ring/crypto/poly1305/poly1305_test.Windows.vcxproj +0 -25
  144. data/vendor/ring/crypto/poly1305/poly1305_test.cc +0 -80
  145. data/vendor/ring/crypto/poly1305/poly1305_test.txt +0 -52
  146. data/vendor/ring/crypto/poly1305/poly1305_vec.c +0 -892
  147. data/vendor/ring/crypto/rand/asm/rdrand-x86_64.pl +0 -75
  148. data/vendor/ring/crypto/rand/internal.h +0 -32
  149. data/vendor/ring/crypto/rand/rand.c +0 -189
  150. data/vendor/ring/crypto/rand/urandom.c +0 -219
  151. data/vendor/ring/crypto/rand/windows.c +0 -56
  152. data/vendor/ring/crypto/refcount_c11.c +0 -66
  153. data/vendor/ring/crypto/refcount_lock.c +0 -53
  154. data/vendor/ring/crypto/refcount_test.Windows.vcxproj +0 -25
  155. data/vendor/ring/crypto/refcount_test.c +0 -58
  156. data/vendor/ring/crypto/rsa/blinding.c +0 -462
  157. data/vendor/ring/crypto/rsa/internal.h +0 -108
  158. data/vendor/ring/crypto/rsa/padding.c +0 -300
  159. data/vendor/ring/crypto/rsa/rsa.c +0 -450
  160. data/vendor/ring/crypto/rsa/rsa_asn1.c +0 -261
  161. data/vendor/ring/crypto/rsa/rsa_impl.c +0 -944
  162. data/vendor/ring/crypto/rsa/rsa_test.Windows.vcxproj +0 -25
  163. data/vendor/ring/crypto/rsa/rsa_test.cc +0 -437
  164. data/vendor/ring/crypto/sha/asm/sha-armv8.pl +0 -436
  165. data/vendor/ring/crypto/sha/asm/sha-x86_64.pl +0 -2390
  166. data/vendor/ring/crypto/sha/asm/sha256-586.pl +0 -1275
  167. data/vendor/ring/crypto/sha/asm/sha256-armv4.pl +0 -735
  168. data/vendor/ring/crypto/sha/asm/sha256-armv8.pl +0 -14
  169. data/vendor/ring/crypto/sha/asm/sha256-x86_64.pl +0 -14
  170. data/vendor/ring/crypto/sha/asm/sha512-586.pl +0 -911
  171. data/vendor/ring/crypto/sha/asm/sha512-armv4.pl +0 -666
  172. data/vendor/ring/crypto/sha/asm/sha512-armv8.pl +0 -14
  173. data/vendor/ring/crypto/sha/asm/sha512-x86_64.pl +0 -14
  174. data/vendor/ring/crypto/sha/sha1.c +0 -271
  175. data/vendor/ring/crypto/sha/sha256.c +0 -204
  176. data/vendor/ring/crypto/sha/sha512.c +0 -355
  177. data/vendor/ring/crypto/test/file_test.cc +0 -326
  178. data/vendor/ring/crypto/test/file_test.h +0 -181
  179. data/vendor/ring/crypto/test/malloc.cc +0 -150
  180. data/vendor/ring/crypto/test/scoped_types.h +0 -95
  181. data/vendor/ring/crypto/test/test.Windows.vcxproj +0 -35
  182. data/vendor/ring/crypto/test/test_util.cc +0 -46
  183. data/vendor/ring/crypto/test/test_util.h +0 -41
  184. data/vendor/ring/crypto/thread_none.c +0 -55
  185. data/vendor/ring/crypto/thread_pthread.c +0 -165
  186. data/vendor/ring/crypto/thread_test.Windows.vcxproj +0 -25
  187. data/vendor/ring/crypto/thread_test.c +0 -200
  188. data/vendor/ring/crypto/thread_win.c +0 -282
  189. data/vendor/ring/examples/checkdigest.rs +0 -103
  190. data/vendor/ring/include/openssl/aes.h +0 -121
  191. data/vendor/ring/include/openssl/arm_arch.h +0 -129
  192. data/vendor/ring/include/openssl/base.h +0 -156
  193. data/vendor/ring/include/openssl/bn.h +0 -794
  194. data/vendor/ring/include/openssl/buffer.h +0 -18
  195. data/vendor/ring/include/openssl/bytestring.h +0 -235
  196. data/vendor/ring/include/openssl/chacha.h +0 -37
  197. data/vendor/ring/include/openssl/cmac.h +0 -76
  198. data/vendor/ring/include/openssl/cpu.h +0 -184
  199. data/vendor/ring/include/openssl/crypto.h +0 -43
  200. data/vendor/ring/include/openssl/curve25519.h +0 -88
  201. data/vendor/ring/include/openssl/ec.h +0 -225
  202. data/vendor/ring/include/openssl/ec_key.h +0 -129
  203. data/vendor/ring/include/openssl/ecdh.h +0 -110
  204. data/vendor/ring/include/openssl/ecdsa.h +0 -156
  205. data/vendor/ring/include/openssl/err.h +0 -201
  206. data/vendor/ring/include/openssl/mem.h +0 -101
  207. data/vendor/ring/include/openssl/obj_mac.h +0 -71
  208. data/vendor/ring/include/openssl/opensslfeatures.h +0 -68
  209. data/vendor/ring/include/openssl/opensslv.h +0 -18
  210. data/vendor/ring/include/openssl/ossl_typ.h +0 -18
  211. data/vendor/ring/include/openssl/poly1305.h +0 -51
  212. data/vendor/ring/include/openssl/rand.h +0 -70
  213. data/vendor/ring/include/openssl/rsa.h +0 -399
  214. data/vendor/ring/include/openssl/thread.h +0 -133
  215. data/vendor/ring/include/openssl/type_check.h +0 -71
  216. data/vendor/ring/mk/Common.props +0 -63
  217. data/vendor/ring/mk/Windows.props +0 -42
  218. data/vendor/ring/mk/WindowsTest.props +0 -18
  219. data/vendor/ring/mk/appveyor.bat +0 -62
  220. data/vendor/ring/mk/bottom_of_makefile.mk +0 -54
  221. data/vendor/ring/mk/ring.mk +0 -266
  222. data/vendor/ring/mk/top_of_makefile.mk +0 -214
  223. data/vendor/ring/mk/travis.sh +0 -40
  224. data/vendor/ring/mk/update-travis-yml.py +0 -229
  225. data/vendor/ring/ring.sln +0 -153
  226. data/vendor/ring/src/aead.rs +0 -682
  227. data/vendor/ring/src/agreement.rs +0 -248
  228. data/vendor/ring/src/c.rs +0 -129
  229. data/vendor/ring/src/constant_time.rs +0 -37
  230. data/vendor/ring/src/der.rs +0 -96
  231. data/vendor/ring/src/digest.rs +0 -690
  232. data/vendor/ring/src/digest_tests.txt +0 -57
  233. data/vendor/ring/src/ecc.rs +0 -28
  234. data/vendor/ring/src/ecc_build.rs +0 -279
  235. data/vendor/ring/src/ecc_curves.rs +0 -117
  236. data/vendor/ring/src/ed25519_tests.txt +0 -2579
  237. data/vendor/ring/src/exe_tests.rs +0 -46
  238. data/vendor/ring/src/ffi.rs +0 -29
  239. data/vendor/ring/src/file_test.rs +0 -187
  240. data/vendor/ring/src/hkdf.rs +0 -153
  241. data/vendor/ring/src/hkdf_tests.txt +0 -59
  242. data/vendor/ring/src/hmac.rs +0 -414
  243. data/vendor/ring/src/hmac_tests.txt +0 -97
  244. data/vendor/ring/src/input.rs +0 -312
  245. data/vendor/ring/src/lib.rs +0 -41
  246. data/vendor/ring/src/pbkdf2.rs +0 -265
  247. data/vendor/ring/src/pbkdf2_tests.txt +0 -113
  248. data/vendor/ring/src/polyfill.rs +0 -57
  249. data/vendor/ring/src/rand.rs +0 -28
  250. data/vendor/ring/src/signature.rs +0 -314
  251. data/vendor/ring/third-party/NIST/README.md +0 -9
  252. data/vendor/ring/third-party/NIST/SHAVS/SHA1LongMsg.rsp +0 -263
  253. data/vendor/ring/third-party/NIST/SHAVS/SHA1Monte.rsp +0 -309
  254. data/vendor/ring/third-party/NIST/SHAVS/SHA1ShortMsg.rsp +0 -267
  255. data/vendor/ring/third-party/NIST/SHAVS/SHA224LongMsg.rsp +0 -263
  256. data/vendor/ring/third-party/NIST/SHAVS/SHA224Monte.rsp +0 -309
  257. data/vendor/ring/third-party/NIST/SHAVS/SHA224ShortMsg.rsp +0 -267
  258. data/vendor/ring/third-party/NIST/SHAVS/SHA256LongMsg.rsp +0 -263
  259. data/vendor/ring/third-party/NIST/SHAVS/SHA256Monte.rsp +0 -309
  260. data/vendor/ring/third-party/NIST/SHAVS/SHA256ShortMsg.rsp +0 -267
  261. data/vendor/ring/third-party/NIST/SHAVS/SHA384LongMsg.rsp +0 -519
  262. data/vendor/ring/third-party/NIST/SHAVS/SHA384Monte.rsp +0 -309
  263. data/vendor/ring/third-party/NIST/SHAVS/SHA384ShortMsg.rsp +0 -523
  264. data/vendor/ring/third-party/NIST/SHAVS/SHA512LongMsg.rsp +0 -519
  265. data/vendor/ring/third-party/NIST/SHAVS/SHA512Monte.rsp +0 -309
  266. data/vendor/ring/third-party/NIST/SHAVS/SHA512ShortMsg.rsp +0 -523
  267. data/vendor/ring/third-party/NIST/sha256sums.txt +0 -1
@@ -1,675 +0,0 @@
1
- #!/usr/bin/env perl
2
- #
3
- # ====================================================================
4
- # Written by Andy Polyakov <appro@openssl.org> for the OpenSSL
5
- # project. The module is, however, dual licensed under OpenSSL and
6
- # CRYPTOGAMS licenses depending on where you obtain it. For further
7
- # details see http://www.openssl.org/~appro/cryptogams/.
8
- # ====================================================================
9
- #
10
- # This module implements support for ARMv8 AES instructions. The
11
- # module is endian-agnostic in sense that it supports both big- and
12
- # little-endian cases. As does it support both 32- and 64-bit modes
13
- # of operation. Latter is achieved by limiting amount of utilized
14
- # registers to 16, which implies additional NEON load and integer
15
- # instructions. This has no effect on mighty Apple A7, where results
16
- # are literally equal to the theoretical estimates based on AES
17
- # instruction latencies and issue rates. On Cortex-A53, an in-order
18
- # execution core, this costs up to 10-15%, which is partially
19
- # compensated by implementing dedicated code path for 128-bit
20
- # CBC encrypt case. On Cortex-A57 parallelizable mode performance
21
- # seems to be limited by sheer amount of NEON instructions...
22
- #
23
- # Performance in cycles per byte processed with 128-bit key:
24
- #
25
- # CBC enc CBC dec CTR
26
- # Apple A7 2.39 1.20 1.20
27
- # Cortex-A53 1.32 1.29 1.46
28
- # Cortex-A57(*) 1.95 0.85 0.93
29
- # Denver 1.96 0.86 0.80
30
- #
31
- # (*) original 3.64/1.34/1.32 results were for r0p0 revision
32
- # and are still same even for updated module;
33
-
34
- $flavour = shift;
35
- $output = shift;
36
-
37
- $0 =~ m/(.*[\/\\])[^\/\\]+$/; $dir=$1;
38
- ( $xlate="${dir}arm-xlate.pl" and -f $xlate ) or
39
- ( $xlate="${dir}../../perlasm/arm-xlate.pl" and -f $xlate) or
40
- die "can't locate arm-xlate.pl";
41
-
42
- open OUT,"| \"$^X\" $xlate $flavour $output";
43
- *STDOUT=*OUT;
44
-
45
- $prefix="aes_v8";
46
-
47
- $code=<<___;
48
- #include <openssl/arm_arch.h>
49
-
50
- #if __ARM_MAX_ARCH__>=7
51
- .text
52
- ___
53
- $code.=<<___ if ($flavour =~ /64/);
54
- #if !defined(__clang__)
55
- .arch armv8-a+crypto
56
- #endif
57
- ___
58
- $code.=".arch armv7-a\n.fpu neon\n.code 32\n" if ($flavour !~ /64/);
59
- #^^^^^^ this is done to simplify adoption by not depending
60
- # on latest binutils.
61
-
62
- # Assembler mnemonics are an eclectic mix of 32- and 64-bit syntax,
63
- # NEON is mostly 32-bit mnemonics, integer - mostly 64. Goal is to
64
- # maintain both 32- and 64-bit codes within single module and
65
- # transliterate common code to either flavour with regex vodoo.
66
- #
67
- {{{
68
- my ($inp,$bits,$out,$ptr,$rounds)=("x0","w1","x2","x3","w12");
69
- my ($zero,$rcon,$mask,$in0,$in1,$tmp,$key)=
70
- $flavour=~/64/? map("q$_",(0..6)) : map("q$_",(0..3,8..10));
71
-
72
-
73
- $code.=<<___;
74
- .align 5
75
- .Lrcon:
76
- .long 0x01,0x01,0x01,0x01
77
- .long 0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d // rotate-n-splat
78
- .long 0x1b,0x1b,0x1b,0x1b
79
-
80
- .globl ${prefix}_set_encrypt_key
81
- .type ${prefix}_set_encrypt_key,%function
82
- .align 5
83
- ${prefix}_set_encrypt_key:
84
- .Lenc_key:
85
- ___
86
- $code.=<<___ if ($flavour =~ /64/);
87
- stp x29,x30,[sp,#-16]!
88
- add x29,sp,#0
89
- ___
90
- $code.=<<___;
91
- mov $ptr,#-1
92
- cmp $inp,#0
93
- b.eq .Lenc_key_abort
94
- cmp $out,#0
95
- b.eq .Lenc_key_abort
96
- mov $ptr,#-2
97
- cmp $bits,#128
98
- b.lt .Lenc_key_abort
99
- cmp $bits,#256
100
- b.gt .Lenc_key_abort
101
- tst $bits,#0x3f
102
- b.ne .Lenc_key_abort
103
-
104
- adr $ptr,.Lrcon
105
- cmp $bits,#192
106
-
107
- veor $zero,$zero,$zero
108
- vld1.8 {$in0},[$inp],#16
109
- mov $bits,#8 // reuse $bits
110
- vld1.32 {$rcon,$mask},[$ptr],#32
111
-
112
- b.lt .Loop128
113
- b.eq .L192
114
- b .L256
115
-
116
- .align 4
117
- .Loop128:
118
- vtbl.8 $key,{$in0},$mask
119
- vext.8 $tmp,$zero,$in0,#12
120
- vst1.32 {$in0},[$out],#16
121
- aese $key,$zero
122
- subs $bits,$bits,#1
123
-
124
- veor $in0,$in0,$tmp
125
- vext.8 $tmp,$zero,$tmp,#12
126
- veor $in0,$in0,$tmp
127
- vext.8 $tmp,$zero,$tmp,#12
128
- veor $key,$key,$rcon
129
- veor $in0,$in0,$tmp
130
- vshl.u8 $rcon,$rcon,#1
131
- veor $in0,$in0,$key
132
- b.ne .Loop128
133
-
134
- vld1.32 {$rcon},[$ptr]
135
-
136
- vtbl.8 $key,{$in0},$mask
137
- vext.8 $tmp,$zero,$in0,#12
138
- vst1.32 {$in0},[$out],#16
139
- aese $key,$zero
140
-
141
- veor $in0,$in0,$tmp
142
- vext.8 $tmp,$zero,$tmp,#12
143
- veor $in0,$in0,$tmp
144
- vext.8 $tmp,$zero,$tmp,#12
145
- veor $key,$key,$rcon
146
- veor $in0,$in0,$tmp
147
- vshl.u8 $rcon,$rcon,#1
148
- veor $in0,$in0,$key
149
-
150
- vtbl.8 $key,{$in0},$mask
151
- vext.8 $tmp,$zero,$in0,#12
152
- vst1.32 {$in0},[$out],#16
153
- aese $key,$zero
154
-
155
- veor $in0,$in0,$tmp
156
- vext.8 $tmp,$zero,$tmp,#12
157
- veor $in0,$in0,$tmp
158
- vext.8 $tmp,$zero,$tmp,#12
159
- veor $key,$key,$rcon
160
- veor $in0,$in0,$tmp
161
- veor $in0,$in0,$key
162
- vst1.32 {$in0},[$out]
163
- add $out,$out,#0x50
164
-
165
- mov $rounds,#10
166
- b .Ldone
167
-
168
- .align 4
169
- .L192:
170
- vld1.8 {$in1},[$inp],#8
171
- vmov.i8 $key,#8 // borrow $key
172
- vst1.32 {$in0},[$out],#16
173
- vsub.i8 $mask,$mask,$key // adjust the mask
174
-
175
- .Loop192:
176
- vtbl.8 $key,{$in1},$mask
177
- vext.8 $tmp,$zero,$in0,#12
178
- vst1.32 {$in1},[$out],#8
179
- aese $key,$zero
180
- subs $bits,$bits,#1
181
-
182
- veor $in0,$in0,$tmp
183
- vext.8 $tmp,$zero,$tmp,#12
184
- veor $in0,$in0,$tmp
185
- vext.8 $tmp,$zero,$tmp,#12
186
- veor $in0,$in0,$tmp
187
-
188
- vdup.32 $tmp,${in0}[3]
189
- veor $tmp,$tmp,$in1
190
- veor $key,$key,$rcon
191
- vext.8 $in1,$zero,$in1,#12
192
- vshl.u8 $rcon,$rcon,#1
193
- veor $in1,$in1,$tmp
194
- veor $in0,$in0,$key
195
- veor $in1,$in1,$key
196
- vst1.32 {$in0},[$out],#16
197
- b.ne .Loop192
198
-
199
- mov $rounds,#12
200
- add $out,$out,#0x20
201
- b .Ldone
202
-
203
- .align 4
204
- .L256:
205
- vld1.8 {$in1},[$inp]
206
- mov $bits,#7
207
- mov $rounds,#14
208
- vst1.32 {$in0},[$out],#16
209
-
210
- .Loop256:
211
- vtbl.8 $key,{$in1},$mask
212
- vext.8 $tmp,$zero,$in0,#12
213
- vst1.32 {$in1},[$out],#16
214
- aese $key,$zero
215
- subs $bits,$bits,#1
216
-
217
- veor $in0,$in0,$tmp
218
- vext.8 $tmp,$zero,$tmp,#12
219
- veor $in0,$in0,$tmp
220
- vext.8 $tmp,$zero,$tmp,#12
221
- veor $key,$key,$rcon
222
- veor $in0,$in0,$tmp
223
- vshl.u8 $rcon,$rcon,#1
224
- veor $in0,$in0,$key
225
- vst1.32 {$in0},[$out],#16
226
- b.eq .Ldone
227
-
228
- vdup.32 $key,${in0}[3] // just splat
229
- vext.8 $tmp,$zero,$in1,#12
230
- aese $key,$zero
231
-
232
- veor $in1,$in1,$tmp
233
- vext.8 $tmp,$zero,$tmp,#12
234
- veor $in1,$in1,$tmp
235
- vext.8 $tmp,$zero,$tmp,#12
236
- veor $in1,$in1,$tmp
237
-
238
- veor $in1,$in1,$key
239
- b .Loop256
240
-
241
- .Ldone:
242
- str $rounds,[$out]
243
- mov $ptr,#0
244
-
245
- .Lenc_key_abort:
246
- mov x0,$ptr // return value
247
- `"ldr x29,[sp],#16" if ($flavour =~ /64/)`
248
- ret
249
- .size ${prefix}_set_encrypt_key,.-${prefix}_set_encrypt_key
250
-
251
- .globl ${prefix}_set_decrypt_key
252
- .type ${prefix}_set_decrypt_key,%function
253
- .align 5
254
- ${prefix}_set_decrypt_key:
255
- ___
256
- $code.=<<___ if ($flavour =~ /64/);
257
- stp x29,x30,[sp,#-16]!
258
- add x29,sp,#0
259
- ___
260
- $code.=<<___ if ($flavour !~ /64/);
261
- stmdb sp!,{r4,lr}
262
- ___
263
- $code.=<<___;
264
- bl .Lenc_key
265
-
266
- cmp x0,#0
267
- b.ne .Ldec_key_abort
268
-
269
- sub $out,$out,#240 // restore original $out
270
- mov x4,#-16
271
- add $inp,$out,x12,lsl#4 // end of key schedule
272
-
273
- vld1.32 {v0.16b},[$out]
274
- vld1.32 {v1.16b},[$inp]
275
- vst1.32 {v0.16b},[$inp],x4
276
- vst1.32 {v1.16b},[$out],#16
277
-
278
- .Loop_imc:
279
- vld1.32 {v0.16b},[$out]
280
- vld1.32 {v1.16b},[$inp]
281
- aesimc v0.16b,v0.16b
282
- aesimc v1.16b,v1.16b
283
- vst1.32 {v0.16b},[$inp],x4
284
- vst1.32 {v1.16b},[$out],#16
285
- cmp $inp,$out
286
- b.hi .Loop_imc
287
-
288
- vld1.32 {v0.16b},[$out]
289
- aesimc v0.16b,v0.16b
290
- vst1.32 {v0.16b},[$inp]
291
-
292
- eor x0,x0,x0 // return value
293
- .Ldec_key_abort:
294
- ___
295
- $code.=<<___ if ($flavour !~ /64/);
296
- ldmia sp!,{r4,pc}
297
- ___
298
- $code.=<<___ if ($flavour =~ /64/);
299
- ldp x29,x30,[sp],#16
300
- ret
301
- ___
302
- $code.=<<___;
303
- .size ${prefix}_set_decrypt_key,.-${prefix}_set_decrypt_key
304
- ___
305
- }}}
306
- {{{
307
- sub gen_block () {
308
- my $dir = shift;
309
- my ($e,$mc) = $dir eq "en" ? ("e","mc") : ("d","imc");
310
- my ($inp,$out,$key)=map("x$_",(0..2));
311
- my $rounds="w3";
312
- my ($rndkey0,$rndkey1,$inout)=map("q$_",(0..3));
313
-
314
- $code.=<<___;
315
- .globl ${prefix}_${dir}crypt
316
- .type ${prefix}_${dir}crypt,%function
317
- .align 5
318
- ${prefix}_${dir}crypt:
319
- ldr $rounds,[$key,#240]
320
- vld1.32 {$rndkey0},[$key],#16
321
- vld1.8 {$inout},[$inp]
322
- sub $rounds,$rounds,#2
323
- vld1.32 {$rndkey1},[$key],#16
324
-
325
- .Loop_${dir}c:
326
- aes$e $inout,$rndkey0
327
- aes$mc $inout,$inout
328
- vld1.32 {$rndkey0},[$key],#16
329
- subs $rounds,$rounds,#2
330
- aes$e $inout,$rndkey1
331
- aes$mc $inout,$inout
332
- vld1.32 {$rndkey1},[$key],#16
333
- b.gt .Loop_${dir}c
334
-
335
- aes$e $inout,$rndkey0
336
- aes$mc $inout,$inout
337
- vld1.32 {$rndkey0},[$key]
338
- aes$e $inout,$rndkey1
339
- veor $inout,$inout,$rndkey0
340
-
341
- vst1.8 {$inout},[$out]
342
- ret
343
- .size ${prefix}_${dir}crypt,.-${prefix}_${dir}crypt
344
- ___
345
- }
346
- &gen_block("en");
347
- &gen_block("de");
348
- }}}
349
- {{{
350
- my ($inp,$out,$len,$key,$ivp)=map("x$_",(0..4));
351
- my ($rounds,$cnt,$key_)=("w5","w6","x7");
352
- my ($ctr,$tctr0,$tctr1,$tctr2)=map("w$_",(8..10,12));
353
- my $step="x12"; # aliases with $tctr2
354
-
355
- my ($dat0,$dat1,$in0,$in1,$tmp0,$tmp1,$ivec,$rndlast)=map("q$_",(0..7));
356
- my ($dat2,$in2,$tmp2)=map("q$_",(10,11,9));
357
-
358
- my ($dat,$tmp)=($dat0,$tmp0);
359
-
360
- ### q8-q15 preloaded key schedule
361
-
362
- $code.=<<___;
363
- .globl ${prefix}_ctr32_encrypt_blocks
364
- .type ${prefix}_ctr32_encrypt_blocks,%function
365
- .align 5
366
- ${prefix}_ctr32_encrypt_blocks:
367
- ___
368
- $code.=<<___ if ($flavour =~ /64/);
369
- stp x29,x30,[sp,#-16]!
370
- add x29,sp,#0
371
- ___
372
- $code.=<<___ if ($flavour !~ /64/);
373
- mov ip,sp
374
- stmdb sp!,{r4-r10,lr}
375
- vstmdb sp!,{d8-d15} @ ABI specification says so
376
- ldr r4, [ip] @ load remaining arg
377
- ___
378
- $code.=<<___;
379
- ldr $rounds,[$key,#240]
380
-
381
- ldr $ctr, [$ivp, #12]
382
- vld1.32 {$dat0},[$ivp]
383
-
384
- vld1.32 {q8-q9},[$key] // load key schedule...
385
- sub $rounds,$rounds,#4
386
- mov $step,#16
387
- cmp $len,#2
388
- add $key_,$key,x5,lsl#4 // pointer to last 5 round keys
389
- sub $rounds,$rounds,#2
390
- vld1.32 {q12-q13},[$key_],#32
391
- vld1.32 {q14-q15},[$key_],#32
392
- vld1.32 {$rndlast},[$key_]
393
- add $key_,$key,#32
394
- mov $cnt,$rounds
395
- cclr $step,lo
396
- #ifndef __ARMEB__
397
- rev $ctr, $ctr
398
- #endif
399
- vorr $dat1,$dat0,$dat0
400
- add $tctr1, $ctr, #1
401
- vorr $dat2,$dat0,$dat0
402
- add $ctr, $ctr, #2
403
- vorr $ivec,$dat0,$dat0
404
- rev $tctr1, $tctr1
405
- vmov.32 ${dat1}[3],$tctr1
406
- b.ls .Lctr32_tail
407
- rev $tctr2, $ctr
408
- sub $len,$len,#3 // bias
409
- vmov.32 ${dat2}[3],$tctr2
410
- b .Loop3x_ctr32
411
-
412
- .align 4
413
- .Loop3x_ctr32:
414
- aese $dat0,q8
415
- aesmc $dat0,$dat0
416
- aese $dat1,q8
417
- aesmc $dat1,$dat1
418
- aese $dat2,q8
419
- aesmc $dat2,$dat2
420
- vld1.32 {q8},[$key_],#16
421
- subs $cnt,$cnt,#2
422
- aese $dat0,q9
423
- aesmc $dat0,$dat0
424
- aese $dat1,q9
425
- aesmc $dat1,$dat1
426
- aese $dat2,q9
427
- aesmc $dat2,$dat2
428
- vld1.32 {q9},[$key_],#16
429
- b.gt .Loop3x_ctr32
430
-
431
- aese $dat0,q8
432
- aesmc $tmp0,$dat0
433
- aese $dat1,q8
434
- aesmc $tmp1,$dat1
435
- vld1.8 {$in0},[$inp],#16
436
- vorr $dat0,$ivec,$ivec
437
- aese $dat2,q8
438
- aesmc $dat2,$dat2
439
- vld1.8 {$in1},[$inp],#16
440
- vorr $dat1,$ivec,$ivec
441
- aese $tmp0,q9
442
- aesmc $tmp0,$tmp0
443
- aese $tmp1,q9
444
- aesmc $tmp1,$tmp1
445
- vld1.8 {$in2},[$inp],#16
446
- mov $key_,$key
447
- aese $dat2,q9
448
- aesmc $tmp2,$dat2
449
- vorr $dat2,$ivec,$ivec
450
- add $tctr0,$ctr,#1
451
- aese $tmp0,q12
452
- aesmc $tmp0,$tmp0
453
- aese $tmp1,q12
454
- aesmc $tmp1,$tmp1
455
- veor $in0,$in0,$rndlast
456
- add $tctr1,$ctr,#2
457
- aese $tmp2,q12
458
- aesmc $tmp2,$tmp2
459
- veor $in1,$in1,$rndlast
460
- add $ctr,$ctr,#3
461
- aese $tmp0,q13
462
- aesmc $tmp0,$tmp0
463
- aese $tmp1,q13
464
- aesmc $tmp1,$tmp1
465
- veor $in2,$in2,$rndlast
466
- rev $tctr0,$tctr0
467
- aese $tmp2,q13
468
- aesmc $tmp2,$tmp2
469
- vmov.32 ${dat0}[3], $tctr0
470
- rev $tctr1,$tctr1
471
- aese $tmp0,q14
472
- aesmc $tmp0,$tmp0
473
- aese $tmp1,q14
474
- aesmc $tmp1,$tmp1
475
- vmov.32 ${dat1}[3], $tctr1
476
- rev $tctr2,$ctr
477
- aese $tmp2,q14
478
- aesmc $tmp2,$tmp2
479
- vmov.32 ${dat2}[3], $tctr2
480
- subs $len,$len,#3
481
- aese $tmp0,q15
482
- aese $tmp1,q15
483
- aese $tmp2,q15
484
-
485
- veor $in0,$in0,$tmp0
486
- vld1.32 {q8},[$key_],#16 // re-pre-load rndkey[0]
487
- vst1.8 {$in0},[$out],#16
488
- veor $in1,$in1,$tmp1
489
- mov $cnt,$rounds
490
- vst1.8 {$in1},[$out],#16
491
- veor $in2,$in2,$tmp2
492
- vld1.32 {q9},[$key_],#16 // re-pre-load rndkey[1]
493
- vst1.8 {$in2},[$out],#16
494
- b.hs .Loop3x_ctr32
495
-
496
- adds $len,$len,#3
497
- b.eq .Lctr32_done
498
- cmp $len,#1
499
- mov $step,#16
500
- cclr $step,eq
501
-
502
- .Lctr32_tail:
503
- aese $dat0,q8
504
- aesmc $dat0,$dat0
505
- aese $dat1,q8
506
- aesmc $dat1,$dat1
507
- vld1.32 {q8},[$key_],#16
508
- subs $cnt,$cnt,#2
509
- aese $dat0,q9
510
- aesmc $dat0,$dat0
511
- aese $dat1,q9
512
- aesmc $dat1,$dat1
513
- vld1.32 {q9},[$key_],#16
514
- b.gt .Lctr32_tail
515
-
516
- aese $dat0,q8
517
- aesmc $dat0,$dat0
518
- aese $dat1,q8
519
- aesmc $dat1,$dat1
520
- aese $dat0,q9
521
- aesmc $dat0,$dat0
522
- aese $dat1,q9
523
- aesmc $dat1,$dat1
524
- vld1.8 {$in0},[$inp],$step
525
- aese $dat0,q12
526
- aesmc $dat0,$dat0
527
- aese $dat1,q12
528
- aesmc $dat1,$dat1
529
- vld1.8 {$in1},[$inp]
530
- aese $dat0,q13
531
- aesmc $dat0,$dat0
532
- aese $dat1,q13
533
- aesmc $dat1,$dat1
534
- veor $in0,$in0,$rndlast
535
- aese $dat0,q14
536
- aesmc $dat0,$dat0
537
- aese $dat1,q14
538
- aesmc $dat1,$dat1
539
- veor $in1,$in1,$rndlast
540
- aese $dat0,q15
541
- aese $dat1,q15
542
-
543
- cmp $len,#1
544
- veor $in0,$in0,$dat0
545
- veor $in1,$in1,$dat1
546
- vst1.8 {$in0},[$out],#16
547
- b.eq .Lctr32_done
548
- vst1.8 {$in1},[$out]
549
-
550
- .Lctr32_done:
551
- ___
552
- $code.=<<___ if ($flavour !~ /64/);
553
- vldmia sp!,{d8-d15}
554
- ldmia sp!,{r4-r10,pc}
555
- ___
556
- $code.=<<___ if ($flavour =~ /64/);
557
- ldr x29,[sp],#16
558
- ret
559
- ___
560
- $code.=<<___;
561
- .size ${prefix}_ctr32_encrypt_blocks,.-${prefix}_ctr32_encrypt_blocks
562
- ___
563
- }}}
564
- $code.=<<___;
565
- #endif
566
- ___
567
- ########################################
568
- if ($flavour =~ /64/) { ######## 64-bit code
569
- my %opcode = (
570
- "aesd" => 0x4e285800, "aese" => 0x4e284800,
571
- "aesimc"=> 0x4e287800, "aesmc" => 0x4e286800 );
572
-
573
- local *unaes = sub {
574
- my ($mnemonic,$arg)=@_;
575
-
576
- $arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)/o &&
577
- sprintf ".inst\t0x%08x\t//%s %s",
578
- $opcode{$mnemonic}|$1|($2<<5),
579
- $mnemonic,$arg;
580
- };
581
-
582
- foreach(split("\n",$code)) {
583
- s/\`([^\`]*)\`/eval($1)/geo;
584
-
585
- s/\bq([0-9]+)\b/"v".($1<8?$1:$1+8).".16b"/geo; # old->new registers
586
- s/@\s/\/\//o; # old->new style commentary
587
-
588
- #s/[v]?(aes\w+)\s+([qv].*)/unaes($1,$2)/geo or
589
- s/cclr\s+([wx])([^,]+),\s*([a-z]+)/csel $1$2,$1zr,$1$2,$3/o or
590
- s/mov\.([a-z]+)\s+([wx][0-9]+),\s*([wx][0-9]+)/csel $2,$3,$2,$1/o or
591
- s/vmov\.i8/movi/o or # fix up legacy mnemonics
592
- s/vext\.8/ext/o or
593
- s/vrev32\.8/rev32/o or
594
- s/vtst\.8/cmtst/o or
595
- s/vshr/ushr/o or
596
- s/^(\s+)v/$1/o or # strip off v prefix
597
- s/\bbx\s+lr\b/ret/o;
598
-
599
- # fix up remainig legacy suffixes
600
- s/\.[ui]?8//o;
601
- m/\],#8/o and s/\.16b/\.8b/go;
602
- s/\.[ui]?32//o and s/\.16b/\.4s/go;
603
- s/\.[ui]?64//o and s/\.16b/\.2d/go;
604
- s/\.[42]([sd])\[([0-3])\]/\.$1\[$2\]/o;
605
-
606
- print $_,"\n";
607
- }
608
- } else { ######## 32-bit code
609
- my %opcode = (
610
- "aesd" => 0xf3b00340, "aese" => 0xf3b00300,
611
- "aesimc"=> 0xf3b003c0, "aesmc" => 0xf3b00380 );
612
-
613
- local *unaes = sub {
614
- my ($mnemonic,$arg)=@_;
615
-
616
- if ($arg =~ m/[qv]([0-9]+)[^,]*,\s*[qv]([0-9]+)/o) {
617
- my $word = $opcode{$mnemonic}|(($1&7)<<13)|(($1&8)<<19)
618
- |(($2&7)<<1) |(($2&8)<<2);
619
- # since ARMv7 instructions are always encoded little-endian.
620
- # correct solution is to use .inst directive, but older
621
- # assemblers don't implement it:-(
622
- sprintf ".byte\t0x%02x,0x%02x,0x%02x,0x%02x\t@ %s %s",
623
- $word&0xff,($word>>8)&0xff,
624
- ($word>>16)&0xff,($word>>24)&0xff,
625
- $mnemonic,$arg;
626
- }
627
- };
628
-
629
- sub unvtbl {
630
- my $arg=shift;
631
-
632
- $arg =~ m/q([0-9]+),\s*\{q([0-9]+)\},\s*q([0-9]+)/o &&
633
- sprintf "vtbl.8 d%d,{q%d},d%d\n\t".
634
- "vtbl.8 d%d,{q%d},d%d", 2*$1,$2,2*$3, 2*$1+1,$2,2*$3+1;
635
- }
636
-
637
- sub unvdup32 {
638
- my $arg=shift;
639
-
640
- $arg =~ m/q([0-9]+),\s*q([0-9]+)\[([0-3])\]/o &&
641
- sprintf "vdup.32 q%d,d%d[%d]",$1,2*$2+($3>>1),$3&1;
642
- }
643
-
644
- sub unvmov32 {
645
- my $arg=shift;
646
-
647
- $arg =~ m/q([0-9]+)\[([0-3])\],(.*)/o &&
648
- sprintf "vmov.32 d%d[%d],%s",2*$1+($2>>1),$2&1,$3;
649
- }
650
-
651
- foreach(split("\n",$code)) {
652
- s/\`([^\`]*)\`/eval($1)/geo;
653
-
654
- s/\b[wx]([0-9]+)\b/r$1/go; # new->old registers
655
- s/\bv([0-9])\.[12468]+[bsd]\b/q$1/go; # new->old registers
656
- s/\/\/\s?/@ /o; # new->old style commentary
657
-
658
- # fix up remainig new-style suffixes
659
- s/\{q([0-9]+)\},\s*\[(.+)\],#8/sprintf "{d%d},[$2]!",2*$1/eo or
660
- s/\],#[0-9]+/]!/o;
661
-
662
- s/[v]?(aes\w+)\s+([qv].*)/unaes($1,$2)/geo or
663
- s/cclr\s+([^,]+),\s*([a-z]+)/mov$2 $1,#0/o or
664
- s/vtbl\.8\s+(.*)/unvtbl($1)/geo or
665
- s/vdup\.32\s+(.*)/unvdup32($1)/geo or
666
- s/vmov\.32\s+(.*)/unvmov32($1)/geo or
667
- s/^(\s+)b\./$1b/o or
668
- s/^(\s+)mov\./$1mov/o or
669
- s/^(\s+)ret/$1bx\tlr/o;
670
-
671
- print $_,"\n";
672
- }
673
- }
674
-
675
- close STDOUT;