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.
- checksums.yaml +7 -0
- data/.gitignore +9 -0
- data/Gemfile +3 -0
- data/README.md +22 -0
- data/Rakefile +1 -0
- data/ext/ring/extconf.rb +29 -0
- data/lib/ring/native.rb +8 -0
- data/lib/ring/native/version.rb +5 -0
- data/ring-native.gemspec +25 -0
- data/vendor/ring/BUILDING.md +40 -0
- data/vendor/ring/Cargo.toml +43 -0
- data/vendor/ring/LICENSE +185 -0
- data/vendor/ring/Makefile +35 -0
- data/vendor/ring/PORTING.md +163 -0
- data/vendor/ring/README.md +113 -0
- data/vendor/ring/STYLE.md +197 -0
- data/vendor/ring/appveyor.yml +27 -0
- data/vendor/ring/build.rs +108 -0
- data/vendor/ring/crypto/aes/aes.c +1142 -0
- data/vendor/ring/crypto/aes/aes_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/aes/aes_test.cc +93 -0
- data/vendor/ring/crypto/aes/asm/aes-586.pl +2368 -0
- data/vendor/ring/crypto/aes/asm/aes-armv4.pl +1249 -0
- data/vendor/ring/crypto/aes/asm/aes-x86_64.pl +2246 -0
- data/vendor/ring/crypto/aes/asm/aesni-x86.pl +1318 -0
- data/vendor/ring/crypto/aes/asm/aesni-x86_64.pl +2084 -0
- data/vendor/ring/crypto/aes/asm/aesv8-armx.pl +675 -0
- data/vendor/ring/crypto/aes/asm/bsaes-armv7.pl +1364 -0
- data/vendor/ring/crypto/aes/asm/bsaes-x86_64.pl +1565 -0
- data/vendor/ring/crypto/aes/asm/vpaes-x86.pl +841 -0
- data/vendor/ring/crypto/aes/asm/vpaes-x86_64.pl +1116 -0
- data/vendor/ring/crypto/aes/internal.h +87 -0
- data/vendor/ring/crypto/aes/mode_wrappers.c +61 -0
- data/vendor/ring/crypto/bn/add.c +394 -0
- data/vendor/ring/crypto/bn/asm/armv4-mont.pl +694 -0
- data/vendor/ring/crypto/bn/asm/armv8-mont.pl +1503 -0
- data/vendor/ring/crypto/bn/asm/bn-586.pl +774 -0
- data/vendor/ring/crypto/bn/asm/co-586.pl +287 -0
- data/vendor/ring/crypto/bn/asm/rsaz-avx2.pl +1882 -0
- data/vendor/ring/crypto/bn/asm/x86-mont.pl +592 -0
- data/vendor/ring/crypto/bn/asm/x86_64-gcc.c +599 -0
- data/vendor/ring/crypto/bn/asm/x86_64-mont.pl +1393 -0
- data/vendor/ring/crypto/bn/asm/x86_64-mont5.pl +3507 -0
- data/vendor/ring/crypto/bn/bn.c +352 -0
- data/vendor/ring/crypto/bn/bn_asn1.c +74 -0
- data/vendor/ring/crypto/bn/bn_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/bn/bn_test.cc +1696 -0
- data/vendor/ring/crypto/bn/cmp.c +200 -0
- data/vendor/ring/crypto/bn/convert.c +433 -0
- data/vendor/ring/crypto/bn/ctx.c +311 -0
- data/vendor/ring/crypto/bn/div.c +594 -0
- data/vendor/ring/crypto/bn/exponentiation.c +1335 -0
- data/vendor/ring/crypto/bn/gcd.c +711 -0
- data/vendor/ring/crypto/bn/generic.c +1019 -0
- data/vendor/ring/crypto/bn/internal.h +316 -0
- data/vendor/ring/crypto/bn/montgomery.c +516 -0
- data/vendor/ring/crypto/bn/mul.c +888 -0
- data/vendor/ring/crypto/bn/prime.c +829 -0
- data/vendor/ring/crypto/bn/random.c +334 -0
- data/vendor/ring/crypto/bn/rsaz_exp.c +262 -0
- data/vendor/ring/crypto/bn/rsaz_exp.h +53 -0
- data/vendor/ring/crypto/bn/shift.c +276 -0
- data/vendor/ring/crypto/bytestring/bytestring_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/bytestring/bytestring_test.cc +421 -0
- data/vendor/ring/crypto/bytestring/cbb.c +399 -0
- data/vendor/ring/crypto/bytestring/cbs.c +227 -0
- data/vendor/ring/crypto/bytestring/internal.h +46 -0
- data/vendor/ring/crypto/chacha/chacha_generic.c +140 -0
- data/vendor/ring/crypto/chacha/chacha_vec.c +323 -0
- data/vendor/ring/crypto/chacha/chacha_vec_arm.S +1447 -0
- data/vendor/ring/crypto/chacha/chacha_vec_arm_generate.go +153 -0
- data/vendor/ring/crypto/cipher/cipher_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/cipher/e_aes.c +390 -0
- data/vendor/ring/crypto/cipher/e_chacha20poly1305.c +208 -0
- data/vendor/ring/crypto/cipher/internal.h +173 -0
- data/vendor/ring/crypto/cipher/test/aes_128_gcm_tests.txt +543 -0
- data/vendor/ring/crypto/cipher/test/aes_128_key_wrap_tests.txt +9 -0
- data/vendor/ring/crypto/cipher/test/aes_256_gcm_tests.txt +475 -0
- data/vendor/ring/crypto/cipher/test/aes_256_key_wrap_tests.txt +23 -0
- data/vendor/ring/crypto/cipher/test/chacha20_poly1305_old_tests.txt +422 -0
- data/vendor/ring/crypto/cipher/test/chacha20_poly1305_tests.txt +484 -0
- data/vendor/ring/crypto/cipher/test/cipher_test.txt +100 -0
- data/vendor/ring/crypto/constant_time_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/constant_time_test.c +304 -0
- data/vendor/ring/crypto/cpu-arm-asm.S +32 -0
- data/vendor/ring/crypto/cpu-arm.c +199 -0
- data/vendor/ring/crypto/cpu-intel.c +261 -0
- data/vendor/ring/crypto/crypto.c +151 -0
- data/vendor/ring/crypto/curve25519/asm/x25519-arm.S +2118 -0
- data/vendor/ring/crypto/curve25519/curve25519.c +4888 -0
- data/vendor/ring/crypto/curve25519/x25519_test.cc +128 -0
- data/vendor/ring/crypto/digest/md32_common.h +181 -0
- data/vendor/ring/crypto/ec/asm/p256-x86_64-asm.pl +2725 -0
- data/vendor/ring/crypto/ec/ec.c +193 -0
- data/vendor/ring/crypto/ec/ec_curves.c +61 -0
- data/vendor/ring/crypto/ec/ec_key.c +228 -0
- data/vendor/ring/crypto/ec/ec_montgomery.c +114 -0
- data/vendor/ring/crypto/ec/example_mul.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/ec/internal.h +243 -0
- data/vendor/ring/crypto/ec/oct.c +253 -0
- data/vendor/ring/crypto/ec/p256-64.c +1794 -0
- data/vendor/ring/crypto/ec/p256-x86_64-table.h +9548 -0
- data/vendor/ring/crypto/ec/p256-x86_64.c +509 -0
- data/vendor/ring/crypto/ec/simple.c +1007 -0
- data/vendor/ring/crypto/ec/util-64.c +183 -0
- data/vendor/ring/crypto/ec/wnaf.c +508 -0
- data/vendor/ring/crypto/ecdh/ecdh.c +155 -0
- data/vendor/ring/crypto/ecdsa/ecdsa.c +304 -0
- data/vendor/ring/crypto/ecdsa/ecdsa_asn1.c +193 -0
- data/vendor/ring/crypto/ecdsa/ecdsa_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/ecdsa/ecdsa_test.cc +327 -0
- data/vendor/ring/crypto/header_removed.h +17 -0
- data/vendor/ring/crypto/internal.h +495 -0
- data/vendor/ring/crypto/libring.Windows.vcxproj +101 -0
- data/vendor/ring/crypto/mem.c +98 -0
- data/vendor/ring/crypto/modes/asm/aesni-gcm-x86_64.pl +1045 -0
- data/vendor/ring/crypto/modes/asm/ghash-armv4.pl +517 -0
- data/vendor/ring/crypto/modes/asm/ghash-x86.pl +1393 -0
- data/vendor/ring/crypto/modes/asm/ghash-x86_64.pl +1741 -0
- data/vendor/ring/crypto/modes/asm/ghashv8-armx.pl +422 -0
- data/vendor/ring/crypto/modes/ctr.c +226 -0
- data/vendor/ring/crypto/modes/gcm.c +1206 -0
- data/vendor/ring/crypto/modes/gcm_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/modes/gcm_test.c +348 -0
- data/vendor/ring/crypto/modes/internal.h +299 -0
- data/vendor/ring/crypto/perlasm/arm-xlate.pl +170 -0
- data/vendor/ring/crypto/perlasm/readme +100 -0
- data/vendor/ring/crypto/perlasm/x86_64-xlate.pl +1164 -0
- data/vendor/ring/crypto/perlasm/x86asm.pl +292 -0
- data/vendor/ring/crypto/perlasm/x86gas.pl +263 -0
- data/vendor/ring/crypto/perlasm/x86masm.pl +200 -0
- data/vendor/ring/crypto/perlasm/x86nasm.pl +187 -0
- data/vendor/ring/crypto/poly1305/poly1305.c +331 -0
- data/vendor/ring/crypto/poly1305/poly1305_arm.c +301 -0
- data/vendor/ring/crypto/poly1305/poly1305_arm_asm.S +2015 -0
- data/vendor/ring/crypto/poly1305/poly1305_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/poly1305/poly1305_test.cc +80 -0
- data/vendor/ring/crypto/poly1305/poly1305_test.txt +52 -0
- data/vendor/ring/crypto/poly1305/poly1305_vec.c +892 -0
- data/vendor/ring/crypto/rand/asm/rdrand-x86_64.pl +75 -0
- data/vendor/ring/crypto/rand/internal.h +32 -0
- data/vendor/ring/crypto/rand/rand.c +189 -0
- data/vendor/ring/crypto/rand/urandom.c +219 -0
- data/vendor/ring/crypto/rand/windows.c +56 -0
- data/vendor/ring/crypto/refcount_c11.c +66 -0
- data/vendor/ring/crypto/refcount_lock.c +53 -0
- data/vendor/ring/crypto/refcount_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/refcount_test.c +58 -0
- data/vendor/ring/crypto/rsa/blinding.c +462 -0
- data/vendor/ring/crypto/rsa/internal.h +108 -0
- data/vendor/ring/crypto/rsa/padding.c +300 -0
- data/vendor/ring/crypto/rsa/rsa.c +450 -0
- data/vendor/ring/crypto/rsa/rsa_asn1.c +261 -0
- data/vendor/ring/crypto/rsa/rsa_impl.c +944 -0
- data/vendor/ring/crypto/rsa/rsa_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/rsa/rsa_test.cc +437 -0
- data/vendor/ring/crypto/sha/asm/sha-armv8.pl +436 -0
- data/vendor/ring/crypto/sha/asm/sha-x86_64.pl +2390 -0
- data/vendor/ring/crypto/sha/asm/sha256-586.pl +1275 -0
- data/vendor/ring/crypto/sha/asm/sha256-armv4.pl +735 -0
- data/vendor/ring/crypto/sha/asm/sha256-armv8.pl +14 -0
- data/vendor/ring/crypto/sha/asm/sha256-x86_64.pl +14 -0
- data/vendor/ring/crypto/sha/asm/sha512-586.pl +911 -0
- data/vendor/ring/crypto/sha/asm/sha512-armv4.pl +666 -0
- data/vendor/ring/crypto/sha/asm/sha512-armv8.pl +14 -0
- data/vendor/ring/crypto/sha/asm/sha512-x86_64.pl +14 -0
- data/vendor/ring/crypto/sha/sha1.c +271 -0
- data/vendor/ring/crypto/sha/sha256.c +204 -0
- data/vendor/ring/crypto/sha/sha512.c +355 -0
- data/vendor/ring/crypto/test/file_test.cc +326 -0
- data/vendor/ring/crypto/test/file_test.h +181 -0
- data/vendor/ring/crypto/test/malloc.cc +150 -0
- data/vendor/ring/crypto/test/scoped_types.h +95 -0
- data/vendor/ring/crypto/test/test.Windows.vcxproj +35 -0
- data/vendor/ring/crypto/test/test_util.cc +46 -0
- data/vendor/ring/crypto/test/test_util.h +41 -0
- data/vendor/ring/crypto/thread_none.c +55 -0
- data/vendor/ring/crypto/thread_pthread.c +165 -0
- data/vendor/ring/crypto/thread_test.Windows.vcxproj +25 -0
- data/vendor/ring/crypto/thread_test.c +200 -0
- data/vendor/ring/crypto/thread_win.c +282 -0
- data/vendor/ring/examples/checkdigest.rs +103 -0
- data/vendor/ring/include/openssl/aes.h +121 -0
- data/vendor/ring/include/openssl/arm_arch.h +129 -0
- data/vendor/ring/include/openssl/base.h +156 -0
- data/vendor/ring/include/openssl/bn.h +794 -0
- data/vendor/ring/include/openssl/buffer.h +18 -0
- data/vendor/ring/include/openssl/bytestring.h +235 -0
- data/vendor/ring/include/openssl/chacha.h +37 -0
- data/vendor/ring/include/openssl/cmac.h +76 -0
- data/vendor/ring/include/openssl/cpu.h +184 -0
- data/vendor/ring/include/openssl/crypto.h +43 -0
- data/vendor/ring/include/openssl/curve25519.h +88 -0
- data/vendor/ring/include/openssl/ec.h +225 -0
- data/vendor/ring/include/openssl/ec_key.h +129 -0
- data/vendor/ring/include/openssl/ecdh.h +110 -0
- data/vendor/ring/include/openssl/ecdsa.h +156 -0
- data/vendor/ring/include/openssl/err.h +201 -0
- data/vendor/ring/include/openssl/mem.h +101 -0
- data/vendor/ring/include/openssl/obj_mac.h +71 -0
- data/vendor/ring/include/openssl/opensslfeatures.h +68 -0
- data/vendor/ring/include/openssl/opensslv.h +18 -0
- data/vendor/ring/include/openssl/ossl_typ.h +18 -0
- data/vendor/ring/include/openssl/poly1305.h +51 -0
- data/vendor/ring/include/openssl/rand.h +70 -0
- data/vendor/ring/include/openssl/rsa.h +399 -0
- data/vendor/ring/include/openssl/thread.h +133 -0
- data/vendor/ring/include/openssl/type_check.h +71 -0
- data/vendor/ring/mk/Common.props +63 -0
- data/vendor/ring/mk/Windows.props +42 -0
- data/vendor/ring/mk/WindowsTest.props +18 -0
- data/vendor/ring/mk/appveyor.bat +62 -0
- data/vendor/ring/mk/bottom_of_makefile.mk +54 -0
- data/vendor/ring/mk/ring.mk +266 -0
- data/vendor/ring/mk/top_of_makefile.mk +214 -0
- data/vendor/ring/mk/travis.sh +40 -0
- data/vendor/ring/mk/update-travis-yml.py +229 -0
- data/vendor/ring/ring.sln +153 -0
- data/vendor/ring/src/aead.rs +682 -0
- data/vendor/ring/src/agreement.rs +248 -0
- data/vendor/ring/src/c.rs +129 -0
- data/vendor/ring/src/constant_time.rs +37 -0
- data/vendor/ring/src/der.rs +96 -0
- data/vendor/ring/src/digest.rs +690 -0
- data/vendor/ring/src/digest_tests.txt +57 -0
- data/vendor/ring/src/ecc.rs +28 -0
- data/vendor/ring/src/ecc_build.rs +279 -0
- data/vendor/ring/src/ecc_curves.rs +117 -0
- data/vendor/ring/src/ed25519_tests.txt +2579 -0
- data/vendor/ring/src/exe_tests.rs +46 -0
- data/vendor/ring/src/ffi.rs +29 -0
- data/vendor/ring/src/file_test.rs +187 -0
- data/vendor/ring/src/hkdf.rs +153 -0
- data/vendor/ring/src/hkdf_tests.txt +59 -0
- data/vendor/ring/src/hmac.rs +414 -0
- data/vendor/ring/src/hmac_tests.txt +97 -0
- data/vendor/ring/src/input.rs +312 -0
- data/vendor/ring/src/lib.rs +41 -0
- data/vendor/ring/src/pbkdf2.rs +265 -0
- data/vendor/ring/src/pbkdf2_tests.txt +113 -0
- data/vendor/ring/src/polyfill.rs +57 -0
- data/vendor/ring/src/rand.rs +28 -0
- data/vendor/ring/src/signature.rs +314 -0
- data/vendor/ring/third-party/NIST/README.md +9 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA1LongMsg.rsp +263 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA1Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA1ShortMsg.rsp +267 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA224LongMsg.rsp +263 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA224Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA224ShortMsg.rsp +267 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA256LongMsg.rsp +263 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA256Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA256ShortMsg.rsp +267 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA384LongMsg.rsp +519 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA384Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA384ShortMsg.rsp +523 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA512LongMsg.rsp +519 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA512Monte.rsp +309 -0
- data/vendor/ring/third-party/NIST/SHAVS/SHA512ShortMsg.rsp +523 -0
- data/vendor/ring/third-party/NIST/sha256sums.txt +1 -0
- metadata +333 -0
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
THE SOFTWARE IS PROVIDED "AS IS" AND BRIAN SMITH AND THE AUTHORS DISCLAIM
|
|
2
|
+
ALL WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
|
|
3
|
+
OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL BRIAN SMITH OR THE AUTHORS
|
|
4
|
+
BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY
|
|
5
|
+
DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN
|
|
6
|
+
AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
|
7
|
+
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
*ring*
|
|
12
|
+
======
|
|
13
|
+
|
|
14
|
+
*ring* is a crypto library in Rust based on BoringSSL's crypto primitive
|
|
15
|
+
implementations.
|
|
16
|
+
|
|
17
|
+
Particular attention is being paid to making it easy to build and integrate
|
|
18
|
+
*ring* into applications and higher-level frameworks, and to ensuring that
|
|
19
|
+
*ring* works optimally on microcontrollers to support Internet of Things
|
|
20
|
+
(IoT) applications.
|
|
21
|
+
|
|
22
|
+
The name *ring* comes from the fact that *ring* started as a subset of
|
|
23
|
+
BoringSSL, and *"ring"* is a substring of "Bo*ring*SSL". Almost all the code in
|
|
24
|
+
*ring* comes from BoringSSL, and BoringSSL is derived from OpenSSL. In general
|
|
25
|
+
an application that uses the subset of BoringSSL APIs that *ring* supports
|
|
26
|
+
should work identically if it is recompiled and relinked with BoringSSL
|
|
27
|
+
instead. *ring* tracks upstream changes to BoringSSL. Several patches that
|
|
28
|
+
were developed for *ring* have already been integrated upstream in BoringSSL.
|
|
29
|
+
|
|
30
|
+
|
|
31
|
+
|
|
32
|
+
Documentation
|
|
33
|
+
-------------
|
|
34
|
+
|
|
35
|
+
See the documentation at
|
|
36
|
+
https://briansmith.org/rustdoc/ring/.
|
|
37
|
+
|
|
38
|
+
See [Building the Rust Library](BUILDING.md#building-the-rust-library) for
|
|
39
|
+
instructions on how to build it.
|
|
40
|
+
|
|
41
|
+
|
|
42
|
+
|
|
43
|
+
Contributing
|
|
44
|
+
------------
|
|
45
|
+
|
|
46
|
+
Patches Welcome! Suggestions:
|
|
47
|
+
|
|
48
|
+
* More code elimination, especially dead code.
|
|
49
|
+
* Replacing more C code with Rust code.
|
|
50
|
+
* Implementation of [SRP-6a](http://srp.stanford.edu/) in Rust, based on the
|
|
51
|
+
|rust::digest| API and the C/asm optimized modular exponentiation.
|
|
52
|
+
* Optimizing the PBKDF2-HMAC implementation based on the ideas from
|
|
53
|
+
[fastpbkdf2](https://github.com/ctz/fastpbkdf2).
|
|
54
|
+
* X25519 (ECDH with Curve25519) and Ed25519.
|
|
55
|
+
* Better IDE support for Windows (e.g. running the tests within the IDE) and
|
|
56
|
+
Mac OS X (e.g. Xcode project files).
|
|
57
|
+
* Support for more platforms in the continuous integration (e.g. Android, iOS,
|
|
58
|
+
ARM microcontrollers).
|
|
59
|
+
* Static analysis and fuzzing in the continuous integration.
|
|
60
|
+
|
|
61
|
+
|
|
62
|
+
|
|
63
|
+
License
|
|
64
|
+
-------
|
|
65
|
+
|
|
66
|
+
See [LICENSE](LICENSE).
|
|
67
|
+
|
|
68
|
+
The *ring* project happily accepts pull requests without any copyright license
|
|
69
|
+
agreement. The portions of pull requests that modify existing files should be
|
|
70
|
+
licensed under the same terms as the files being modified. New files in pull
|
|
71
|
+
requests, including in particular all Rust code, should be licensed under the
|
|
72
|
+
ISC-style license.
|
|
73
|
+
|
|
74
|
+
If your patch is useful for BoringSSL then it would be very nice of you to also
|
|
75
|
+
submit it to them after agreeing to their CLA.
|
|
76
|
+
|
|
77
|
+
|
|
78
|
+
|
|
79
|
+
Online Automated Testing
|
|
80
|
+
------------------------
|
|
81
|
+
|
|
82
|
+
Travis CI is used for Linux and Mac OS X. Appveyor is used for Windows.
|
|
83
|
+
|
|
84
|
+
<table>
|
|
85
|
+
<tr><th>OS</th><th>Arch.</th><th>Compilers</th><th>Status</th>
|
|
86
|
+
<tr><td>Linux</td>
|
|
87
|
+
<td>x86, x64<td>GCC 4.8, 4.9, 5; Clang 3.4, 3.6, 3.7, 3.8 (trunk)</td>
|
|
88
|
+
<td rowspan=2><a title="Build Status" href=https://travis-ci.org/briansmith/ring><img src=https://travis-ci.org/briansmith/ring.svg?branch=master></a>
|
|
89
|
+
</tr>
|
|
90
|
+
<tr><td>Mac OS X x64</td>
|
|
91
|
+
<td>x86, x64</td>
|
|
92
|
+
<td>Apple Clang 6.0 (based on Clang 3.5)</td>
|
|
93
|
+
</tr>
|
|
94
|
+
<tr><td>Windows</td>
|
|
95
|
+
<td>x86, x64</td>
|
|
96
|
+
<td>MSVC 2013 Update 5 (12.0), MSVC 2015 Update 1 (14.0)</td>
|
|
97
|
+
<td><a title="Build Status" href=https://ci.appveyor.com/project/briansmith/ring/branch/master><img src=https://ci.appveyor.com/api/projects/status/3wq9p54r9iym05rm/branch/master?svg=true></a>
|
|
98
|
+
</tr>
|
|
99
|
+
</table>
|
|
100
|
+
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
Bug Reporting
|
|
104
|
+
-------------
|
|
105
|
+
|
|
106
|
+
Please file bugs in the
|
|
107
|
+
[issue tracker](https://github.com/briansmith/ring/issues). If you think you've
|
|
108
|
+
found a security vulnerability that affects BoringSSL and/or OpenSSL then those
|
|
109
|
+
projects would probably appreciate it if you report the bug privately to them.
|
|
110
|
+
The *ring* project is happy to take *any* kind of bug report as a pull request
|
|
111
|
+
that fixes it and/or adds a test for the issue, or as an issue filed in the
|
|
112
|
+
public issue tracker. **Do NOT report any security vulnerability privately to
|
|
113
|
+
the *ring* developers.**
|
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
# BoringSSL Style Guide
|
|
2
|
+
|
|
3
|
+
BoringSSL usually follows the
|
|
4
|
+
[Google C++ style guide](https://google.github.io/styleguide/cppguide.html),
|
|
5
|
+
The rest of this document describes differences and clarifications on
|
|
6
|
+
top of the base guide.
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
## Legacy code
|
|
10
|
+
|
|
11
|
+
As a derivative of OpenSSL, BoringSSL contains a lot of legacy code that
|
|
12
|
+
does not follow this style guide. Particularly where public API is
|
|
13
|
+
concerned, balance consistency within a module with the benefits of a
|
|
14
|
+
given rule. Module-wide deviations on naming should be respected while
|
|
15
|
+
integer and return value conventions take precedence over consistency.
|
|
16
|
+
|
|
17
|
+
Some modules have seen few changes, so they still retain the original
|
|
18
|
+
indentation style for now. When editing these, try to retain the
|
|
19
|
+
original style. For Emacs, `doc/c-indentation.el` from OpenSSL may be
|
|
20
|
+
helpful in this.
|
|
21
|
+
|
|
22
|
+
|
|
23
|
+
## Language
|
|
24
|
+
|
|
25
|
+
The majority of the project is in C, so C++-specific rules in the
|
|
26
|
+
Google style guide do not apply. Support for C99 features depends on
|
|
27
|
+
our target platforms. Typically, Chromium's target MSVC is the most
|
|
28
|
+
restrictive.
|
|
29
|
+
|
|
30
|
+
Variable declarations in the middle of a function are allowed.
|
|
31
|
+
|
|
32
|
+
Comments should be `/* C-style */` for consistency.
|
|
33
|
+
|
|
34
|
+
When declaration pointer types, `*` should be placed next to the variable
|
|
35
|
+
name, not the type. So
|
|
36
|
+
|
|
37
|
+
uint8_t *ptr;
|
|
38
|
+
|
|
39
|
+
not
|
|
40
|
+
|
|
41
|
+
uint8_t* ptr;
|
|
42
|
+
|
|
43
|
+
Rather than `malloc()` and `free()`, use the wrappers `OPENSSL_malloc()`
|
|
44
|
+
and `OPENSSL_free()`. Use the standard C `assert()` function freely.
|
|
45
|
+
|
|
46
|
+
For new constants, prefer enums when the values are sequential and typed
|
|
47
|
+
constants for flags. If adding values to an existing set of `#define`s,
|
|
48
|
+
continue with `#define`.
|
|
49
|
+
|
|
50
|
+
|
|
51
|
+
## Formatting
|
|
52
|
+
|
|
53
|
+
Single-statement blocks are not allowed. All conditions and loops must
|
|
54
|
+
use braces:
|
|
55
|
+
|
|
56
|
+
if (foo) {
|
|
57
|
+
do_something();
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
not
|
|
61
|
+
|
|
62
|
+
if (foo)
|
|
63
|
+
do_something();
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## Integers
|
|
67
|
+
|
|
68
|
+
Prefer using explicitly-sized integers where appropriate rather than
|
|
69
|
+
generic C ones. For instance, to represent a byte, use `uint8_t`, not
|
|
70
|
+
`unsigned char`. Likewise, represent a two-byte field as `uint16_t`, not
|
|
71
|
+
`unsigned short`.
|
|
72
|
+
|
|
73
|
+
Sizes are represented as `size_t`.
|
|
74
|
+
|
|
75
|
+
Within a struct that is retained across the lifetime of an SSL
|
|
76
|
+
connection, if bounds of a size are known and it's easy, use a smaller
|
|
77
|
+
integer type like `uint8_t`. This is a "free" connection footprint
|
|
78
|
+
optimization for servers. Don't make code significantly more complex for
|
|
79
|
+
it, and do still check the bounds when passing in and out of the
|
|
80
|
+
struct. This narrowing should not propagate to local variables and
|
|
81
|
+
function parameters.
|
|
82
|
+
|
|
83
|
+
When doing arithmetic, account for overflow conditions.
|
|
84
|
+
|
|
85
|
+
Except with platform APIs, do not use `ssize_t`. MSVC lacks it, and
|
|
86
|
+
prefer out-of-band error signaling for `size_t` (see Return values).
|
|
87
|
+
|
|
88
|
+
|
|
89
|
+
## Naming
|
|
90
|
+
|
|
91
|
+
Follow Google naming conventions in C++ files. In C files, use the
|
|
92
|
+
following naming conventions for consistency with existing OpenSSL and C
|
|
93
|
+
styles:
|
|
94
|
+
|
|
95
|
+
Define structs with typedef named `TYPE_NAME`. The corresponding struct
|
|
96
|
+
should be named `struct type_name_st`.
|
|
97
|
+
|
|
98
|
+
Name public functions as `MODULE_function_name`, unless the module
|
|
99
|
+
already uses a different naming scheme for legacy reasons. The module
|
|
100
|
+
name should be a type name if the function is a method of a particular
|
|
101
|
+
type.
|
|
102
|
+
|
|
103
|
+
Some types are allocated within the library while others are initialized
|
|
104
|
+
into a struct allocated by the caller, often on the stack. Name these
|
|
105
|
+
functions `TYPE_NAME_new`/`TYPE_NAME_free` and
|
|
106
|
+
`TYPE_NAME_init`/`TYPE_NAME_cleanup`, respectively. All `TYPE_NAME_free`
|
|
107
|
+
functions must do nothing on `NULL` input.
|
|
108
|
+
|
|
109
|
+
If a variable is the length of a pointer value, it has the suffix
|
|
110
|
+
`_len`. An output parameter is named `out` or has an `out_` prefix. For
|
|
111
|
+
instance, For instance:
|
|
112
|
+
|
|
113
|
+
uint8_t *out,
|
|
114
|
+
size_t *out_len,
|
|
115
|
+
const uint8_t *in,
|
|
116
|
+
size_t in_len,
|
|
117
|
+
|
|
118
|
+
Name public headers like `include/openssl/evp.h` with header guards like
|
|
119
|
+
`OPENSSL_HEADER_EVP_H`. Name internal headers like
|
|
120
|
+
`crypto/ec/internal.h` with header guards like
|
|
121
|
+
`OPENSSL_HEADER_EC_INTERNAL_H`.
|
|
122
|
+
|
|
123
|
+
Name enums like `enum unix_hacker_t`. For instance:
|
|
124
|
+
|
|
125
|
+
enum should_free_handshake_buffer_t {
|
|
126
|
+
free_handshake_buffer,
|
|
127
|
+
dont_free_handshake_buffer,
|
|
128
|
+
};
|
|
129
|
+
|
|
130
|
+
|
|
131
|
+
## Return values
|
|
132
|
+
|
|
133
|
+
As even `malloc` may fail in BoringSSL, the vast majority of functions
|
|
134
|
+
will have a failure case. Functions should return `int` with one on
|
|
135
|
+
success and zero on error. Do not overload the return value to both
|
|
136
|
+
signal success/failure and output an integer. For example:
|
|
137
|
+
|
|
138
|
+
OPENSSL_EXPORT int CBS_get_u16(CBS *cbs, uint16_t *out);
|
|
139
|
+
|
|
140
|
+
If a function needs more than a true/false result code, define an enum
|
|
141
|
+
rather than arbitrarily assigning meaning to int values.
|
|
142
|
+
|
|
143
|
+
If a function outputs a pointer to an object on success and there are no
|
|
144
|
+
other outputs, return the pointer directly and `NULL` on error.
|
|
145
|
+
|
|
146
|
+
|
|
147
|
+
## Parameters
|
|
148
|
+
|
|
149
|
+
Where not constrained by legacy code, parameter order should be:
|
|
150
|
+
|
|
151
|
+
1. context parameters
|
|
152
|
+
2. output parameters
|
|
153
|
+
3. input parameters
|
|
154
|
+
|
|
155
|
+
For example,
|
|
156
|
+
|
|
157
|
+
/* CBB_add_asn sets |*out_contents| to a |CBB| into which the contents of an
|
|
158
|
+
* ASN.1 object can be written. The |tag| argument will be used as the tag for
|
|
159
|
+
* the object. It returns one on success or zero on error. */
|
|
160
|
+
OPENSSL_EXPORT int CBB_add_asn1(CBB *cbb, CBB *out_contents, uint8_t tag);
|
|
161
|
+
|
|
162
|
+
|
|
163
|
+
## Documentation
|
|
164
|
+
|
|
165
|
+
All public symbols must have a documentation comment in their header
|
|
166
|
+
file. The style is based on that of Go. The first sentence begins with
|
|
167
|
+
the symbol name, optionally prefixed with "A" or "An". Apart from the
|
|
168
|
+
initial mention of symbol, references to other symbols or parameter
|
|
169
|
+
names should be surrounded by |pipes|.
|
|
170
|
+
|
|
171
|
+
Documentation should be concise but completely describe the exposed
|
|
172
|
+
behavior of the function. Pay special note to success/failure behaviors
|
|
173
|
+
and caller obligations on object lifetimes. If this sacrifices
|
|
174
|
+
conciseness, consider simplifying the function's behavior.
|
|
175
|
+
|
|
176
|
+
/* EVP_DigestVerifyUpdate appends |len| bytes from |data| to the data which
|
|
177
|
+
* will be verified by |EVP_DigestVerifyFinal|. It returns one on success and
|
|
178
|
+
* zero otherwise. */
|
|
179
|
+
OPENSSL_EXPORT int EVP_DigestVerifyUpdate(EVP_MD_CTX *ctx, const void *data,
|
|
180
|
+
size_t len);
|
|
181
|
+
|
|
182
|
+
Explicitly mention any surprising edge cases or deviations from common
|
|
183
|
+
return value patterns in legacy functions.
|
|
184
|
+
|
|
185
|
+
/* RSA_private_encrypt encrypts |flen| bytes from |from| with the private key in
|
|
186
|
+
* |rsa| and writes the encrypted data to |to|. The |to| buffer must have at
|
|
187
|
+
* least |RSA_size| bytes of space. It returns the number of bytes written, or
|
|
188
|
+
* -1 on error. The |padding| argument must be one of the |RSA_*_PADDING|
|
|
189
|
+
* values. If in doubt, |RSA_PKCS1_PADDING| is the most common.
|
|
190
|
+
*
|
|
191
|
+
* WARNING: this function is dangerous because it breaks the usual return value
|
|
192
|
+
* convention. Use |RSA_sign_raw| instead. */
|
|
193
|
+
OPENSSL_EXPORT int RSA_private_encrypt(int flen, const uint8_t *from,
|
|
194
|
+
uint8_t *to, RSA *rsa, int padding);
|
|
195
|
+
|
|
196
|
+
Document private functions in their `internal.h` header or, if static,
|
|
197
|
+
where defined.
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
version: 1.0.{build}
|
|
2
|
+
os:
|
|
3
|
+
- Visual Studio 2015
|
|
4
|
+
clone_depth: 1
|
|
5
|
+
configuration:
|
|
6
|
+
- Debug
|
|
7
|
+
- Release
|
|
8
|
+
platform:
|
|
9
|
+
- Win32
|
|
10
|
+
- x64
|
|
11
|
+
environment:
|
|
12
|
+
matrix:
|
|
13
|
+
- TOOLCHAIN_VERSION: 14.0
|
|
14
|
+
RUST: 1.4.0
|
|
15
|
+
- TOOLCHAIN_VERSION: 14.0
|
|
16
|
+
RUST: beta
|
|
17
|
+
- TOOLCHAIN_VERSION: 14.0
|
|
18
|
+
RUST: nightly
|
|
19
|
+
|
|
20
|
+
- TOOLCHAIN_VERSION: 12.0
|
|
21
|
+
RUST: 1.4.0
|
|
22
|
+
- TOOLCHAIN_VERSION: 12.0
|
|
23
|
+
RUST: beta
|
|
24
|
+
- TOOLCHAIN_VERSION: 12.0
|
|
25
|
+
RUST: nightly
|
|
26
|
+
|
|
27
|
+
build_script: mk/appveyor.bat
|
|
@@ -0,0 +1,108 @@
|
|
|
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 ANY
|
|
10
|
+
// SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
|
11
|
+
// WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
|
|
12
|
+
// OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
|
|
13
|
+
// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
|
14
|
+
|
|
15
|
+
extern crate num;
|
|
16
|
+
|
|
17
|
+
#[path="src/ecc_build.rs"]
|
|
18
|
+
mod ecc_build;
|
|
19
|
+
|
|
20
|
+
#[path="src/ecc_curves.rs"]
|
|
21
|
+
mod ecc_curves;
|
|
22
|
+
|
|
23
|
+
use std::env;
|
|
24
|
+
use std::path::Path;
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
const LIB_NAME: &'static str = "ring";
|
|
28
|
+
|
|
29
|
+
fn main() {
|
|
30
|
+
for (key, value) in env::vars() {
|
|
31
|
+
println!("{}: {}", key, value);
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
let out_dir = env::var("OUT_DIR").unwrap();
|
|
35
|
+
|
|
36
|
+
ecc_build::generate_code(&out_dir).unwrap();
|
|
37
|
+
build_c_code(&out_dir).unwrap();
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
fn build_c_code(out_dir: &str) -> Result<(), std::env::VarError> {
|
|
41
|
+
let host_str = try!(env::var("HOST"));
|
|
42
|
+
let host_triple = host_str.split('-').collect::<Vec<&str>>();
|
|
43
|
+
|
|
44
|
+
let target_str = try!(env::var("TARGET"));
|
|
45
|
+
let target_triple = target_str.split('-').collect::<Vec<&str>>();
|
|
46
|
+
|
|
47
|
+
let use_msbuild = host_triple.contains(&"msvc") &&
|
|
48
|
+
target_triple.contains(&"msvc");
|
|
49
|
+
|
|
50
|
+
let opt_level = try!(env::var("OPT_LEVEL"));
|
|
51
|
+
let disable_opt = opt_level == "0";
|
|
52
|
+
|
|
53
|
+
let num_jobs = try!(env::var("NUM_JOBS"));
|
|
54
|
+
|
|
55
|
+
// TODO: deal with link-time-optimization flag.
|
|
56
|
+
|
|
57
|
+
let command_name;
|
|
58
|
+
let args;
|
|
59
|
+
let lib_path;
|
|
60
|
+
if !use_msbuild {
|
|
61
|
+
command_name = "make";
|
|
62
|
+
// Environment variables |CC|, |CXX|, etc. will be inherited from this
|
|
63
|
+
// process.
|
|
64
|
+
let cmake_build_type = "RELWITHDEBINFO"; // TODO: disable_opt
|
|
65
|
+
lib_path = Path::new(out_dir).join("lib");
|
|
66
|
+
args = vec![
|
|
67
|
+
format!("-j{}", num_jobs),
|
|
68
|
+
format!("TARGET={}", target_str),
|
|
69
|
+
format!("CMAKE_BUILD_TYPE={}", cmake_build_type),
|
|
70
|
+
format!("BUILD_PREFIX={}/", out_dir),
|
|
71
|
+
format!("GENERATED_CODE_DIR={}", out_dir),
|
|
72
|
+
];
|
|
73
|
+
} else {
|
|
74
|
+
// TODO: This assumes that the package is being built under a
|
|
75
|
+
// {VS2013,VS2015} {x86,x64} Native Tools Command Prompt. It would be
|
|
76
|
+
// nice if we didn't require that to be the case. At least it should be
|
|
77
|
+
// documented.
|
|
78
|
+
command_name = "msbuild";
|
|
79
|
+
let platform = match target_triple[0] {
|
|
80
|
+
"i686" => "Win32",
|
|
81
|
+
"x86_64" => "x64",
|
|
82
|
+
_ => panic!("unexpected ARCH: {}", target_triple[0])
|
|
83
|
+
};
|
|
84
|
+
let configuration = if disable_opt { "Debug" } else { "Release" };
|
|
85
|
+
args = vec![
|
|
86
|
+
format!("{}.sln", LIB_NAME),
|
|
87
|
+
format!("/m:{}", num_jobs),
|
|
88
|
+
format!("/p:Platform={}", platform),
|
|
89
|
+
format!("/p:Configuration={}", configuration),
|
|
90
|
+
format!("/p:OutRootDir={}/", out_dir),
|
|
91
|
+
format!("/p:GENERATED_CODE_DIR={}", out_dir),
|
|
92
|
+
];
|
|
93
|
+
lib_path = Path::new(&out_dir).join("lib");
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
if !std::process::Command::new(command_name)
|
|
97
|
+
.args(&args)
|
|
98
|
+
.status()
|
|
99
|
+
.unwrap_or_else(|e| { panic!("failed to execute {}: {}",
|
|
100
|
+
command_name, e); })
|
|
101
|
+
.success() {
|
|
102
|
+
panic!("{} execution failed", command_name);
|
|
103
|
+
}
|
|
104
|
+
|
|
105
|
+
println!("cargo:rustc-link-search=native={}", lib_path.to_str().unwrap());
|
|
106
|
+
println!("cargo:rustc-link-lib=static={}-core", LIB_NAME);
|
|
107
|
+
Ok(())
|
|
108
|
+
}
|
|
@@ -0,0 +1,1142 @@
|
|
|
1
|
+
/* ====================================================================
|
|
2
|
+
* Copyright (c) 2002-2006 The OpenSSL Project. All rights reserved.
|
|
3
|
+
*
|
|
4
|
+
* Redistribution and use in source and binary forms, with or without
|
|
5
|
+
* modification, are permitted provided that the following conditions
|
|
6
|
+
* are met:
|
|
7
|
+
*
|
|
8
|
+
* 1. Redistributions of source code must retain the above copyright
|
|
9
|
+
* notice, this list of conditions and the following disclaimer.
|
|
10
|
+
*
|
|
11
|
+
* 2. Redistributions in binary form must reproduce the above copyright
|
|
12
|
+
* notice, this list of conditions and the following disclaimer in
|
|
13
|
+
* the documentation and/or other materials provided with the
|
|
14
|
+
* distribution.
|
|
15
|
+
*
|
|
16
|
+
* 3. All advertising materials mentioning features or use of this
|
|
17
|
+
* software must display the following acknowledgment:
|
|
18
|
+
* "This product includes software developed by the OpenSSL Project
|
|
19
|
+
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
|
20
|
+
*
|
|
21
|
+
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
|
22
|
+
* endorse or promote products derived from this software without
|
|
23
|
+
* prior written permission. For written permission, please contact
|
|
24
|
+
* openssl-core@openssl.org.
|
|
25
|
+
*
|
|
26
|
+
* 5. Products derived from this software may not be called "OpenSSL"
|
|
27
|
+
* nor may "OpenSSL" appear in their names without prior written
|
|
28
|
+
* permission of the OpenSSL Project.
|
|
29
|
+
*
|
|
30
|
+
* 6. Redistributions of any form whatsoever must retain the following
|
|
31
|
+
* acknowledgment:
|
|
32
|
+
* "This product includes software developed by the OpenSSL Project
|
|
33
|
+
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
|
34
|
+
*
|
|
35
|
+
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
|
36
|
+
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
|
37
|
+
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
|
38
|
+
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
|
39
|
+
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
|
40
|
+
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
|
41
|
+
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
|
42
|
+
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
|
43
|
+
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
|
44
|
+
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
|
45
|
+
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
|
46
|
+
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
|
47
|
+
* ==================================================================== */
|
|
48
|
+
|
|
49
|
+
#include <openssl/aes.h>
|
|
50
|
+
|
|
51
|
+
#include <assert.h>
|
|
52
|
+
#include <stdlib.h>
|
|
53
|
+
|
|
54
|
+
#include <openssl/cpu.h>
|
|
55
|
+
|
|
56
|
+
#include "internal.h"
|
|
57
|
+
|
|
58
|
+
|
|
59
|
+
#if defined(OPENSSL_NO_ASM) || \
|
|
60
|
+
(!defined(OPENSSL_X86) && !defined(OPENSSL_X86_64) && !defined(OPENSSL_ARM))
|
|
61
|
+
|
|
62
|
+
/* Te0[x] = S [x].[02, 01, 01, 03];
|
|
63
|
+
* Te1[x] = S [x].[03, 02, 01, 01];
|
|
64
|
+
* Te2[x] = S [x].[01, 03, 02, 01];
|
|
65
|
+
* Te3[x] = S [x].[01, 01, 03, 02];
|
|
66
|
+
*
|
|
67
|
+
* Td0[x] = Si[x].[0e, 09, 0d, 0b];
|
|
68
|
+
* Td1[x] = Si[x].[0b, 0e, 09, 0d];
|
|
69
|
+
* Td2[x] = Si[x].[0d, 0b, 0e, 09];
|
|
70
|
+
* Td3[x] = Si[x].[09, 0d, 0b, 0e];
|
|
71
|
+
* Td4[x] = Si[x].[01]; */
|
|
72
|
+
|
|
73
|
+
static const uint32_t Te0[256] = {
|
|
74
|
+
0xc66363a5U, 0xf87c7c84U, 0xee777799U, 0xf67b7b8dU, 0xfff2f20dU,
|
|
75
|
+
0xd66b6bbdU, 0xde6f6fb1U, 0x91c5c554U, 0x60303050U, 0x02010103U,
|
|
76
|
+
0xce6767a9U, 0x562b2b7dU, 0xe7fefe19U, 0xb5d7d762U, 0x4dababe6U,
|
|
77
|
+
0xec76769aU, 0x8fcaca45U, 0x1f82829dU, 0x89c9c940U, 0xfa7d7d87U,
|
|
78
|
+
0xeffafa15U, 0xb25959ebU, 0x8e4747c9U, 0xfbf0f00bU, 0x41adadecU,
|
|
79
|
+
0xb3d4d467U, 0x5fa2a2fdU, 0x45afafeaU, 0x239c9cbfU, 0x53a4a4f7U,
|
|
80
|
+
0xe4727296U, 0x9bc0c05bU, 0x75b7b7c2U, 0xe1fdfd1cU, 0x3d9393aeU,
|
|
81
|
+
0x4c26266aU, 0x6c36365aU, 0x7e3f3f41U, 0xf5f7f702U, 0x83cccc4fU,
|
|
82
|
+
0x6834345cU, 0x51a5a5f4U, 0xd1e5e534U, 0xf9f1f108U, 0xe2717193U,
|
|
83
|
+
0xabd8d873U, 0x62313153U, 0x2a15153fU, 0x0804040cU, 0x95c7c752U,
|
|
84
|
+
0x46232365U, 0x9dc3c35eU, 0x30181828U, 0x379696a1U, 0x0a05050fU,
|
|
85
|
+
0x2f9a9ab5U, 0x0e070709U, 0x24121236U, 0x1b80809bU, 0xdfe2e23dU,
|
|
86
|
+
0xcdebeb26U, 0x4e272769U, 0x7fb2b2cdU, 0xea75759fU, 0x1209091bU,
|
|
87
|
+
0x1d83839eU, 0x582c2c74U, 0x341a1a2eU, 0x361b1b2dU, 0xdc6e6eb2U,
|
|
88
|
+
0xb45a5aeeU, 0x5ba0a0fbU, 0xa45252f6U, 0x763b3b4dU, 0xb7d6d661U,
|
|
89
|
+
0x7db3b3ceU, 0x5229297bU, 0xdde3e33eU, 0x5e2f2f71U, 0x13848497U,
|
|
90
|
+
0xa65353f5U, 0xb9d1d168U, 0x00000000U, 0xc1eded2cU, 0x40202060U,
|
|
91
|
+
0xe3fcfc1fU, 0x79b1b1c8U, 0xb65b5bedU, 0xd46a6abeU, 0x8dcbcb46U,
|
|
92
|
+
0x67bebed9U, 0x7239394bU, 0x944a4adeU, 0x984c4cd4U, 0xb05858e8U,
|
|
93
|
+
0x85cfcf4aU, 0xbbd0d06bU, 0xc5efef2aU, 0x4faaaae5U, 0xedfbfb16U,
|
|
94
|
+
0x864343c5U, 0x9a4d4dd7U, 0x66333355U, 0x11858594U, 0x8a4545cfU,
|
|
95
|
+
0xe9f9f910U, 0x04020206U, 0xfe7f7f81U, 0xa05050f0U, 0x783c3c44U,
|
|
96
|
+
0x259f9fbaU, 0x4ba8a8e3U, 0xa25151f3U, 0x5da3a3feU, 0x804040c0U,
|
|
97
|
+
0x058f8f8aU, 0x3f9292adU, 0x219d9dbcU, 0x70383848U, 0xf1f5f504U,
|
|
98
|
+
0x63bcbcdfU, 0x77b6b6c1U, 0xafdada75U, 0x42212163U, 0x20101030U,
|
|
99
|
+
0xe5ffff1aU, 0xfdf3f30eU, 0xbfd2d26dU, 0x81cdcd4cU, 0x180c0c14U,
|
|
100
|
+
0x26131335U, 0xc3ecec2fU, 0xbe5f5fe1U, 0x359797a2U, 0x884444ccU,
|
|
101
|
+
0x2e171739U, 0x93c4c457U, 0x55a7a7f2U, 0xfc7e7e82U, 0x7a3d3d47U,
|
|
102
|
+
0xc86464acU, 0xba5d5de7U, 0x3219192bU, 0xe6737395U, 0xc06060a0U,
|
|
103
|
+
0x19818198U, 0x9e4f4fd1U, 0xa3dcdc7fU, 0x44222266U, 0x542a2a7eU,
|
|
104
|
+
0x3b9090abU, 0x0b888883U, 0x8c4646caU, 0xc7eeee29U, 0x6bb8b8d3U,
|
|
105
|
+
0x2814143cU, 0xa7dede79U, 0xbc5e5ee2U, 0x160b0b1dU, 0xaddbdb76U,
|
|
106
|
+
0xdbe0e03bU, 0x64323256U, 0x743a3a4eU, 0x140a0a1eU, 0x924949dbU,
|
|
107
|
+
0x0c06060aU, 0x4824246cU, 0xb85c5ce4U, 0x9fc2c25dU, 0xbdd3d36eU,
|
|
108
|
+
0x43acacefU, 0xc46262a6U, 0x399191a8U, 0x319595a4U, 0xd3e4e437U,
|
|
109
|
+
0xf279798bU, 0xd5e7e732U, 0x8bc8c843U, 0x6e373759U, 0xda6d6db7U,
|
|
110
|
+
0x018d8d8cU, 0xb1d5d564U, 0x9c4e4ed2U, 0x49a9a9e0U, 0xd86c6cb4U,
|
|
111
|
+
0xac5656faU, 0xf3f4f407U, 0xcfeaea25U, 0xca6565afU, 0xf47a7a8eU,
|
|
112
|
+
0x47aeaee9U, 0x10080818U, 0x6fbabad5U, 0xf0787888U, 0x4a25256fU,
|
|
113
|
+
0x5c2e2e72U, 0x381c1c24U, 0x57a6a6f1U, 0x73b4b4c7U, 0x97c6c651U,
|
|
114
|
+
0xcbe8e823U, 0xa1dddd7cU, 0xe874749cU, 0x3e1f1f21U, 0x964b4bddU,
|
|
115
|
+
0x61bdbddcU, 0x0d8b8b86U, 0x0f8a8a85U, 0xe0707090U, 0x7c3e3e42U,
|
|
116
|
+
0x71b5b5c4U, 0xcc6666aaU, 0x904848d8U, 0x06030305U, 0xf7f6f601U,
|
|
117
|
+
0x1c0e0e12U, 0xc26161a3U, 0x6a35355fU, 0xae5757f9U, 0x69b9b9d0U,
|
|
118
|
+
0x17868691U, 0x99c1c158U, 0x3a1d1d27U, 0x279e9eb9U, 0xd9e1e138U,
|
|
119
|
+
0xebf8f813U, 0x2b9898b3U, 0x22111133U, 0xd26969bbU, 0xa9d9d970U,
|
|
120
|
+
0x078e8e89U, 0x339494a7U, 0x2d9b9bb6U, 0x3c1e1e22U, 0x15878792U,
|
|
121
|
+
0xc9e9e920U, 0x87cece49U, 0xaa5555ffU, 0x50282878U, 0xa5dfdf7aU,
|
|
122
|
+
0x038c8c8fU, 0x59a1a1f8U, 0x09898980U, 0x1a0d0d17U, 0x65bfbfdaU,
|
|
123
|
+
0xd7e6e631U, 0x844242c6U, 0xd06868b8U, 0x824141c3U, 0x299999b0U,
|
|
124
|
+
0x5a2d2d77U, 0x1e0f0f11U, 0x7bb0b0cbU, 0xa85454fcU, 0x6dbbbbd6U,
|
|
125
|
+
0x2c16163aU, };
|
|
126
|
+
|
|
127
|
+
static const uint32_t Te1[256] = {
|
|
128
|
+
0xa5c66363U, 0x84f87c7cU, 0x99ee7777U, 0x8df67b7bU, 0x0dfff2f2U,
|
|
129
|
+
0xbdd66b6bU, 0xb1de6f6fU, 0x5491c5c5U, 0x50603030U, 0x03020101U,
|
|
130
|
+
0xa9ce6767U, 0x7d562b2bU, 0x19e7fefeU, 0x62b5d7d7U, 0xe64dababU,
|
|
131
|
+
0x9aec7676U, 0x458fcacaU, 0x9d1f8282U, 0x4089c9c9U, 0x87fa7d7dU,
|
|
132
|
+
0x15effafaU, 0xebb25959U, 0xc98e4747U, 0x0bfbf0f0U, 0xec41adadU,
|
|
133
|
+
0x67b3d4d4U, 0xfd5fa2a2U, 0xea45afafU, 0xbf239c9cU, 0xf753a4a4U,
|
|
134
|
+
0x96e47272U, 0x5b9bc0c0U, 0xc275b7b7U, 0x1ce1fdfdU, 0xae3d9393U,
|
|
135
|
+
0x6a4c2626U, 0x5a6c3636U, 0x417e3f3fU, 0x02f5f7f7U, 0x4f83ccccU,
|
|
136
|
+
0x5c683434U, 0xf451a5a5U, 0x34d1e5e5U, 0x08f9f1f1U, 0x93e27171U,
|
|
137
|
+
0x73abd8d8U, 0x53623131U, 0x3f2a1515U, 0x0c080404U, 0x5295c7c7U,
|
|
138
|
+
0x65462323U, 0x5e9dc3c3U, 0x28301818U, 0xa1379696U, 0x0f0a0505U,
|
|
139
|
+
0xb52f9a9aU, 0x090e0707U, 0x36241212U, 0x9b1b8080U, 0x3ddfe2e2U,
|
|
140
|
+
0x26cdebebU, 0x694e2727U, 0xcd7fb2b2U, 0x9fea7575U, 0x1b120909U,
|
|
141
|
+
0x9e1d8383U, 0x74582c2cU, 0x2e341a1aU, 0x2d361b1bU, 0xb2dc6e6eU,
|
|
142
|
+
0xeeb45a5aU, 0xfb5ba0a0U, 0xf6a45252U, 0x4d763b3bU, 0x61b7d6d6U,
|
|
143
|
+
0xce7db3b3U, 0x7b522929U, 0x3edde3e3U, 0x715e2f2fU, 0x97138484U,
|
|
144
|
+
0xf5a65353U, 0x68b9d1d1U, 0x00000000U, 0x2cc1ededU, 0x60402020U,
|
|
145
|
+
0x1fe3fcfcU, 0xc879b1b1U, 0xedb65b5bU, 0xbed46a6aU, 0x468dcbcbU,
|
|
146
|
+
0xd967bebeU, 0x4b723939U, 0xde944a4aU, 0xd4984c4cU, 0xe8b05858U,
|
|
147
|
+
0x4a85cfcfU, 0x6bbbd0d0U, 0x2ac5efefU, 0xe54faaaaU, 0x16edfbfbU,
|
|
148
|
+
0xc5864343U, 0xd79a4d4dU, 0x55663333U, 0x94118585U, 0xcf8a4545U,
|
|
149
|
+
0x10e9f9f9U, 0x06040202U, 0x81fe7f7fU, 0xf0a05050U, 0x44783c3cU,
|
|
150
|
+
0xba259f9fU, 0xe34ba8a8U, 0xf3a25151U, 0xfe5da3a3U, 0xc0804040U,
|
|
151
|
+
0x8a058f8fU, 0xad3f9292U, 0xbc219d9dU, 0x48703838U, 0x04f1f5f5U,
|
|
152
|
+
0xdf63bcbcU, 0xc177b6b6U, 0x75afdadaU, 0x63422121U, 0x30201010U,
|
|
153
|
+
0x1ae5ffffU, 0x0efdf3f3U, 0x6dbfd2d2U, 0x4c81cdcdU, 0x14180c0cU,
|
|
154
|
+
0x35261313U, 0x2fc3ececU, 0xe1be5f5fU, 0xa2359797U, 0xcc884444U,
|
|
155
|
+
0x392e1717U, 0x5793c4c4U, 0xf255a7a7U, 0x82fc7e7eU, 0x477a3d3dU,
|
|
156
|
+
0xacc86464U, 0xe7ba5d5dU, 0x2b321919U, 0x95e67373U, 0xa0c06060U,
|
|
157
|
+
0x98198181U, 0xd19e4f4fU, 0x7fa3dcdcU, 0x66442222U, 0x7e542a2aU,
|
|
158
|
+
0xab3b9090U, 0x830b8888U, 0xca8c4646U, 0x29c7eeeeU, 0xd36bb8b8U,
|
|
159
|
+
0x3c281414U, 0x79a7dedeU, 0xe2bc5e5eU, 0x1d160b0bU, 0x76addbdbU,
|
|
160
|
+
0x3bdbe0e0U, 0x56643232U, 0x4e743a3aU, 0x1e140a0aU, 0xdb924949U,
|
|
161
|
+
0x0a0c0606U, 0x6c482424U, 0xe4b85c5cU, 0x5d9fc2c2U, 0x6ebdd3d3U,
|
|
162
|
+
0xef43acacU, 0xa6c46262U, 0xa8399191U, 0xa4319595U, 0x37d3e4e4U,
|
|
163
|
+
0x8bf27979U, 0x32d5e7e7U, 0x438bc8c8U, 0x596e3737U, 0xb7da6d6dU,
|
|
164
|
+
0x8c018d8dU, 0x64b1d5d5U, 0xd29c4e4eU, 0xe049a9a9U, 0xb4d86c6cU,
|
|
165
|
+
0xfaac5656U, 0x07f3f4f4U, 0x25cfeaeaU, 0xafca6565U, 0x8ef47a7aU,
|
|
166
|
+
0xe947aeaeU, 0x18100808U, 0xd56fbabaU, 0x88f07878U, 0x6f4a2525U,
|
|
167
|
+
0x725c2e2eU, 0x24381c1cU, 0xf157a6a6U, 0xc773b4b4U, 0x5197c6c6U,
|
|
168
|
+
0x23cbe8e8U, 0x7ca1ddddU, 0x9ce87474U, 0x213e1f1fU, 0xdd964b4bU,
|
|
169
|
+
0xdc61bdbdU, 0x860d8b8bU, 0x850f8a8aU, 0x90e07070U, 0x427c3e3eU,
|
|
170
|
+
0xc471b5b5U, 0xaacc6666U, 0xd8904848U, 0x05060303U, 0x01f7f6f6U,
|
|
171
|
+
0x121c0e0eU, 0xa3c26161U, 0x5f6a3535U, 0xf9ae5757U, 0xd069b9b9U,
|
|
172
|
+
0x91178686U, 0x5899c1c1U, 0x273a1d1dU, 0xb9279e9eU, 0x38d9e1e1U,
|
|
173
|
+
0x13ebf8f8U, 0xb32b9898U, 0x33221111U, 0xbbd26969U, 0x70a9d9d9U,
|
|
174
|
+
0x89078e8eU, 0xa7339494U, 0xb62d9b9bU, 0x223c1e1eU, 0x92158787U,
|
|
175
|
+
0x20c9e9e9U, 0x4987ceceU, 0xffaa5555U, 0x78502828U, 0x7aa5dfdfU,
|
|
176
|
+
0x8f038c8cU, 0xf859a1a1U, 0x80098989U, 0x171a0d0dU, 0xda65bfbfU,
|
|
177
|
+
0x31d7e6e6U, 0xc6844242U, 0xb8d06868U, 0xc3824141U, 0xb0299999U,
|
|
178
|
+
0x775a2d2dU, 0x111e0f0fU, 0xcb7bb0b0U, 0xfca85454U, 0xd66dbbbbU,
|
|
179
|
+
0x3a2c1616U, };
|
|
180
|
+
|
|
181
|
+
static const uint32_t Te2[256] = {
|
|
182
|
+
0x63a5c663U, 0x7c84f87cU, 0x7799ee77U, 0x7b8df67bU, 0xf20dfff2U,
|
|
183
|
+
0x6bbdd66bU, 0x6fb1de6fU, 0xc55491c5U, 0x30506030U, 0x01030201U,
|
|
184
|
+
0x67a9ce67U, 0x2b7d562bU, 0xfe19e7feU, 0xd762b5d7U, 0xabe64dabU,
|
|
185
|
+
0x769aec76U, 0xca458fcaU, 0x829d1f82U, 0xc94089c9U, 0x7d87fa7dU,
|
|
186
|
+
0xfa15effaU, 0x59ebb259U, 0x47c98e47U, 0xf00bfbf0U, 0xadec41adU,
|
|
187
|
+
0xd467b3d4U, 0xa2fd5fa2U, 0xafea45afU, 0x9cbf239cU, 0xa4f753a4U,
|
|
188
|
+
0x7296e472U, 0xc05b9bc0U, 0xb7c275b7U, 0xfd1ce1fdU, 0x93ae3d93U,
|
|
189
|
+
0x266a4c26U, 0x365a6c36U, 0x3f417e3fU, 0xf702f5f7U, 0xcc4f83ccU,
|
|
190
|
+
0x345c6834U, 0xa5f451a5U, 0xe534d1e5U, 0xf108f9f1U, 0x7193e271U,
|
|
191
|
+
0xd873abd8U, 0x31536231U, 0x153f2a15U, 0x040c0804U, 0xc75295c7U,
|
|
192
|
+
0x23654623U, 0xc35e9dc3U, 0x18283018U, 0x96a13796U, 0x050f0a05U,
|
|
193
|
+
0x9ab52f9aU, 0x07090e07U, 0x12362412U, 0x809b1b80U, 0xe23ddfe2U,
|
|
194
|
+
0xeb26cdebU, 0x27694e27U, 0xb2cd7fb2U, 0x759fea75U, 0x091b1209U,
|
|
195
|
+
0x839e1d83U, 0x2c74582cU, 0x1a2e341aU, 0x1b2d361bU, 0x6eb2dc6eU,
|
|
196
|
+
0x5aeeb45aU, 0xa0fb5ba0U, 0x52f6a452U, 0x3b4d763bU, 0xd661b7d6U,
|
|
197
|
+
0xb3ce7db3U, 0x297b5229U, 0xe33edde3U, 0x2f715e2fU, 0x84971384U,
|
|
198
|
+
0x53f5a653U, 0xd168b9d1U, 0x00000000U, 0xed2cc1edU, 0x20604020U,
|
|
199
|
+
0xfc1fe3fcU, 0xb1c879b1U, 0x5bedb65bU, 0x6abed46aU, 0xcb468dcbU,
|
|
200
|
+
0xbed967beU, 0x394b7239U, 0x4ade944aU, 0x4cd4984cU, 0x58e8b058U,
|
|
201
|
+
0xcf4a85cfU, 0xd06bbbd0U, 0xef2ac5efU, 0xaae54faaU, 0xfb16edfbU,
|
|
202
|
+
0x43c58643U, 0x4dd79a4dU, 0x33556633U, 0x85941185U, 0x45cf8a45U,
|
|
203
|
+
0xf910e9f9U, 0x02060402U, 0x7f81fe7fU, 0x50f0a050U, 0x3c44783cU,
|
|
204
|
+
0x9fba259fU, 0xa8e34ba8U, 0x51f3a251U, 0xa3fe5da3U, 0x40c08040U,
|
|
205
|
+
0x8f8a058fU, 0x92ad3f92U, 0x9dbc219dU, 0x38487038U, 0xf504f1f5U,
|
|
206
|
+
0xbcdf63bcU, 0xb6c177b6U, 0xda75afdaU, 0x21634221U, 0x10302010U,
|
|
207
|
+
0xff1ae5ffU, 0xf30efdf3U, 0xd26dbfd2U, 0xcd4c81cdU, 0x0c14180cU,
|
|
208
|
+
0x13352613U, 0xec2fc3ecU, 0x5fe1be5fU, 0x97a23597U, 0x44cc8844U,
|
|
209
|
+
0x17392e17U, 0xc45793c4U, 0xa7f255a7U, 0x7e82fc7eU, 0x3d477a3dU,
|
|
210
|
+
0x64acc864U, 0x5de7ba5dU, 0x192b3219U, 0x7395e673U, 0x60a0c060U,
|
|
211
|
+
0x81981981U, 0x4fd19e4fU, 0xdc7fa3dcU, 0x22664422U, 0x2a7e542aU,
|
|
212
|
+
0x90ab3b90U, 0x88830b88U, 0x46ca8c46U, 0xee29c7eeU, 0xb8d36bb8U,
|
|
213
|
+
0x143c2814U, 0xde79a7deU, 0x5ee2bc5eU, 0x0b1d160bU, 0xdb76addbU,
|
|
214
|
+
0xe03bdbe0U, 0x32566432U, 0x3a4e743aU, 0x0a1e140aU, 0x49db9249U,
|
|
215
|
+
0x060a0c06U, 0x246c4824U, 0x5ce4b85cU, 0xc25d9fc2U, 0xd36ebdd3U,
|
|
216
|
+
0xacef43acU, 0x62a6c462U, 0x91a83991U, 0x95a43195U, 0xe437d3e4U,
|
|
217
|
+
0x798bf279U, 0xe732d5e7U, 0xc8438bc8U, 0x37596e37U, 0x6db7da6dU,
|
|
218
|
+
0x8d8c018dU, 0xd564b1d5U, 0x4ed29c4eU, 0xa9e049a9U, 0x6cb4d86cU,
|
|
219
|
+
0x56faac56U, 0xf407f3f4U, 0xea25cfeaU, 0x65afca65U, 0x7a8ef47aU,
|
|
220
|
+
0xaee947aeU, 0x08181008U, 0xbad56fbaU, 0x7888f078U, 0x256f4a25U,
|
|
221
|
+
0x2e725c2eU, 0x1c24381cU, 0xa6f157a6U, 0xb4c773b4U, 0xc65197c6U,
|
|
222
|
+
0xe823cbe8U, 0xdd7ca1ddU, 0x749ce874U, 0x1f213e1fU, 0x4bdd964bU,
|
|
223
|
+
0xbddc61bdU, 0x8b860d8bU, 0x8a850f8aU, 0x7090e070U, 0x3e427c3eU,
|
|
224
|
+
0xb5c471b5U, 0x66aacc66U, 0x48d89048U, 0x03050603U, 0xf601f7f6U,
|
|
225
|
+
0x0e121c0eU, 0x61a3c261U, 0x355f6a35U, 0x57f9ae57U, 0xb9d069b9U,
|
|
226
|
+
0x86911786U, 0xc15899c1U, 0x1d273a1dU, 0x9eb9279eU, 0xe138d9e1U,
|
|
227
|
+
0xf813ebf8U, 0x98b32b98U, 0x11332211U, 0x69bbd269U, 0xd970a9d9U,
|
|
228
|
+
0x8e89078eU, 0x94a73394U, 0x9bb62d9bU, 0x1e223c1eU, 0x87921587U,
|
|
229
|
+
0xe920c9e9U, 0xce4987ceU, 0x55ffaa55U, 0x28785028U, 0xdf7aa5dfU,
|
|
230
|
+
0x8c8f038cU, 0xa1f859a1U, 0x89800989U, 0x0d171a0dU, 0xbfda65bfU,
|
|
231
|
+
0xe631d7e6U, 0x42c68442U, 0x68b8d068U, 0x41c38241U, 0x99b02999U,
|
|
232
|
+
0x2d775a2dU, 0x0f111e0fU, 0xb0cb7bb0U, 0x54fca854U, 0xbbd66dbbU,
|
|
233
|
+
0x163a2c16U, };
|
|
234
|
+
|
|
235
|
+
static const uint32_t Te3[256] = {
|
|
236
|
+
0x6363a5c6U, 0x7c7c84f8U, 0x777799eeU, 0x7b7b8df6U, 0xf2f20dffU,
|
|
237
|
+
0x6b6bbdd6U, 0x6f6fb1deU, 0xc5c55491U, 0x30305060U, 0x01010302U,
|
|
238
|
+
0x6767a9ceU, 0x2b2b7d56U, 0xfefe19e7U, 0xd7d762b5U, 0xababe64dU,
|
|
239
|
+
0x76769aecU, 0xcaca458fU, 0x82829d1fU, 0xc9c94089U, 0x7d7d87faU,
|
|
240
|
+
0xfafa15efU, 0x5959ebb2U, 0x4747c98eU, 0xf0f00bfbU, 0xadadec41U,
|
|
241
|
+
0xd4d467b3U, 0xa2a2fd5fU, 0xafafea45U, 0x9c9cbf23U, 0xa4a4f753U,
|
|
242
|
+
0x727296e4U, 0xc0c05b9bU, 0xb7b7c275U, 0xfdfd1ce1U, 0x9393ae3dU,
|
|
243
|
+
0x26266a4cU, 0x36365a6cU, 0x3f3f417eU, 0xf7f702f5U, 0xcccc4f83U,
|
|
244
|
+
0x34345c68U, 0xa5a5f451U, 0xe5e534d1U, 0xf1f108f9U, 0x717193e2U,
|
|
245
|
+
0xd8d873abU, 0x31315362U, 0x15153f2aU, 0x04040c08U, 0xc7c75295U,
|
|
246
|
+
0x23236546U, 0xc3c35e9dU, 0x18182830U, 0x9696a137U, 0x05050f0aU,
|
|
247
|
+
0x9a9ab52fU, 0x0707090eU, 0x12123624U, 0x80809b1bU, 0xe2e23ddfU,
|
|
248
|
+
0xebeb26cdU, 0x2727694eU, 0xb2b2cd7fU, 0x75759feaU, 0x09091b12U,
|
|
249
|
+
0x83839e1dU, 0x2c2c7458U, 0x1a1a2e34U, 0x1b1b2d36U, 0x6e6eb2dcU,
|
|
250
|
+
0x5a5aeeb4U, 0xa0a0fb5bU, 0x5252f6a4U, 0x3b3b4d76U, 0xd6d661b7U,
|
|
251
|
+
0xb3b3ce7dU, 0x29297b52U, 0xe3e33eddU, 0x2f2f715eU, 0x84849713U,
|
|
252
|
+
0x5353f5a6U, 0xd1d168b9U, 0x00000000U, 0xeded2cc1U, 0x20206040U,
|
|
253
|
+
0xfcfc1fe3U, 0xb1b1c879U, 0x5b5bedb6U, 0x6a6abed4U, 0xcbcb468dU,
|
|
254
|
+
0xbebed967U, 0x39394b72U, 0x4a4ade94U, 0x4c4cd498U, 0x5858e8b0U,
|
|
255
|
+
0xcfcf4a85U, 0xd0d06bbbU, 0xefef2ac5U, 0xaaaae54fU, 0xfbfb16edU,
|
|
256
|
+
0x4343c586U, 0x4d4dd79aU, 0x33335566U, 0x85859411U, 0x4545cf8aU,
|
|
257
|
+
0xf9f910e9U, 0x02020604U, 0x7f7f81feU, 0x5050f0a0U, 0x3c3c4478U,
|
|
258
|
+
0x9f9fba25U, 0xa8a8e34bU, 0x5151f3a2U, 0xa3a3fe5dU, 0x4040c080U,
|
|
259
|
+
0x8f8f8a05U, 0x9292ad3fU, 0x9d9dbc21U, 0x38384870U, 0xf5f504f1U,
|
|
260
|
+
0xbcbcdf63U, 0xb6b6c177U, 0xdada75afU, 0x21216342U, 0x10103020U,
|
|
261
|
+
0xffff1ae5U, 0xf3f30efdU, 0xd2d26dbfU, 0xcdcd4c81U, 0x0c0c1418U,
|
|
262
|
+
0x13133526U, 0xecec2fc3U, 0x5f5fe1beU, 0x9797a235U, 0x4444cc88U,
|
|
263
|
+
0x1717392eU, 0xc4c45793U, 0xa7a7f255U, 0x7e7e82fcU, 0x3d3d477aU,
|
|
264
|
+
0x6464acc8U, 0x5d5de7baU, 0x19192b32U, 0x737395e6U, 0x6060a0c0U,
|
|
265
|
+
0x81819819U, 0x4f4fd19eU, 0xdcdc7fa3U, 0x22226644U, 0x2a2a7e54U,
|
|
266
|
+
0x9090ab3bU, 0x8888830bU, 0x4646ca8cU, 0xeeee29c7U, 0xb8b8d36bU,
|
|
267
|
+
0x14143c28U, 0xdede79a7U, 0x5e5ee2bcU, 0x0b0b1d16U, 0xdbdb76adU,
|
|
268
|
+
0xe0e03bdbU, 0x32325664U, 0x3a3a4e74U, 0x0a0a1e14U, 0x4949db92U,
|
|
269
|
+
0x06060a0cU, 0x24246c48U, 0x5c5ce4b8U, 0xc2c25d9fU, 0xd3d36ebdU,
|
|
270
|
+
0xacacef43U, 0x6262a6c4U, 0x9191a839U, 0x9595a431U, 0xe4e437d3U,
|
|
271
|
+
0x79798bf2U, 0xe7e732d5U, 0xc8c8438bU, 0x3737596eU, 0x6d6db7daU,
|
|
272
|
+
0x8d8d8c01U, 0xd5d564b1U, 0x4e4ed29cU, 0xa9a9e049U, 0x6c6cb4d8U,
|
|
273
|
+
0x5656faacU, 0xf4f407f3U, 0xeaea25cfU, 0x6565afcaU, 0x7a7a8ef4U,
|
|
274
|
+
0xaeaee947U, 0x08081810U, 0xbabad56fU, 0x787888f0U, 0x25256f4aU,
|
|
275
|
+
0x2e2e725cU, 0x1c1c2438U, 0xa6a6f157U, 0xb4b4c773U, 0xc6c65197U,
|
|
276
|
+
0xe8e823cbU, 0xdddd7ca1U, 0x74749ce8U, 0x1f1f213eU, 0x4b4bdd96U,
|
|
277
|
+
0xbdbddc61U, 0x8b8b860dU, 0x8a8a850fU, 0x707090e0U, 0x3e3e427cU,
|
|
278
|
+
0xb5b5c471U, 0x6666aaccU, 0x4848d890U, 0x03030506U, 0xf6f601f7U,
|
|
279
|
+
0x0e0e121cU, 0x6161a3c2U, 0x35355f6aU, 0x5757f9aeU, 0xb9b9d069U,
|
|
280
|
+
0x86869117U, 0xc1c15899U, 0x1d1d273aU, 0x9e9eb927U, 0xe1e138d9U,
|
|
281
|
+
0xf8f813ebU, 0x9898b32bU, 0x11113322U, 0x6969bbd2U, 0xd9d970a9U,
|
|
282
|
+
0x8e8e8907U, 0x9494a733U, 0x9b9bb62dU, 0x1e1e223cU, 0x87879215U,
|
|
283
|
+
0xe9e920c9U, 0xcece4987U, 0x5555ffaaU, 0x28287850U, 0xdfdf7aa5U,
|
|
284
|
+
0x8c8c8f03U, 0xa1a1f859U, 0x89898009U, 0x0d0d171aU, 0xbfbfda65U,
|
|
285
|
+
0xe6e631d7U, 0x4242c684U, 0x6868b8d0U, 0x4141c382U, 0x9999b029U,
|
|
286
|
+
0x2d2d775aU, 0x0f0f111eU, 0xb0b0cb7bU, 0x5454fca8U, 0xbbbbd66dU,
|
|
287
|
+
0x16163a2cU, };
|
|
288
|
+
|
|
289
|
+
static const uint32_t Td0[256] = {
|
|
290
|
+
0x51f4a750U, 0x7e416553U, 0x1a17a4c3U, 0x3a275e96U, 0x3bab6bcbU,
|
|
291
|
+
0x1f9d45f1U, 0xacfa58abU, 0x4be30393U, 0x2030fa55U, 0xad766df6U,
|
|
292
|
+
0x88cc7691U, 0xf5024c25U, 0x4fe5d7fcU, 0xc52acbd7U, 0x26354480U,
|
|
293
|
+
0xb562a38fU, 0xdeb15a49U, 0x25ba1b67U, 0x45ea0e98U, 0x5dfec0e1U,
|
|
294
|
+
0xc32f7502U, 0x814cf012U, 0x8d4697a3U, 0x6bd3f9c6U, 0x038f5fe7U,
|
|
295
|
+
0x15929c95U, 0xbf6d7aebU, 0x955259daU, 0xd4be832dU, 0x587421d3U,
|
|
296
|
+
0x49e06929U, 0x8ec9c844U, 0x75c2896aU, 0xf48e7978U, 0x99583e6bU,
|
|
297
|
+
0x27b971ddU, 0xbee14fb6U, 0xf088ad17U, 0xc920ac66U, 0x7dce3ab4U,
|
|
298
|
+
0x63df4a18U, 0xe51a3182U, 0x97513360U, 0x62537f45U, 0xb16477e0U,
|
|
299
|
+
0xbb6bae84U, 0xfe81a01cU, 0xf9082b94U, 0x70486858U, 0x8f45fd19U,
|
|
300
|
+
0x94de6c87U, 0x527bf8b7U, 0xab73d323U, 0x724b02e2U, 0xe31f8f57U,
|
|
301
|
+
0x6655ab2aU, 0xb2eb2807U, 0x2fb5c203U, 0x86c57b9aU, 0xd33708a5U,
|
|
302
|
+
0x302887f2U, 0x23bfa5b2U, 0x02036abaU, 0xed16825cU, 0x8acf1c2bU,
|
|
303
|
+
0xa779b492U, 0xf307f2f0U, 0x4e69e2a1U, 0x65daf4cdU, 0x0605bed5U,
|
|
304
|
+
0xd134621fU, 0xc4a6fe8aU, 0x342e539dU, 0xa2f355a0U, 0x058ae132U,
|
|
305
|
+
0xa4f6eb75U, 0x0b83ec39U, 0x4060efaaU, 0x5e719f06U, 0xbd6e1051U,
|
|
306
|
+
0x3e218af9U, 0x96dd063dU, 0xdd3e05aeU, 0x4de6bd46U, 0x91548db5U,
|
|
307
|
+
0x71c45d05U, 0x0406d46fU, 0x605015ffU, 0x1998fb24U, 0xd6bde997U,
|
|
308
|
+
0x894043ccU, 0x67d99e77U, 0xb0e842bdU, 0x07898b88U, 0xe7195b38U,
|
|
309
|
+
0x79c8eedbU, 0xa17c0a47U, 0x7c420fe9U, 0xf8841ec9U, 0x00000000U,
|
|
310
|
+
0x09808683U, 0x322bed48U, 0x1e1170acU, 0x6c5a724eU, 0xfd0efffbU,
|
|
311
|
+
0x0f853856U, 0x3daed51eU, 0x362d3927U, 0x0a0fd964U, 0x685ca621U,
|
|
312
|
+
0x9b5b54d1U, 0x24362e3aU, 0x0c0a67b1U, 0x9357e70fU, 0xb4ee96d2U,
|
|
313
|
+
0x1b9b919eU, 0x80c0c54fU, 0x61dc20a2U, 0x5a774b69U, 0x1c121a16U,
|
|
314
|
+
0xe293ba0aU, 0xc0a02ae5U, 0x3c22e043U, 0x121b171dU, 0x0e090d0bU,
|
|
315
|
+
0xf28bc7adU, 0x2db6a8b9U, 0x141ea9c8U, 0x57f11985U, 0xaf75074cU,
|
|
316
|
+
0xee99ddbbU, 0xa37f60fdU, 0xf701269fU, 0x5c72f5bcU, 0x44663bc5U,
|
|
317
|
+
0x5bfb7e34U, 0x8b432976U, 0xcb23c6dcU, 0xb6edfc68U, 0xb8e4f163U,
|
|
318
|
+
0xd731dccaU, 0x42638510U, 0x13972240U, 0x84c61120U, 0x854a247dU,
|
|
319
|
+
0xd2bb3df8U, 0xaef93211U, 0xc729a16dU, 0x1d9e2f4bU, 0xdcb230f3U,
|
|
320
|
+
0x0d8652ecU, 0x77c1e3d0U, 0x2bb3166cU, 0xa970b999U, 0x119448faU,
|
|
321
|
+
0x47e96422U, 0xa8fc8cc4U, 0xa0f03f1aU, 0x567d2cd8U, 0x223390efU,
|
|
322
|
+
0x87494ec7U, 0xd938d1c1U, 0x8ccaa2feU, 0x98d40b36U, 0xa6f581cfU,
|
|
323
|
+
0xa57ade28U, 0xdab78e26U, 0x3fadbfa4U, 0x2c3a9de4U, 0x5078920dU,
|
|
324
|
+
0x6a5fcc9bU, 0x547e4662U, 0xf68d13c2U, 0x90d8b8e8U, 0x2e39f75eU,
|
|
325
|
+
0x82c3aff5U, 0x9f5d80beU, 0x69d0937cU, 0x6fd52da9U, 0xcf2512b3U,
|
|
326
|
+
0xc8ac993bU, 0x10187da7U, 0xe89c636eU, 0xdb3bbb7bU, 0xcd267809U,
|
|
327
|
+
0x6e5918f4U, 0xec9ab701U, 0x834f9aa8U, 0xe6956e65U, 0xaaffe67eU,
|
|
328
|
+
0x21bccf08U, 0xef15e8e6U, 0xbae79bd9U, 0x4a6f36ceU, 0xea9f09d4U,
|
|
329
|
+
0x29b07cd6U, 0x31a4b2afU, 0x2a3f2331U, 0xc6a59430U, 0x35a266c0U,
|
|
330
|
+
0x744ebc37U, 0xfc82caa6U, 0xe090d0b0U, 0x33a7d815U, 0xf104984aU,
|
|
331
|
+
0x41ecdaf7U, 0x7fcd500eU, 0x1791f62fU, 0x764dd68dU, 0x43efb04dU,
|
|
332
|
+
0xccaa4d54U, 0xe49604dfU, 0x9ed1b5e3U, 0x4c6a881bU, 0xc12c1fb8U,
|
|
333
|
+
0x4665517fU, 0x9d5eea04U, 0x018c355dU, 0xfa877473U, 0xfb0b412eU,
|
|
334
|
+
0xb3671d5aU, 0x92dbd252U, 0xe9105633U, 0x6dd64713U, 0x9ad7618cU,
|
|
335
|
+
0x37a10c7aU, 0x59f8148eU, 0xeb133c89U, 0xcea927eeU, 0xb761c935U,
|
|
336
|
+
0xe11ce5edU, 0x7a47b13cU, 0x9cd2df59U, 0x55f2733fU, 0x1814ce79U,
|
|
337
|
+
0x73c737bfU, 0x53f7cdeaU, 0x5ffdaa5bU, 0xdf3d6f14U, 0x7844db86U,
|
|
338
|
+
0xcaaff381U, 0xb968c43eU, 0x3824342cU, 0xc2a3405fU, 0x161dc372U,
|
|
339
|
+
0xbce2250cU, 0x283c498bU, 0xff0d9541U, 0x39a80171U, 0x080cb3deU,
|
|
340
|
+
0xd8b4e49cU, 0x6456c190U, 0x7bcb8461U, 0xd532b670U, 0x486c5c74U,
|
|
341
|
+
0xd0b85742U, };
|
|
342
|
+
|
|
343
|
+
static const uint32_t Td1[256] = {
|
|
344
|
+
0x5051f4a7U, 0x537e4165U, 0xc31a17a4U, 0x963a275eU, 0xcb3bab6bU,
|
|
345
|
+
0xf11f9d45U, 0xabacfa58U, 0x934be303U, 0x552030faU, 0xf6ad766dU,
|
|
346
|
+
0x9188cc76U, 0x25f5024cU, 0xfc4fe5d7U, 0xd7c52acbU, 0x80263544U,
|
|
347
|
+
0x8fb562a3U, 0x49deb15aU, 0x6725ba1bU, 0x9845ea0eU, 0xe15dfec0U,
|
|
348
|
+
0x02c32f75U, 0x12814cf0U, 0xa38d4697U, 0xc66bd3f9U, 0xe7038f5fU,
|
|
349
|
+
0x9515929cU, 0xebbf6d7aU, 0xda955259U, 0x2dd4be83U, 0xd3587421U,
|
|
350
|
+
0x2949e069U, 0x448ec9c8U, 0x6a75c289U, 0x78f48e79U, 0x6b99583eU,
|
|
351
|
+
0xdd27b971U, 0xb6bee14fU, 0x17f088adU, 0x66c920acU, 0xb47dce3aU,
|
|
352
|
+
0x1863df4aU, 0x82e51a31U, 0x60975133U, 0x4562537fU, 0xe0b16477U,
|
|
353
|
+
0x84bb6baeU, 0x1cfe81a0U, 0x94f9082bU, 0x58704868U, 0x198f45fdU,
|
|
354
|
+
0x8794de6cU, 0xb7527bf8U, 0x23ab73d3U, 0xe2724b02U, 0x57e31f8fU,
|
|
355
|
+
0x2a6655abU, 0x07b2eb28U, 0x032fb5c2U, 0x9a86c57bU, 0xa5d33708U,
|
|
356
|
+
0xf2302887U, 0xb223bfa5U, 0xba02036aU, 0x5ced1682U, 0x2b8acf1cU,
|
|
357
|
+
0x92a779b4U, 0xf0f307f2U, 0xa14e69e2U, 0xcd65daf4U, 0xd50605beU,
|
|
358
|
+
0x1fd13462U, 0x8ac4a6feU, 0x9d342e53U, 0xa0a2f355U, 0x32058ae1U,
|
|
359
|
+
0x75a4f6ebU, 0x390b83ecU, 0xaa4060efU, 0x065e719fU, 0x51bd6e10U,
|
|
360
|
+
0xf93e218aU, 0x3d96dd06U, 0xaedd3e05U, 0x464de6bdU, 0xb591548dU,
|
|
361
|
+
0x0571c45dU, 0x6f0406d4U, 0xff605015U, 0x241998fbU, 0x97d6bde9U,
|
|
362
|
+
0xcc894043U, 0x7767d99eU, 0xbdb0e842U, 0x8807898bU, 0x38e7195bU,
|
|
363
|
+
0xdb79c8eeU, 0x47a17c0aU, 0xe97c420fU, 0xc9f8841eU, 0x00000000U,
|
|
364
|
+
0x83098086U, 0x48322bedU, 0xac1e1170U, 0x4e6c5a72U, 0xfbfd0effU,
|
|
365
|
+
0x560f8538U, 0x1e3daed5U, 0x27362d39U, 0x640a0fd9U, 0x21685ca6U,
|
|
366
|
+
0xd19b5b54U, 0x3a24362eU, 0xb10c0a67U, 0x0f9357e7U, 0xd2b4ee96U,
|
|
367
|
+
0x9e1b9b91U, 0x4f80c0c5U, 0xa261dc20U, 0x695a774bU, 0x161c121aU,
|
|
368
|
+
0x0ae293baU, 0xe5c0a02aU, 0x433c22e0U, 0x1d121b17U, 0x0b0e090dU,
|
|
369
|
+
0xadf28bc7U, 0xb92db6a8U, 0xc8141ea9U, 0x8557f119U, 0x4caf7507U,
|
|
370
|
+
0xbbee99ddU, 0xfda37f60U, 0x9ff70126U, 0xbc5c72f5U, 0xc544663bU,
|
|
371
|
+
0x345bfb7eU, 0x768b4329U, 0xdccb23c6U, 0x68b6edfcU, 0x63b8e4f1U,
|
|
372
|
+
0xcad731dcU, 0x10426385U, 0x40139722U, 0x2084c611U, 0x7d854a24U,
|
|
373
|
+
0xf8d2bb3dU, 0x11aef932U, 0x6dc729a1U, 0x4b1d9e2fU, 0xf3dcb230U,
|
|
374
|
+
0xec0d8652U, 0xd077c1e3U, 0x6c2bb316U, 0x99a970b9U, 0xfa119448U,
|
|
375
|
+
0x2247e964U, 0xc4a8fc8cU, 0x1aa0f03fU, 0xd8567d2cU, 0xef223390U,
|
|
376
|
+
0xc787494eU, 0xc1d938d1U, 0xfe8ccaa2U, 0x3698d40bU, 0xcfa6f581U,
|
|
377
|
+
0x28a57adeU, 0x26dab78eU, 0xa43fadbfU, 0xe42c3a9dU, 0x0d507892U,
|
|
378
|
+
0x9b6a5fccU, 0x62547e46U, 0xc2f68d13U, 0xe890d8b8U, 0x5e2e39f7U,
|
|
379
|
+
0xf582c3afU, 0xbe9f5d80U, 0x7c69d093U, 0xa96fd52dU, 0xb3cf2512U,
|
|
380
|
+
0x3bc8ac99U, 0xa710187dU, 0x6ee89c63U, 0x7bdb3bbbU, 0x09cd2678U,
|
|
381
|
+
0xf46e5918U, 0x01ec9ab7U, 0xa8834f9aU, 0x65e6956eU, 0x7eaaffe6U,
|
|
382
|
+
0x0821bccfU, 0xe6ef15e8U, 0xd9bae79bU, 0xce4a6f36U, 0xd4ea9f09U,
|
|
383
|
+
0xd629b07cU, 0xaf31a4b2U, 0x312a3f23U, 0x30c6a594U, 0xc035a266U,
|
|
384
|
+
0x37744ebcU, 0xa6fc82caU, 0xb0e090d0U, 0x1533a7d8U, 0x4af10498U,
|
|
385
|
+
0xf741ecdaU, 0x0e7fcd50U, 0x2f1791f6U, 0x8d764dd6U, 0x4d43efb0U,
|
|
386
|
+
0x54ccaa4dU, 0xdfe49604U, 0xe39ed1b5U, 0x1b4c6a88U, 0xb8c12c1fU,
|
|
387
|
+
0x7f466551U, 0x049d5eeaU, 0x5d018c35U, 0x73fa8774U, 0x2efb0b41U,
|
|
388
|
+
0x5ab3671dU, 0x5292dbd2U, 0x33e91056U, 0x136dd647U, 0x8c9ad761U,
|
|
389
|
+
0x7a37a10cU, 0x8e59f814U, 0x89eb133cU, 0xeecea927U, 0x35b761c9U,
|
|
390
|
+
0xede11ce5U, 0x3c7a47b1U, 0x599cd2dfU, 0x3f55f273U, 0x791814ceU,
|
|
391
|
+
0xbf73c737U, 0xea53f7cdU, 0x5b5ffdaaU, 0x14df3d6fU, 0x867844dbU,
|
|
392
|
+
0x81caaff3U, 0x3eb968c4U, 0x2c382434U, 0x5fc2a340U, 0x72161dc3U,
|
|
393
|
+
0x0cbce225U, 0x8b283c49U, 0x41ff0d95U, 0x7139a801U, 0xde080cb3U,
|
|
394
|
+
0x9cd8b4e4U, 0x906456c1U, 0x617bcb84U, 0x70d532b6U, 0x74486c5cU,
|
|
395
|
+
0x42d0b857U, };
|
|
396
|
+
|
|
397
|
+
static const uint32_t Td2[256] = {
|
|
398
|
+
0xa75051f4U, 0x65537e41U, 0xa4c31a17U, 0x5e963a27U, 0x6bcb3babU,
|
|
399
|
+
0x45f11f9dU, 0x58abacfaU, 0x03934be3U, 0xfa552030U, 0x6df6ad76U,
|
|
400
|
+
0x769188ccU, 0x4c25f502U, 0xd7fc4fe5U, 0xcbd7c52aU, 0x44802635U,
|
|
401
|
+
0xa38fb562U, 0x5a49deb1U, 0x1b6725baU, 0x0e9845eaU, 0xc0e15dfeU,
|
|
402
|
+
0x7502c32fU, 0xf012814cU, 0x97a38d46U, 0xf9c66bd3U, 0x5fe7038fU,
|
|
403
|
+
0x9c951592U, 0x7aebbf6dU, 0x59da9552U, 0x832dd4beU, 0x21d35874U,
|
|
404
|
+
0x692949e0U, 0xc8448ec9U, 0x896a75c2U, 0x7978f48eU, 0x3e6b9958U,
|
|
405
|
+
0x71dd27b9U, 0x4fb6bee1U, 0xad17f088U, 0xac66c920U, 0x3ab47dceU,
|
|
406
|
+
0x4a1863dfU, 0x3182e51aU, 0x33609751U, 0x7f456253U, 0x77e0b164U,
|
|
407
|
+
0xae84bb6bU, 0xa01cfe81U, 0x2b94f908U, 0x68587048U, 0xfd198f45U,
|
|
408
|
+
0x6c8794deU, 0xf8b7527bU, 0xd323ab73U, 0x02e2724bU, 0x8f57e31fU,
|
|
409
|
+
0xab2a6655U, 0x2807b2ebU, 0xc2032fb5U, 0x7b9a86c5U, 0x08a5d337U,
|
|
410
|
+
0x87f23028U, 0xa5b223bfU, 0x6aba0203U, 0x825ced16U, 0x1c2b8acfU,
|
|
411
|
+
0xb492a779U, 0xf2f0f307U, 0xe2a14e69U, 0xf4cd65daU, 0xbed50605U,
|
|
412
|
+
0x621fd134U, 0xfe8ac4a6U, 0x539d342eU, 0x55a0a2f3U, 0xe132058aU,
|
|
413
|
+
0xeb75a4f6U, 0xec390b83U, 0xefaa4060U, 0x9f065e71U, 0x1051bd6eU,
|
|
414
|
+
0x8af93e21U, 0x063d96ddU, 0x05aedd3eU, 0xbd464de6U, 0x8db59154U,
|
|
415
|
+
0x5d0571c4U, 0xd46f0406U, 0x15ff6050U, 0xfb241998U, 0xe997d6bdU,
|
|
416
|
+
0x43cc8940U, 0x9e7767d9U, 0x42bdb0e8U, 0x8b880789U, 0x5b38e719U,
|
|
417
|
+
0xeedb79c8U, 0x0a47a17cU, 0x0fe97c42U, 0x1ec9f884U, 0x00000000U,
|
|
418
|
+
0x86830980U, 0xed48322bU, 0x70ac1e11U, 0x724e6c5aU, 0xfffbfd0eU,
|
|
419
|
+
0x38560f85U, 0xd51e3daeU, 0x3927362dU, 0xd9640a0fU, 0xa621685cU,
|
|
420
|
+
0x54d19b5bU, 0x2e3a2436U, 0x67b10c0aU, 0xe70f9357U, 0x96d2b4eeU,
|
|
421
|
+
0x919e1b9bU, 0xc54f80c0U, 0x20a261dcU, 0x4b695a77U, 0x1a161c12U,
|
|
422
|
+
0xba0ae293U, 0x2ae5c0a0U, 0xe0433c22U, 0x171d121bU, 0x0d0b0e09U,
|
|
423
|
+
0xc7adf28bU, 0xa8b92db6U, 0xa9c8141eU, 0x198557f1U, 0x074caf75U,
|
|
424
|
+
0xddbbee99U, 0x60fda37fU, 0x269ff701U, 0xf5bc5c72U, 0x3bc54466U,
|
|
425
|
+
0x7e345bfbU, 0x29768b43U, 0xc6dccb23U, 0xfc68b6edU, 0xf163b8e4U,
|
|
426
|
+
0xdccad731U, 0x85104263U, 0x22401397U, 0x112084c6U, 0x247d854aU,
|
|
427
|
+
0x3df8d2bbU, 0x3211aef9U, 0xa16dc729U, 0x2f4b1d9eU, 0x30f3dcb2U,
|
|
428
|
+
0x52ec0d86U, 0xe3d077c1U, 0x166c2bb3U, 0xb999a970U, 0x48fa1194U,
|
|
429
|
+
0x642247e9U, 0x8cc4a8fcU, 0x3f1aa0f0U, 0x2cd8567dU, 0x90ef2233U,
|
|
430
|
+
0x4ec78749U, 0xd1c1d938U, 0xa2fe8ccaU, 0x0b3698d4U, 0x81cfa6f5U,
|
|
431
|
+
0xde28a57aU, 0x8e26dab7U, 0xbfa43fadU, 0x9de42c3aU, 0x920d5078U,
|
|
432
|
+
0xcc9b6a5fU, 0x4662547eU, 0x13c2f68dU, 0xb8e890d8U, 0xf75e2e39U,
|
|
433
|
+
0xaff582c3U, 0x80be9f5dU, 0x937c69d0U, 0x2da96fd5U, 0x12b3cf25U,
|
|
434
|
+
0x993bc8acU, 0x7da71018U, 0x636ee89cU, 0xbb7bdb3bU, 0x7809cd26U,
|
|
435
|
+
0x18f46e59U, 0xb701ec9aU, 0x9aa8834fU, 0x6e65e695U, 0xe67eaaffU,
|
|
436
|
+
0xcf0821bcU, 0xe8e6ef15U, 0x9bd9bae7U, 0x36ce4a6fU, 0x09d4ea9fU,
|
|
437
|
+
0x7cd629b0U, 0xb2af31a4U, 0x23312a3fU, 0x9430c6a5U, 0x66c035a2U,
|
|
438
|
+
0xbc37744eU, 0xcaa6fc82U, 0xd0b0e090U, 0xd81533a7U, 0x984af104U,
|
|
439
|
+
0xdaf741ecU, 0x500e7fcdU, 0xf62f1791U, 0xd68d764dU, 0xb04d43efU,
|
|
440
|
+
0x4d54ccaaU, 0x04dfe496U, 0xb5e39ed1U, 0x881b4c6aU, 0x1fb8c12cU,
|
|
441
|
+
0x517f4665U, 0xea049d5eU, 0x355d018cU, 0x7473fa87U, 0x412efb0bU,
|
|
442
|
+
0x1d5ab367U, 0xd25292dbU, 0x5633e910U, 0x47136dd6U, 0x618c9ad7U,
|
|
443
|
+
0x0c7a37a1U, 0x148e59f8U, 0x3c89eb13U, 0x27eecea9U, 0xc935b761U,
|
|
444
|
+
0xe5ede11cU, 0xb13c7a47U, 0xdf599cd2U, 0x733f55f2U, 0xce791814U,
|
|
445
|
+
0x37bf73c7U, 0xcdea53f7U, 0xaa5b5ffdU, 0x6f14df3dU, 0xdb867844U,
|
|
446
|
+
0xf381caafU, 0xc43eb968U, 0x342c3824U, 0x405fc2a3U, 0xc372161dU,
|
|
447
|
+
0x250cbce2U, 0x498b283cU, 0x9541ff0dU, 0x017139a8U, 0xb3de080cU,
|
|
448
|
+
0xe49cd8b4U, 0xc1906456U, 0x84617bcbU, 0xb670d532U, 0x5c74486cU,
|
|
449
|
+
0x5742d0b8U, };
|
|
450
|
+
|
|
451
|
+
static const uint32_t Td3[256] = {
|
|
452
|
+
0xf4a75051U, 0x4165537eU, 0x17a4c31aU, 0x275e963aU, 0xab6bcb3bU,
|
|
453
|
+
0x9d45f11fU, 0xfa58abacU, 0xe303934bU, 0x30fa5520U, 0x766df6adU,
|
|
454
|
+
0xcc769188U, 0x024c25f5U, 0xe5d7fc4fU, 0x2acbd7c5U, 0x35448026U,
|
|
455
|
+
0x62a38fb5U, 0xb15a49deU, 0xba1b6725U, 0xea0e9845U, 0xfec0e15dU,
|
|
456
|
+
0x2f7502c3U, 0x4cf01281U, 0x4697a38dU, 0xd3f9c66bU, 0x8f5fe703U,
|
|
457
|
+
0x929c9515U, 0x6d7aebbfU, 0x5259da95U, 0xbe832dd4U, 0x7421d358U,
|
|
458
|
+
0xe0692949U, 0xc9c8448eU, 0xc2896a75U, 0x8e7978f4U, 0x583e6b99U,
|
|
459
|
+
0xb971dd27U, 0xe14fb6beU, 0x88ad17f0U, 0x20ac66c9U, 0xce3ab47dU,
|
|
460
|
+
0xdf4a1863U, 0x1a3182e5U, 0x51336097U, 0x537f4562U, 0x6477e0b1U,
|
|
461
|
+
0x6bae84bbU, 0x81a01cfeU, 0x082b94f9U, 0x48685870U, 0x45fd198fU,
|
|
462
|
+
0xde6c8794U, 0x7bf8b752U, 0x73d323abU, 0x4b02e272U, 0x1f8f57e3U,
|
|
463
|
+
0x55ab2a66U, 0xeb2807b2U, 0xb5c2032fU, 0xc57b9a86U, 0x3708a5d3U,
|
|
464
|
+
0x2887f230U, 0xbfa5b223U, 0x036aba02U, 0x16825cedU, 0xcf1c2b8aU,
|
|
465
|
+
0x79b492a7U, 0x07f2f0f3U, 0x69e2a14eU, 0xdaf4cd65U, 0x05bed506U,
|
|
466
|
+
0x34621fd1U, 0xa6fe8ac4U, 0x2e539d34U, 0xf355a0a2U, 0x8ae13205U,
|
|
467
|
+
0xf6eb75a4U, 0x83ec390bU, 0x60efaa40U, 0x719f065eU, 0x6e1051bdU,
|
|
468
|
+
0x218af93eU, 0xdd063d96U, 0x3e05aeddU, 0xe6bd464dU, 0x548db591U,
|
|
469
|
+
0xc45d0571U, 0x06d46f04U, 0x5015ff60U, 0x98fb2419U, 0xbde997d6U,
|
|
470
|
+
0x4043cc89U, 0xd99e7767U, 0xe842bdb0U, 0x898b8807U, 0x195b38e7U,
|
|
471
|
+
0xc8eedb79U, 0x7c0a47a1U, 0x420fe97cU, 0x841ec9f8U, 0x00000000U,
|
|
472
|
+
0x80868309U, 0x2bed4832U, 0x1170ac1eU, 0x5a724e6cU, 0x0efffbfdU,
|
|
473
|
+
0x8538560fU, 0xaed51e3dU, 0x2d392736U, 0x0fd9640aU, 0x5ca62168U,
|
|
474
|
+
0x5b54d19bU, 0x362e3a24U, 0x0a67b10cU, 0x57e70f93U, 0xee96d2b4U,
|
|
475
|
+
0x9b919e1bU, 0xc0c54f80U, 0xdc20a261U, 0x774b695aU, 0x121a161cU,
|
|
476
|
+
0x93ba0ae2U, 0xa02ae5c0U, 0x22e0433cU, 0x1b171d12U, 0x090d0b0eU,
|
|
477
|
+
0x8bc7adf2U, 0xb6a8b92dU, 0x1ea9c814U, 0xf1198557U, 0x75074cafU,
|
|
478
|
+
0x99ddbbeeU, 0x7f60fda3U, 0x01269ff7U, 0x72f5bc5cU, 0x663bc544U,
|
|
479
|
+
0xfb7e345bU, 0x4329768bU, 0x23c6dccbU, 0xedfc68b6U, 0xe4f163b8U,
|
|
480
|
+
0x31dccad7U, 0x63851042U, 0x97224013U, 0xc6112084U, 0x4a247d85U,
|
|
481
|
+
0xbb3df8d2U, 0xf93211aeU, 0x29a16dc7U, 0x9e2f4b1dU, 0xb230f3dcU,
|
|
482
|
+
0x8652ec0dU, 0xc1e3d077U, 0xb3166c2bU, 0x70b999a9U, 0x9448fa11U,
|
|
483
|
+
0xe9642247U, 0xfc8cc4a8U, 0xf03f1aa0U, 0x7d2cd856U, 0x3390ef22U,
|
|
484
|
+
0x494ec787U, 0x38d1c1d9U, 0xcaa2fe8cU, 0xd40b3698U, 0xf581cfa6U,
|
|
485
|
+
0x7ade28a5U, 0xb78e26daU, 0xadbfa43fU, 0x3a9de42cU, 0x78920d50U,
|
|
486
|
+
0x5fcc9b6aU, 0x7e466254U, 0x8d13c2f6U, 0xd8b8e890U, 0x39f75e2eU,
|
|
487
|
+
0xc3aff582U, 0x5d80be9fU, 0xd0937c69U, 0xd52da96fU, 0x2512b3cfU,
|
|
488
|
+
0xac993bc8U, 0x187da710U, 0x9c636ee8U, 0x3bbb7bdbU, 0x267809cdU,
|
|
489
|
+
0x5918f46eU, 0x9ab701ecU, 0x4f9aa883U, 0x956e65e6U, 0xffe67eaaU,
|
|
490
|
+
0xbccf0821U, 0x15e8e6efU, 0xe79bd9baU, 0x6f36ce4aU, 0x9f09d4eaU,
|
|
491
|
+
0xb07cd629U, 0xa4b2af31U, 0x3f23312aU, 0xa59430c6U, 0xa266c035U,
|
|
492
|
+
0x4ebc3774U, 0x82caa6fcU, 0x90d0b0e0U, 0xa7d81533U, 0x04984af1U,
|
|
493
|
+
0xecdaf741U, 0xcd500e7fU, 0x91f62f17U, 0x4dd68d76U, 0xefb04d43U,
|
|
494
|
+
0xaa4d54ccU, 0x9604dfe4U, 0xd1b5e39eU, 0x6a881b4cU, 0x2c1fb8c1U,
|
|
495
|
+
0x65517f46U, 0x5eea049dU, 0x8c355d01U, 0x877473faU, 0x0b412efbU,
|
|
496
|
+
0x671d5ab3U, 0xdbd25292U, 0x105633e9U, 0xd647136dU, 0xd7618c9aU,
|
|
497
|
+
0xa10c7a37U, 0xf8148e59U, 0x133c89ebU, 0xa927eeceU, 0x61c935b7U,
|
|
498
|
+
0x1ce5ede1U, 0x47b13c7aU, 0xd2df599cU, 0xf2733f55U, 0x14ce7918U,
|
|
499
|
+
0xc737bf73U, 0xf7cdea53U, 0xfdaa5b5fU, 0x3d6f14dfU, 0x44db8678U,
|
|
500
|
+
0xaff381caU, 0x68c43eb9U, 0x24342c38U, 0xa3405fc2U, 0x1dc37216U,
|
|
501
|
+
0xe2250cbcU, 0x3c498b28U, 0x0d9541ffU, 0xa8017139U, 0x0cb3de08U,
|
|
502
|
+
0xb4e49cd8U, 0x56c19064U, 0xcb84617bU, 0x32b670d5U, 0x6c5c7448U,
|
|
503
|
+
0xb85742d0U, };
|
|
504
|
+
|
|
505
|
+
static const uint8_t Td4[256] = {
|
|
506
|
+
0x52U, 0x09U, 0x6aU, 0xd5U, 0x30U, 0x36U, 0xa5U, 0x38U, 0xbfU, 0x40U, 0xa3U,
|
|
507
|
+
0x9eU, 0x81U, 0xf3U, 0xd7U, 0xfbU, 0x7cU, 0xe3U, 0x39U, 0x82U, 0x9bU, 0x2fU,
|
|
508
|
+
0xffU, 0x87U, 0x34U, 0x8eU, 0x43U, 0x44U, 0xc4U, 0xdeU, 0xe9U, 0xcbU, 0x54U,
|
|
509
|
+
0x7bU, 0x94U, 0x32U, 0xa6U, 0xc2U, 0x23U, 0x3dU, 0xeeU, 0x4cU, 0x95U, 0x0bU,
|
|
510
|
+
0x42U, 0xfaU, 0xc3U, 0x4eU, 0x08U, 0x2eU, 0xa1U, 0x66U, 0x28U, 0xd9U, 0x24U,
|
|
511
|
+
0xb2U, 0x76U, 0x5bU, 0xa2U, 0x49U, 0x6dU, 0x8bU, 0xd1U, 0x25U, 0x72U, 0xf8U,
|
|
512
|
+
0xf6U, 0x64U, 0x86U, 0x68U, 0x98U, 0x16U, 0xd4U, 0xa4U, 0x5cU, 0xccU, 0x5dU,
|
|
513
|
+
0x65U, 0xb6U, 0x92U, 0x6cU, 0x70U, 0x48U, 0x50U, 0xfdU, 0xedU, 0xb9U, 0xdaU,
|
|
514
|
+
0x5eU, 0x15U, 0x46U, 0x57U, 0xa7U, 0x8dU, 0x9dU, 0x84U, 0x90U, 0xd8U, 0xabU,
|
|
515
|
+
0x00U, 0x8cU, 0xbcU, 0xd3U, 0x0aU, 0xf7U, 0xe4U, 0x58U, 0x05U, 0xb8U, 0xb3U,
|
|
516
|
+
0x45U, 0x06U, 0xd0U, 0x2cU, 0x1eU, 0x8fU, 0xcaU, 0x3fU, 0x0fU, 0x02U, 0xc1U,
|
|
517
|
+
0xafU, 0xbdU, 0x03U, 0x01U, 0x13U, 0x8aU, 0x6bU, 0x3aU, 0x91U, 0x11U, 0x41U,
|
|
518
|
+
0x4fU, 0x67U, 0xdcU, 0xeaU, 0x97U, 0xf2U, 0xcfU, 0xceU, 0xf0U, 0xb4U, 0xe6U,
|
|
519
|
+
0x73U, 0x96U, 0xacU, 0x74U, 0x22U, 0xe7U, 0xadU, 0x35U, 0x85U, 0xe2U, 0xf9U,
|
|
520
|
+
0x37U, 0xe8U, 0x1cU, 0x75U, 0xdfU, 0x6eU, 0x47U, 0xf1U, 0x1aU, 0x71U, 0x1dU,
|
|
521
|
+
0x29U, 0xc5U, 0x89U, 0x6fU, 0xb7U, 0x62U, 0x0eU, 0xaaU, 0x18U, 0xbeU, 0x1bU,
|
|
522
|
+
0xfcU, 0x56U, 0x3eU, 0x4bU, 0xc6U, 0xd2U, 0x79U, 0x20U, 0x9aU, 0xdbU, 0xc0U,
|
|
523
|
+
0xfeU, 0x78U, 0xcdU, 0x5aU, 0xf4U, 0x1fU, 0xddU, 0xa8U, 0x33U, 0x88U, 0x07U,
|
|
524
|
+
0xc7U, 0x31U, 0xb1U, 0x12U, 0x10U, 0x59U, 0x27U, 0x80U, 0xecU, 0x5fU, 0x60U,
|
|
525
|
+
0x51U, 0x7fU, 0xa9U, 0x19U, 0xb5U, 0x4aU, 0x0dU, 0x2dU, 0xe5U, 0x7aU, 0x9fU,
|
|
526
|
+
0x93U, 0xc9U, 0x9cU, 0xefU, 0xa0U, 0xe0U, 0x3bU, 0x4dU, 0xaeU, 0x2aU, 0xf5U,
|
|
527
|
+
0xb0U, 0xc8U, 0xebU, 0xbbU, 0x3cU, 0x83U, 0x53U, 0x99U, 0x61U, 0x17U, 0x2bU,
|
|
528
|
+
0x04U, 0x7eU, 0xbaU, 0x77U, 0xd6U, 0x26U, 0xe1U, 0x69U, 0x14U, 0x63U, 0x55U,
|
|
529
|
+
0x21U, 0x0cU, 0x7dU, };
|
|
530
|
+
|
|
531
|
+
static const uint32_t rcon[] = {
|
|
532
|
+
0x01000000, 0x02000000, 0x04000000, 0x08000000, 0x10000000,
|
|
533
|
+
0x20000000, 0x40000000, 0x80000000, 0x1B000000, 0x36000000,
|
|
534
|
+
/* for 128-bit blocks, Rijndael never uses more than 10 rcon values */
|
|
535
|
+
};
|
|
536
|
+
|
|
537
|
+
int AES_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
|
|
538
|
+
uint32_t *rk;
|
|
539
|
+
int i = 0;
|
|
540
|
+
uint32_t temp;
|
|
541
|
+
|
|
542
|
+
if (!key || !aeskey) {
|
|
543
|
+
return -1;
|
|
544
|
+
}
|
|
545
|
+
|
|
546
|
+
switch (bits) {
|
|
547
|
+
case 128:
|
|
548
|
+
aeskey->rounds = 10;
|
|
549
|
+
break;
|
|
550
|
+
case 192:
|
|
551
|
+
aeskey->rounds = 12;
|
|
552
|
+
break;
|
|
553
|
+
case 256:
|
|
554
|
+
aeskey->rounds = 14;
|
|
555
|
+
break;
|
|
556
|
+
default:
|
|
557
|
+
return -2;
|
|
558
|
+
}
|
|
559
|
+
|
|
560
|
+
rk = aeskey->rd_key;
|
|
561
|
+
|
|
562
|
+
rk[0] = GETU32(key);
|
|
563
|
+
rk[1] = GETU32(key + 4);
|
|
564
|
+
rk[2] = GETU32(key + 8);
|
|
565
|
+
rk[3] = GETU32(key + 12);
|
|
566
|
+
if (bits == 128) {
|
|
567
|
+
while (1) {
|
|
568
|
+
temp = rk[3];
|
|
569
|
+
rk[4] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
|
|
570
|
+
(Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
|
|
571
|
+
(Te0[(temp) & 0xff] & 0x0000ff00) ^
|
|
572
|
+
(Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
|
|
573
|
+
rk[5] = rk[1] ^ rk[4];
|
|
574
|
+
rk[6] = rk[2] ^ rk[5];
|
|
575
|
+
rk[7] = rk[3] ^ rk[6];
|
|
576
|
+
if (++i == 10) {
|
|
577
|
+
return 0;
|
|
578
|
+
}
|
|
579
|
+
rk += 4;
|
|
580
|
+
}
|
|
581
|
+
}
|
|
582
|
+
rk[4] = GETU32(key + 16);
|
|
583
|
+
rk[5] = GETU32(key + 20);
|
|
584
|
+
if (bits == 192) {
|
|
585
|
+
while (1) {
|
|
586
|
+
temp = rk[5];
|
|
587
|
+
rk[6] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
|
|
588
|
+
(Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
|
|
589
|
+
(Te0[(temp) & 0xff] & 0x0000ff00) ^
|
|
590
|
+
(Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
|
|
591
|
+
rk[7] = rk[1] ^ rk[6];
|
|
592
|
+
rk[8] = rk[2] ^ rk[7];
|
|
593
|
+
rk[9] = rk[3] ^ rk[8];
|
|
594
|
+
if (++i == 8) {
|
|
595
|
+
return 0;
|
|
596
|
+
}
|
|
597
|
+
rk[10] = rk[4] ^ rk[9];
|
|
598
|
+
rk[11] = rk[5] ^ rk[10];
|
|
599
|
+
rk += 6;
|
|
600
|
+
}
|
|
601
|
+
}
|
|
602
|
+
rk[6] = GETU32(key + 24);
|
|
603
|
+
rk[7] = GETU32(key + 28);
|
|
604
|
+
if (bits == 256) {
|
|
605
|
+
while (1) {
|
|
606
|
+
temp = rk[7];
|
|
607
|
+
rk[8] = rk[0] ^ (Te2[(temp >> 16) & 0xff] & 0xff000000) ^
|
|
608
|
+
(Te3[(temp >> 8) & 0xff] & 0x00ff0000) ^
|
|
609
|
+
(Te0[(temp) & 0xff] & 0x0000ff00) ^
|
|
610
|
+
(Te1[(temp >> 24)] & 0x000000ff) ^ rcon[i];
|
|
611
|
+
rk[9] = rk[1] ^ rk[8];
|
|
612
|
+
rk[10] = rk[2] ^ rk[9];
|
|
613
|
+
rk[11] = rk[3] ^ rk[10];
|
|
614
|
+
if (++i == 7) {
|
|
615
|
+
return 0;
|
|
616
|
+
}
|
|
617
|
+
temp = rk[11];
|
|
618
|
+
rk[12] = rk[4] ^ (Te2[(temp >> 24)] & 0xff000000) ^
|
|
619
|
+
(Te3[(temp >> 16) & 0xff] & 0x00ff0000) ^
|
|
620
|
+
(Te0[(temp >> 8) & 0xff] & 0x0000ff00) ^
|
|
621
|
+
(Te1[(temp) & 0xff] & 0x000000ff);
|
|
622
|
+
rk[13] = rk[5] ^ rk[12];
|
|
623
|
+
rk[14] = rk[6] ^ rk[13];
|
|
624
|
+
rk[15] = rk[7] ^ rk[14];
|
|
625
|
+
|
|
626
|
+
rk += 8;
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
return 0;
|
|
630
|
+
}
|
|
631
|
+
|
|
632
|
+
int AES_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
|
|
633
|
+
uint32_t *rk;
|
|
634
|
+
int i, j, status;
|
|
635
|
+
uint32_t temp;
|
|
636
|
+
|
|
637
|
+
/* first, start with an encryption schedule */
|
|
638
|
+
status = AES_set_encrypt_key(key, bits, aeskey);
|
|
639
|
+
if (status < 0) {
|
|
640
|
+
return status;
|
|
641
|
+
}
|
|
642
|
+
|
|
643
|
+
rk = aeskey->rd_key;
|
|
644
|
+
|
|
645
|
+
/* invert the order of the round keys: */
|
|
646
|
+
for (i = 0, j = 4 * aeskey->rounds; i < j; i += 4, j -= 4) {
|
|
647
|
+
temp = rk[i];
|
|
648
|
+
rk[i] = rk[j];
|
|
649
|
+
rk[j] = temp;
|
|
650
|
+
temp = rk[i + 1];
|
|
651
|
+
rk[i + 1] = rk[j + 1];
|
|
652
|
+
rk[j + 1] = temp;
|
|
653
|
+
temp = rk[i + 2];
|
|
654
|
+
rk[i + 2] = rk[j + 2];
|
|
655
|
+
rk[j + 2] = temp;
|
|
656
|
+
temp = rk[i + 3];
|
|
657
|
+
rk[i + 3] = rk[j + 3];
|
|
658
|
+
rk[j + 3] = temp;
|
|
659
|
+
}
|
|
660
|
+
/* apply the inverse MixColumn transform to all round keys but the first and
|
|
661
|
+
* the last: */
|
|
662
|
+
for (i = 1; i < (int)aeskey->rounds; i++) {
|
|
663
|
+
rk += 4;
|
|
664
|
+
rk[0] =
|
|
665
|
+
Td0[Te1[(rk[0] >> 24)] & 0xff] ^ Td1[Te1[(rk[0] >> 16) & 0xff] & 0xff] ^
|
|
666
|
+
Td2[Te1[(rk[0] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[0]) & 0xff] & 0xff];
|
|
667
|
+
rk[1] =
|
|
668
|
+
Td0[Te1[(rk[1] >> 24)] & 0xff] ^ Td1[Te1[(rk[1] >> 16) & 0xff] & 0xff] ^
|
|
669
|
+
Td2[Te1[(rk[1] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[1]) & 0xff] & 0xff];
|
|
670
|
+
rk[2] =
|
|
671
|
+
Td0[Te1[(rk[2] >> 24)] & 0xff] ^ Td1[Te1[(rk[2] >> 16) & 0xff] & 0xff] ^
|
|
672
|
+
Td2[Te1[(rk[2] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[2]) & 0xff] & 0xff];
|
|
673
|
+
rk[3] =
|
|
674
|
+
Td0[Te1[(rk[3] >> 24)] & 0xff] ^ Td1[Te1[(rk[3] >> 16) & 0xff] & 0xff] ^
|
|
675
|
+
Td2[Te1[(rk[3] >> 8) & 0xff] & 0xff] ^ Td3[Te1[(rk[3]) & 0xff] & 0xff];
|
|
676
|
+
}
|
|
677
|
+
return 0;
|
|
678
|
+
}
|
|
679
|
+
|
|
680
|
+
void AES_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
|
|
681
|
+
const uint32_t *rk;
|
|
682
|
+
uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
|
|
683
|
+
#ifndef FULL_UNROLL
|
|
684
|
+
int r;
|
|
685
|
+
#endif /* ?FULL_UNROLL */
|
|
686
|
+
|
|
687
|
+
assert(in && out && key);
|
|
688
|
+
rk = key->rd_key;
|
|
689
|
+
|
|
690
|
+
/* map byte array block to cipher state
|
|
691
|
+
* and add initial round key: */
|
|
692
|
+
s0 = GETU32(in) ^ rk[0];
|
|
693
|
+
s1 = GETU32(in + 4) ^ rk[1];
|
|
694
|
+
s2 = GETU32(in + 8) ^ rk[2];
|
|
695
|
+
s3 = GETU32(in + 12) ^ rk[3];
|
|
696
|
+
#ifdef FULL_UNROLL
|
|
697
|
+
/* round 1: */
|
|
698
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
699
|
+
Te3[s3 & 0xff] ^ rk[4];
|
|
700
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
701
|
+
Te3[s0 & 0xff] ^ rk[5];
|
|
702
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
703
|
+
Te3[s1 & 0xff] ^ rk[6];
|
|
704
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
705
|
+
Te3[s2 & 0xff] ^ rk[7];
|
|
706
|
+
/* round 2: */
|
|
707
|
+
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
708
|
+
Te3[t3 & 0xff] ^ rk[8];
|
|
709
|
+
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
710
|
+
Te3[t0 & 0xff] ^ rk[9];
|
|
711
|
+
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
712
|
+
Te3[t1 & 0xff] ^ rk[10];
|
|
713
|
+
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
714
|
+
Te3[t2 & 0xff] ^ rk[11];
|
|
715
|
+
/* round 3: */
|
|
716
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
717
|
+
Te3[s3 & 0xff] ^ rk[12];
|
|
718
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
719
|
+
Te3[s0 & 0xff] ^ rk[13];
|
|
720
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
721
|
+
Te3[s1 & 0xff] ^ rk[14];
|
|
722
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
723
|
+
Te3[s2 & 0xff] ^ rk[15];
|
|
724
|
+
/* round 4: */
|
|
725
|
+
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
726
|
+
Te3[t3 & 0xff] ^ rk[16];
|
|
727
|
+
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
728
|
+
Te3[t0 & 0xff] ^ rk[17];
|
|
729
|
+
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
730
|
+
Te3[t1 & 0xff] ^ rk[18];
|
|
731
|
+
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
732
|
+
Te3[t2 & 0xff] ^ rk[19];
|
|
733
|
+
/* round 5: */
|
|
734
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
735
|
+
Te3[s3 & 0xff] ^ rk[20];
|
|
736
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
737
|
+
Te3[s0 & 0xff] ^ rk[21];
|
|
738
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
739
|
+
Te3[s1 & 0xff] ^ rk[22];
|
|
740
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
741
|
+
Te3[s2 & 0xff] ^ rk[23];
|
|
742
|
+
/* round 6: */
|
|
743
|
+
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
744
|
+
Te3[t3 & 0xff] ^ rk[24];
|
|
745
|
+
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
746
|
+
Te3[t0 & 0xff] ^ rk[25];
|
|
747
|
+
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
748
|
+
Te3[t1 & 0xff] ^ rk[26];
|
|
749
|
+
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
750
|
+
Te3[t2 & 0xff] ^ rk[27];
|
|
751
|
+
/* round 7: */
|
|
752
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
753
|
+
Te3[s3 & 0xff] ^ rk[28];
|
|
754
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
755
|
+
Te3[s0 & 0xff] ^ rk[29];
|
|
756
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
757
|
+
Te3[s1 & 0xff] ^ rk[30];
|
|
758
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
759
|
+
Te3[s2 & 0xff] ^ rk[31];
|
|
760
|
+
/* round 8: */
|
|
761
|
+
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
762
|
+
Te3[t3 & 0xff] ^ rk[32];
|
|
763
|
+
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
764
|
+
Te3[t0 & 0xff] ^ rk[33];
|
|
765
|
+
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
766
|
+
Te3[t1 & 0xff] ^ rk[34];
|
|
767
|
+
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
768
|
+
Te3[t2 & 0xff] ^ rk[35];
|
|
769
|
+
/* round 9: */
|
|
770
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
771
|
+
Te3[s3 & 0xff] ^ rk[36];
|
|
772
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
773
|
+
Te3[s0 & 0xff] ^ rk[37];
|
|
774
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
775
|
+
Te3[s1 & 0xff] ^ rk[38];
|
|
776
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
777
|
+
Te3[s2 & 0xff] ^ rk[39];
|
|
778
|
+
if (key->rounds > 10) {
|
|
779
|
+
/* round 10: */
|
|
780
|
+
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
781
|
+
Te3[t3 & 0xff] ^ rk[40];
|
|
782
|
+
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
783
|
+
Te3[t0 & 0xff] ^ rk[41];
|
|
784
|
+
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
785
|
+
Te3[t1 & 0xff] ^ rk[42];
|
|
786
|
+
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
787
|
+
Te3[t2 & 0xff] ^ rk[43];
|
|
788
|
+
/* round 11: */
|
|
789
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
790
|
+
Te3[s3 & 0xff] ^ rk[44];
|
|
791
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
792
|
+
Te3[s0 & 0xff] ^ rk[45];
|
|
793
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
794
|
+
Te3[s1 & 0xff] ^ rk[46];
|
|
795
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
796
|
+
Te3[s2 & 0xff] ^ rk[47];
|
|
797
|
+
if (key->rounds > 12) {
|
|
798
|
+
/* round 12: */
|
|
799
|
+
s0 = Te0[t0 >> 24] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
800
|
+
Te3[t3 & 0xff] ^ rk[48];
|
|
801
|
+
s1 = Te0[t1 >> 24] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
802
|
+
Te3[t0 & 0xff] ^ rk[49];
|
|
803
|
+
s2 = Te0[t2 >> 24] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
804
|
+
Te3[t1 & 0xff] ^ rk[50];
|
|
805
|
+
s3 = Te0[t3 >> 24] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
806
|
+
Te3[t2 & 0xff] ^ rk[51];
|
|
807
|
+
/* round 13: */
|
|
808
|
+
t0 = Te0[s0 >> 24] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
809
|
+
Te3[s3 & 0xff] ^ rk[52];
|
|
810
|
+
t1 = Te0[s1 >> 24] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
811
|
+
Te3[s0 & 0xff] ^ rk[53];
|
|
812
|
+
t2 = Te0[s2 >> 24] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
813
|
+
Te3[s1 & 0xff] ^ rk[54];
|
|
814
|
+
t3 = Te0[s3 >> 24] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
815
|
+
Te3[s2 & 0xff] ^ rk[55];
|
|
816
|
+
}
|
|
817
|
+
}
|
|
818
|
+
rk += key->rounds << 2;
|
|
819
|
+
#else /* !FULL_UNROLL */
|
|
820
|
+
/*
|
|
821
|
+
* Nr - 1 full rounds:
|
|
822
|
+
*/
|
|
823
|
+
r = key->rounds >> 1;
|
|
824
|
+
for (;;) {
|
|
825
|
+
t0 = Te0[(s0 >> 24)] ^ Te1[(s1 >> 16) & 0xff] ^ Te2[(s2 >> 8) & 0xff] ^
|
|
826
|
+
Te3[(s3) & 0xff] ^ rk[4];
|
|
827
|
+
t1 = Te0[(s1 >> 24)] ^ Te1[(s2 >> 16) & 0xff] ^ Te2[(s3 >> 8) & 0xff] ^
|
|
828
|
+
Te3[(s0) & 0xff] ^ rk[5];
|
|
829
|
+
t2 = Te0[(s2 >> 24)] ^ Te1[(s3 >> 16) & 0xff] ^ Te2[(s0 >> 8) & 0xff] ^
|
|
830
|
+
Te3[(s1) & 0xff] ^ rk[6];
|
|
831
|
+
t3 = Te0[(s3 >> 24)] ^ Te1[(s0 >> 16) & 0xff] ^ Te2[(s1 >> 8) & 0xff] ^
|
|
832
|
+
Te3[(s2) & 0xff] ^ rk[7];
|
|
833
|
+
|
|
834
|
+
rk += 8;
|
|
835
|
+
if (--r == 0) {
|
|
836
|
+
break;
|
|
837
|
+
}
|
|
838
|
+
|
|
839
|
+
s0 = Te0[(t0 >> 24)] ^ Te1[(t1 >> 16) & 0xff] ^ Te2[(t2 >> 8) & 0xff] ^
|
|
840
|
+
Te3[(t3) & 0xff] ^ rk[0];
|
|
841
|
+
s1 = Te0[(t1 >> 24)] ^ Te1[(t2 >> 16) & 0xff] ^ Te2[(t3 >> 8) & 0xff] ^
|
|
842
|
+
Te3[(t0) & 0xff] ^ rk[1];
|
|
843
|
+
s2 = Te0[(t2 >> 24)] ^ Te1[(t3 >> 16) & 0xff] ^ Te2[(t0 >> 8) & 0xff] ^
|
|
844
|
+
Te3[(t1) & 0xff] ^ rk[2];
|
|
845
|
+
s3 = Te0[(t3 >> 24)] ^ Te1[(t0 >> 16) & 0xff] ^ Te2[(t1 >> 8) & 0xff] ^
|
|
846
|
+
Te3[(t2) & 0xff] ^ rk[3];
|
|
847
|
+
}
|
|
848
|
+
#endif /* ?FULL_UNROLL */
|
|
849
|
+
/* apply last round and map cipher state to byte array block: */
|
|
850
|
+
s0 = (Te2[(t0 >> 24)] & 0xff000000) ^ (Te3[(t1 >> 16) & 0xff] & 0x00ff0000) ^
|
|
851
|
+
(Te0[(t2 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t3) & 0xff] & 0x000000ff) ^
|
|
852
|
+
rk[0];
|
|
853
|
+
PUTU32(out, s0);
|
|
854
|
+
s1 = (Te2[(t1 >> 24)] & 0xff000000) ^ (Te3[(t2 >> 16) & 0xff] & 0x00ff0000) ^
|
|
855
|
+
(Te0[(t3 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t0) & 0xff] & 0x000000ff) ^
|
|
856
|
+
rk[1];
|
|
857
|
+
PUTU32(out + 4, s1);
|
|
858
|
+
s2 = (Te2[(t2 >> 24)] & 0xff000000) ^ (Te3[(t3 >> 16) & 0xff] & 0x00ff0000) ^
|
|
859
|
+
(Te0[(t0 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t1) & 0xff] & 0x000000ff) ^
|
|
860
|
+
rk[2];
|
|
861
|
+
PUTU32(out + 8, s2);
|
|
862
|
+
s3 = (Te2[(t3 >> 24)] & 0xff000000) ^ (Te3[(t0 >> 16) & 0xff] & 0x00ff0000) ^
|
|
863
|
+
(Te0[(t1 >> 8) & 0xff] & 0x0000ff00) ^ (Te1[(t2) & 0xff] & 0x000000ff) ^
|
|
864
|
+
rk[3];
|
|
865
|
+
PUTU32(out + 12, s3);
|
|
866
|
+
}
|
|
867
|
+
|
|
868
|
+
void AES_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
|
|
869
|
+
const uint32_t *rk;
|
|
870
|
+
uint32_t s0, s1, s2, s3, t0, t1, t2, t3;
|
|
871
|
+
#ifndef FULL_UNROLL
|
|
872
|
+
int r;
|
|
873
|
+
#endif /* ?FULL_UNROLL */
|
|
874
|
+
|
|
875
|
+
assert(in && out && key);
|
|
876
|
+
rk = key->rd_key;
|
|
877
|
+
|
|
878
|
+
/* map byte array block to cipher state
|
|
879
|
+
* and add initial round key: */
|
|
880
|
+
s0 = GETU32(in) ^ rk[0];
|
|
881
|
+
s1 = GETU32(in + 4) ^ rk[1];
|
|
882
|
+
s2 = GETU32(in + 8) ^ rk[2];
|
|
883
|
+
s3 = GETU32(in + 12) ^ rk[3];
|
|
884
|
+
#ifdef FULL_UNROLL
|
|
885
|
+
/* round 1: */
|
|
886
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
887
|
+
Td3[s1 & 0xff] ^ rk[4];
|
|
888
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
889
|
+
Td3[s2 & 0xff] ^ rk[5];
|
|
890
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
891
|
+
Td3[s3 & 0xff] ^ rk[6];
|
|
892
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
893
|
+
Td3[s0 & 0xff] ^ rk[7];
|
|
894
|
+
/* round 2: */
|
|
895
|
+
s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
896
|
+
Td3[t1 & 0xff] ^ rk[8];
|
|
897
|
+
s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
898
|
+
Td3[t2 & 0xff] ^ rk[9];
|
|
899
|
+
s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
900
|
+
Td3[t3 & 0xff] ^ rk[10];
|
|
901
|
+
s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
902
|
+
Td3[t0 & 0xff] ^ rk[11];
|
|
903
|
+
/* round 3: */
|
|
904
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
905
|
+
Td3[s1 & 0xff] ^ rk[12];
|
|
906
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
907
|
+
Td3[s2 & 0xff] ^ rk[13];
|
|
908
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
909
|
+
Td3[s3 & 0xff] ^ rk[14];
|
|
910
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
911
|
+
Td3[s0 & 0xff] ^ rk[15];
|
|
912
|
+
/* round 4: */
|
|
913
|
+
s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
914
|
+
Td3[t1 & 0xff] ^ rk[16];
|
|
915
|
+
s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
916
|
+
Td3[t2 & 0xff] ^ rk[17];
|
|
917
|
+
s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
918
|
+
Td3[t3 & 0xff] ^ rk[18];
|
|
919
|
+
s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
920
|
+
Td3[t0 & 0xff] ^ rk[19];
|
|
921
|
+
/* round 5: */
|
|
922
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
923
|
+
Td3[s1 & 0xff] ^ rk[20];
|
|
924
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
925
|
+
Td3[s2 & 0xff] ^ rk[21];
|
|
926
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
927
|
+
Td3[s3 & 0xff] ^ rk[22];
|
|
928
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
929
|
+
Td3[s0 & 0xff] ^ rk[23];
|
|
930
|
+
/* round 6: */
|
|
931
|
+
s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
932
|
+
Td3[t1 & 0xff] ^ rk[24];
|
|
933
|
+
s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
934
|
+
Td3[t2 & 0xff] ^ rk[25];
|
|
935
|
+
s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
936
|
+
Td3[t3 & 0xff] ^ rk[26];
|
|
937
|
+
s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
938
|
+
Td3[t0 & 0xff] ^ rk[27];
|
|
939
|
+
/* round 7: */
|
|
940
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
941
|
+
Td3[s1 & 0xff] ^ rk[28];
|
|
942
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
943
|
+
Td3[s2 & 0xff] ^ rk[29];
|
|
944
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
945
|
+
Td3[s3 & 0xff] ^ rk[30];
|
|
946
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
947
|
+
Td3[s0 & 0xff] ^ rk[31];
|
|
948
|
+
/* round 8: */
|
|
949
|
+
s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
950
|
+
Td3[t1 & 0xff] ^ rk[32];
|
|
951
|
+
s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
952
|
+
Td3[t2 & 0xff] ^ rk[33];
|
|
953
|
+
s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
954
|
+
Td3[t3 & 0xff] ^ rk[34];
|
|
955
|
+
s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
956
|
+
Td3[t0 & 0xff] ^ rk[35];
|
|
957
|
+
/* round 9: */
|
|
958
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
959
|
+
Td3[s1 & 0xff] ^ rk[36];
|
|
960
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
961
|
+
Td3[s2 & 0xff] ^ rk[37];
|
|
962
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
963
|
+
Td3[s3 & 0xff] ^ rk[38];
|
|
964
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
965
|
+
Td3[s0 & 0xff] ^ rk[39];
|
|
966
|
+
if (key->rounds > 10) {
|
|
967
|
+
/* round 10: */
|
|
968
|
+
s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
969
|
+
Td3[t1 & 0xff] ^ rk[40];
|
|
970
|
+
s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
971
|
+
Td3[t2 & 0xff] ^ rk[41];
|
|
972
|
+
s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
973
|
+
Td3[t3 & 0xff] ^ rk[42];
|
|
974
|
+
s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
975
|
+
Td3[t0 & 0xff] ^ rk[43];
|
|
976
|
+
/* round 11: */
|
|
977
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
978
|
+
Td3[s1 & 0xff] ^ rk[44];
|
|
979
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
980
|
+
Td3[s2 & 0xff] ^ rk[45];
|
|
981
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
982
|
+
Td3[s3 & 0xff] ^ rk[46];
|
|
983
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
984
|
+
Td3[s0 & 0xff] ^ rk[47];
|
|
985
|
+
if (key->rounds > 12) {
|
|
986
|
+
/* round 12: */
|
|
987
|
+
s0 = Td0[t0 >> 24] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
988
|
+
Td3[t1 & 0xff] ^ rk[48];
|
|
989
|
+
s1 = Td0[t1 >> 24] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
990
|
+
Td3[t2 & 0xff] ^ rk[49];
|
|
991
|
+
s2 = Td0[t2 >> 24] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
992
|
+
Td3[t3 & 0xff] ^ rk[50];
|
|
993
|
+
s3 = Td0[t3 >> 24] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
994
|
+
Td3[t0 & 0xff] ^ rk[51];
|
|
995
|
+
/* round 13: */
|
|
996
|
+
t0 = Td0[s0 >> 24] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
997
|
+
Td3[s1 & 0xff] ^ rk[52];
|
|
998
|
+
t1 = Td0[s1 >> 24] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
999
|
+
Td3[s2 & 0xff] ^ rk[53];
|
|
1000
|
+
t2 = Td0[s2 >> 24] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
1001
|
+
Td3[s3 & 0xff] ^ rk[54];
|
|
1002
|
+
t3 = Td0[s3 >> 24] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
1003
|
+
Td3[s0 & 0xff] ^ rk[55];
|
|
1004
|
+
}
|
|
1005
|
+
}
|
|
1006
|
+
rk += key->rounds << 2;
|
|
1007
|
+
#else /* !FULL_UNROLL */
|
|
1008
|
+
/*
|
|
1009
|
+
* Nr - 1 full rounds:
|
|
1010
|
+
*/
|
|
1011
|
+
r = key->rounds >> 1;
|
|
1012
|
+
for (;;) {
|
|
1013
|
+
t0 = Td0[(s0 >> 24)] ^ Td1[(s3 >> 16) & 0xff] ^ Td2[(s2 >> 8) & 0xff] ^
|
|
1014
|
+
Td3[(s1) & 0xff] ^ rk[4];
|
|
1015
|
+
t1 = Td0[(s1 >> 24)] ^ Td1[(s0 >> 16) & 0xff] ^ Td2[(s3 >> 8) & 0xff] ^
|
|
1016
|
+
Td3[(s2) & 0xff] ^ rk[5];
|
|
1017
|
+
t2 = Td0[(s2 >> 24)] ^ Td1[(s1 >> 16) & 0xff] ^ Td2[(s0 >> 8) & 0xff] ^
|
|
1018
|
+
Td3[(s3) & 0xff] ^ rk[6];
|
|
1019
|
+
t3 = Td0[(s3 >> 24)] ^ Td1[(s2 >> 16) & 0xff] ^ Td2[(s1 >> 8) & 0xff] ^
|
|
1020
|
+
Td3[(s0) & 0xff] ^ rk[7];
|
|
1021
|
+
|
|
1022
|
+
rk += 8;
|
|
1023
|
+
if (--r == 0) {
|
|
1024
|
+
break;
|
|
1025
|
+
}
|
|
1026
|
+
|
|
1027
|
+
s0 = Td0[(t0 >> 24)] ^ Td1[(t3 >> 16) & 0xff] ^ Td2[(t2 >> 8) & 0xff] ^
|
|
1028
|
+
Td3[(t1) & 0xff] ^ rk[0];
|
|
1029
|
+
s1 = Td0[(t1 >> 24)] ^ Td1[(t0 >> 16) & 0xff] ^ Td2[(t3 >> 8) & 0xff] ^
|
|
1030
|
+
Td3[(t2) & 0xff] ^ rk[1];
|
|
1031
|
+
s2 = Td0[(t2 >> 24)] ^ Td1[(t1 >> 16) & 0xff] ^ Td2[(t0 >> 8) & 0xff] ^
|
|
1032
|
+
Td3[(t3) & 0xff] ^ rk[2];
|
|
1033
|
+
s3 = Td0[(t3 >> 24)] ^ Td1[(t2 >> 16) & 0xff] ^ Td2[(t1 >> 8) & 0xff] ^
|
|
1034
|
+
Td3[(t0) & 0xff] ^ rk[3];
|
|
1035
|
+
}
|
|
1036
|
+
#endif /* ?FULL_UNROLL */
|
|
1037
|
+
/* apply last round and
|
|
1038
|
+
* map cipher state to byte array block: */
|
|
1039
|
+
s0 = ((uint32_t)Td4[(t0 >> 24)] << 24) ^
|
|
1040
|
+
((uint32_t)Td4[(t3 >> 16) & 0xff] << 16) ^
|
|
1041
|
+
((uint32_t)Td4[(t2 >> 8) & 0xff] << 8) ^
|
|
1042
|
+
((uint32_t)Td4[(t1) & 0xff]) ^ rk[0];
|
|
1043
|
+
PUTU32(out, s0);
|
|
1044
|
+
s1 = ((uint32_t)Td4[(t1 >> 24)] << 24) ^
|
|
1045
|
+
((uint32_t)Td4[(t0 >> 16) & 0xff] << 16) ^
|
|
1046
|
+
((uint32_t)Td4[(t3 >> 8) & 0xff] << 8) ^
|
|
1047
|
+
((uint32_t)Td4[(t2) & 0xff]) ^ rk[1];
|
|
1048
|
+
PUTU32(out + 4, s1);
|
|
1049
|
+
s2 = ((uint32_t)Td4[(t2 >> 24)] << 24) ^
|
|
1050
|
+
((uint32_t)Td4[(t1 >> 16) & 0xff] << 16) ^
|
|
1051
|
+
((uint32_t)Td4[(t0 >> 8) & 0xff] << 8) ^
|
|
1052
|
+
((uint32_t)Td4[(t3) & 0xff]) ^ rk[2];
|
|
1053
|
+
PUTU32(out + 8, s2);
|
|
1054
|
+
s3 = ((uint32_t)Td4[(t3 >> 24)] << 24) ^
|
|
1055
|
+
((uint32_t)Td4[(t2 >> 16) & 0xff] << 16) ^
|
|
1056
|
+
((uint32_t)Td4[(t1 >> 8) & 0xff] << 8) ^
|
|
1057
|
+
((uint32_t)Td4[(t0) & 0xff]) ^ rk[3];
|
|
1058
|
+
PUTU32(out + 12, s3);
|
|
1059
|
+
}
|
|
1060
|
+
|
|
1061
|
+
#else
|
|
1062
|
+
|
|
1063
|
+
#if defined(OPENSSL_ARM) || defined(OPENSSL_AARCH64)
|
|
1064
|
+
|
|
1065
|
+
static int hwaes_capable(void) {
|
|
1066
|
+
return CRYPTO_is_ARMv8_AES_capable();
|
|
1067
|
+
}
|
|
1068
|
+
|
|
1069
|
+
int aes_v8_set_encrypt_key(const uint8_t *user_key, const int bits,
|
|
1070
|
+
AES_KEY *key);
|
|
1071
|
+
int aes_v8_set_decrypt_key(const uint8_t *user_key, const int bits,
|
|
1072
|
+
AES_KEY *key);
|
|
1073
|
+
void aes_v8_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key);
|
|
1074
|
+
void aes_v8_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key);
|
|
1075
|
+
|
|
1076
|
+
#else
|
|
1077
|
+
|
|
1078
|
+
static int hwaes_capable(void) {
|
|
1079
|
+
return 0;
|
|
1080
|
+
}
|
|
1081
|
+
|
|
1082
|
+
static int aes_v8_set_encrypt_key(const uint8_t *user_key, int bits, AES_KEY *key) {
|
|
1083
|
+
abort();
|
|
1084
|
+
}
|
|
1085
|
+
|
|
1086
|
+
static int aes_v8_set_decrypt_key(const uint8_t *user_key, int bits, AES_KEY *key) {
|
|
1087
|
+
abort();
|
|
1088
|
+
}
|
|
1089
|
+
|
|
1090
|
+
static void aes_v8_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
|
|
1091
|
+
abort();
|
|
1092
|
+
}
|
|
1093
|
+
|
|
1094
|
+
static void aes_v8_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
|
|
1095
|
+
abort();
|
|
1096
|
+
}
|
|
1097
|
+
|
|
1098
|
+
#endif
|
|
1099
|
+
|
|
1100
|
+
|
|
1101
|
+
/* In this case several functions are provided by asm code. However, one cannot
|
|
1102
|
+
* control asm symbol visibility with command line flags and such so they are
|
|
1103
|
+
* always hidden and wrapped by these C functions, which can be so
|
|
1104
|
+
* controlled. */
|
|
1105
|
+
|
|
1106
|
+
void asm_AES_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key);
|
|
1107
|
+
void AES_encrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
|
|
1108
|
+
if (hwaes_capable()) {
|
|
1109
|
+
aes_v8_encrypt(in, out, key);
|
|
1110
|
+
} else {
|
|
1111
|
+
asm_AES_encrypt(in, out, key);
|
|
1112
|
+
}
|
|
1113
|
+
}
|
|
1114
|
+
|
|
1115
|
+
void asm_AES_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key);
|
|
1116
|
+
void AES_decrypt(const uint8_t *in, uint8_t *out, const AES_KEY *key) {
|
|
1117
|
+
if (hwaes_capable()) {
|
|
1118
|
+
aes_v8_decrypt(in, out, key);
|
|
1119
|
+
} else {
|
|
1120
|
+
asm_AES_decrypt(in, out, key);
|
|
1121
|
+
}
|
|
1122
|
+
}
|
|
1123
|
+
|
|
1124
|
+
int asm_AES_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey);
|
|
1125
|
+
int AES_set_encrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
|
|
1126
|
+
if (hwaes_capable()) {
|
|
1127
|
+
return aes_v8_set_encrypt_key(key, bits, aeskey);
|
|
1128
|
+
} else {
|
|
1129
|
+
return asm_AES_set_encrypt_key(key, bits, aeskey);
|
|
1130
|
+
}
|
|
1131
|
+
}
|
|
1132
|
+
|
|
1133
|
+
int asm_AES_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey);
|
|
1134
|
+
int AES_set_decrypt_key(const uint8_t *key, unsigned bits, AES_KEY *aeskey) {
|
|
1135
|
+
if (hwaes_capable()) {
|
|
1136
|
+
return aes_v8_set_decrypt_key(key, bits, aeskey);
|
|
1137
|
+
} else {
|
|
1138
|
+
return asm_AES_set_decrypt_key(key, bits, aeskey);
|
|
1139
|
+
}
|
|
1140
|
+
}
|
|
1141
|
+
|
|
1142
|
+
#endif /* OPENSSL_NO_ASM || (!OPENSSL_X86 && !OPENSSL_X86_64 && !OPENSSL_ARM) */
|