├── .gitignore ├── LICENSE ├── README.md ├── go.mod └── strobe ├── keccakf.go ├── keccakf_amd64.go ├── keccakf_amd64.s ├── strobe.go ├── strobe_test.go ├── test_vectors └── test_vectors.json └── vectors_test.go /.gitignore: -------------------------------------------------------------------------------- 1 | # Binaries for programs and plugins 2 | *.exe 3 | *.dll 4 | *.so 5 | *.dylib 6 | 7 | # Test binary, build with `go test -c` 8 | *.test 9 | 10 | # Output of the go coverage tool, specifically when used with LiteIDE 11 | *.out 12 | 13 | # Project-local glide cache, RE: https://github.com/Masterminds/glide/issues/736 14 | .glide/ 15 | 16 | # Debug 17 | strobe/debug.go -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # StrobeGo 2 | 3 | [![GoDoc](https://godoc.org/github.com/mimoo/StrobeGo/strobe?status.svg)](https://godoc.org/github.com/mimoo/StrobeGo/strobe) 4 | 5 | This repository contains an implementation of the [Strobe protocol framework](https://strobe.sourceforge.io/). See [this blogpost](https://www.cryptologie.net/article/416/the-strobe-protocol-framework/) for an explanation of what is the framework. 6 | 7 | **The implementation of Strobe has not been thoroughly tested. Do not use this in production**. 8 | 9 | The **Strobe** implementation is heavily based on [golang.org/x/crypto/sha3](https://godoc.org/golang.org/x/crypto/sha3), which is why some of the files have been copied in the [/strobe](/strobe) directory. You do not need to have Go's SHA-3 package to make it work. 10 | 11 | ## Install 12 | 13 | To use it, first get Go's experimental sha3's implementation: 14 | 15 | ``` 16 | go get github.com/mimoo/StrobeGo/strobe 17 | ``` 18 | 19 | ## Usage 20 | 21 | See [godoc](https://godoc.org/github.com/mimoo/StrobeGo/strobe) for thorough documentation. Here is an example usage: 22 | 23 | ```go 24 | package main 25 | 26 | import ( 27 | "encoding/hex" 28 | "fmt" 29 | 30 | "github.com/mimoo/StrobeGo/strobe" 31 | ) 32 | 33 | func main() { 34 | s := strobe.InitStrobe("myHash", 128) // 128-bit security 35 | message := []byte("hello, how are you good sir?") 36 | s.AD(false, message) // meta=false 37 | fmt.Println(hex.EncodeToString(s.PRF(16))) // output length = 16 38 | } 39 | ``` 40 | 41 | ## Roadmap 42 | 43 | * Implement test vectors of SHAKE 44 | * Generate proper test vectors and test them with the reference implementation in python of Strobe 45 | -------------------------------------------------------------------------------- /go.mod: -------------------------------------------------------------------------------- 1 | module github.com/mimoo/StrobeGo 2 | 3 | go 1.17 4 | -------------------------------------------------------------------------------- /strobe/keccakf.go: -------------------------------------------------------------------------------- 1 | // Copyright 2014 The Go Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style 3 | // license that can be found in the LICENSE file. 4 | 5 | // +build !amd64 appengine gccgo 6 | 7 | package strobe 8 | 9 | // rc stores the round constants for use in the ι step. 10 | var rc = [24]uint64{ 11 | 0x0000000000000001, 12 | 0x0000000000008082, 13 | 0x800000000000808A, 14 | 0x8000000080008000, 15 | 0x000000000000808B, 16 | 0x0000000080000001, 17 | 0x8000000080008081, 18 | 0x8000000000008009, 19 | 0x000000000000008A, 20 | 0x0000000000000088, 21 | 0x0000000080008009, 22 | 0x000000008000000A, 23 | 0x000000008000808B, 24 | 0x800000000000008B, 25 | 0x8000000000008089, 26 | 0x8000000000008003, 27 | 0x8000000000008002, 28 | 0x8000000000000080, 29 | 0x000000000000800A, 30 | 0x800000008000000A, 31 | 0x8000000080008081, 32 | 0x8000000000008080, 33 | 0x0000000080000001, 34 | 0x8000000080008008, 35 | } 36 | 37 | // keccakF1600 applies the Keccak permutation to a 1600b-wide 38 | // state represented as a slice of 25 uint64s. 39 | func keccakF1600(a *[25]uint64, nr int) { 40 | // Implementation translated from Keccak-inplace.c 41 | // in the keccak reference code. 42 | var t, bc0, bc1, bc2, bc3, bc4, d0, d1, d2, d3, d4 uint64 43 | 44 | for i := 0; i < 24; i += 4 { 45 | if i+nr >= 24 { 46 | // Combines the 5 steps in each round into 2 steps. 47 | // Unrolls 4 rounds per loop and spreads some steps across rounds. 48 | 49 | // Round 1 50 | bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] 51 | bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] 52 | bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] 53 | bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] 54 | bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] 55 | d0 = bc4 ^ (bc1<<1 | bc1>>63) 56 | d1 = bc0 ^ (bc2<<1 | bc2>>63) 57 | d2 = bc1 ^ (bc3<<1 | bc3>>63) 58 | d3 = bc2 ^ (bc4<<1 | bc4>>63) 59 | d4 = bc3 ^ (bc0<<1 | bc0>>63) 60 | 61 | bc0 = a[0] ^ d0 62 | t = a[6] ^ d1 63 | bc1 = t<<44 | t>>(64-44) 64 | t = a[12] ^ d2 65 | bc2 = t<<43 | t>>(64-43) 66 | t = a[18] ^ d3 67 | bc3 = t<<21 | t>>(64-21) 68 | t = a[24] ^ d4 69 | bc4 = t<<14 | t>>(64-14) 70 | a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i] 71 | a[6] = bc1 ^ (bc3 &^ bc2) 72 | a[12] = bc2 ^ (bc4 &^ bc3) 73 | a[18] = bc3 ^ (bc0 &^ bc4) 74 | a[24] = bc4 ^ (bc1 &^ bc0) 75 | 76 | t = a[10] ^ d0 77 | bc2 = t<<3 | t>>(64-3) 78 | t = a[16] ^ d1 79 | bc3 = t<<45 | t>>(64-45) 80 | t = a[22] ^ d2 81 | bc4 = t<<61 | t>>(64-61) 82 | t = a[3] ^ d3 83 | bc0 = t<<28 | t>>(64-28) 84 | t = a[9] ^ d4 85 | bc1 = t<<20 | t>>(64-20) 86 | a[10] = bc0 ^ (bc2 &^ bc1) 87 | a[16] = bc1 ^ (bc3 &^ bc2) 88 | a[22] = bc2 ^ (bc4 &^ bc3) 89 | a[3] = bc3 ^ (bc0 &^ bc4) 90 | a[9] = bc4 ^ (bc1 &^ bc0) 91 | 92 | t = a[20] ^ d0 93 | bc4 = t<<18 | t>>(64-18) 94 | t = a[1] ^ d1 95 | bc0 = t<<1 | t>>(64-1) 96 | t = a[7] ^ d2 97 | bc1 = t<<6 | t>>(64-6) 98 | t = a[13] ^ d3 99 | bc2 = t<<25 | t>>(64-25) 100 | t = a[19] ^ d4 101 | bc3 = t<<8 | t>>(64-8) 102 | a[20] = bc0 ^ (bc2 &^ bc1) 103 | a[1] = bc1 ^ (bc3 &^ bc2) 104 | a[7] = bc2 ^ (bc4 &^ bc3) 105 | a[13] = bc3 ^ (bc0 &^ bc4) 106 | a[19] = bc4 ^ (bc1 &^ bc0) 107 | 108 | t = a[5] ^ d0 109 | bc1 = t<<36 | t>>(64-36) 110 | t = a[11] ^ d1 111 | bc2 = t<<10 | t>>(64-10) 112 | t = a[17] ^ d2 113 | bc3 = t<<15 | t>>(64-15) 114 | t = a[23] ^ d3 115 | bc4 = t<<56 | t>>(64-56) 116 | t = a[4] ^ d4 117 | bc0 = t<<27 | t>>(64-27) 118 | a[5] = bc0 ^ (bc2 &^ bc1) 119 | a[11] = bc1 ^ (bc3 &^ bc2) 120 | a[17] = bc2 ^ (bc4 &^ bc3) 121 | a[23] = bc3 ^ (bc0 &^ bc4) 122 | a[4] = bc4 ^ (bc1 &^ bc0) 123 | 124 | t = a[15] ^ d0 125 | bc3 = t<<41 | t>>(64-41) 126 | t = a[21] ^ d1 127 | bc4 = t<<2 | t>>(64-2) 128 | t = a[2] ^ d2 129 | bc0 = t<<62 | t>>(64-62) 130 | t = a[8] ^ d3 131 | bc1 = t<<55 | t>>(64-55) 132 | t = a[14] ^ d4 133 | bc2 = t<<39 | t>>(64-39) 134 | a[15] = bc0 ^ (bc2 &^ bc1) 135 | a[21] = bc1 ^ (bc3 &^ bc2) 136 | a[2] = bc2 ^ (bc4 &^ bc3) 137 | a[8] = bc3 ^ (bc0 &^ bc4) 138 | a[14] = bc4 ^ (bc1 &^ bc0) 139 | 140 | // Round 2 141 | bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] 142 | bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] 143 | bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] 144 | bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] 145 | bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] 146 | d0 = bc4 ^ (bc1<<1 | bc1>>63) 147 | d1 = bc0 ^ (bc2<<1 | bc2>>63) 148 | d2 = bc1 ^ (bc3<<1 | bc3>>63) 149 | d3 = bc2 ^ (bc4<<1 | bc4>>63) 150 | d4 = bc3 ^ (bc0<<1 | bc0>>63) 151 | 152 | bc0 = a[0] ^ d0 153 | t = a[16] ^ d1 154 | bc1 = t<<44 | t>>(64-44) 155 | t = a[7] ^ d2 156 | bc2 = t<<43 | t>>(64-43) 157 | t = a[23] ^ d3 158 | bc3 = t<<21 | t>>(64-21) 159 | t = a[14] ^ d4 160 | bc4 = t<<14 | t>>(64-14) 161 | a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+1] 162 | a[16] = bc1 ^ (bc3 &^ bc2) 163 | a[7] = bc2 ^ (bc4 &^ bc3) 164 | a[23] = bc3 ^ (bc0 &^ bc4) 165 | a[14] = bc4 ^ (bc1 &^ bc0) 166 | 167 | t = a[20] ^ d0 168 | bc2 = t<<3 | t>>(64-3) 169 | t = a[11] ^ d1 170 | bc3 = t<<45 | t>>(64-45) 171 | t = a[2] ^ d2 172 | bc4 = t<<61 | t>>(64-61) 173 | t = a[18] ^ d3 174 | bc0 = t<<28 | t>>(64-28) 175 | t = a[9] ^ d4 176 | bc1 = t<<20 | t>>(64-20) 177 | a[20] = bc0 ^ (bc2 &^ bc1) 178 | a[11] = bc1 ^ (bc3 &^ bc2) 179 | a[2] = bc2 ^ (bc4 &^ bc3) 180 | a[18] = bc3 ^ (bc0 &^ bc4) 181 | a[9] = bc4 ^ (bc1 &^ bc0) 182 | 183 | t = a[15] ^ d0 184 | bc4 = t<<18 | t>>(64-18) 185 | t = a[6] ^ d1 186 | bc0 = t<<1 | t>>(64-1) 187 | t = a[22] ^ d2 188 | bc1 = t<<6 | t>>(64-6) 189 | t = a[13] ^ d3 190 | bc2 = t<<25 | t>>(64-25) 191 | t = a[4] ^ d4 192 | bc3 = t<<8 | t>>(64-8) 193 | a[15] = bc0 ^ (bc2 &^ bc1) 194 | a[6] = bc1 ^ (bc3 &^ bc2) 195 | a[22] = bc2 ^ (bc4 &^ bc3) 196 | a[13] = bc3 ^ (bc0 &^ bc4) 197 | a[4] = bc4 ^ (bc1 &^ bc0) 198 | 199 | t = a[10] ^ d0 200 | bc1 = t<<36 | t>>(64-36) 201 | t = a[1] ^ d1 202 | bc2 = t<<10 | t>>(64-10) 203 | t = a[17] ^ d2 204 | bc3 = t<<15 | t>>(64-15) 205 | t = a[8] ^ d3 206 | bc4 = t<<56 | t>>(64-56) 207 | t = a[24] ^ d4 208 | bc0 = t<<27 | t>>(64-27) 209 | a[10] = bc0 ^ (bc2 &^ bc1) 210 | a[1] = bc1 ^ (bc3 &^ bc2) 211 | a[17] = bc2 ^ (bc4 &^ bc3) 212 | a[8] = bc3 ^ (bc0 &^ bc4) 213 | a[24] = bc4 ^ (bc1 &^ bc0) 214 | 215 | t = a[5] ^ d0 216 | bc3 = t<<41 | t>>(64-41) 217 | t = a[21] ^ d1 218 | bc4 = t<<2 | t>>(64-2) 219 | t = a[12] ^ d2 220 | bc0 = t<<62 | t>>(64-62) 221 | t = a[3] ^ d3 222 | bc1 = t<<55 | t>>(64-55) 223 | t = a[19] ^ d4 224 | bc2 = t<<39 | t>>(64-39) 225 | a[5] = bc0 ^ (bc2 &^ bc1) 226 | a[21] = bc1 ^ (bc3 &^ bc2) 227 | a[12] = bc2 ^ (bc4 &^ bc3) 228 | a[3] = bc3 ^ (bc0 &^ bc4) 229 | a[19] = bc4 ^ (bc1 &^ bc0) 230 | 231 | // Round 3 232 | bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] 233 | bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] 234 | bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] 235 | bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] 236 | bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] 237 | d0 = bc4 ^ (bc1<<1 | bc1>>63) 238 | d1 = bc0 ^ (bc2<<1 | bc2>>63) 239 | d2 = bc1 ^ (bc3<<1 | bc3>>63) 240 | d3 = bc2 ^ (bc4<<1 | bc4>>63) 241 | d4 = bc3 ^ (bc0<<1 | bc0>>63) 242 | 243 | bc0 = a[0] ^ d0 244 | t = a[11] ^ d1 245 | bc1 = t<<44 | t>>(64-44) 246 | t = a[22] ^ d2 247 | bc2 = t<<43 | t>>(64-43) 248 | t = a[8] ^ d3 249 | bc3 = t<<21 | t>>(64-21) 250 | t = a[19] ^ d4 251 | bc4 = t<<14 | t>>(64-14) 252 | a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+2] 253 | a[11] = bc1 ^ (bc3 &^ bc2) 254 | a[22] = bc2 ^ (bc4 &^ bc3) 255 | a[8] = bc3 ^ (bc0 &^ bc4) 256 | a[19] = bc4 ^ (bc1 &^ bc0) 257 | 258 | t = a[15] ^ d0 259 | bc2 = t<<3 | t>>(64-3) 260 | t = a[1] ^ d1 261 | bc3 = t<<45 | t>>(64-45) 262 | t = a[12] ^ d2 263 | bc4 = t<<61 | t>>(64-61) 264 | t = a[23] ^ d3 265 | bc0 = t<<28 | t>>(64-28) 266 | t = a[9] ^ d4 267 | bc1 = t<<20 | t>>(64-20) 268 | a[15] = bc0 ^ (bc2 &^ bc1) 269 | a[1] = bc1 ^ (bc3 &^ bc2) 270 | a[12] = bc2 ^ (bc4 &^ bc3) 271 | a[23] = bc3 ^ (bc0 &^ bc4) 272 | a[9] = bc4 ^ (bc1 &^ bc0) 273 | 274 | t = a[5] ^ d0 275 | bc4 = t<<18 | t>>(64-18) 276 | t = a[16] ^ d1 277 | bc0 = t<<1 | t>>(64-1) 278 | t = a[2] ^ d2 279 | bc1 = t<<6 | t>>(64-6) 280 | t = a[13] ^ d3 281 | bc2 = t<<25 | t>>(64-25) 282 | t = a[24] ^ d4 283 | bc3 = t<<8 | t>>(64-8) 284 | a[5] = bc0 ^ (bc2 &^ bc1) 285 | a[16] = bc1 ^ (bc3 &^ bc2) 286 | a[2] = bc2 ^ (bc4 &^ bc3) 287 | a[13] = bc3 ^ (bc0 &^ bc4) 288 | a[24] = bc4 ^ (bc1 &^ bc0) 289 | 290 | t = a[20] ^ d0 291 | bc1 = t<<36 | t>>(64-36) 292 | t = a[6] ^ d1 293 | bc2 = t<<10 | t>>(64-10) 294 | t = a[17] ^ d2 295 | bc3 = t<<15 | t>>(64-15) 296 | t = a[3] ^ d3 297 | bc4 = t<<56 | t>>(64-56) 298 | t = a[14] ^ d4 299 | bc0 = t<<27 | t>>(64-27) 300 | a[20] = bc0 ^ (bc2 &^ bc1) 301 | a[6] = bc1 ^ (bc3 &^ bc2) 302 | a[17] = bc2 ^ (bc4 &^ bc3) 303 | a[3] = bc3 ^ (bc0 &^ bc4) 304 | a[14] = bc4 ^ (bc1 &^ bc0) 305 | 306 | t = a[10] ^ d0 307 | bc3 = t<<41 | t>>(64-41) 308 | t = a[21] ^ d1 309 | bc4 = t<<2 | t>>(64-2) 310 | t = a[7] ^ d2 311 | bc0 = t<<62 | t>>(64-62) 312 | t = a[18] ^ d3 313 | bc1 = t<<55 | t>>(64-55) 314 | t = a[4] ^ d4 315 | bc2 = t<<39 | t>>(64-39) 316 | a[10] = bc0 ^ (bc2 &^ bc1) 317 | a[21] = bc1 ^ (bc3 &^ bc2) 318 | a[7] = bc2 ^ (bc4 &^ bc3) 319 | a[18] = bc3 ^ (bc0 &^ bc4) 320 | a[4] = bc4 ^ (bc1 &^ bc0) 321 | 322 | // Round 4 323 | bc0 = a[0] ^ a[5] ^ a[10] ^ a[15] ^ a[20] 324 | bc1 = a[1] ^ a[6] ^ a[11] ^ a[16] ^ a[21] 325 | bc2 = a[2] ^ a[7] ^ a[12] ^ a[17] ^ a[22] 326 | bc3 = a[3] ^ a[8] ^ a[13] ^ a[18] ^ a[23] 327 | bc4 = a[4] ^ a[9] ^ a[14] ^ a[19] ^ a[24] 328 | d0 = bc4 ^ (bc1<<1 | bc1>>63) 329 | d1 = bc0 ^ (bc2<<1 | bc2>>63) 330 | d2 = bc1 ^ (bc3<<1 | bc3>>63) 331 | d3 = bc2 ^ (bc4<<1 | bc4>>63) 332 | d4 = bc3 ^ (bc0<<1 | bc0>>63) 333 | 334 | bc0 = a[0] ^ d0 335 | t = a[1] ^ d1 336 | bc1 = t<<44 | t>>(64-44) 337 | t = a[2] ^ d2 338 | bc2 = t<<43 | t>>(64-43) 339 | t = a[3] ^ d3 340 | bc3 = t<<21 | t>>(64-21) 341 | t = a[4] ^ d4 342 | bc4 = t<<14 | t>>(64-14) 343 | a[0] = bc0 ^ (bc2 &^ bc1) ^ rc[i+3] 344 | a[1] = bc1 ^ (bc3 &^ bc2) 345 | a[2] = bc2 ^ (bc4 &^ bc3) 346 | a[3] = bc3 ^ (bc0 &^ bc4) 347 | a[4] = bc4 ^ (bc1 &^ bc0) 348 | 349 | t = a[5] ^ d0 350 | bc2 = t<<3 | t>>(64-3) 351 | t = a[6] ^ d1 352 | bc3 = t<<45 | t>>(64-45) 353 | t = a[7] ^ d2 354 | bc4 = t<<61 | t>>(64-61) 355 | t = a[8] ^ d3 356 | bc0 = t<<28 | t>>(64-28) 357 | t = a[9] ^ d4 358 | bc1 = t<<20 | t>>(64-20) 359 | a[5] = bc0 ^ (bc2 &^ bc1) 360 | a[6] = bc1 ^ (bc3 &^ bc2) 361 | a[7] = bc2 ^ (bc4 &^ bc3) 362 | a[8] = bc3 ^ (bc0 &^ bc4) 363 | a[9] = bc4 ^ (bc1 &^ bc0) 364 | 365 | t = a[10] ^ d0 366 | bc4 = t<<18 | t>>(64-18) 367 | t = a[11] ^ d1 368 | bc0 = t<<1 | t>>(64-1) 369 | t = a[12] ^ d2 370 | bc1 = t<<6 | t>>(64-6) 371 | t = a[13] ^ d3 372 | bc2 = t<<25 | t>>(64-25) 373 | t = a[14] ^ d4 374 | bc3 = t<<8 | t>>(64-8) 375 | a[10] = bc0 ^ (bc2 &^ bc1) 376 | a[11] = bc1 ^ (bc3 &^ bc2) 377 | a[12] = bc2 ^ (bc4 &^ bc3) 378 | a[13] = bc3 ^ (bc0 &^ bc4) 379 | a[14] = bc4 ^ (bc1 &^ bc0) 380 | 381 | t = a[15] ^ d0 382 | bc1 = t<<36 | t>>(64-36) 383 | t = a[16] ^ d1 384 | bc2 = t<<10 | t>>(64-10) 385 | t = a[17] ^ d2 386 | bc3 = t<<15 | t>>(64-15) 387 | t = a[18] ^ d3 388 | bc4 = t<<56 | t>>(64-56) 389 | t = a[19] ^ d4 390 | bc0 = t<<27 | t>>(64-27) 391 | a[15] = bc0 ^ (bc2 &^ bc1) 392 | a[16] = bc1 ^ (bc3 &^ bc2) 393 | a[17] = bc2 ^ (bc4 &^ bc3) 394 | a[18] = bc3 ^ (bc0 &^ bc4) 395 | a[19] = bc4 ^ (bc1 &^ bc0) 396 | 397 | t = a[20] ^ d0 398 | bc3 = t<<41 | t>>(64-41) 399 | t = a[21] ^ d1 400 | bc4 = t<<2 | t>>(64-2) 401 | t = a[22] ^ d2 402 | bc0 = t<<62 | t>>(64-62) 403 | t = a[23] ^ d3 404 | bc1 = t<<55 | t>>(64-55) 405 | t = a[24] ^ d4 406 | bc2 = t<<39 | t>>(64-39) 407 | a[20] = bc0 ^ (bc2 &^ bc1) 408 | a[21] = bc1 ^ (bc3 &^ bc2) 409 | a[22] = bc2 ^ (bc4 &^ bc3) 410 | a[23] = bc3 ^ (bc0 &^ bc4) 411 | a[24] = bc4 ^ (bc1 &^ bc0) 412 | } 413 | } 414 | } 415 | -------------------------------------------------------------------------------- /strobe/keccakf_amd64.go: -------------------------------------------------------------------------------- 1 | // Copyright 2015 The Go Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style 3 | // license that can be found in the LICENSE file. 4 | 5 | // +build amd64,!appengine,!gccgo 6 | 7 | package strobe 8 | 9 | // This function is implemented in keccakf_amd64.s. 10 | 11 | //go:noescape 12 | 13 | func keccakF1600(a *[25]uint64, nr int) 14 | -------------------------------------------------------------------------------- /strobe/keccakf_amd64.s: -------------------------------------------------------------------------------- 1 | // Copyright 2015 The Go Authors. All rights reserved. 2 | // Use of this source code is governed by a BSD-style 3 | // license that can be found in the LICENSE file. 4 | 5 | // +build amd64,!appengine,!gccgo 6 | 7 | // This code was translated into a form compatible with 6a from the public 8 | // domain sources at https://github.com/gvanas/KeccakCodePackage 9 | 10 | // Offsets in state 11 | #define _ba (0*8) 12 | #define _be (1*8) 13 | #define _bi (2*8) 14 | #define _bo (3*8) 15 | #define _bu (4*8) 16 | #define _ga (5*8) 17 | #define _ge (6*8) 18 | #define _gi (7*8) 19 | #define _go (8*8) 20 | #define _gu (9*8) 21 | #define _ka (10*8) 22 | #define _ke (11*8) 23 | #define _ki (12*8) 24 | #define _ko (13*8) 25 | #define _ku (14*8) 26 | #define _ma (15*8) 27 | #define _me (16*8) 28 | #define _mi (17*8) 29 | #define _mo (18*8) 30 | #define _mu (19*8) 31 | #define _sa (20*8) 32 | #define _se (21*8) 33 | #define _si (22*8) 34 | #define _so (23*8) 35 | #define _su (24*8) 36 | 37 | // Temporary registers 38 | #define rT1 AX 39 | 40 | // Round vars 41 | #define rpState DI 42 | #define rpStack SP 43 | 44 | #define rDa BX 45 | #define rDe CX 46 | #define rDi DX 47 | #define rDo R8 48 | #define rDu R9 49 | 50 | #define rBa R10 51 | #define rBe R11 52 | #define rBi R12 53 | #define rBo R13 54 | #define rBu R14 55 | 56 | #define rCa SI 57 | #define rCe BP 58 | #define rCi rBi 59 | #define rCo rBo 60 | #define rCu R15 61 | 62 | #define MOVQ_RBI_RCE MOVQ rBi, rCe 63 | #define XORQ_RT1_RCA XORQ rT1, rCa 64 | #define XORQ_RT1_RCE XORQ rT1, rCe 65 | #define XORQ_RBA_RCU XORQ rBa, rCu 66 | #define XORQ_RBE_RCU XORQ rBe, rCu 67 | #define XORQ_RDU_RCU XORQ rDu, rCu 68 | #define XORQ_RDA_RCA XORQ rDa, rCa 69 | #define XORQ_RDE_RCE XORQ rDe, rCe 70 | 71 | #define mKeccakRound(iState, oState, rc, B_RBI_RCE, G_RT1_RCA, G_RT1_RCE, G_RBA_RCU, K_RT1_RCA, K_RT1_RCE, K_RBA_RCU, M_RT1_RCA, M_RT1_RCE, M_RBE_RCU, S_RDU_RCU, S_RDA_RCA, S_RDE_RCE) \ 72 | /* Prepare round */ \ 73 | MOVQ rCe, rDa; \ 74 | ROLQ $1, rDa; \ 75 | \ 76 | MOVQ _bi(iState), rCi; \ 77 | XORQ _gi(iState), rDi; \ 78 | XORQ rCu, rDa; \ 79 | XORQ _ki(iState), rCi; \ 80 | XORQ _mi(iState), rDi; \ 81 | XORQ rDi, rCi; \ 82 | \ 83 | MOVQ rCi, rDe; \ 84 | ROLQ $1, rDe; \ 85 | \ 86 | MOVQ _bo(iState), rCo; \ 87 | XORQ _go(iState), rDo; \ 88 | XORQ rCa, rDe; \ 89 | XORQ _ko(iState), rCo; \ 90 | XORQ _mo(iState), rDo; \ 91 | XORQ rDo, rCo; \ 92 | \ 93 | MOVQ rCo, rDi; \ 94 | ROLQ $1, rDi; \ 95 | \ 96 | MOVQ rCu, rDo; \ 97 | XORQ rCe, rDi; \ 98 | ROLQ $1, rDo; \ 99 | \ 100 | MOVQ rCa, rDu; \ 101 | XORQ rCi, rDo; \ 102 | ROLQ $1, rDu; \ 103 | \ 104 | /* Result b */ \ 105 | MOVQ _ba(iState), rBa; \ 106 | MOVQ _ge(iState), rBe; \ 107 | XORQ rCo, rDu; \ 108 | MOVQ _ki(iState), rBi; \ 109 | MOVQ _mo(iState), rBo; \ 110 | MOVQ _su(iState), rBu; \ 111 | XORQ rDe, rBe; \ 112 | ROLQ $44, rBe; \ 113 | XORQ rDi, rBi; \ 114 | XORQ rDa, rBa; \ 115 | ROLQ $43, rBi; \ 116 | \ 117 | MOVQ rBe, rCa; \ 118 | MOVQ rc, rT1; \ 119 | ORQ rBi, rCa; \ 120 | XORQ rBa, rT1; \ 121 | XORQ rT1, rCa; \ 122 | MOVQ rCa, _ba(oState); \ 123 | \ 124 | XORQ rDu, rBu; \ 125 | ROLQ $14, rBu; \ 126 | MOVQ rBa, rCu; \ 127 | ANDQ rBe, rCu; \ 128 | XORQ rBu, rCu; \ 129 | MOVQ rCu, _bu(oState); \ 130 | \ 131 | XORQ rDo, rBo; \ 132 | ROLQ $21, rBo; \ 133 | MOVQ rBo, rT1; \ 134 | ANDQ rBu, rT1; \ 135 | XORQ rBi, rT1; \ 136 | MOVQ rT1, _bi(oState); \ 137 | \ 138 | NOTQ rBi; \ 139 | ORQ rBa, rBu; \ 140 | ORQ rBo, rBi; \ 141 | XORQ rBo, rBu; \ 142 | XORQ rBe, rBi; \ 143 | MOVQ rBu, _bo(oState); \ 144 | MOVQ rBi, _be(oState); \ 145 | B_RBI_RCE; \ 146 | \ 147 | /* Result g */ \ 148 | MOVQ _gu(iState), rBe; \ 149 | XORQ rDu, rBe; \ 150 | MOVQ _ka(iState), rBi; \ 151 | ROLQ $20, rBe; \ 152 | XORQ rDa, rBi; \ 153 | ROLQ $3, rBi; \ 154 | MOVQ _bo(iState), rBa; \ 155 | MOVQ rBe, rT1; \ 156 | ORQ rBi, rT1; \ 157 | XORQ rDo, rBa; \ 158 | MOVQ _me(iState), rBo; \ 159 | MOVQ _si(iState), rBu; \ 160 | ROLQ $28, rBa; \ 161 | XORQ rBa, rT1; \ 162 | MOVQ rT1, _ga(oState); \ 163 | G_RT1_RCA; \ 164 | \ 165 | XORQ rDe, rBo; \ 166 | ROLQ $45, rBo; \ 167 | MOVQ rBi, rT1; \ 168 | ANDQ rBo, rT1; \ 169 | XORQ rBe, rT1; \ 170 | MOVQ rT1, _ge(oState); \ 171 | G_RT1_RCE; \ 172 | \ 173 | XORQ rDi, rBu; \ 174 | ROLQ $61, rBu; \ 175 | MOVQ rBu, rT1; \ 176 | ORQ rBa, rT1; \ 177 | XORQ rBo, rT1; \ 178 | MOVQ rT1, _go(oState); \ 179 | \ 180 | ANDQ rBe, rBa; \ 181 | XORQ rBu, rBa; \ 182 | MOVQ rBa, _gu(oState); \ 183 | NOTQ rBu; \ 184 | G_RBA_RCU; \ 185 | \ 186 | ORQ rBu, rBo; \ 187 | XORQ rBi, rBo; \ 188 | MOVQ rBo, _gi(oState); \ 189 | \ 190 | /* Result k */ \ 191 | MOVQ _be(iState), rBa; \ 192 | MOVQ _gi(iState), rBe; \ 193 | MOVQ _ko(iState), rBi; \ 194 | MOVQ _mu(iState), rBo; \ 195 | MOVQ _sa(iState), rBu; \ 196 | XORQ rDi, rBe; \ 197 | ROLQ $6, rBe; \ 198 | XORQ rDo, rBi; \ 199 | ROLQ $25, rBi; \ 200 | MOVQ rBe, rT1; \ 201 | ORQ rBi, rT1; \ 202 | XORQ rDe, rBa; \ 203 | ROLQ $1, rBa; \ 204 | XORQ rBa, rT1; \ 205 | MOVQ rT1, _ka(oState); \ 206 | K_RT1_RCA; \ 207 | \ 208 | XORQ rDu, rBo; \ 209 | ROLQ $8, rBo; \ 210 | MOVQ rBi, rT1; \ 211 | ANDQ rBo, rT1; \ 212 | XORQ rBe, rT1; \ 213 | MOVQ rT1, _ke(oState); \ 214 | K_RT1_RCE; \ 215 | \ 216 | XORQ rDa, rBu; \ 217 | ROLQ $18, rBu; \ 218 | NOTQ rBo; \ 219 | MOVQ rBo, rT1; \ 220 | ANDQ rBu, rT1; \ 221 | XORQ rBi, rT1; \ 222 | MOVQ rT1, _ki(oState); \ 223 | \ 224 | MOVQ rBu, rT1; \ 225 | ORQ rBa, rT1; \ 226 | XORQ rBo, rT1; \ 227 | MOVQ rT1, _ko(oState); \ 228 | \ 229 | ANDQ rBe, rBa; \ 230 | XORQ rBu, rBa; \ 231 | MOVQ rBa, _ku(oState); \ 232 | K_RBA_RCU; \ 233 | \ 234 | /* Result m */ \ 235 | MOVQ _ga(iState), rBe; \ 236 | XORQ rDa, rBe; \ 237 | MOVQ _ke(iState), rBi; \ 238 | ROLQ $36, rBe; \ 239 | XORQ rDe, rBi; \ 240 | MOVQ _bu(iState), rBa; \ 241 | ROLQ $10, rBi; \ 242 | MOVQ rBe, rT1; \ 243 | MOVQ _mi(iState), rBo; \ 244 | ANDQ rBi, rT1; \ 245 | XORQ rDu, rBa; \ 246 | MOVQ _so(iState), rBu; \ 247 | ROLQ $27, rBa; \ 248 | XORQ rBa, rT1; \ 249 | MOVQ rT1, _ma(oState); \ 250 | M_RT1_RCA; \ 251 | \ 252 | XORQ rDi, rBo; \ 253 | ROLQ $15, rBo; \ 254 | MOVQ rBi, rT1; \ 255 | ORQ rBo, rT1; \ 256 | XORQ rBe, rT1; \ 257 | MOVQ rT1, _me(oState); \ 258 | M_RT1_RCE; \ 259 | \ 260 | XORQ rDo, rBu; \ 261 | ROLQ $56, rBu; \ 262 | NOTQ rBo; \ 263 | MOVQ rBo, rT1; \ 264 | ORQ rBu, rT1; \ 265 | XORQ rBi, rT1; \ 266 | MOVQ rT1, _mi(oState); \ 267 | \ 268 | ORQ rBa, rBe; \ 269 | XORQ rBu, rBe; \ 270 | MOVQ rBe, _mu(oState); \ 271 | \ 272 | ANDQ rBa, rBu; \ 273 | XORQ rBo, rBu; \ 274 | MOVQ rBu, _mo(oState); \ 275 | M_RBE_RCU; \ 276 | \ 277 | /* Result s */ \ 278 | MOVQ _bi(iState), rBa; \ 279 | MOVQ _go(iState), rBe; \ 280 | MOVQ _ku(iState), rBi; \ 281 | XORQ rDi, rBa; \ 282 | MOVQ _ma(iState), rBo; \ 283 | ROLQ $62, rBa; \ 284 | XORQ rDo, rBe; \ 285 | MOVQ _se(iState), rBu; \ 286 | ROLQ $55, rBe; \ 287 | \ 288 | XORQ rDu, rBi; \ 289 | MOVQ rBa, rDu; \ 290 | XORQ rDe, rBu; \ 291 | ROLQ $2, rBu; \ 292 | ANDQ rBe, rDu; \ 293 | XORQ rBu, rDu; \ 294 | MOVQ rDu, _su(oState); \ 295 | \ 296 | ROLQ $39, rBi; \ 297 | S_RDU_RCU; \ 298 | NOTQ rBe; \ 299 | XORQ rDa, rBo; \ 300 | MOVQ rBe, rDa; \ 301 | ANDQ rBi, rDa; \ 302 | XORQ rBa, rDa; \ 303 | MOVQ rDa, _sa(oState); \ 304 | S_RDA_RCA; \ 305 | \ 306 | ROLQ $41, rBo; \ 307 | MOVQ rBi, rDe; \ 308 | ORQ rBo, rDe; \ 309 | XORQ rBe, rDe; \ 310 | MOVQ rDe, _se(oState); \ 311 | S_RDE_RCE; \ 312 | \ 313 | MOVQ rBo, rDi; \ 314 | MOVQ rBu, rDo; \ 315 | ANDQ rBu, rDi; \ 316 | ORQ rBa, rDo; \ 317 | XORQ rBi, rDi; \ 318 | XORQ rBo, rDo; \ 319 | MOVQ rDi, _si(oState); \ 320 | MOVQ rDo, _so(oState) \ 321 | 322 | // func keccakF1600(state *[25]uint64, nr int) 323 | TEXT ·keccakF1600(SB), 0, $200-8 324 | MOVQ state+0(FP), rpState 325 | 326 | // Convert the user state into an internal state 327 | NOTQ _be(rpState) 328 | NOTQ _bi(rpState) 329 | NOTQ _go(rpState) 330 | NOTQ _ki(rpState) 331 | NOTQ _mi(rpState) 332 | NOTQ _sa(rpState) 333 | 334 | // Execute the KeccakF permutation 335 | MOVQ _ba(rpState), rCa 336 | MOVQ _be(rpState), rCe 337 | MOVQ _bu(rpState), rCu 338 | 339 | XORQ _ga(rpState), rCa 340 | XORQ _ge(rpState), rCe 341 | XORQ _gu(rpState), rCu 342 | 343 | XORQ _ka(rpState), rCa 344 | XORQ _ke(rpState), rCe 345 | XORQ _ku(rpState), rCu 346 | 347 | XORQ _ma(rpState), rCa 348 | XORQ _me(rpState), rCe 349 | XORQ _mu(rpState), rCu 350 | 351 | XORQ _sa(rpState), rCa 352 | XORQ _se(rpState), rCe 353 | MOVQ _si(rpState), rDi 354 | MOVQ _so(rpState), rDo 355 | XORQ _su(rpState), rCu 356 | 357 | CMPQ nr+8(FP), $12 358 | JEQ Keccak12Rounds 359 | 360 | mKeccakRound(rpState, rpStack, $0x0000000000000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 361 | mKeccakRound(rpStack, rpState, $0x0000000000008082, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 362 | mKeccakRound(rpState, rpStack, $0x800000000000808a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 363 | mKeccakRound(rpStack, rpState, $0x8000000080008000, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 364 | mKeccakRound(rpState, rpStack, $0x000000000000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 365 | mKeccakRound(rpStack, rpState, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 366 | mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 367 | mKeccakRound(rpStack, rpState, $0x8000000000008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 368 | mKeccakRound(rpState, rpStack, $0x000000000000008a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 369 | mKeccakRound(rpStack, rpState, $0x0000000000000088, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 370 | mKeccakRound(rpState, rpStack, $0x0000000080008009, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 371 | mKeccakRound(rpStack, rpState, $0x000000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 372 | Keccak12Rounds: 373 | mKeccakRound(rpState, rpStack, $0x000000008000808b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 374 | mKeccakRound(rpStack, rpState, $0x800000000000008b, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 375 | mKeccakRound(rpState, rpStack, $0x8000000000008089, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 376 | mKeccakRound(rpStack, rpState, $0x8000000000008003, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 377 | mKeccakRound(rpState, rpStack, $0x8000000000008002, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 378 | mKeccakRound(rpStack, rpState, $0x8000000000000080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 379 | mKeccakRound(rpState, rpStack, $0x000000000000800a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 380 | mKeccakRound(rpStack, rpState, $0x800000008000000a, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 381 | mKeccakRound(rpState, rpStack, $0x8000000080008081, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 382 | mKeccakRound(rpStack, rpState, $0x8000000000008080, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 383 | mKeccakRound(rpState, rpStack, $0x0000000080000001, MOVQ_RBI_RCE, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBA_RCU, XORQ_RT1_RCA, XORQ_RT1_RCE, XORQ_RBE_RCU, XORQ_RDU_RCU, XORQ_RDA_RCA, XORQ_RDE_RCE) 384 | mKeccakRound(rpStack, rpState, $0x8000000080008008, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP, NOP) 385 | 386 | // Revert the internal state to the user state 387 | NOTQ _be(rpState) 388 | NOTQ _bi(rpState) 389 | NOTQ _go(rpState) 390 | NOTQ _ki(rpState) 391 | NOTQ _mi(rpState) 392 | NOTQ _sa(rpState) 393 | 394 | RET 395 | -------------------------------------------------------------------------------- /strobe/strobe.go: -------------------------------------------------------------------------------- 1 | package strobe 2 | 3 | /***************************************************/ 4 | /* 5 | /* This is a compact implementation of Strobe. 6 | /* As it hasn't been thoroughly tested only use this 7 | /* for experimental purposes :) 8 | /* 9 | /* Author: David Wong 10 | /* Contact: www.cryptologie.net/contact 11 | /* 12 | /***************************************************/ 13 | 14 | import ( 15 | "bytes" 16 | "encoding/binary" 17 | "encoding/hex" 18 | ) 19 | 20 | const ( 21 | // The size of the authentication tag used in AEAD functions 22 | MACLEN = 16 23 | ) 24 | 25 | // KEY inserts a key into the state. 26 | // It also provides forward secrecy. 27 | func (s *Strobe) KEY(key []byte) { 28 | s.Operate(false, "KEY", key, 0, false) 29 | } 30 | 31 | // PRF provides a hash of length `output_len` of all previous operations 32 | // It can also be used to generate random numbers, it is forward secure. 33 | func (s *Strobe) PRF(outputLen int) []byte { 34 | return s.Operate(false, "PRF", []byte{}, outputLen, false) 35 | } 36 | 37 | // Send_ENC_unauthenticated is used to encrypt some plaintext 38 | // it should be followed by Send_MAC in order to protect its integrity 39 | // `meta` is used for encrypted framing data. 40 | func (s *Strobe) Send_ENC_unauthenticated(meta bool, plaintext []byte) []byte { 41 | return s.Operate(meta, "send_ENC", plaintext, 0, false) 42 | } 43 | 44 | // Recv_ENC_unauthenticated is used to decrypt some received ciphertext 45 | // it should be followed by Recv_MAC in order to protect its integrity 46 | // `meta` is used for decrypting framing data. 47 | func (s *Strobe) Recv_ENC_unauthenticated(meta bool, ciphertext []byte) []byte { 48 | return s.Operate(meta, "recv_ENC", ciphertext, 0, false) 49 | } 50 | 51 | // AD allows you to authenticate Additional Data 52 | // it should be followed by a Send_MAC or Recv_MAC in order to truly work 53 | func (s *Strobe) AD(meta bool, additionalData []byte) { 54 | s.Operate(meta, "AD", additionalData, 0, false) 55 | } 56 | 57 | // Send_CLR allows you to send data in cleartext 58 | // `meta` is used to send framing data 59 | func (s *Strobe) Send_CLR(meta bool, cleartext []byte) { 60 | s.Operate(meta, "send_CLR", cleartext, 0, false) 61 | } 62 | 63 | // Recv_CLR allows you to receive data in cleartext. 64 | // `meta` is used to receive framing data 65 | func (s *Strobe) Recv_CLR(meta bool, cleartext []byte) { 66 | s.Operate(meta, "recv_CLR", cleartext, 0, false) 67 | } 68 | 69 | // Send_MAC allows you to produce an authentication tag. 70 | // `meta` is appropriate for checking the integrity of framing data. 71 | func (s *Strobe) Send_MAC(meta bool, output_length int) []byte { 72 | return s.Operate(meta, "send_MAC", []byte{}, output_length, false) 73 | } 74 | 75 | // Recv_MAC allows you to verify a received authentication tag. 76 | // `meta` is appropriate for checking the integrity of framing data. 77 | func (s *Strobe) Recv_MAC(meta bool, MAC []byte) bool { 78 | if s.Operate(meta, "recv_MAC", MAC, 0, false)[0] == 0 { 79 | return true 80 | } 81 | return false 82 | } 83 | 84 | // RATCHET allows you to introduce forward secrecy in a protocol. 85 | func (s *Strobe) RATCHET(length int) { 86 | s.Operate(false, "RATCHET", []byte{}, length, false) 87 | } 88 | 89 | // Send_AEAD allows you to encrypt data and authenticate additional data 90 | // It is similar to AES-GCM. 91 | func (s *Strobe) Send_AEAD(plaintext, ad []byte) (ciphertext []byte) { 92 | ciphertext = append(ciphertext, s.Send_ENC_unauthenticated(false, plaintext)...) 93 | s.AD(false, ad) 94 | ciphertext = append(ciphertext, s.Send_MAC(false, MACLEN)...) 95 | return 96 | } 97 | 98 | // Recv_AEAD allows you to decrypt data and authenticate additional data 99 | // It is similar to AES-GCM. 100 | func (s *Strobe) Recv_AEAD(ciphertext, ad []byte) (plaintext []byte, ok bool) { 101 | if len(ciphertext) < MACLEN { 102 | ok = false 103 | return 104 | } 105 | plaintext = s.Recv_ENC_unauthenticated(false, ciphertext[:len(ciphertext)-MACLEN]) 106 | s.AD(false, ad) 107 | ok = s.Recv_MAC(false, ciphertext[len(ciphertext)-MACLEN:]) 108 | return 109 | } 110 | 111 | // 112 | // Strobe Objects 113 | // 114 | 115 | type role uint8 // for strobe.I0 116 | 117 | const ( 118 | iInitiator role = iota // set if we send the first transport message 119 | iResponder // set if we receive the first transport message 120 | iNone // starting value 121 | ) 122 | 123 | /* 124 | We do not use strobe's `pos` variable here since it is easily 125 | obtainable via `len(buf)` 126 | */ 127 | // TODO: accept permutations of different sizes 128 | type Strobe struct { 129 | // config 130 | duplexRate int // 1600/8 - security/4 131 | StrobeR int // duplexRate - 2 132 | 133 | // strobe specific 134 | initialized bool // used to avoid padding during the first permutation 135 | posBegin uint8 // start of the current operation (0 := previous block) 136 | I0 role 137 | 138 | // streaming API 139 | curFlags flag 140 | 141 | // duplex construction (see sha3.go) 142 | a [25]uint64 // the actual state 143 | buf []byte // a pointer into the storage, it also serves as `pos` variable 144 | storage []byte // to-be-XORed (used for optimizations purposes) 145 | tempStateBuf []byte // utility slice used for temporary duplexing operations 146 | } 147 | 148 | // Clone allows you to clone a Strobe state. 149 | func (s Strobe) Clone() *Strobe { 150 | ret := s 151 | // need to recreate some buffers 152 | ret.storage = make([]byte, s.duplexRate) 153 | copy(ret.storage, s.storage) 154 | ret.tempStateBuf = make([]byte, s.duplexRate) 155 | copy(ret.tempStateBuf, s.tempStateBuf) 156 | // and set pointers 157 | ret.buf = ret.storage[:len(ret.buf)] 158 | return &ret 159 | } 160 | 161 | // Serialize allows one to serialize the strobe state to later recover it. 162 | // [security(1)|initialized(1)|I0(1)|curFlags(1)|posBegin(1)|pos(1)|[25]uint64 state] 163 | func (s Strobe) Serialize() []byte { 164 | // serialized data 165 | serialized := make([]byte, 6+25*8) // TODO: this is only for keccak-f[1600] 166 | // security? 167 | security := (1600/8 - s.duplexRate) * 4 168 | if security == 128 { 169 | serialized[0] = 0 170 | } else { 171 | serialized[0] = 1 172 | } 173 | // initialized? 174 | if s.initialized { 175 | serialized[1] = 1 176 | } else { 177 | serialized[1] = 0 178 | } 179 | // I0 180 | serialized[2] = byte(s.I0) 181 | // curFlags 182 | serialized[3] = byte(s.curFlags) 183 | // posBegin 184 | serialized[4] = byte(s.posBegin) 185 | // pos 186 | serialized[5] = byte(len(s.buf)) 187 | // make sure to XOR what's left to XOR in the storage 188 | var buf [1600 / 8]byte 189 | var state [25]uint64 190 | copy(buf[:len(s.buf)], s.storage[:len(s.buf)]) // len(s.buf) = pos 191 | copy(state[:], s.a[:]) 192 | xorState(&state, buf[:]) 193 | // state 194 | var b []byte 195 | b = serialized[6:] 196 | for i := 0; len(b) >= 8; i++ { 197 | binary.LittleEndian.PutUint64(b, state[i]) 198 | b = b[8:] 199 | } 200 | // 201 | return serialized 202 | } 203 | 204 | // Recover state allows one to re-create a strobe state from a serialized state. 205 | // [security(1)|initialized(1)|I0(1)|curFlags(1)|posBegin(1)|pos(1)|[25]uint64 state] 206 | func RecoverState(serialized []byte) (s Strobe) { 207 | if len(serialized) != 6+25*8 { 208 | panic("strobe: cannot recover state of invalid length") 209 | } 210 | // security? 211 | if serialized[0] > 1 { 212 | panic("strobe: cannot recover state with invalid security") 213 | } 214 | security := 128 215 | if security == 1 { 216 | security = 256 217 | } 218 | // init vars from security 219 | s.duplexRate = 1600/8 - security/4 220 | s.StrobeR = s.duplexRate - 2 221 | // need to recreate some buffers 222 | s.storage = make([]byte, s.duplexRate) 223 | s.tempStateBuf = make([]byte, s.duplexRate) 224 | // initialized? 225 | if serialized[1] == 1 { 226 | s.initialized = true 227 | } else { 228 | s.initialized = false 229 | } 230 | // I0? 231 | if serialized[2] > 3 { 232 | panic("strobe: cannot recover state with invalid role") 233 | } 234 | s.I0 = role(serialized[2]) 235 | // curFlags + posBegin 236 | s.curFlags = flag(serialized[3]) 237 | s.posBegin = uint8(serialized[4]) 238 | // pos 239 | pos := int(serialized[5]) 240 | s.buf = s.storage[:pos] 241 | // state 242 | serialized = serialized[6:] 243 | for i := 0; i < 25; i++ { 244 | a := binary.LittleEndian.Uint64(serialized[:8]) 245 | s.a[i] = a 246 | serialized = serialized[8:] 247 | } 248 | // 249 | return 250 | } 251 | 252 | // 253 | // Flags 254 | // 255 | 256 | type flag uint8 257 | 258 | const ( 259 | flagI flag = 1 << iota 260 | flagA 261 | flagC 262 | flagT 263 | flagM 264 | flagK 265 | ) 266 | 267 | var operationMap = map[string]flag{ 268 | "AD": flagA, 269 | "KEY": flagA | flagC, 270 | "PRF": flagI | flagA | flagC, 271 | "send_CLR": flagA | flagT, 272 | "recv_CLR": flagI | flagA | flagT, 273 | "send_ENC": flagA | flagC | flagT, 274 | "recv_ENC": flagI | flagA | flagC | flagT, 275 | "send_MAC": flagC | flagT, 276 | "recv_MAC": flagI | flagC | flagT, 277 | "RATCHET": flagC, 278 | } 279 | 280 | // 281 | // Helper 282 | // 283 | 284 | // this only works for 8-byte alligned buffers 285 | func xorState(state *[25]uint64, buf []byte) { 286 | n := len(buf) / 8 287 | for i := 0; i < n; i++ { 288 | a := binary.LittleEndian.Uint64(buf) 289 | state[i] ^= a 290 | buf = buf[8:] 291 | } 292 | } 293 | 294 | // this only works for 8-byte alligned buffers 295 | func outState(state [25]uint64, b []byte) { 296 | for i := 0; len(b) >= 8; i++ { 297 | binary.LittleEndian.PutUint64(b, state[i]) 298 | b = b[8:] 299 | } 300 | } 301 | 302 | // since the golang implementation does not absorb 303 | // things in the state "right away" (sometimes just 304 | // wait for the buffer to fill) we need a function 305 | // to properly print the state even when the state 306 | // is in this "temporary" state. 307 | func (s Strobe) debugPrintState() string { 308 | // copy _storage into buf 309 | var buf [1600 / 8]byte 310 | copy(buf[:len(s.buf)], s.storage[:len(s.buf)]) 311 | // copy _state into state 312 | var state [25]uint64 313 | copy(state[:], s.a[:]) 314 | // xor 315 | xorState(&state, buf[:]) 316 | // print 317 | outState(state, buf[:]) 318 | return hex.EncodeToString(buf[:]) 319 | } 320 | 321 | // 322 | // Core functions 323 | // 324 | 325 | // InitStrobe allows you to initialize a new strobe instance with a customization string (that can be empty) and a security target (either 128 or 256). 326 | func InitStrobe(customizationString string, security int) (s Strobe) { 327 | // compute security and rate 328 | if security != 128 && security != 256 { 329 | panic("strobe: security must be set to either 128 or 256") 330 | } 331 | s.duplexRate = 1600/8 - security/4 332 | s.StrobeR = s.duplexRate - 2 333 | // init vars 334 | s.storage = make([]byte, s.duplexRate) 335 | s.tempStateBuf = make([]byte, s.duplexRate) 336 | s.I0 = iNone 337 | s.initialized = false 338 | // absorb domain + initialize + absorb custom string 339 | domain := []byte{1, byte(s.StrobeR + 2), 1, 0, 1, 12 * 8} 340 | domain = append(domain, []byte("STROBEv1.0.2")...) 341 | s.buf = s.storage[:0] 342 | s.duplex(domain, false, false, true) 343 | s.initialized = true 344 | s.Operate(true, "AD", []byte(customizationString), 0, false) 345 | 346 | return 347 | } 348 | 349 | // runF: applies the STROBE's + cSHAKE's padding and the Keccak permutation 350 | func (s *Strobe) runF() { 351 | if s.initialized { 352 | // if we're initialize we apply the strobe padding 353 | if len(s.buf) > s.StrobeR { 354 | panic("strobe: buffer is never supposed to reach strobeR") 355 | } 356 | s.buf = append(s.buf, s.posBegin) 357 | s.buf = append(s.buf, 0x04) 358 | zerosStart := len(s.buf) 359 | s.buf = s.storage[:s.duplexRate] 360 | for i := zerosStart; i < s.duplexRate; i++ { 361 | s.buf[i] = 0 362 | } 363 | s.buf[s.duplexRate-1] ^= 0x80 364 | xorState(&s.a, s.buf) 365 | } else if len(s.buf) != 0 { 366 | // otherwise we just pad with 0s for xorState to work 367 | zerosStart := len(s.buf) // rate = [0--end_of_buffer/zeroStart---duplexRate] 368 | s.buf = s.storage[:s.duplexRate] 369 | for i := zerosStart; i < s.duplexRate; i++ { 370 | s.buf[i] = 0 371 | } 372 | xorState(&s.a, s.buf) 373 | } 374 | 375 | // run the permutation 376 | keccakF1600(&s.a, 24) 377 | 378 | // reset the buffer and set posBegin to 0 379 | // (meaning that the current operation started on a previous block) 380 | s.buf = s.storage[:0] 381 | s.posBegin = 0 382 | } 383 | 384 | // duplex: the duplex call 385 | func (s *Strobe) duplex(data []byte, cbefore, cafter, forceF bool) { 386 | 387 | // process data block by block 388 | for len(data) > 0 { 389 | 390 | todo := s.StrobeR - len(s.buf) 391 | if todo > len(data) { 392 | todo = len(data) 393 | } 394 | 395 | if cbefore { 396 | outState(s.a, s.tempStateBuf) 397 | for idx, state := range s.tempStateBuf[len(s.buf) : len(s.buf)+todo] { 398 | data[idx] ^= state 399 | } 400 | } 401 | 402 | // buffer what's to be XOR'ed (we XOR once during runF) 403 | s.buf = append(s.buf, data[:todo]...) 404 | 405 | if cafter { 406 | outState(s.a, s.tempStateBuf) 407 | for idx, state := range s.tempStateBuf[len(s.buf)-todo : len(s.buf)] { 408 | data[idx] ^= state 409 | } 410 | } 411 | 412 | // what's next for the loop? 413 | data = data[todo:] 414 | 415 | // If the duplex is full, time to XOR + padd + permutate. 416 | if len(s.buf) == s.StrobeR { 417 | s.runF() 418 | } 419 | 420 | } 421 | 422 | // sometimes we the next operation to start on a new block 423 | if forceF && len(s.buf) != 0 { 424 | s.runF() 425 | } 426 | 427 | return 428 | } 429 | 430 | // Operate runs an operation (see OperationMap for a list of operations). 431 | // For operations that only require a length, provide the length via the 432 | // length argument with an empty slice []byte{}. For other operations provide 433 | // a zero length. 434 | // Result is always retrieved through the return value. For boolean results, 435 | // check that the first index is 0 for true, 1 for false. 436 | func (s *Strobe) Operate(meta bool, operation string, dataConst []byte, length int, more bool) []byte { 437 | // operation is valid? 438 | var flags flag 439 | var ok bool 440 | if flags, ok = operationMap[operation]; !ok { 441 | panic("not a valid operation") 442 | } 443 | 444 | // operation is meta? 445 | if meta { 446 | flags |= flagM 447 | } 448 | 449 | // does the operation requires a length? 450 | var data []byte 451 | 452 | if (flags&(flagI|flagT) != (flagI | flagT)) && (flags&(flagI|flagA) != flagA) { 453 | 454 | if length == 0 { 455 | panic("A length should be set for this operation.") 456 | } 457 | 458 | data = bytes.Repeat([]byte{0}, length) 459 | 460 | } else { 461 | if length != 0 { 462 | panic("Output length must be zero except for PRF, send_MAC and RATCHET operations.") 463 | } 464 | 465 | data = make([]byte, len(dataConst)) 466 | copy(data, dataConst) 467 | } 468 | 469 | // is this call the continuity of a previous call? 470 | if more { 471 | if flags != s.curFlags { 472 | panic("Flag should be the same when streaming operations.") 473 | } 474 | } else { 475 | s.beginOp(flags) 476 | s.curFlags = flags 477 | } 478 | 479 | // Operation 480 | cAfter := (flags & (flagC | flagI | flagT)) == (flagC | flagT) 481 | cBefore := (flags&flagC != 0) && (!cAfter) 482 | 483 | s.duplex(data, cBefore, cAfter, false) 484 | 485 | if (flags & (flagI | flagA)) == (flagI | flagA) { 486 | // Return data for the application 487 | return data 488 | } else if (flags & (flagI | flagT)) == flagT { 489 | // Return data for the transport. 490 | return data 491 | } else if (flags & (flagI | flagA | flagT)) == (flagI | flagT) { 492 | // Check MAC: all output bytes must be 0 493 | if more { 494 | panic("not supposed to check a MAC with the 'more' streaming option") 495 | } 496 | var failures byte 497 | for _, dataByte := range data { 498 | failures |= dataByte 499 | } 500 | return []byte{failures} // 0 if correct, 1 if not 501 | } 502 | 503 | // Operation has no output 504 | return nil 505 | } 506 | 507 | // beginOp: starts an operation 508 | func (s *Strobe) beginOp(flags flag) { 509 | 510 | if flags&flagT != 0 { 511 | if s.I0 == iNone { 512 | s.I0 = role(flags & flagI) 513 | } 514 | flags ^= flag(s.I0) 515 | } 516 | 517 | oldBegin := s.posBegin 518 | s.posBegin = uint8(len(s.buf) + 1) // s.pos + 1 519 | forceF := (flags&(flagC|flagK) != 0) 520 | s.duplex([]byte{oldBegin, byte(flags)}, false, false, forceF) 521 | } 522 | -------------------------------------------------------------------------------- /strobe/strobe_test.go: -------------------------------------------------------------------------------- 1 | package strobe 2 | 3 | import ( 4 | "encoding/hex" 5 | "testing" 6 | ) 7 | 8 | var message = []byte("hello, how are you good sir?") 9 | 10 | func TestClone(t *testing.T) { 11 | 12 | s1 := InitStrobe("myHash", 128) 13 | s2 := s1.Clone() 14 | 15 | s1.Operate(false, "AD", message, 0, false) 16 | out1 := hex.EncodeToString(s1.PRF(32)) 17 | 18 | s2.Operate(false, "AD", message, 0, false) 19 | out2 := hex.EncodeToString(s2.PRF(32)) 20 | 21 | if out1 != out2 { 22 | t.Fatal("strobe cannot clone correctly") 23 | } 24 | 25 | s1.Operate(false, "send_ENC", message, 0, false) 26 | out1 = hex.EncodeToString(s1.PRF(32)) 27 | 28 | s2.Operate(false, "send_ENC", message, 0, false) 29 | out2 = hex.EncodeToString(s2.PRF(32)) 30 | 31 | if out1 != out2 { 32 | t.Fatal("strobe cannot clone correctly") 33 | } 34 | 35 | } 36 | 37 | func TestStream(t *testing.T) { 38 | message1 := "hello" 39 | message2 := "how are you good sir?" 40 | fullmessage := message1 + message2 41 | 42 | s1 := InitStrobe("myHash", 128) 43 | s2 := s1.Clone() 44 | 45 | s1.Operate(false, "AD", []byte(fullmessage), 0, false) 46 | out1 := hex.EncodeToString(s1.PRF(32)) 47 | 48 | s2.Operate(false, "AD", []byte(message1), 0, false) 49 | s2.Operate(false, "AD", []byte(message2), 0, true) 50 | out2 := hex.EncodeToString(s2.PRF(32)) 51 | 52 | if out1 != out2 { 53 | t.Fatal("strobe cannot stream correctly") 54 | } 55 | } 56 | 57 | func TestStream2(t *testing.T) { 58 | s := InitStrobe("custom string number 2, that's a pretty long string", 128) 59 | key := []byte("0101010100100101010101010101001001") 60 | s.Operate(false, "KEY", key, 0, false) 61 | s.Operate(false, "KEY", key, 0, true) 62 | message := []byte("hello, how are you good sir? ????") 63 | s.Operate(false, "AD", message, 0, false) 64 | s.Operate(false, "AD", message, 0, true) 65 | s.Operate(false, "AD", message, 0, false) 66 | if s.debugPrintState() != "5117b46c2d842655c1be2a69f64f16aaaad2c0050fe2ac5446afe44345a9b10d044c8b3ec8005a9e362c0a431ab5c4d8228c2f890ae56ad3fef4404aa6cc76704b503d627553ae9635d329cdfa86ed29ec0dd79787ff3fcefdee7463c053ef3b4a4fa7c8eb89a6372df2c4ccfc7469d7447bd19a67940642334706e5ff6b1ef58514e55c6b5c6921c58eb7cb5c57978c92c42e598926fcfdcd9705fb948ed6fe9027c65fb0659c98a9c9668d523dfa2b27bde76224944503b686901c989fedac34994dd16daedf00" { 67 | t.Fatal("this is not working") 68 | } 69 | } 70 | 71 | func TestRecover(t *testing.T) { 72 | s := InitStrobe("custom string number 2, that's a pretty long string", 128) 73 | key := []byte("0101010100100101010101010101001001") 74 | s.Operate(false, "KEY", key, 0, false) 75 | s.Operate(false, "KEY", key, 0, true) 76 | 77 | // serialize and clone 78 | cloned := s.Clone() 79 | serialized := s.Serialize() 80 | 81 | // recover 82 | recovered := RecoverState(serialized) 83 | 84 | // and compare recovered and cloned 85 | recovered.Operate(false, "send_ENC", message, 0, false) 86 | out1 := hex.EncodeToString(recovered.PRF(32)) 87 | 88 | cloned.Operate(false, "send_ENC", message, 0, false) 89 | out2 := hex.EncodeToString(cloned.PRF(32)) 90 | 91 | if out1 != out2 { 92 | t.Fatal("strobe cannot serialize/recover correctly") 93 | } 94 | 95 | recovered.Operate(false, "send_MAC", []byte{}, 16, false) 96 | out1 = hex.EncodeToString(recovered.PRF(32)) 97 | 98 | cloned.Operate(false, "send_MAC", []byte{}, 16, false) 99 | out2 = hex.EncodeToString(cloned.PRF(32)) 100 | 101 | if out1 != out2 { 102 | t.Fatal("strobe cannot serialize/recover correctly") 103 | } 104 | } 105 | -------------------------------------------------------------------------------- /strobe/test_vectors/test_vectors.json: -------------------------------------------------------------------------------- 1 | {"test_vectors":[{"name":"simple tests","operations":[{"name":"init","custom_string":"custom string","security":128,"meta":false,"state_after":"9c7f75fa8b893ab70ad448513c0b5263dc0c475c551526f6733bea22f16cb57cd31f682e660ee912824a772201ee1394226f4afcb62d331293cc92e8a624acf6e1b60095e322bbfbc845e5b26995fe7d7c841374d1ff5898c92ee0636b06727321c92a603907035349ccbb1b92b7b0057e8fa87fcebc7e88656fcb45ae04bc34cabeaebe79d91750c0e8bf13b966504d1343597265dd8865adf91409cc9b20d5f47444041f97b699ddfbdee91ea87bd09bf8b02da75a96e947f07f5b65bb4e6efefaa16abfd9fbf6","stream":false},{"name":"KEY","meta":false,"input_data":"303130313031","state_after":"3031303130310e6be02d3677fb5a70dfc1f3a6f889f561699f053f97f705d671383c613b13b3e4184397827ad73b9c26e13af703f0bf70ff10d71516bb8a05a5b69775f1722daf9178b71cfca96cf36cd0fab68cac22f3f35afec0bf5066656d142761e3200b9e76a9ddd6ad74932110afd4a776fd82515edfe028dd4858abfda1c3b6bff17e9b82aad3b519e51e704cba48a6e383c8504cd1f7b13d7a6ac6e9690ed05ae90744c5c32a97af08d66f15c9357bf20ea9276cab5ac736b8a68f25b095c409a1c48fd4","stream":false},{"name":"AD","meta":false,"input_data":"68656c6c6f2c20686f772061726520796f7520676f6f64207369723f","state_after":"3031303130310e6988485a1b947650b7ae848699fb904110f0701ff0986ab2514b55130413b3e4184397827ad73b9c26e13af703f0bf70ff10d71516bb8a05a5b69775f1722daf9178b71cfca96cf36cd0fab68cac22f3f35afec0bf5066656d142761e3200b9e76a9ddd6ad74932110afd4a776fd82515edfe028dd4858abfda1c3b6bff17e9b82aad3b519e51e704cba48a6e383c8504cd1f7b13d7a6ac6e9690ed05ae90744c5c32a97af08d66f15c9357bf20ea9276cab5ac736b8a68f25b095c409a1c48fd4","stream":false},{"name":"PRF","meta":false,"input_length":16,"output":"5ce86d0815c02a27d8bdd923f2cb0bd8","state_after":"000000000000000000000000000000006380b09c7f711ca1c97eb6612cf25c2ab2abfb9cba447b27e72134629c3947281a0be4044d4e03c60564c66885407a2e6982603b07390ab718c0fa70f25e857c189caf2bdf42786669bc2f5d43440869e8feb7d47780383bb82c84705220c4d08b5df18081cb4939f3a38d059ee18529e85c6dade82e3c8b3c6cd0b56203299bb7311dfcbb68d1b5be5df6d2b8697dd60e89ca4fd78ffbd1c22b939311775d913a8bf324b8ebac782e1f99605eccf03c0e59770c177812d1","stream":false},{"name":"RATCHET","meta":false,"input_length":32,"state_after":"00000000000000000000000000000000000000000000000000000000000000003c720704cf227c72bfd5ad2f23013a6837613e6bfcd9f4f051c5d16f4b70fc031f3086426e17eccfdb44a54c7bbe5574dc55c3c7243fc031d525f4b92b15593234b8a70002fa72fbb5d80387b2a9f3cb8116b97aca2a518d8492a2306bf05fbe151638fa523cce3fd9ac2ad53ceb5436769c7ff8756eb659535b909d45d16923b0784b725143a62d15d890251d6931df520f5b58524f197877e4c340062e22159adde94267ca811a","stream":false},{"name":"send_ENC","meta":false,"input_data":"686920686f772061726520796f75","output":"5dfb4863302857637184a2e633b3","state_after":"5dfb4863302857637184a2e633b31280c48b183746013d8a06f3a556630e0d823ad0498bbe61e469b9eca994cb173be8a273ce0917a2d0cc809547af2e3eadb4c44e8cc28253374fb82c0fdd5eb1220796673a8879d35afdf8005f448cdec958555dd36ac24da7971e1dad024edd3de24f0ecd2415ba8a50883ccf24d935e9a937ac79b1cdc205be55d361e224fa5babf5767ca7b5d3a625b1167387b49e925140926c1618efdc0c457898b05a4b4be5c053eb17e70625336dad4e7bdd5384bc7884d23c8c719961","stream":false},{"name":"recv_ENC","meta":false,"input_data":"686920686f772061726520796f75","output":"579edbad40d64825e61024808a36","state_after":"686920686f772061726520796f7565be3d92fd87dfedf1dd6b26debdb4aaeea5c8eb66ea50d0fd39dcf57dfbe98fbf9856d34d388cd304f82d65098f14b37aa3d754afb9a0bf9b05437c05bc025f3cb5409d783b9ff133a83ebb7548e707ab3b726cccef1ebf865b292cb725c336c04de5b10d758458e22b5004b5f728b2ab8826327069172b9af2f03274ef7cd268c4190ba1c6d64857f6103249c5d0f105429e1444109b293fcac1e10b6e98c6bdb26a5829d145f0ae130fa2a4aac132da6b40bafff58bb9e39a","stream":false},{"name":"send_MAC","meta":false,"input_length":16,"output":"dbc27e18c45c707da242c782a4dbd9ca","state_after":"dbc27e18c45c707da242c782a4dbd9ca26bbab0cb25c242a82db4e4fd0fa721104d9a7c6941ad02473fc526c831a7e88963b22a1422994ad203bfc58777bee2ef756babaeb9523b4697d820a780e7c37dd9cbce4a7ec1aa39c552f8d77d6e795b98a4ce487272325e4c2f3832dbb16c324d52b56fc8b99c2fdecd8b055198d2d5cbe0d0b9ddc0f4e7debbeff6c590281323abf38f3e2403fc262edd67f40913b9c21f68ab8f303fb99b3894b1261c33a3f7c80dd4f135487e8e0f5b50882fde896d6ddfdfdf236e6","stream":false},{"name":"recv_MAC","meta":false,"input_data":"686920686f772061726520796f75","output":"ff","state_after":"686920686f772061726520796f753cb2c269cf77d477405ed4be79478f5d65d8f09ab8676dcab45510511fa9eb83a1b73b82aad44bcffaf2a2c1755a1f1bd92f94114cda7e3a82f2f40d3cb44731b76d768bc54cca5a4ce4d0581af603d10244cf559c4d39caff777250fb8739666ac4b09b9a79ddc4603e8e45812e393658756e269ebbb43371d7cd12157074f76b31d0510ac35ceb1e9272ca2713d16c8e646357791572b484d46ef3ffa3e9c4b77367e8ea49b2ef665ba2ef1b7d0accbadac6d82d944c0df6ac","stream":false},{"name":"send_CLR","meta":false,"input_data":"686920686f772061726520796f75","output":"686920686f772061726520796f75","state_after":"686920686f772061726520796f753cb8aa00ef1fbb00603fa6db593ee02865d8f09ab8676dcab45510511fa9eb83a1b73b82aad44bcffaf2a2c1755a1f1bd92f94114cda7e3a82f2f40d3cb44731b76d768bc54cca5a4ce4d0581af603d10244cf559c4d39caff777250fb8739666ac4b09b9a79ddc4603e8e45812e393658756e269ebbb43371d7cd12157074f76b31d0510ac35ceb1e9272ca2713d16c8e646357791572b484d46ef3ffa3e9c4b77367e8ea49b2ef665ba2ef1b7d0accbadac6d82d944c0df6ac","stream":false},{"name":"recv_CLR","meta":false,"input_data":"686920686f772061726520796f75","output":"686920686f772061726520796f75","state_after":"686920686f772061726520796f753cb8aa00ef1fbb00603fa6db593ee0286ad398f3980f02bd943462343fd084f6a1b73b82aad44bcffaf2a2c1755a1f1bd92f94114cda7e3a82f2f40d3cb44731b76d768bc54cca5a4ce4d0581af603d10244cf559c4d39caff777250fb8739666ac4b09b9a79ddc4603e8e45812e393658756e269ebbb43371d7cd12157074f76b31d0510ac35ceb1e9272ca2713d16c8e646357791572b484d46ef3ffa3e9c4b77367e8ea49b2ef665ba2ef1b7d0accbadac6d82d944c0df6ac","stream":false}]},{"name":"meta tests","operations":[{"name":"init","custom_string":"custom string number 2, that's a pretty long string","security":128,"meta":false,"state_after":"9c7f75fa8b893ab70ad448513c0b5243b2792a3e306706c45f1b9e4a9018920ff37e485e146b9d66fb6a1b4d6f8933e7561d2392d12d331293cc92e8a624acf6e1b60095e322bbfbc845e5b26995fe7d7c841374d1ff5898c92ee0636b06727321c92a603907035349ccbb1b92b7b0057e8fa87fcebc7e88656fcb45ae04bc34cabeaebe79d91750c0e8bf13b966504d1343597265dd8865adf91409cc9b20d5f47444041f97b699ddfbdee91ea87bd09bf8b02da75a96e947f07f5b65bb4e6efefaa16abfd9fbf6","stream":false},{"name":"KEY","meta":false,"input_data":"303130313031","state_after":"303130313031c70245935ce6fc2fffb47011279f887312c498f2a44a5aafb316e25f24fd46140c84c87f6613d7ff30a22d105ea7b8cde98ac104cf72d0c913bd71c6b7918cf8d1a15f8aa2b6bd6b92416e709b9678b52358884b3855dc4714ae0b93338829fbca58361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":false},{"name":"AD","meta":true,"input_data":"68656c6c6f2c20686f772061726520796f7520676f6f64207369723f","state_after":"303130313031c7102df6308a9303dfdc1f6607fefa1632bdf787842d35c0d736913656c246140c84c87f6613d7ff30a22d105ea7b8cde98ac104cf72d0c913bd71c6b7918cf8d1a15f8aa2b6bd6b92416e709b9678b52358884b3855dc4714ae0b93338829fbca58361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":false},{"name":"PRF","meta":false,"input_length":16,"output":"87e57623d5c80f6d1083473a288ccdd7","state_after":"0000000000000000000000000000000043b52a0e602d1f0ae3ef2604208be72c684fd6815a51820c6309f8a058b5c0789fd3caed49beb6c495a7750d1b542432eaa236d335b6fb348befdccd7104543aade1a95d7a92f5126586ae19a97e067712e23f9d818e3476bcc6fdbf6eec68911c59554ad3ec1cdd030ef5317de98593339d8e2858c26f1974475848d01d4a616be74e54321585a6da031bdbc2e0e47fb7f3d7deab9e814d76945a40c2c017960214317f7e113b877410fd3bbebf77cc66963763ebdd4a23","stream":false},{"name":"RATCHET","meta":true,"input_length":32,"state_after":"000000000000000000000000000000000000000000000000000000000000000051febdf419228ac7b34083126bc714f03c99ecf12d877c951005da1902898b35560e3657dedec031802ce4f25a1342a8b97c1d9a4c4e1392c068bb7e1624ab623cca72103b35d52be4c1f5c488cf86d9eee96277341d8ab353cf8a4238c168829104d8cbc439130f02e2c4d03f4cecaabfe8a0454528480c855edbd60f902c0717dc5bbfebb95e1276c28dab2c49d38b2ab66697b7da736144209ab06dc70df314071f2879a89f5d","stream":false},{"name":"send_ENC","meta":true,"input_data":"686920686f772061726520796f75","output":"6a8d3904dda55c68ad7818aa35e3","state_after":"6a8d3904dda55c68ad7818aa35e3e4417dc86e31d33e6edeb5f006e79aafea698883142597a53198b6346c7b8b2f9af269cb3d530c5910bcec4595e3724683968939754e0813c047587b7374f13c1f302b727aa90302fdbc83a58894cc1ce3ce4abe5cc05e9fc2d53948c6bf700c9f22599d24f2b9bdc238957a9ecadc920b498c69a849d360e884609ffa0a3874def586a239dfe1c0fde37d8a5e753a7b8bee76f776b0c2386b7be481c00977720de47ecb40c0689e3130a1ddfca58f11eaf86c58326ba105fd50","stream":false},{"name":"recv_ENC","meta":true,"input_data":"686920686f772061726520796f75","output":"a893f629a3cadf6be99012799a6f","state_after":"686920686f772061726520796f75e11cfa1638d8ebc506978fa765913ba05b1c864db629640722560281cb00dc1226c1494f6abed4e959fd85e109e75a9282bd2eab6eee73a1d9505f28efaa413b1d542b43192bcd03707e197273977f4042813bba51f2d0a3c2733601c672cb1f253b290d09614cee56e6042e6d953a918367f978bb7ba1298fef6b87a9b09c2a7a0a5e0f8e9f8f2fca16038f1ab94570e84346a6640bafff6579febc0c8e563915ecf5780853abbaba9e12addde343b877229b6ba59f229be545","stream":false},{"name":"send_MAC","meta":true,"input_length":16,"output":"e98ae11701ce81a5223a6148376da997","state_after":"e98ae11701ce81a5223a6148376da997ad6ac43d85edca8d64951a28fcd9d93a6ccc0a14e04cc5408173036e729fd7839559fbc4462714f91cdaf8d679f7379ca17f7acebc31250c67cb4915475a1c8113c0afb07e742e8ab6e7ad9d1d508cf3ba5a263126bc61129229b3f6cfc0eb3e742aace9d86cd1f60c6fbe46955d1204580473853957e1f877c1c4308715b84d2432b269a1529154e479f0e43ac84e6cb078331bc00dad254890e9391e324da90ce5825adf26bef187d9a2558e4b14e62ddc6580947a3d55","stream":false},{"name":"recv_MAC","meta":true,"input_data":"686920686f772061726520796f75","output":"ff","state_after":"686920686f772061726520796f75decb5bc5882267f72b4743e0688a238b7f834e52dce69c3fb13f610aabc4da862443d682f55dea631bef70a9dbae7a3549fa0eb7fb42f46c6d2cbc61560ac21f0cceaef280dc6985683351326b0abd86595545a489ce1a70238c0f04954394855e4bfcc31e587c22083d564212bfa627413b642094486a7f336e363928c14d45695db30c0363e5d7af573fe67fa54e80615b0f6aa4be56c4598fd25ce36209881a87f055a7dae6a12e49c070969802c4c2b53e5e03f9ffa4ad3b","stream":false},{"name":"send_CLR","meta":true,"input_data":"686920686f772061726520796f75","output":"686920686f772061726520796f75","state_after":"686920686f772061726520796f75ded133aca84a08800b26318548f34cfe7f834e52dce69c3fb13f610aabc4da862443d682f55dea631bef70a9dbae7a3549fa0eb7fb42f46c6d2cbc61560ac21f0cceaef280dc6985683351326b0abd86595545a489ce1a70238c0f04954394855e4bfcc31e587c22083d564212bfa627413b642094486a7f336e363928c14d45695db30c0363e5d7af573fe67fa54e80615b0f6aa4be56c4598fd25ce36209881a87f055a7dae6a12e49c070969802c4c2b53e5e03f9ffa4ad3b","stream":false},{"name":"recv_CLR","meta":true,"input_data":"686920686f772061726520796f75","output":"686920686f772061726520796f75","state_after":"686920686f772061726520796f75ded133aca84a08800b26318548f34cfe7098263bfc8ef348915e136f8bbdb5f32443d682f55dea631bef70a9dbae7a3549fa0eb7fb42f46c6d2cbc61560ac21f0cceaef280dc6985683351326b0abd86595545a489ce1a70238c0f04954394855e4bfcc31e587c22083d564212bfa627413b642094486a7f336e363928c14d45695db30c0363e5d7af573fe67fa54e80615b0f6aa4be56c4598fd25ce36209881a87f055a7dae6a12e49c070969802c4c2b53e5e03f9ffa4ad3b","stream":false}]},{"name":"streaming tests","operations":[{"name":"init","custom_string":"custom string number 2, that's a pretty long string","security":128,"meta":false,"state_after":"9c7f75fa8b893ab70ad448513c0b5243b2792a3e306706c45f1b9e4a9018920ff37e485e146b9d66fb6a1b4d6f8933e7561d2392d12d331293cc92e8a624acf6e1b60095e322bbfbc845e5b26995fe7d7c841374d1ff5898c92ee0636b06727321c92a603907035349ccbb1b92b7b0057e8fa87fcebc7e88656fcb45ae04bc34cabeaebe79d91750c0e8bf13b966504d1343597265dd8865adf91409cc9b20d5f47444041f97b699ddfbdee91ea87bd09bf8b02da75a96e947f07f5b65bb4e6efefaa16abfd9fbf6","stream":false},{"name":"KEY","meta":false,"input_data":"30313031303130313030313030313031303130313031303130313031303031303031","state_after":"3031303130313031303031303031303130313031303130313031303130303130303124fd46140c84c87f6613d7ff30a22d105ea7b8cde98ac104cf72d0c913bd71c6b7918cf8d1a15f8aa2b6bd6b92416e709b9678b52358884b3855dc4714ae0b93338829fbca58361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":false},{"name":"KEY","meta":false,"input_data":"30313031303130313030313030313031303130313031303130313031303031303031","state_after":"30313031303130313030313030313031303130313031303130313031303031303031303130313031303130303130303130313031303130313031303130313030313030318cf8d1a15f8aa2b6bd6b92416e709b9678b52358884b3855dc4714ae0b93338829fbca58361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":true},{"name":"AD","meta":false,"input_data":"68656c6c6f2c20686f772061726520796f7520676f6f64207369723f203f3f3f3f","state_after":"30313031303130313030313030313031303130313031303130313031303031303031303130313031303130303130303130313031303130313031303130313030313030318cfab9c433e6cd9a9d03fd364e11e9f358cc4c2da82c573ab86767c779ac13b716c4f558361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":false},{"name":"AD","meta":false,"input_data":"68656c6c6f2c20686f772061726520796f7520676f6f64207369723f203f3f3f3f","state_after":"30313031303130313030313030313031303130313031303130313031303031303031303130313031303130303130303130313031303130313031303130313030313030318cfab9c433e6cd9a9d03fd364e11e9f358cc4c2da82c573ab86767c779ac13b716c4f5305372928474e476fa6605ea99c4125e3db4030e0287a6212adfc34c23ca52c74b1c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":true},{"name":"AD","meta":false,"input_data":"68656c6c6f2c20686f772061726520796f7520676f6f64207369723f203f3f3f3f","state_after":"5117b46c2d842655c1be2a69f64f16aaaad2c0050fe2ac5446afe44345a9b10d044c8b3ec8005a9e362c0a431ab5c4d8228c2f890ae56ad3fef4404aa6cc76704b503d627553ae9635d329cdfa86ed29ec0dd79787ff3fcefdee7463c053ef3b4a4fa7c8eb89a6372df2c4ccfc7469d7447bd19a67940642334706e5ff6b1ef58514e55c6b5c6921c58eb7cb5c57978c92c42e598926fcfdcd9705fb948ed6fe9027c65fb0659c98a9c9668d523dfa2b27bde76224944503b686901c989fedac34994dd16daedf00","stream":false},{"name":"send_MAC","meta":true,"input_length":16,"output":"a9d37332c1e7e3658d5fcc2c5c54e8b4","state_after":"a9d37332c1e7e3658d5fcc2c5c54e8b4ce41fd35b864e24d7de9ef5948a300bee1094848c36f625d5f7a0996a2dfe009b3bc43eb1685bbae952045794d7cdf3c4e7b4368b990029e16517a94783956b84cabee912476a9859540a94d523f872928a62275cdcad130991ee6c718abb1c66667c645c68564d5c45691e43f42b73938cd2ba1e4c38aeacb74d91ad0a1420a3f33f6567ad0ec058dcaa2ae144e91b931add84cdba459977b76eeb3458858615562d31fbbbab04a0e62624b18ffe4e07f2c44765e1d2b9c","stream":false}]},{"name":"boundary tests","operations":[{"name":"init","custom_string":"custom string number 2, that's a pretty long string","security":128,"meta":false,"state_after":"9c7f75fa8b893ab70ad448513c0b5243b2792a3e306706c45f1b9e4a9018920ff37e485e146b9d66fb6a1b4d6f8933e7561d2392d12d331293cc92e8a624acf6e1b60095e322bbfbc845e5b26995fe7d7c841374d1ff5898c92ee0636b06727321c92a603907035349ccbb1b92b7b0057e8fa87fcebc7e88656fcb45ae04bc34cabeaebe79d91750c0e8bf13b966504d1343597265dd8865adf91409cc9b20d5f47444041f97b699ddfbdee91ea87bd09bf8b02da75a96e947f07f5b65bb4e6efefaa16abfd9fbf6","stream":false},{"name":"KEY","meta":false,"input_data":"00","state_after":"0073c69cfaafc70245935ce6fc2fffb47011279f887312c498f2a44a5aafb316e25f24fd46140c84c87f6613d7ff30a22d105ea7b8cde98ac104cf72d0c913bd71c6b7918cf8d1a15f8aa2b6bd6b92416e709b9678b52358884b3855dc4714ae0b93338829fbca58361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":false},{"name":"AD","meta":false,"input_data":"0001","state_after":"0073c49cfbafc70245935ce6fc2fffb47011279f887312c498f2a44a5aafb316e25f24fd46140c84c87f6613d7ff30a22d105ea7b8cde98ac104cf72d0c913bd71c6b7918cf8d1a15f8aa2b6bd6b92416e709b9678b52358884b3855dc4714ae0b93338829fbca58361efeeb58c41e9511258beba1322752c123696de8c20159b6b17303f56df8741c6fecc991611ca8f755d54bed57960feb032f47d64df53030a491151fe6f4cdd0c48f9c0a81e5bce406de061283d6257ac6ef2babc776e5dee146793acef9cf","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102","output":"00fdec","state_after":"00fdec8c1234e93a20d11d53e011f7623d218c099186ce53e211316bc2f9d3f241f9045ea21375d75ff2fccf78c78c13da9edf7d5578646f483c4c018beb01c6d6c82056a71f879390a6c76262d0847eba1df1374ddf4b8393734c027469c1488a732f7f38f26b2e3f642a6f9ea99e6bfe67b99550f5b43e2edd59fccf95da4746ea19239bdfc241f4e885cbacb5748a4504ec1ea1d5a29f83eaedcc343d4bfa1cb3f9c439124393fc108b3de8aec3e4fd6870d77d3c0976c9582b518edabb396f538c4ff4b8419f","stream":false},{"name":"KEY","meta":false,"input_data":"00010203","state_after":"000102030764ef14e5830e7e670c81f0b83a66f12058a9c63e7fb99ff7eb4e6bd2ae3f1f37e02855648705b2bf18bc47d5411be0a40490cfe1912342f360be9c78b72041a75c21050cc88b65c3d7f2d2582ed8ea63261d6b7ef73e2ee4dc95e045ec4ef06937a179b1f4e014c425460f57b592cca0e1d449fa21fc1f3fa8301b7f3794746868aeec35a0739e47c4f3cf5d6adc041ec0e554f9269a2e6acbcebd0ff8274bf5ca9abb0559eef39428c1384c6882dfc05161a932c0a08b52fad6a52c50de22d8f94196","stream":false},{"name":"AD","meta":false,"input_data":"0001020304","state_after":"000102030766ef15e7800a7e670c81f0b83a66f12058a9c63e7fb99ff7eb4e6bd2ae3f1f37e02855648705b2bf18bc47d5411be0a40490cfe1912342f360be9c78b72041a75c21050cc88b65c3d7f2d2582ed8ea63261d6b7ef73e2ee4dc95e045ec4ef06937a179b1f4e014c425460f57b592cca0e1d449fa21fc1f3fa8301b7f3794746868aeec35a0739e47c4f3cf5d6adc041ec0e554f9269a2e6acbcebd0ff8274bf5ca9abb0559eef39428c1384c6882dfc05161a932c0a08b52fad6a52c50de22d8f94196","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405","output":"f6c22d0f51f9","state_after":"f6c22d0f51f90ca9fd4400baf1097b62d3ad09c1bae11b3e5d6349b53f0003f925c09bdc7b71126fc3237987e581e2ce57af2786475609e92dff666f985ed8980eb80404bfd4a464a6d57ae73d0dc8abd14c18f95959edb8559517f80faaa1fb563e1d45321debc5c04f9b1a2d2a685da2ed7b470b06c86e5062a3d5297cbb392cad0acec42f73174eb36f96653ca9252399354cf9dda55d95a1836eb6cc1050e5269197060f1f0aff149aa21aaed2531006ac4f8ac0ff913c8a61d121a746d791c99ada3e72c315","stream":false},{"name":"KEY","meta":false,"input_data":"00010203040506","state_after":"00010203040506f60d74229800bd033d6e7addef057ce47e9b3b70bc6c34c88672e1ea4b6bb5c9d98c71f936cdb17aa9abe2f060d0f57b6873d09bef5d241fe885f4899345e4afa94fe5eade2eb8fd548e78d787486d279bc516f43c3abaa8e1b80c5cdb14dcf32d1b40c42e2ca8a0d4c1ec2b7d7eeed6c65e928206c7f4b30cd22b06b1638c4867558c2206ab4e4f5f07ddc5c97564a83535bc3ecdcb0c2608ecd05ff9846d593dbb42c17935d2427be82310a2fdce8ef9ee80d24e078abb883ae2f76f0b9112b3","stream":false},{"name":"AD","meta":false,"input_data":"0001020304050607","state_after":"00010203040506f60f74239a03b9063b697addef057ce47e9b3b70bc6c34c88672e1ea4b6bb5c9d98c71f936cdb17aa9abe2f060d0f57b6873d09bef5d241fe885f4899345e4afa94fe5eade2eb8fd548e78d787486d279bc516f43c3abaa8e1b80c5cdb14dcf32d1b40c42e2ca8a0d4c1ec2b7d7eeed6c65e928206c7f4b30cd22b06b1638c4867558c2206ab4e4f5f07ddc5c97564a83535bc3ecdcb0c2608ecd05ff9846d593dbb42c17935d2427be82310a2fdce8ef9ee80d24e078abb883ae2f76f0b9112b3","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708","output":"b3abbcbebb3c23e4b2","state_after":"b3abbcbebb3c23e4b2b9ee03e32cb5cc29502b5e5b5ef04e2aa98604fa9108c4991c7cc87fc86067aeaaa0b2887f5f921ca26e376656e25dd4c682be32f02cc700d53151ad0ed6d94abb21a738b7abbcdf0287dc68be4ed74c556e7431936722fe3e1aee9266caf471e63c988684f75d204084b839b6b239093fb5eff9007dd6fb02bec467da1083ae38e37794fb2cc9fcef5548912c424fe69be3666c0420d498ba2c62567e80dc1942e051a772abb085b4d00dfb27159592e5bfbaf45667733ec44a91da058140","stream":false},{"name":"KEY","meta":false,"input_data":"00010203040506070809","state_after":"000102030405060708092d267d0d9d914e30a1717b8eb46a5aa0b1fef2eac73ad534fd86a2da0f97f6b7a0f15e7d9fe2261dade6d5f5032fc33758f0bca996ab8ceb7cba8da525d1ff5dff022f8e3542a5228ce262e8301a4996f32300f5f865c81556770975941e33427dce9e2b8ed0b419c28b133ab9b74b1f1e19a3e804a502eceea198f631c49e7d8dee1607d534e1a3ffbcf0fe8048a28ca1033ba99a6b3c752632da5fdd12461e529979c2a77331708d75cbc85e51caa289cabe08e219fb1e15ae04b9c7e1","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a","state_after":"000102030405060708092d247d0c9f924a35a7767387be6a5aa0b1fef2eac73ad534fd86a2da0f97f6b7a0f15e7d9fe2261dade6d5f5032fc33758f0bca996ab8ceb7cba8da525d1ff5dff022f8e3542a5228ce262e8301a4996f32300f5f865c81556770975941e33427dce9e2b8ed0b419c28b133ab9b74b1f1e19a3e804a502eceea198f631c49e7d8dee1607d534e1a3ffbcf0fe8048a28ca1033ba99a6b3c752632da5fdd12461e529979c2a77331708d75cbc85e51caa289cabe08e219fb1e15ae04b9c7e1","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b","output":"2477c260d0926e8d8ec57b90","state_after":"2477c260d0926e8d8ec57b902ff18928cc571d8e487fb3260290d840cc4675ae10a3a2b2a075dd09d14de9aef64b1283cc5c2d6a334efb51a14a6a891fde740f36ddea8b10d94bf542624d8dc38b9da0f237b9078279ac963396253ba6edc5400d4dc447ca290f84ad86d8516cc30869f7aed9be87c470437bcf74116110a2b6af342a14a769c6d743677f2c71176bf767fcd4a9cbfb51acb5b5cb79208912d760d54a662da5a8241facfc2c9a8d6cfcc76fb318737b4b8556490f079c94880b4409b20a2c06596f","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c","state_after":"000102030405060708090a0b0c2274abbc3c90573b5aac1d00e7f3237fb49a10ffdd2d7091d89dbd5bb54ffbdbc419fa053561ea4dcd4afeab0b561a9e7c3f9c007734574986c80ed8edeb36fd17ff0fac67e679e591c6aa333a104c7767a101706486855285bb27b08fe4625036ea9fd50aeee5f958a2feb41ad540195b032e8c6b58ca02e3f4a99ec2144594029b24debac7cce619b59651eb143f5dff4b72e6610a7b0904b47748466253efca7118997513e417fba99339786dbab54adeaf9276055c5556854f","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d","state_after":"000102030405060708090a0b0c2276abbd3e93533e5cab1509edf82f72b49a10ffdd2d7091d89dbd5bb54ffbdbc419fa053561ea4dcd4afeab0b561a9e7c3f9c007734574986c80ed8edeb36fd17ff0fac67e679e591c6aa333a104c7767a101706486855285bb27b08fe4625036ea9fd50aeee5f958a2feb41ad540195b032e8c6b58ca02e3f4a99ec2144594029b24debac7cce619b59651eb143f5dff4b72e6610a7b0904b47748466253efca7118997513e417fba99339786dbab54adeaf9276055c5556854f","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e","output":"639ab57fe676d768140724906017c4","state_after":"639ab57fe676d768140724906017c4e1f1daa6b5c212c1990f75473b72d55563df53121d6da229a9a6985eab22ac3a99c079db4a9e684055b6a60e8b55979a4ef057b411bf83557718a616942df22e5fb33aba706e97650222ddbcb52a9451b3c969ee6c71de8b9725e25ad91cad3510caffcd5cdfd7efd70d05f1ed373c85018a191995e389427875b4546143bb2bdac065de305a3639836734af5a9d3c3ccda247d093c6e33f3c094c38a2f193018240f0bba77792c32251c44429df074d6c111b6273c4f91f01","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f","state_after":"000102030405060708090a0b0c0d0e0f863b8d027816cd7fef8bbbf938bc3370b57ad9ee35f960ba034622cf6c0b3d507618e7d8e3bc82e092bf559f4da27084e46b15bdca174c7f0cd86173692b218a4a0ddd8e07f760c0ac0a4f5f403b7754a994f5586de043af57df07e572babb57410d7d26c3d3e77980926fffec293f801c7c477a7a5dcfa0aaeb6b5188173a22858961db210c09fe89e4473284e716ee87d2b344ad737107a23c8494eacf1d664ca1c50be09cdcf30c7c2271f06a6a9430a6217ba00850cf","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f10","state_after":"000102030405060708090a0b0c0d0e0f86398d037a15c97ae98cb3f032b73f7dbb75c9ee35f960ba034622cf6c0b3d507618e7d8e3bc82e092bf559f4da27084e46b15bdca174c7f0cd86173692b218a4a0ddd8e07f760c0ac0a4f5f403b7754a994f5586de043af57df07e572babb57410d7d26c3d3e77980926fffec293f801c7c477a7a5dcfa0aaeb6b5188173a22858961db210c09fe89e4473284e716ee87d2b344ad737107a23c8494eacf1d664ca1c50be09cdcf30c7c2271f06a6a9430a6217ba00850cf","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f1011","output":"3d34858c2a22301bc8d494aa638a4c8a962a","state_after":"3d34858c2a22301bc8d494aa638a4c8a962a719e59afea91b9bc494856846a1fcfb191b2cc20865ba6ee4917c70a58ee9affcea0b0f5bf93082c7a4251617e26a54610dcda08327dd05591681738dc8d98d12f8b02f551f97360e8518b4818564795502c70137f85dd8b4515daaed9d7a2c78de6315c5b47933977df159dd1ab0ce0c50c4edf8e32971b65d4f83de461097f97a60fa1b78dff984c9ffe8ca6f9ba642218862ccdee0fcbf905037513f7a9dd3adebf357244b58e91640b8980ca5c4d0f9ba32f5dfa","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112","state_after":"000102030405060708090a0b0c0d0e0f101112c1b806ec395e4826258a6021fdfccfbbe08d03087193c07e6160aa19dd0169b8a490c2aa9e418e60cf5c255002b51bb8d20ed1ad4a52a011a09b69ae66e3c24cbf95c7b8a2dab89fbe39e28fca80815f173529c145fc04d7ecb05b1405254151b7e94f8d39a1bbada495238a3302b65fb0f89ac1bffba02d884e1059ba338efcc56c61d1ead3e709e2ffa832d39c46217597ddc82708ae5b93032cc84f91545d179359ac9c47859ad877c313d8990c74ece78ddb20","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f10111213","state_after":"000102030405060708090a0b0c0d0e0f101112c1ba06ed3b5d4c23238d6828f7f7c3b6ee8213196380c07e6160aa19dd0169b8a490c2aa9e418e60cf5c255002b51bb8d20ed1ad4a52a011a09b69ae66e3c24cbf95c7b8a2dab89fbe39e28fca80815f173529c145fc04d7ecb05b1405254151b7e94f8d39a1bbada495238a3302b65fb0f89ac1bffba02d884e1059ba338efcc56c61d1ead3e709e2ffa832d39c46217597ddc82708ae5b93032cc84f91545d179359ac9c47859ad877c313d8990c74ece78ddb20","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f1011121314","output":"d88da9b37fbdd35fc96d39c4248685b15596449e02","state_after":"d88da9b37fbdd35fc96d39c4248685b15596449e02dae09a0b01d39d6cf3f75f8742bed7891811442c287618a24be7026523e906fa32a1ba12c41315c5a6f3d2570d9622939b5972730a6cacf852807a9875d8aacdd711fb714f0031c294cef5f75b38b61ffe8bf2ca5e65e5be738b724b30a33a7847375506a202fe0c430d088c41ddccc73b81783768c2f485992db3c6996671915894b946fe6994861d2c69898e1885da657619e2982412012a03c4a47b59209b639683c91dcb8017e21ad874a45c4434f64060","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415","state_after":"000102030405060708090a0b0c0d0e0f101112131415f578dfb384faa35c700e65760cac554fc44fefc952878f827e4d741ce1c61c3e29293f2b7be5a3c615a04676922ecc1293d7fb2380cb0cb846afc6d7dd41566eae5722c685fa3ec960d50f1494db19fe083bf7eb676fe24fc48d422edfd4c60ef603d0dd14f2efadd2ca362d4c88b57b7b806b850080d77338f28a533af7f38050059582ce1e7f7def6de4f1b59bd8e187168d3e7bc3abccca9197f44d3971cae2d38293372cd5e077c437cfb47d384a59a1","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f10111213141516","state_after":"000102030405060708090a0b0c0d0e0f101112131415f57adfb286f9a75976096d7f06a75942ca40ffd840949b97684d741ce1c61c3e29293f2b7be5a3c615a04676922ecc1293d7fb2380cb0cb846afc6d7dd41566eae5722c685fa3ec960d50f1494db19fe083bf7eb676fe24fc48d422edfd4c60ef603d0dd14f2efadd2ca362d4c88b57b7b806b850080d77338f28a533af7f38050059582ce1e7f7def6de4f1b59bd8e187168d3e7bc3abccca9197f44d3971cae2d38293372cd5e077c437cfb47d384a59a1","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f1011121314151617","output":"19382db50a83ca18e73f624dc8ad72d97bb6f194f639c4cb","state_after":"19382db50a83ca18e73f624dc8ad72d97bb6f194f639c4cba57091219caec26081134776d09ee6c1e3f45a6518db877aa51b4cc17894d0892775bef6cfa8bbc438e825faff3f1bda94a6a94093e6155106108a42e6c971d43a9ca825907cb2d8b2708e45048787546941d22ab57ab61bf1baa1eab9fa669c5dc924c12febd63458403de6908aa3638baf88e90fd426001d8e0bd00b8fff11c141babbb2866d12352a0ddf1bbca9f96b3ea623749beb8e82f9455cbe1b818f05b89f47ba5274a27d05cafe038cd17d","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718f3b501a9ab691725206895df115cbd8abf3d9f56788ddc2370e4541f7bf97f8e61f6bb512fbe99fd9d490eb84e86931cccdbbf24735093b10fce0ff7414f150f05821dba5d86eb91acd6c7473746688308dd1b2dfc8705c0158dae6f26932e9fff245068807667214868164b888c9795f192c4a66b7e3590a99e4f44d68dcc7c179ff249ff093d0dffa08a1253a322370b37fdf52bf5df4697bda03a64192629020bec5923904b66c42808e68b4410","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f10111213141516171819","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718f3b701a8a96a1320266f9dd61b57b187b1328f476a9ec83666f34c067bf97f8e61f6bb512fbe99fd9d490eb84e86931cccdbbf24735093b10fce0ff7414f150f05821dba5d86eb91acd6c7473746688308dd1b2dfc8705c0158dae6f26932e9fff245068807667214868164b888c9795f192c4a66b7e3590a99e4f44d68dcc7c179ff249ff093d0dffa08a1253a322370b37fdf52bf5df4697bda03a64192629020bec5923904b66c42808e68b4410","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a","output":"9b24176e161b7527021294b1025e974938e36121a916d931849468","state_after":"9b24176e161b7527021294b1025e974938e36121a916d931849468e7190782f69cff15f032c9d994315d49ddff267eccc6073b75ca5af473f8f9cecb8af2cc9b7a0dc2faae50d5d917062abbfa04eeee0a1b08153ef19506dc3534c775e86f08b75348801e2ce98a2bd96185e32a6bac26e034804fe958d12ce734ccc190a6e767e216e6659838c73c58436db26cf47bca242eba65792ec42beb6e07ab5089eb63e8164f7af88e7ed41d1c410fef575115f9d8a86bc58747a2e995d8dde8715aa57a32207099fcb7","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1bdc8c9a9b49a380d52f8bf882f6eaa5745aafc85ee21dd07ed3ae77fe14b5726f9fef2ffa030a6fc2a292c4038c3c2bfec0e2eb5b561005d6de6b71a07a46510e79a291d329699b9eef20c6a111759e890313ef39d510d97298ad4bc947fa93211dcd020afbd733febe3d54afbe78697c705a88cc278095d3c96aea8f2a2589bb9db829dd21c1b2c37e5eb3299036a8b8419d328e2cedb535279db3ac4091c3e8b91d4cdfddbdf8e7db390d30","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1bdc8e9a9a4ba084d0298cf08bfce1a97954a0d84ff00ec46bc5b96fe70eae6e6f9fef2ffa030a6fc2a292c4038c3c2bfec0e2eb5b561005d6de6b71a07a46510e79a291d329699b9eef20c6a111759e890313ef39d510d97298ad4bc947fa93211dcd020afbd733febe3d54afbe78697c705a88cc278095d3c96aea8f2a2589bb9db829dd21c1b2c37e5eb3299036a8b8419d328e2cedb535279db3ac4091c3e8b91d4cdfddbdf8e7db390d30","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d","output":"b019241d5dd2c7af2a686dadd39ee041b9d31f9316fa026198e85d1f38fb","state_after":"b019241d5dd2c7af2a686dadd39ee041b9d31f9316fa026198e85d1f38fb9a2ae843356093c05569782e286de83198894c176b39322a962ac50b976b41adf770ed50abd3b720fa471bc7cf290e9575136a74e0f6bfff9a21686ea4c7d83164e9200b56eb10ea0c77386b04fcabc19ac68b60071d505c9c4bf28d173a4fe14beb3e6db662c69550cb349155161889280cc6acd248d9a57a68a57191db7994023cc6782668f8e240ef6c58c39aebf0f2b0e0424e96123b1ff4beee55b99977d894f182783485e7b4d5","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1ea76fdf77e00d9d4c176cc7f2f5fdae6b53020572e29278902119a117319fbccdc4554919cfd5c2d98977b2b33e6f6951240718ff6f2006cfe33e2c4b0ea7d4b2db3fc19e491959c9f4d56f36bc5288144afa1acbbe9c713f54629fcc95615b1f4874f5ad8f4a19d2525ce887291b290dd9cc75289dcb79f281e5b595c26b9a3c4ecca1e963e95d5b2d90ebb43af2d86d91814eea71e0a066944b5051762321ef04549c273fedc92676","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1ea76ddf76e20e9949116bcffbfff6a2665d0d1563f0816c85370eb90e2b84a0d0da4a4919cfd5c2d98977b2b33e6f6951240718ff6f2006cfe33e2c4b0ea7d4b2db3fc19e491959c9f4d56f36bc5288144afa1acbbe9c713f54629fcc95615b1f4874f5ad8f4a19d2525ce887291b290dd9cc75289dcb79f281e5b595c26b9a3c4ecca1e963e95d5b2d90ebb43af2d86d91814eea71e0a066944b5051762321ef04549c273fedc92676","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20","output":"69f3a799fc4286397f178684cded700d8d6358aa4d44b016f3d16c1b0e1636c922","state_after":"69f3a799fc4286397f178684cded700d8d6358aa4d44b016f3d16c1b0e1636c9222af5f0df367d618157579c17b13636845d4049cea6198e68b025284365ff3b658df459b34be742cd0aac6b17f1087c462b74ba0e5718b5e761da6c4af93307969fb52739ebacd9e2a71288ab63a3128a33c90bb4541fa64d13571a3255cc49ca772a6d3bbcf7c7fbc6038bf9d69eced91804596a632199fbb451591f99062e49e711958a8e41e7f851bdfdf8cb3610fc086058e2950d559aaee569d63fd3ba257798dfdd165193","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021ceaaedd93a0e124e394b9ff21805b6a3d32fc150a04e74a19b77e1ce0fd5ae855c0ca0f425408bd03b2257f2151402f035b156f8a22e3851cb05e3956e5a220792e6494867d9e4f2dfd8a28c967db1df1b35bb7bada1482cb103ce7181cc3d934a39731d88fb07b23be8b51e2bb2e1e2c59dff3d4b04b4b3bc530dbd43bd0a6349298d8a08a1102690f4f3248bb210e68c2290a91273ee56db319910d44b6522c76c0dc7a089","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021cea8edd8380d164b3f4c97fb120ebaaedd20d141b25d60b48d60f9d715ceb298421380d507408bd03b2257f2151402f035b156f8a22e3851cb05e3956e5a220792e6494867d9e4f2dfd8a28c967db1df1b35bb7bada1482cb103ce7181cc3d934a39731d88fb07b23be8b51e2bb2e1e2c59dff3d4b04b4b3bc530dbd43bd0a6349298d8a08a1102690f4f3248bb210e68c2290a91273ee56db319910d44b6522c76c0dc7a089","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223","output":"6dbbb0a0e9a2c49449685fe25a80fb4312d882d94c81228d731911c37ebb8f53a1457ee1","state_after":"6dbbb0a0e9a2c49449685fe25a80fb4312d882d94c81228d731911c37ebb8f53a1457ee1124bc24461f9e62214a8e16f6b3fb99e8ce7b6dd98129ba108e0fcd33482f45fb639b3ac479dcbe335cac82930f24f5e9fe905a2271afdfec0f2b1138d147fccc9d1dfba5111f84a26db627cf0877c9f5716fe9614656219dba016039397ca50b5c0fa5c3b7ebdbe6b36606c94b115fa8f23804971c2b7e07c94b41b8dc6780367ad21ac88a7742717a1d20407273b56501db3719a020e2b0b6adc5c7b378c609deb6dbd","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324fe94482fe7a759e0f15f802b3c184444663c6fec8c17b8892269c89292f24f86be733c6b8f6a27919e29f69c33ab3a6a839bc082e96775984bb8ad4612c463785d38e778935993758648fed561e7406c357e025ad5dbe4df6175e37f0fc5e165078eb9a62f64249bf79d8b2eba4324eb158ca13f6b38a7c4de42029f4c202e0f72cd660576a699fa2adb1356e10ba8898f352d5d753e98b158c56cb7d375d3ce857cd7","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324fe96482ee5a45de5f75888223613484968337ffd9e04ac9c347ed08b88e9539ba06c1c4aad4903b49e29f69c33ab3a6a839bc082e96775984bb8ad4612c463785d38e778935993758648fed561e7406c357e025ad5dbe4df6175e37f0fc5e165078eb9a62f64249bf79d8b2eba4324eb158ca13f6b38a7c4de42029f4c202e0f72cd660576a699fa2adb1356e10ba8898f352d5d753e98b158c56cb7d375d3ce857cd7","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526","output":"fdb4116c78b27bae923ec8f4e26fea4690f21b975fbabedd050b726dd0e2e75e000e93ba4312c0","state_after":"fdb4116c78b27bae923ec8f4e26fea4690f21b975fbabedd050b726dd0e2e75e000e93ba4312c00a396942bfd9db8a5b0076fd08787a483f07e65bbc6f9bf017a4892db151f01caaff7622dc359c85705c67b5cc95a81d1b625b13c73ebdfc536cf73985c4a290262d71fba8ed062af5b47efb772e3dd584293de36aa3316157678968212f9836a203fce962058649bb563bcfa413097dd57363c67b75c48e56c94cd802651e4bf85fe7a5061b0f8ed21a1e6d157281dfe230a114a96caaa8098f2240308b27b904","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f2021222324252627","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526274d76a64e325d2a42e82373b1174e80d7d3438cc9596984b06bf29f78499c3baab4dcfbe73f9e3c39fc1789a28a96dd55c93e7d151cb5cdfa5b75ef15a43a96449f38881db18b07fb3d38b176486e0c8d6ca36351eb3f0e53083eea3cdade6df37a60b9f929f6300341911d53065873e3f0a17707c5125efda4036e8b68d093cace174a0d3099a31342865e932de1d7c0b528c4b0d198e6e9dc09acb96dfd30f1","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526274d74a64f305e2e47ee247bb81d458cdadd4c9cd84b7a90a57de58761538727b7aac3dbc61dbd181cda30a1a28a96dd55c93e7d151cb5cdfa5b75ef15a43a96449f38881db18b07fb3d38b176486e0c8d6ca36351eb3f0e53083eea3cdade6df37a60b9f929f6300341911d53065873e3f0a17707c5125efda4036e8b68d093cace174a0d3099a31342865e932de1d7c0b528c4b0d198e6e9dc09acb96dfd30f1","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f20212223242526272829","output":"454797248a9fa2bf9f51e9409d914d6760a1e0283e696f351cecb65634269862418bae6f692bc779f209","state_after":"454797248a9fa2bf9f51e9409d914d6760a1e0283e696f351cecb65634269862418bae6f692bc779f209d7a8033b6b9c895d90bb998f5f13a3b1d94462818bb66fe2386dc40e4edc242445384fd5a9aa2ac476de2bb5a02b1f6292d77e1669f31968ac28b7535ac9316d49c72607e2b3b42f2d00eb188a02b576637751b6a894d00d4cff1b5b72b142bcc2c5508fa11c8e08841ab1c27ba1a9853391ee81fcf4c0cdd5c99925513243cb2ceb3d43a34d2c85e7cefededef13361f9ef632231c4f2e2468921f68cd4","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292af910798af9993071624c882dff91dbad506e2ea68a43961334bcda3fcad0e84d15c9465ee201735fe45cef1d2019f80dd63103e061557846d3ae42cd1899466e77444a012dbe9a5598f06a44303da1ace4258710bad7e222906ce83b558d745c947a6878c403453043b26e3e25d7d3ba46b165247ba3c385341029d83e59475578089b5efabcc0f5017a123fc4ca320788cbdcc112515991f3069ea5a0","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292af912798bfb9a3474644b8024f59ad7a05e613eb79850820622abc226d0cbf4500bd6667fc022577ac27bc7340a32f80dd63103e061557846d3ae42cd1899466e77444a012dbe9a5598f06a44303da1ace4258710bad7e222906ce83b558d745c947a6878c403453043b26e3e25d7d3ba46b165247ba3c385341029d83e59475578089b5efabcc0f5017a123fc4ca320788cbdcc112515991f3069ea5a0","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c","output":"8fd67ab6feb721931fc9104fd7057b2694adbff8328f70b4dc2969eb5ef62b2fc0089f78f26645fd0fc839616d","state_after":"8fd67ab6feb721931fc9104fd7057b2694adbff8328f70b4dc2969eb5ef62b2fc0089f78f26645fd0fc839616d9bb9d736d7a9aaff46f1a73dc3a57076407a400ff79e82f217efa2ce1a5e4c93001a0dc9a937950aa5592e4b9344a2743021625a6c1a3d1ba95c4d12f0d05500e2c1be9975ed37354e996f74d766dbe46b69e8578a9b783a74671fcc01fb9415fd090ffd26b2c5e6f0e92e474daea1e237ccd64ef75cc561df2d19238342073782fff2eb6c7fd916b1473107c64b572e84ef15b3c0371a0e2ba8f2","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d5e62e684c240d44d7e7cdeb6f8202c86a3b359746c1ab27d74d76df8d8a7a36270b401d7162dd192809e212cddf5d4e3ed4357e05c3cc240be8b81f708fcf1223e3d59e8f90a93b29fc0e02decd89a0700d84048979a6b7f0219f3ec0936c232027e16c2520479a77e10c776e5f9bea70a499374d9b19ad2f64664c688db670ea308ca06bef3573ab7dbd83cfc6346e5fb87bc1ac94745ad9df2","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d5e60e685c043d048787bd6bff22b208badbc49657e09a66862c075e1c2bcbf7f6eab21f6340ef5b7a6b90905f7def8cec34357e05c3cc240be8b81f708fcf1223e3d59e8f90a93b29fc0e02decd89a0700d84048979a6b7f0219f3ec0936c232027e16c2520479a77e10c776e5f9bea70a499374d9b19ad2f64664c688db670ea308ca06bef3573ab7dbd83cfc6346e5fb87bc1ac94745ad9df2","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f","output":"0a5837127baa649cfeaad29976949ba583a934f57def98035d65c1be9a436cf547db984b4cb0fb0f4dba2a549592c771","state_after":"0a5837127baa649cfeaad29976949ba583a934f57def98035d65c1be9a436cf547db984b4cb0fb0f4dba2a549592c771bdb8df8d2d54ff354485ccecada3e1d242d6c6cd90755027dcfc346309998289d415f213c49c64ead320883bf9e2634ae5462cf30b3e1e12fe085705d10489e9cc7c069f8108b8dc398171bd3ce0c2c406cb69febad1bb4191c2eeab2c3fc4d09c34d95998dd79ee008195be6923bb304eac95f263098120bd8d8a68cf7785c5ac679efbf91b7baa60dee89c8f8788e36b9263b174333022","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303d15975ad1eee33075c9f9cd9f067c18d999fba39d67e8a473bf5ff7594147085bb416cab0d2c2d1768999b70b4fea2ec3264bf5504bf9e17a11b504b8a813631a37139bcdcbdbcf601761984b22cc2bb8f0b6e0f6c47a3a5c7a5b066b9b51d18df524d64d1e1720b618c5007db73d75dc2836b2ec8ed18c2f3f12aac3c9262a4ea2bc914689e3268338e7037cc82deb60fc98226ea88b","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303d17975bd3ede73573cef1c4950d7015d796ebb28f74fcb165a847ee435a5b1545ab36eb92f1e6f450aeb19e2164c603ed097bc4504bf9e17a11b504b8a813631a37139bcdcbdbcf601761984b22cc2bb8f0b6e0f6c47a3a5c7a5b066b9b51d18df524d64d1e1720b618c5007db73d75dc2836b2ec8ed18c2f3f12aac3c9262a4ea2bc914689e3268338e7037cc82deb60fc98226ea88b","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132","output":"6cefaa5f01d7aef0e023783010c3815e17d25552eba6b203e28d1123cb3833fb80ba712e3b35926f436ccabdf9015feadac035","state_after":"6cefaa5f01d7aef0e023783010c3815e17d25552eba6b203e28d1123cb3833fb80ba712e3b35926f436ccabdf9015feadac03516377fba64bf40bceeaaa559a1e055a1718f4b4ab477b154011db84dbf41be2cdaf7d568a502d4ea4109d13844b912e13056353b62953bd87c050d5b5265d618169c5f6bbdbcf041ba30fba5014f2d9c97f1a37b23cdeac83aea66b4184fee242a0c5501d33856175d406bb5a1ac908bcb636958e2d4854656bb700ec42845228c8d8a1c2ac3c8a89eb4b01683d05fa400c2062064","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233006f2d82332623799821ba25b53c81b5de239d1d3cf350256eb146a4adf6b42eda980cb5765f2309fb1dbeb4c8ba957426d51bcba66218317ebef36ae8e0be15f4cd56fd26dc24c1e10a489391e4cee4ca68fe3b225752f4e75606b6c4da176849b62cff6efb9191f24e7d182cc7853ba63224450b1aa37a7c126e6654e02e2ecb6529fb12c99778ffa6f1a15bf4e87fc71b3a44","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233006d2d833125277c9e26b22cbf378db8d02c8d0c2ee0443078a65ebdb7eda833c4872c94547c072cdd3a969de291b95908fa2bfa94512c317ebef36ae8e0be15f4cd56fd26dc24c1e10a489391e4cee4ca68fe3b225752f4e75606b6c4da176849b62cff6efb9191f24e7d182cc7853ba63224450b1aa37a7c126e6654e02e2ecb6529fb12c99778ffa6f1a15bf4e87fc71b3a44","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435","output":"ab5f2a7f5c005f4a2b7807c4027baf58db5f35d950a009e4da18e6fe9df40024f678516b0934bf615f5ab535cf18fade418fa7fdd9f4","state_after":"ab5f2a7f5c005f4a2b7807c4027baf58db5f35d950a009e4da18e6fe9df40024f678516b0934bf615f5ab535cf18fade418fa7fdd9f417c10add128e1aa8a95357b50d4f647b9e4aa8bf9803482d34df361cadd284fad4a55b7168c99d880351d3f48015009f9b505ac221552b72755724a8f72b3bdf2d46232d692215d368816656061adfb089467a84cf9da2318b2d33b1426154b52852f1e5c50b2c9f84746eb3711e35088d2ca67961c5a19652fc783ddd03a305ce13bb8d0d54f6b7f1a34ffa329e5354cced","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536497ba90468b915fee1eb6e9c0a9ffeb11ca68e0624d5cf9c8b04d2ab22d6538dbdb364fcd53cab96a3ea32b7b56e636bbdd322479f01953f111652a2ec9be46f9ef46036c774a0f5bc1a8309c80647f9cf074c25e42091dc1038eb16f42070a1f9a38d129f42f0e718fa97446108920046e3d59239eb85b15009fc6c5178713e38e1ba2bc87a3069146c731124fc6701e1","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435364979a9056aba11fbe7ec66950094f2bc12a99e1736c6db899d13cab238cd4f90a3ac44ddf71f8fb385cd1a9e9f454f4693fc1276ad32a10a272152a2ec9be46f9ef46036c774a0f5bc1a8309c80647f9cf074c25e42091dc1038eb16f42070a1f9a38d129f42f0e718fa97446108920046e3d59239eb85b15009fc6c5178713e38e1ba2bc87a3069146c731124fc6701e1","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738","output":"101d5d64e9328a9af8491961ea6576582066826ae6de6e406ad263c4f2986b3cce01342305622bf381603b376c87b0773b564e5c0b96ce51a6","state_after":"101d5d64e9328a9af8491961ea6576582066826ae6de6e406ad263c4f2986b3cce01342305622bf381603b376c87b0773b564e5c0b96ce51a63c94dc2fad114b06db1979664614dbc6296f50cc4fe710b0e9708151418778104c0f6784ab54004cf3eb6927fc8ab652f0b8d0b84f7dcea5c224de7b4189e6c36351364e1d1ed20edef9bd3e7fe42388938b0fbcacfcd13cc4d68512b9bf36e4649e22cede76149fc36c597b1a2323fd2e47f76789f608bb1cc7b698efa5a0fa119e36d252f92b7f2a6ee47df16cdd","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233343536373839","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637383969a4b47969ddadad3f93f46f2c3b6b351e1083570b3035487f75b5e9f50c95727c81195b7e3ecbf3d7aeecaf596dd1cb535e05e01eae50a32b8c4fe1cf22d2f5b197410642d71189af76053a27aafc0b687be119c68f7766c3e5920b42a9db55dadeb05dacbfaf8eaa2b4f7c068082c48aac7900d873e85f064cb4c65f81d5d946b36e1e7822844ccd6120fa75e3","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f3031323334353637383969a6b4786bdea9a83994fc6626306738101f93461923215d6962adf0ef17896f629e397a5c1defd6f189c4867346fde67d7135d12c9d64961dbb77d8f522d2f5b197410642d71189af76053a27aafc0b687be119c68f7766c3e5920b42a9db55dadeb05dacbfaf8eaa2b4f7c068082c48aac7900d873e85f064cb4c65f81d5d946b36e1e7822844ccd6120fa75e3","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b","output":"b361d23b3ab5120485fda3bd5c2f70a783e478c5d1f6d45e719a8b79ef2e3623c14eb1a4004dccdae4ec215b28d5d60dee728cba81a35f11f48cb04c","state_after":"b361d23b3ab5120485fda3bd5c2f70a783e478c5d1f6d45e719a8b79ef2e3623c14eb1a4004dccdae4ec215b28d5d60dee728cba81a35f11f48cb04cc18435b2a8b98b81d184015fbd5f132c4ae0681d4119e8bda46dcb064eb706eacb385cff2464787e3ef9e619d12eb303c28d225861683b2d7f92a67eb4468748c047cf44b2aeea6392c455d9395d92694f8e6c4230951849756f1da58eaf5b11b998646f6a3348320b3a908149f18c380f46c0b5cf710c6e718eec4bc829ca92dd2cdc3517ef18a4baf51036","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c65b381a3108ea9d346b2892f94720fdf69f29bcdca01f6664aecc7dbbc8d50414283f75957b4d8ab1d817977b7ea69f4dd6b8ff3ea0665d3155fd015b90ea3bc920f04b61369f3604814ae112f8e164a22a29897330c066b30b0666a6bb5d2a4f0dd1faa1d6b09d5e71118c31e62b06d4ac5fd9a8b7ff3d9b6c9629b9b76043983b192cd206704fbe50035","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c65b181a2128dadd640b581269e7903d267fd8bdcd812e2735cfbdfc2a6964c5c5c9cd7787597fc8e3ba6515e9dc145d9f344bfc2d83551e62368e82c83359f81920f04b61369f3604814ae112f8e164a22a29897330c066b30b0666a6bb5d2a4f0dd1faa1d6b09d5e71118c31e62b06d4ac5fd9a8b7ff3d9b6c9629b9b76043983b192cd206704fbe50035","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e","output":"6d7be5a0fdcb877ef50f1d20d9406cadb044413d6646cf57664d24c1f29afe5410db33118095d9c7d9a4a62d20ed68ab6b43998d5e9698cd77a5143db1b4d1","state_after":"6d7be5a0fdcb877ef50f1d20d9406cadb044413d6646cf57664d24c1f29afe5410db33118095d9c7d9a4a62d20ed68ab6b43998d5e9698cd77a5143db1b4d1634141701667b65396ba8b26a7d5c0176c20fb69d3fdd3169a03691f0040c7563dd7b65300861488641e871c03b1f564d031394fbb95847147ffba71df1b4151f74b877cda7124318149216385f58d1c1173f1670143402de8d5b49b9300483c53884e85c958cf99efc91a77e54425bb5aca67bd4d065e47ea91afb42d5291f1280cd0ec70b7c7ee34","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3fc908229db094517a733473e4dd28a536bef43b4dd015dae5b0aec4dc74aa9e2638b602d74873b9a781002f735cfa38ddce75cec4d59b1aa3967ed66c69c9ff7648ba96698041205ae19d4602e4ac9aac22fad10e3ba7041cee4c0eee2800d44ca1c51aa5fb0d76d787db578d576d2248835c9ee6427e7eaf300995c31e4481de50b2c0e98cf11440","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3fc90a229cb297557f75337bedd723a93bb0fb2b5cc206cef0a6b9dcc56eb1823b26a922f66a509d82a727075a76d114f0e05afef5e7a82e96a049ee5553f2c34b7685d6698041205ae19d4602e4ac9aac22fad10e3ba7041cee4c0eee2800d44ca1c51aa5fb0d76d787db578d576d2248835c9ee6427e7eaf300995c31e4481de50b2c0e98cf11440","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041","output":"9031341dd722d97496eedce0edb5a0bf2d870382984d85bafe69387117dc755c34289ed67b85248d7b8d68d44100f4446401d9b0301aefdb092cd8337b9f13aa45ed","state_after":"9031341dd722d97496eedce0edb5a0bf2d870382984d85bafe69387117dc755c34289ed67b85248d7b8d68d44100f4446401d9b0301aefdb092cd8337b9f13aa45edc9f1b0396c91440a590984195b56cc5f64aa549c73195a2332553898998e9afe187ceb80ea1aeee28c8b37eaa5c3f43875e1cfd0ccd91d1e2eef8fcc3796e14c8f43e17edbd39776fd81906bb92207f2ce63f974ab773edcfb946422a73ac2e2bc3be3c20fe9d6aba390dc66ba8dc7765154a86f4b6030b0f8e873bcb420fce7a7c8837cd86b","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414288e73ba3fab7896e649e8f3732f9b6b2f8daecb82a1a8e6f79ee43d396312d6e571bcf8e8b3b91d48f7d71db4339954479464fafaa98cf39b915b85d25cc772b25475c468d6f57de9a00262abdb7389806568a3a1b6b244688faa9cd4ca36166344d13d487992ed8fb70c29869c8558a6cf1b70479c93a26e9d93afed24e59c59e0fc51a99","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414288e53ba2f8b48d6b6299873e38f2babff6d5fca938099a7a6ff95bca8c2a31734904efafa918b5f1a95a59f26912b96957697f9e98abfb0c8f2280641ff74b161b781c07cf2c57de9a00262abdb7389806568a3a1b6b244688faa9cd4ca36166344d13d487992ed8fb70c29869c8558a6cf1b70479c93a26e9d93afed24e59c59e0fc51a99","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344","output":"d77d0da0e7729de95172dedd024a90d9c8897044bddffe05f2003d6e8a2413389b42e9e8349961ca08deee78ee1c9f9ad15fa83b9069bebb33a509b931a6216b493cf730af","state_after":"d77d0da0e7729de95172dedd024a90d9c8897044bddffe05f2003d6e8a2413389b42e9e8349961ca08deee78ee1c9f9ad15fa83b9069bebb33a509b931a6216b493cf730af5956f75a1762f4d7730131b38a1870e12df674705a6de1880b56d96db0ac594ac57a99f6c6e551b8ea10e0f84a97e6cac95724af0f4b9655528bf61928432aac61e9df322421d8927d3126339ee65b795be826c1a9e511c91fe557a6e0c29adc74336f80b99f6f6f36135c1b3842ca36606a69a2b0eb73e2839875a3bd930e37cc833b","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445bb0728f57f257f539332f5615d419c6f00e6179a6de99ce98e63a542d64866d11a988ff3c08a31635dc920bf61203b655ad1d4a225db890734a027534bc7d27d18009f7698c21362eb4392d37d983d57fbf98df5b5fd94eb530eea7e7bb650fbc305d065b9de97e2086693308033b31002109d9bda5c204b96282ef06154c0297d5a","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243444546","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445bb0528f47d267b569535fd68574a90620ee9078b7ffa88fc9874bd5bcc537acc0487afd2e2a915467bee08964b0b174874fee49317e8bd3202971f6a71fcee40263fdf37da815727ad4392d37d983d57fbf98df5b5fd94eb530eea7e7bb650fbc305d065b9de97e2086693308033b31002109d9bda5c204b96282ef06154c0297d5a","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f4041424344454647","output":"81e054e8c408de31befb92c9203985d43bd2c75ac149e519630784d7d1d70ec56bf734d867519388acc6b6b7986c7ae87a84be8b4c40d9cac6dccbb0406ac2191e60f62464306302","state_after":"81e054e8c408de31befb92c9203985d43bd2c75ac149e519630784d7d1d70ec56bf734d867519388acc6b6b7986c7ae87a84be8b4c40d9cac6dccbb0406ac2191e60f624643063029cdcd29c829b53da4065fb645d28235cb76a19c898e7767b697e5bdbbf4979dcde795f0261cd983effd6c01432756187744244989e429838518ca7d3578b745bacae2caaf883030a53847e808a63c840d4f2a3faee13c344cb31a12d65a42bf53dc08403e7d3ce8bde177c7b5496cdc8cfa1755069b2ab38f3ab53991378fd27","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748515395a811073cdb3637957c96eef29e93a57b073b36cbfd462bfeb15a37c6863fed54067fc7a2f4abff8e9747b0401d3c316b55e47b2f14cb0fc9ad1ecdc0186b6db7ba93b13a9c6f8d8d985fea9201a151274d1578ec0118517157f0c55b0127bc2e178646bbf94f2e5d60bbd9a2a82a2d6b5afdd37595522db0c5754022","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f40414243444546474849","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748515195a9130438de30309d759ce5fe939daa6b162925dfe8503ce6a8402cda9b21f274275de486d18dd8a6be6d9b6c30121e5b64d6481b21fd38f19424f6fc255552f7fbd1f27ed929cac5d15fea9201a151274d1578ec0118517157f0c55b0127bc2e178646bbf94f2e5d60bbd9a2a82a2d6b5afdd37595522db0c5754022","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a","output":"c186536fa7a066f3939c6d309f587b5701b72f41bab35dfb7e00d0e05c2bcd7533c92caa4d2d71bcc03823accf34954d13d31a3fa5d37e0c06c33fefe840e5cc773ed69d1932ab48da48d7","state_after":"c186536fa7a066f3939c6d309f587b5701b72f41bab35dfb7e00d0e05c2bcd7533c92caa4d2d71bcc03823accf34954d13d31a3fa5d37e0c06c33fefe840e5cc773ed69d1932ab48da48d7ba1e798f9f2a12e0a02437d3ef862edc88cccdeea8c3a1cf4d86ca26581ce6d6c085c7b666129f1da1b2489a9d622d316a9aaf440d82be719e59c1980de4bda7f5f2b9cc2393abdf0b2e90386aa0a78c5d648ce470c25c758bc6af7c18e954dee02664da562c3a3690822cac36b2928f5955936cdf078d3d2a5b845a64","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b26bf54ee2cbccbaf7c8f187b440c23d6a7f06c1af2510f1cca61a45dfe5b1607fca9015754639584f9175c92e4f268031f42fdbae790f292c747e99f2179242f96c9dae365c79a030a1812c6816b7688d5032512c56b238b4f67d16e374a1de96e5e0b93eaee6872d09f1402bb6252e71ca11df33d863a36d324d81d","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b26bd54ef2ebfcfaa7a8810724e072fdba9ff7c0be0421b09dc76bc44e4400a1ae2b621767640b1a1df3074bbced9442e316dcd8bd5a3c6a7f170d1a61b421812a8f69aa22784de464c5f5a8fcb203a88d5032512c56b238b4f67d16e374a1de96e5e0b93eaee6872d09f1402bb6252e71ca11df33d863a36d324d81d","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d","output":"594a7922b63ae033132f07130fb16cb9e176b75c0fb3eb29558ff84faec331ca20c99d778fbd4f89fe6ce4d7cebf4ef1a00ef9a6a5c078c1b432ecb9781b7d1df3ee72767e86027ef1fe2c08dfb0","state_after":"594a7922b63ae033132f07130fb16cb9e176b75c0fb3eb29558ff84faec331ca20c99d778fbd4f89fe6ce4d7cebf4ef1a00ef9a6a5c078c1b432ecb9781b7d1df3ee72767e86027ef1fe2c08dfb0d252bd848e0ef1e771a94c08f59c182c033424e39bd61dbf930c54abd7a5e5d0684f31ef92c61f922cf86dc733cd46764451b01a849e81e1777166d5f19a8715f7d1b1062f357d94c35c2f3768115f2ebd71e200c315191c946d0d88fb3a5ca154c4a962e3bf57c7cb91377f07585f37af56568420af5b0a9f6c","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4ef8d8bba8af2cf18d6566b286165244be6b3575857f2d08746bf45b3d37b94a4b8fad3ab4f4c11da1218a5a39e6abda7a5764876875335ed4cd9809c33533e37219249df83b3ed4a8a23bb5d4e349f323a8db85d2ca2cf3e394cd8abd6388923fbb357cf074ba08dad72f079362277e35fc79cb78f2ee501d2a","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4ef8dabba9ad2ff5886361ba8f1c5948b3653a65946d3e1c617de343242da2565691b21a95d6e2398407ad7210cc80f657794bb75947006ae1fbaf31fa0f08df4f271bddb9797d90ede47cfd9da902bf6ee69485d2ca2cf3e394cd8abd6388923fbb357cf074ba08dad72f079362277e35fc79cb78f2ee501d2a","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50","output":"ca606fe4fe1d39357744334fe5cef4e1d63c9ed9c69960b7840f3fa5eb52d009084b5cab25893212aaac812cdddf67b2932b73455b7ef29962ab7f8c532aecc2e5bd990faf1644d14c973d99db92cb5ede","state_after":"ca606fe4fe1d39357744334fe5cef4e1d63c9ed9c69960b7840f3fa5eb52d009084b5cab25893212aaac812cdddf67b2932b73455b7ef29962ab7f8c532aecc2e5bd990faf1644d14c973d99db92cb5ede0ee31c6eab5c300a569680895a31da6e5f44e7b54d05cbaad21edfc8d517902a7eda1dd22ce4bce4ca32ee96da8c4ba28b25eeb68f44a672f469610bd09a1284b2c32c85dec08f8d82a77dcb71986e6096c88f8f8ddb02b00f15fbd01d50797689ee694fdea20182354ac6d8899dbe44bf48043504004c","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50519bc0f783e0a89bb2166b0f065d3f130bd517526b7fb09e4e3be8f1e9dee6018ae3199ea0bf684603ab250f2b37fbf86cb7cc610450da8360a498232a0c69bb710fff77e7693ca74ec275d67e7bf2239bb45a84858df7e6d87b1d198b57a35db133c99c017e342f1a9a18c8c79a07cdb5a11d40ce6249","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152","state_after":"f447526ceb09cdd8badfdd96a82cc2302abfe32e89b6c5807fbd1c0aa43d661d20222df474ed3558327d884eb941759d4d4848db49ec39be343bd663117111346f76e290712c5492f8a89083e179834a59e24c95a77a3d6294a402182cbadb1d330c39c777891975a629c563efb4dafe30460ad27f046f65aae27bf5da39c3bc78a380676a71cbd69e1888359656393d295937caa28f92728efe1e93dcacb8890d2fe169b8efdf248c5f5bbfc51ad612d8924e29c63a4d3b66d30069337d965aeb969ed396e35c87","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253","output":"6df53f5ed28394e2da0e04fefcef82107f63c500e7154837d6373c099f0b7925cec4dbef54de9a14e3b32cb494c9d19985efca46cf688d802f65df8c3aefc95515a2717f962d1a741417eb8c425868b42268f3d9","state_after":"6df53f5ed28394e2da0e04fefcef82107f63c500e7154837d6373c099f0b7925cec4dbef54de9a14e3b32cb494c9d19985efca46cf688d802f65df8c3aefc95515a2717f962d1a741417eb8c425868b42268f3d9ba7ed230d382e0147c011840cdbf586126098719c57b84865908101704eae497ae345c904ccf041f76219588a99af55c0d46e1792350c08516b39bbcd6f93cdbfb2214705154e5ccd070e26a12e62c242d91d00415cdf2c77dbd5462f324f0382722f63a2de0658827894554b4f528a58e2823a8","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354d7b9704ba473c1e3c9a04de18fe7ee174fab36e8be05c1c374db747dd4c2a246b1cce18fbc1366fb3ee6b43a29be65d65ca3b97d63c87ce2f2065fe3a463ca9cf4b801058b2e18ccc423a1dded07712397e63e7eecb2a59ad1bc50f62d5c73926e879ed08861f7249db1b37ff03de11c58bdfc","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455","state_after":"4aaf4b468fb0570de053c22f45095df204e0ea1fa4790fd8307c955db1b20232a5464f58ddbdc9800e42763c676d63e5d28a1d1a0dc9476524074c200a5a68d6e256c7a7e910877405a4a576bdab63f3085621307624a037f295d0917a39665ab725e695ba53dca9392e308509ae6ae15a918c29c174c3be139470df225248d1a449d47073529aae773cfe0e75442b4b2a56bd8c74b83fc57ac3ef39438d316934db368b2786901235da1d81b287ea89eaf00da4f3ebaa51be476d7317fbdd416cb79d694c6430bf","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556","output":"4a1f2fc077e225b95bfc510fef4d6a58a70a6140e1ba7c33e330654229dfdddb9f007a7536d988d04855f1e121ca55e6a3bbb6ace47aad481df0f665baa8fcdfaa9e22ea759308a554296c4adffe6793ea5141dae30c04","state_after":"4a1f2fc077e225b95bfc510fef4d6a58a70a6140e1ba7c33e330654229dfdddb9f007a7536d988d04855f1e121ca55e6a3bbb6ace47aad481df0f665baa8fcdfaa9e22ea759308a554296c4adffe6793ea5141dae30c044ed1ad3a744921cd3dcc986ed097a3d9328a06e622999da464dabdf4d6ff1378c4ea5985a43838281f67bf4cece1385eedebdc053dfdc67b02d4a2fcd26c6d567dda0f268ef91685dd3d9a04205aa7054b53f3d4f917f6c292db6af8055333ad3dfca670720e3aae75a13fe56e3148b8e5","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354555657","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f5051525354555657821e0f73bf12965dbdd814bde7d00b39ed372fd6f73b84891c929b1f13aa560b911923da37c5364dfc24a9f7333c622e34397550ca40cfcb102d63c2b823b72643d24a4b398fdf753996b8e37dc34a7f0cc826b6f01411d585160270c6e0696525ea6bdd8c2bba6c05f67a34954252e2","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758","state_after":"bf85ed18641d73ab740ede8a616ccfa0eb84db4b1177409208d95516aecd5aa3e5ba347dc235b8c136202b4387a53425726c21705f0ce73532c3b984349609648d60a586d95003e8f5553c27b109ff017089425e4bfc86a54883dd8e9f60ca6f15fbf6eb07c646868049758415dcf9cd1ddb92b0df978112baefa8adb27f02b53ad6948e4d2f1cf558370753c5eca5c08059cde7fa5b98af7652fd2aa8139601bef860da2a44d7a42c935ca59507eeaf8955970bacda685cdf8059c47da3552168ff9ca9487df804","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f50515253545556575859","output":"486493c7a48ca2d76a69fa79fe3ec269fddf4e58725ca83ff36d5d2076304988043ed192ba6cafca8b570076083794f4749db3d755f11c10cc95dc126d8714c7b3b642fe1c38eb982fdd378174abd0c679ce58b02f122ca5e2b1","state_after":"486493c7a48ca2d76a69fa79fe3ec269fddf4e58725ca83ff36d5d2076304988043ed192ba6cafca8b570076083794f4749db3d755f11c10cc95dc126d8714c7b3b642fe1c38eb982fdd378174abd0c679ce58b02f122ca5e2b1f21ccfe639d22c81dc1b56f15d3645ed686579d9778f5f78b64a366d709755248b15abffd2d887bfa7050829b2fbad2da35be081e92ab3b7c032c28cc17bd40964a9fc53b0320398afee8b6bdde2c27404571ddda52c3f11fec28377418e3e5d2ae9b2d4dc9a6968e67e00cd6f6d","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a1b7988775e1e8f48a34f115fa9d9ac4d3283700d798b59f9b4fb3fff176d8e8f10774cfc8611825ff316f531bf03e2a0e61e8e99d2595b9435aa54d210fe8a924325a7b81bcf4002abb45236a428bc1cf012d8abf0032b3a853c5ea9c401d481967b128f9c826d0bc8e12e04b4","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b","state_after":"d8e7d2328ca857f005f2bf58c68e44347760fc9b8765fe599a83f3389ff48236ccc49217ba09e2109fbd3f3b2870d265434c8d264cb6864c8b47720e9d4e9bef65841e1edd9cbcabf86e817eaa3786903cfca702d8c47bd4c6fc21d2552a2de01c4a3091b71d8301937a7f58c9dd8f3a8768a99660383682d7466d4d659799fc7ef5d0f5b6b8f327b042fff5cb49de12356865e3c9fea2f2cc699d894d57dc7ec23d154a60fd9a4c88a7d67190e1e58bd346d2dd78d6ae848c56453a32a93a30e64ceff442defbd0","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c","output":"b0bcaa2be297f8ce2b8afe3a8fc83f02e5836982925321044b92e2ab81954d1c09c24782734058f1f6b80a6f5f02f21e6a10f007ab904a1058ad46e07299e3897c447c00cf1c1d85324a7c34c74ff64c0ce6ed8fbd25189cdbf74b7289","state_after":"b0bcaa2be297f8ce2b8afe3a8fc83f02e5836982925321044b92e2ab81954d1c09c24782734058f1f6b80a6f5f02f21e6a10f007ab904a1058ad46e07299e3897c447c00cf1c1d85324a7c34c74ff64c0ce6ed8fbd25189cdbf74b7289c809082e7beb4d0fc99a1a70286b5edb01b321deae2010bf2254e58aaa7dd71d57273e2f60bbb1d41bc65030b95f110a11c3b624ba49850f46ce864f30e0837e7a46e01f0656d71dd5bc60766e44fa0924b508911efac4d5792440dd87d0a92c87a2531a93d8005089c406","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d334f528c9f1ca56d6e998045cfb7edc1567588e57c9d175d01b335c9663c18ae431358f8a3ac61bb1fe59142a696093026ec3459a26127493234a2a62e38f87158c3cffa0f9c8fe28e02600f2a842b30a7ede897650ef45f42bfb3d6516e2c12785c699221ec821aaa60","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e","state_after":"de2b1e48b21b801019f81b610d49388b367b51b405183fcfbe2493ee3d05a5a1fae109f5b32ae1e812ce7973a8e04da97bfe546d96aa78f4f0d2136a24f2b777651328cc127eac46a46c5043e819c770748562d0d4495d63e8d13c0649d91d6d6cbfdf54a6df40bc2e6ae0cd22baa5209058371a036619754cec4a805e32e759ab652da4aa60dcea05584c762b29e502fb52cd24c042e47fae213c9c2bcbceba9460db796eca279b42a3943e62aa9deccb74512f1d19ef1609ad066df0b4a7d665464130cf435b86","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f","output":"1ed7d9c4fb8219162538d08a53465ce4d9856f8496b77b75241fb7265a2e6179554e9b57e4be09019e47d2270863271f60da2250994b819b222c5913edf142a2d25a3bb291283af2503d16bd5b134db22e2afe04ebc632f9a813826b0f38da1b","state_after":"1ed7d9c4fb8219162538d08a53465ce4d9856f8496b77b75241fb7265a2e6179554e9b57e4be09019e47d2270863271f60da2250994b819b222c5913edf142a2d25a3bb291283af2503d16bd5b134db22e2afe04ebc632f9a813826b0f38da1b517596755e5340e4a9529e6d42c61d3774c49e2d5da13875e62b0cd2ecdcec72c3fb04a117c8873dbe285d2560a24b85b5d2389b6575b53b354940695d0934cd7ce96ec112506432d397f8290f18853d08249e0e063c787c8bc76bf2a9d0f95ea89f05d31c56b970","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60a12d44d0ac2124502a7765f6ae9f08c6a4a339a0e9be5ae4dcb2a8d0c372a0b52ab1cdc3ddcce2c5872e9ed360be8e94ed8737d81ad42de1c8cc5a8675d7ea337ff2c7601a3a77dd997cb8326e17633f14654736731d632f9660011b5c2518f4d88c249ee9593b","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061","state_after":"94b1d2dcddd360c14900fb006e44ca771ce4932c28db5638240f7569241a98d39c7188c52e72cd3c45bd75e005f899def6842676f8fd9c7fe97bd45117ff5242548ce40d2c0f63581cce7f39442e3202c99500de624f71fcce6820630cce6fae31e31ae375352840a5f363620769a65a5eb698484887dfa82a7c6545c33d6a5fa54764286502563856f6d0c417f9926beb28fb438c15f294a49a46ac020f2dd20f1dba6c477f6a63303cd3ab015ed5d4e10ea669d519279ed7dbbd34babf2fa77a141723d5771afd","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162","output":"9a99d2238d039ce1e95d8bd42664755d1d632fc97b54e6983814da656f858e07088dd437dadae29e5145bef018d27553ce5dd08080886301cc05fbcf4b8595f349d390e469bb55a7b03a7bab786dc2ec518c1f0e994c65af104b15d3a5e72c229fc949","state_after":"9a99d2238d039ce1e95d8bd42664755d1d632fc97b54e6983814da656f858e07088dd437dadae29e5145bef018d27553ce5dd08080886301cc05fbcf4b8595f349d390e469bb55a7b03a7bab786dc2ec518c1f0e994c65af104b15d3a5e72c229fc949132cea0a271c2435191d195b3b347b7648989d3d7ecf81a0834b9e0e38f2924cc13eb3069abfa423bb0f6f195728e330ee4ec9de395d94f1e9711db4d9fe65739d60be5e405a8adafba12d63abe82d8d266e33ebfe5d433d825ff5abbaf6ab1ff1326c1fd3","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616263","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616263df505660a29298e03c9092f290e0af2183311c57dd4e33054ff84b64fb9d8dcf05f80eeb7e0305fe4277e6eb605af289d12ed683aefa3902b8b8a05644f1e7fee4cdf470ebffb29eb35d12c03a0aa353f0187371e71bf1348aa7f68daf1f16316f9dd883","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364","state_after":"52725ff7257d9e59aca285b76754278b3f0ded4daaebe14fbc8c55a7498d09f8e7a3f7168f496416e97f05c1a8667620ad0aece809980efed12790957f76510416073e7edbf767baad33867f9f7ab1191a7f4aa0d51b30cd7d51ee5d9ff0d66da750a2826e7f29d9ddece5b57de852e770fab2ee1a7a8d8b6e68140a31ac0174ca63c6c7a5e45b6fc605a3db082eaf7d6f2bad47bf9604f69d62fc1e8c3cd91bf44c22ff483a88719446b6ad89fb23d882da0dbbcb886953b706724c96565fb0ddbd6eb1c2a09138","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465","output":"fd7db406054c2cbbf43ef857a7c4a9f42469a8c3bbf90567cc67b6245a4b1c71836784a3a9d7aa7f7d1770787041226318ff3262d12f81255d6f1c9037176a062ae85fe15c359fb11ec341d8fd7083caff779e0fc85cc9604f65d957215f8b6b8f2871c18372","state_after":"fd7db406054c2cbbf43ef857a7c4a9f42469a8c3bbf90567cc67b6245a4b1c71836784a3a9d7aa7f7d1770787041226318ff3262d12f81255d6f1c9037176a062ae85fe15c359fb11ec341d8fd7083caff779e0fc85cc9604f65d957215f8b6b8f2871c183725becd8ddb25b777b584c9deecb6878c6eab1da2c2592a6f1a7b0a5c08dd8801f3c415c9c233c0806b4e415452ba6d50ffb58c98119ef64548c7c227271fae1346f832b3bd3da06a74c1f953b9a48df8cb2e5c646c2503878daecafca807db9c4f2aa","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616263646566","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666774c0b37d5a0e671904824bd17f54e69b3b96f55b31ee63e9cdd0ac7d42475fcf5e14735e2080febcf14e661254510826dfd98911888ecc78e9f97a2574ed3cdad3b587aad1fe996b50640ad4bd75e1e4fcd1b5c967919a8760e62cc2976f54f2","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656667","state_after":"db378365595b9fbeb2b635bddbcfe5b308754e8dc9ec0b651791f20e363e60378453209d4fb1df7d1aa05f89775e8577dffcb708bbd827ddc634f9733436b363eb02ffb7b98bdf2be185effe49febd80f555b5c914a93e5ab335618d9acb2e6a660f60c0f645b7a8420a611e8aa54c742cf7e6da84f51c74c4b32a542f902d135383190352e46e8a9e043a545ac42d6721d4e9f893fc180abc8d7c63961d0b5334db618c51582c511becef88871bd07ff21961f7be04a9ad92daa1d7a203a6a1106fc285df7090fc","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768","output":"93591eb9031383e2670405faea2f307090f0f7c22e28baf3357d7fd0a854f6d37b8675bb5cc85da32d963265eadf5adfae24f9d1f6e80f812211bcb04fcff25343dfbca55f2e4a119edba98f2eebd063d8d47c94b7bac8aa9ced665f63d95bef6236cb6743d7aaee8a","state_after":"93591eb9031383e2670405faea2f307090f0f7c22e28baf3357d7fd0a854f6d37b8675bb5cc85da32d963265eadf5adfae24f9d1f6e80f812211bcb04fcff25343dfbca55f2e4a119edba98f2eebd063d8d47c94b7bac8aa9ced665f63d95bef6236cb6743d7aaee8a92f400d4cfd79a471c8d11bfa41cf727d8dd02be02b408dd440d5fcf2f256c44c4de354cf2b818be2afd3d0004f58d7d9a3f93c367edc2a8dbbc4fe1f752686e4bf869eddab721954373bdb1aab20f5716c350d32e2be73d79045e7863dafc","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f60616263646566676869","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f6061626364656667686928b680252f357a29ccd21ab45fb908b2c25a2351700d813a4d4be829e58dced236931f8159702f43c135107ef5abe0f564f08f5b3f4172c9f9752b544450f10bf90e275ee340a2fde2970df45feae9dd0d557ce9071ebe27517b4c04f458","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a","state_after":"dee6d0dc9b44303914ae0bc4fa7d7e8415bef5aeb25155ed1bb43963891f31712934639bc2ef70e7e8c6c1f8a73b2f471d869b0562450f6f20e3ed1c89f409f988a7d3749175724b44dca9bcfeefd2565aa71b371fa0ba1601df92aeb6bb12d18650a6d62a2e55a222819c4d9004af5db7a712e79e5bcb5ff279f6e31a828dfa91cb2d9fef69d71e3fff00096e027f0293111ae60d18dcb1b3c33ae64bf593be57a29c48ee26534caad1acf43dfc61766f111a79010486cdbce444b7d0d0548a58a3d5ba8014c3c3","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b","output":"793a4ca0d30a5e832e75ff3fbd525efc62b59eb56b78a2452123eeaee1edd2b24bd09e4cfb9fb9252fba3e933e349bd33f56555e8a329ac1af36275e588de666756a8096273d316b018f55f0cacb7e5a43cec0f32e5b676d520413c5ce12ec137e3c661d2ad5c8b0fc6a9152","state_after":"793a4ca0d30a5e832e75ff3fbd525efc62b59eb56b78a2452123eeaee1edd2b24bd09e4cfb9fb9252fba3e933e349bd33f56555e8a329ac1af36275e588de666756a8096273d316b018f55f0cacb7e5a43cec0f32e5b676d520413c5ce12ec137e3c661d2ad5c8b0fc6a91528f04705f1041083d7c1d7f194b09f1a2dcef5a75ea8de01ce8443e6d873f10f62b76084dae7b22e630bbf55bbc52fceaa7103707099235ef376180ce24ac74620de05ac02441af906e12c26b799ec49965b05d8af11df6de81bb4b07","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6cb6968336d79cb57bfde2c4bda233f87cbd187918a8e1eb41d91e7953462a51da2eeb43a405fe40932477b3a03d12b5eb1c2dfb312188a1996739f847f23f701c5d3d5f3fe934df5a0efe4c62086161164417d230fb71836a23686f","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d","state_after":"8c310a1c2adbfcdc553f961e826631019ed893c8ecfc84ff9854017030ca41513d5880f02912f46c91f99aee328b8a6ecda3bbaca5054f939a0c4dc766b3ae5007228e0e96625f9b2697716b02bea82c93774dd6d2992daaa2ca6e44c043479944561b727a69798b0476ac9c1fcbc3fc591b623293bf6e0026df3fe269f038b1d1a7892d37b84913b83dbcef932e26eaa7fa810579dd2f937bf95ca2e4b67400e62ce64cd153c9745c2c1b738bba0884f8a0c77e1fc09675b0d15b9238e41a48588d40aaa8f41d03","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e","output":"d5b31c9e8a68367f596bd56e912fbeaab55375a9b05ae5d445ba8c20874ab51c17a860b62f251d862cb8b49b65305bdbce65adf5eb24515c15414fbe1f9d231071b6a81198c249e6fbac383196456d8664e08b9f9177c326cf64c90ea2ec30225d6f26349cd466e64fcbc97ded7007","state_after":"d5b31c9e8a68367f596bd56e912fbeaab55375a9b05ae5d445ba8c20874ab51c17a860b62f251d862cb8b49b65305bdbce65adf5eb24515c15414fbe1f9d231071b6a81198c249e6fbac383196456d8664e08b9f9177c326cf64c90ea2ec30225d6f26349cd466e64fcbc97ded7007b57b6c1285a980fd6dd204eea3f26b815fd4f8da59a6b8f49e8322cf77bb66b1c7bb0ba821af80581377bd2c38137453a4ef883a9c52e6994f61814c0d716ad5a0d18b1f945eada5fcb80ebf10da482ea04cda286f09b00521","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f6415f655f1d4de1c8b615043f84c3168d63edee3b0fff7d8400786c97fd189ecd9ded65cadd34f4d9754551277fe3e8305bbab33c14a7321bb37054dd19cffd116eb376cb514146310e3298c547400cf502f60ed2b0e7a16","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70","state_after":"2572c84c55db280df408b7ed0b7f7b64e49e6f42790c398bc1ddd9359ad43c8373d8b8d4d25fc7be5dd28a5878208b2a2ab3ff0bfa8612cc9db040a37f5cf350e80d8cdf5934907f55e6d3b4c5ffc5dd753a38c66b45ea870ba57223a2d1f121849ce29769e6a7fd5d9584aebd1a2d224b669140a4d93ca4ada15e0fa34a9e6a774c1e6606fa154b0c5bb674eaf8a4894bafff9aeec2599cfda3e376d9eecf294671b70e9d92603b2d0634f3453643b2a679a34ef99fd2f2e7a6995881cc7c25da796dc1812b0e2c","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071","output":"5039b303cdeea24bb775b267ce00d0fbae618041263bb918096f12fd1a127614b14bb38acd7f1088edf6c6817a1a4668f431b550292e59e7dfcc108855d71bbaeba4e5a06f11a1303d3e93f1eee95b8feb9c0b444fcab607043c042ffd1cbe06af88ab6f9c4e784aa72e033b7e3f06cf7d26","state_after":"5039b303cdeea24bb775b267ce00d0fbae618041263bb918096f12fd1a127614b14bb38acd7f1088edf6c6817a1a4668f431b550292e59e7dfcc108855d71bbaeba4e5a06f11a1303d3e93f1eee95b8feb9c0b444fcab607043c042ffd1cbe06af88ab6f9c4e784aa72e033b7e3f06cf7d26fd3637720c1627b410342a78c12a3dd91891bd7f005cb529317d33ecee9299c700a5a64f1d81b152e43495c2ac7793ac0fd17b9a8ad02be8452a92f07d72107fd2c9bab0e886c0f76c3fa7b03be4b5c9fb7888f420e4","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172753a78e0463483af06d8154574032c20d247aeda5d7b8f397c0ebef1b1b073d47f1f4a65d4a76c3f3071de2f20c1940af6280fdaddfa26337ac5f3264dc7c3c7e4b68f1c5f9f1c92384d8448d6d98c410cf97ddb48","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717273","state_after":"57a498c4c29809f6037b81772af04c0c7b7873f49618b907b23711bb0dc42ab8c0499039e243c34336b3c0f0dd65871116330b028fe5878672d08d95356935d6922f6dad81a4a1fd38a5204004e7656ff743820f0ed91730038ab29c578627c9666f4137393396b7741ec9c183df4f095d811c539a97523b3b04ae03698f2499b1cf0931605eb000a55564f24192358740cb6bd01f3929edb17e18c498061b56b127513f900cf0a1fa2f3cb59ece2b6a89b883abce1e5d1533b00e194e579edc187781b485c5be0a","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374","output":"a401a13c7f4dd82ca29c64194c21b450f145bf1353e0194301699d78b8dc40f88125a452cad6ed8c4ad43d55fb9b2b906b80fa50fa82fb82b4e7f7582c142f406517cbcedb60b024047b054405d37db92c215ff3900b1cf4573b5041f514b238d4dac1cb2b2249c81c59314e19d14623d9c4594a2c","state_after":"a401a13c7f4dd82ca29c64194c21b450f145bf1353e0194301699d78b8dc40f88125a452cad6ed8c4ad43d55fb9b2b906b80fa50fa82fb82b4e7f7582c142f406517cbcedb60b024047b054405d37db92c215ff3900b1cf4573b5041f514b238d4dac1cb2b2249c81c59314e19d14623d9c4594a2c0532b6ae1d1ca290341fc7c4d9576e087225633020fda80e4383ba699fff2600488866a2c7a2e73e3d53959cc190a59d240840bfba184fd08d51efb5f61a256344b8d8c5f18b8f1d277484f56612abc0561daf","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374757240e2e7c21ceb0bb54c745b26020fb206c1204b2d29874b735a34c03ee45ab6a71ae69012abc1511846d1ba8374d99d144b8ef70928e55d8691aaeffa4aabd20fe125fe00373528b1d9be19c908741d2358","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717273747576","state_after":"51a1371143ab9bed3ac5e40b779d9041f437866fdf2c944d7ee0c9cee7c314d621b51d88a890dbcb07027d5ecb60647f0a8a8a35c513639974cbb2abaf5aa4ef7a41a8fe6a8af070dfc23940dbda674eed7baf7a1eb45a1a3c838e4647074e12eec2d34dc37070d4fdadde35be2970a6c6cd6fbdc4b387e7a16f1e4ae7441a1124a9287e75a1c8f49ffbb9c4db80d7aaca5c840dffe0af070a21cf716e3ca68c7fe4c6963f9bd4913d4a2d7d2a835f933099eafcfa8c7cc0062d0e84cf4dc7c1537f45a16fd253b2","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374757677","output":"0e40bc57e80a712d8c771e8d1a839b5359129f4ff6960a18e847a51f4270a580687bfd85885ef1992d0c45a18e57b9539d0f36370d82289c373c63763d64d81d546d16d77062833e169015a9b62b630ba93999e441d29c7de0bd6c425822ef442c802f1276b582e35db85f013a54ef275315c5dccbf8feec","state_after":"0e40bc57e80a712d8c771e8d1a839b5359129f4ff6960a18e847a51f4270a580687bfd85885ef1992d0c45a18e57b9539d0f36370d82289c373c63763d64d81d546d16d77062833e169015a9b62b630ba93999e441d29c7de0bd6c425822ef442c802f1276b582e35db85f013a54ef275315c5dccbf8feec5b5d5662e6d9402c88e9ec1ab8e46e0a17c6c63f660da7d19888b2b39e3fc643940204c8907e10771a0a896bbfc79bb3498737b48b9660645d6aa8f9102d53b95203116de4af7f09b73aa556b01bd6d7","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f7071727374757677785b5020bc635ea2891aa5e6ab78bbf4c00ffd3feef4a6f4a2092d15b91bfac00b01c917e639081c9a41cb497acfe85730075e0394174813b6c0e34aa4a0c277d928f6effd12c050bcf8d5dc13d5c1d6","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f70717273747576777879","state_after":"717fd3505ef54fb230222575b7ad247a5b0752e3a29f12f8cd73e74f3dd489a9d92f1ba7e48c5e38d46a47a1ac10f39c37a83f5de01396187e02667fe7aae58c929f7730e8e4ce95fa71beedd9bd051380cf00222fe96df00381377c42b37170abb649c399fb3d69f9a51fa8c290c7b93d3abe62e5f97643a5302b1130c702427208a8106a2b1b160d3757878f7529aa025aba21a324d549f4b03b02e1844892e3d37a455b612dd57b65f05e62d7b8ee3a0cda0de5821a6753659b0736c4f48c9dc60c2ebc485065","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a","output":"94348899b00be9aaa22bc961e2e793533be13059a4df79c4e45380ba03c31cc3a722f1a8c5a8f1cb9a5f1da9dd7d802952cc0e47ebea177f1286f9ec63ccac17165dbcf80a98df7df52d7859211e64480aa13ae616d8bd0ca88cf68ef2ce1d3c3f45851b3c916522d00c7e15833b5c73cead9a6c7610a3eb2d22fc","state_after":"94348899b00be9aaa22bc961e2e793533be13059a4df79c4e45380ba03c31cc3a722f1a8c5a8f1cb9a5f1da9dd7d802952cc0e47ebea177f1286f9ec63ccac17165dbcf80a98df7df52d7859211e64480aa13ae616d8bd0ca88cf68ef2ce1d3c3f45851b3c916522d00c7e15833b5c73cead9a6c7610a3eb2d22fcabc1330699a0f5b3a6a08759da13b27887d2bdff5daccc8b54abf6d7d277d044a0bfe628fe32fae102079d0a99020b115a11153f5df09f9cea182f933b0dfb026500c6aac1ff5277dce351b850","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b046ab1c24f764a4971ad7dca5711315a6df47849e2bb0d44f8b398bd250e524f194f92ec7e75495f851a2ea66c1327c6390535b259bbf9848d0a76a8d082587d6fa949cc4966388b82613a6f","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c","state_after":"e6568cb1294d198abf96de975113562b92657587e5cb1f5cf9cbec03df2cbfa3816d2151da265e6c121e5e2cb7b20283b3b61ac4eab05860109f2ac031564bbe9a5bf6843c1275cf9805b0d572dd7c660f8cf40e030dfb7099e687c947bd62218c25f04ae3096b7ee0ba8d4f746ecfb945077af55fc0214548af80b348ee1b4d41ff7b9b5702e75d613c206268d12581f56480650661268a38d6915443bc6c9937b6e538110662351fa191a53d681938d6b92e1fabf9050cb24fe4ac811f48e519c9a2a38be28f42","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d","output":"683994a1ebd3819cf37badb1f2877ab1f817ecc55e4892384bb6958030fd25fd43d155aa4edb8a909e1267f22feab8c3f34246ea660ac6d3d0ac471aa6af3ac24bf3fa8f66b9fcbd15eead6575af9a5fac25ba3c4cfbac3ec31f529d6d53b64deea08ac67a9548c33bc47dfe91153c6af6dfe24279ff096fb7f55c41c757","state_after":"683994a1ebd3819cf37badb1f2877ab1f817ecc55e4892384bb6958030fd25fd43d155aa4edb8a909e1267f22feab8c3f34246ea660ac6d3d0ac471aa6af3ac24bf3fa8f66b9fcbd15eead6575af9a5fac25ba3c4cfbac3ec31f529d6d53b64deea08ac67a9548c33bc47dfe91153c6af6dfe24279ff096fb7f55c41c757ce58d884c10b4878e3663016f523bb54a9f448cb4af3de5591c42b5b6a1c638cc16c66889abf8897223616a895ba34d7f3631570620c24c6d1d59c072b834112542ece0ded3b342a8c3c","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7eb4c5b69423d5fd86e4bf959c7c5c3a7d6c37544fe12ff4832f808445c8037b5b16df9f2cec83e2d24310c6abbd81dd3b7c3a8075138f598f26a43d25eb507c78da3182eeb5b314b289","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f","state_after":"b38550f5efd76f8328f404beae4c744522841ed3fd2ec940cb2691899c4fabd000622207be53359325a24fc7562a88800a8d016e028df6ba75609aa4170e04eb83967dd01b176c7e3f02659e1cb7e09eab1ad2722bd133dd2685ce6aa060a87456164977515ce4d12788a0fc1f339de0506cb16b682e09ed8475bd791cc36b0e94e639e066f9a8e61c269771117a37495fd7b31bb026a70da3a8570b0239051b0a523b2204ab86b512842d3ca7bd8a424407bb812eda25de519725c476a3e6f5272b7a8f15e6accf","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80","output":"667dc263ff5593d1d93c15ec378c5751e7e510741835b25a0f956fc5fce0f4b56d7bf4d881547310070f2943373a8ab9696176487e4536dac5a2fb030f08f835a3d9a3aa4bc6fb8f582cbd9ad71dd0becd95aabff756b89aa03ce78aa5f41d199aa911e2ec7a2f2a82f3b255b341c2209ed4c87885af4fd8577b75d30e2c800243","state_after":"667dc263ff5593d1d93c15ec378c5751e7e510741835b25a0f956fc5fce0f4b56d7bf4d881547310070f2943373a8ab9696176487e4536dac5a2fb030f08f835a3d9a3aa4bc6fb8f582cbd9ad71dd0becd95aabff756b89aa03ce78aa5f41d199aa911e2ec7a2f2a82f3b255b341c2209ed4c87885af4fd8577b75d30e2c80024396c68d9cf77bbf5da2d079ec45c61dd9c566376c68e9c56c0a43c1fa763a32607784ad84054ae1441db0692692d71e9d35a63923fb3fb57b620ce7329adb3c0e92b7009a989d3d","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081d25bc15f7861b14581f8c4238ba62818e81f9d8c023b29d8f4228049436b4fbfc333dd1cd94bb127dc0fe1fa9e83a1dfa1f4b6892876b6e91f776b33247c57944a25b0dfdaff","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182","state_after":"630f6f66afa1fa9660710018e3b1b41fd26339f2a502bda664b967dea31a9456ab30c335e99e521b1dd241220b54d5d6c244365e2fe6ead393c9707006c986918de682a16caa9f6d727e2da0773cdfa23045b4ee7365749bab2b30a27324fb130951a6d85357112c77d3f3b07709d9bee5561957095edbe4d069f10af1b84d35407dc89a9d728ca3c0a9180f1ea405ae0a12fe11f942da4f9b6d58e593f5634557c434e80f0bfad875522ff4b031af207bc1d7a8c12b58a0a165619a373452d3235e53c1a94fe5e8","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80818283","output":"834c451ca2fb891be7e7efc269ac610fac77dfae6ceb8262bf819b90a479b69011de1f9fc61c7018d40a240ad8ab4dc8612ff9770f3be10a3286a261045f0f6ac973867b641225bab0ad52ef262a4680e23c721e9a9764e6e30d1affe3ebe43173ab30a26e4c3e1e9ead5f9d7f4d10e3643fdb30d47f475f571915782d872667738f7de2","state_after":"834c451ca2fb891be7e7efc269ac610fac77dfae6ceb8262bf819b90a479b69011de1f9fc61c7018d40a240ad8ab4dc8612ff9770f3be10a3286a261045f0f6ac973867b641225bab0ad52ef262a4680e23c721e9a9764e6e30d1affe3ebe43173ab30a26e4c3e1e9ead5f9d7f4d10e3643fdb30d47f475f571915782d872667738f7de2f4d5b19cbc849949e8fc42851ed578f2069677664e803847a7abbfd8d81120fd2664bfa51db59d9a3ea0364f0bb6ce484613f06123e5f1e11b24472ec87f50a4bcb1508e","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828384","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80818283844af51884d6088e731af63859ef2d40045458a7bef335861e74f9cbebac9357dcb29a4c198d5d712b71ed57de272267d39d95dcfc552c0f17697494529c4a7647df7535","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485","state_after":"4a13d7a054d4e1c961148b580238c366b4f6d512dfc94ddb804f966ea145272cffad2beafeef6c8808ff569f5f149e31f8d7b9ad8e8018533fc86032899f44b88d1d051c0b438aab85a90f5f1dc32914d2eec5d8f4a69506228cad9a7f37c7738a8a19e172915b48cd40b7f14f3f5763d5aaa53f27b177d12cb89c5be4e5d0a8397798853e0c5521f0ac0240c7658ac328ddfd888681db456bd6e2c6fabdbab2f5032c817af4fc81ff27ccd0bd3b64fa86eb1d5a61a7fceb410ea3705b1aeecbaf22570771904afe","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80818283848586","output":"104e51122aa4e2af098319c5fd0cda46aae936fd2e661e5f136289d26d5858515af2798aa1160d0d947c20093a34243323cb631e5c0f68ef61577006e70bb0f0f032669166eb068b21584aef31d6d6fd742316516fcb165eb06abaedfee392e0fe26fa9f0af469b72b1297b5e41180b037af2bb91333f37fe364908a294fba25edee22e3cf55c1","state_after":"104e51122aa4e2af098319c5fd0cda46aae936fd2e661e5f136289d26d5858515af2798aa1160d0d947c20093a34243323cb631e5c0f68ef61577006e70bb0f0f032669166eb068b21584aef31d6d6fd742316516fcb165eb06abaedfee392e0fe26fa9f0af469b72b1297b5e41180b037af2bb91333f37fe364908a294fba25edee22e3cf55c19d765e7b6066e350599520f3576587676ac6659e4034ecd4afb2c48a22928271878440ac1227703fab6f52dbff30fa68c7206719166c362c5de033b8d4c53a3969","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828384858687","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f8081828384858687e047397bcd8e832464e04df2a4265065a05627740ab14b0b46ab1256320f11362452caf053f14f2fc6384a94adbf28239fa908a4b28971b122376b31eba6d962","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788","state_after":"4ab0618db5ec11af726bdf263d7a0485322f63fc3c0138c9b25b26fe0acad5394486dc859a72904dae0d011acf19be3151494cd481498dc86e47801088a9283dcd79191cd68384751c60cfbb37b26d13d906a0ef0372e5a6007559f74895041b1225bd840052d3b8e4b7fc7f7edf43a2529c4860e1f1313f122447aa283473dda27073a9c2ff1599f9db806df1e9d6bb4d0daaffd4775bebf02e112c3dafaeae9bcbe5c9a6fa3fd09f8f08826e6f5347eebe6b20a2b04b36b18b2645990af5e93afd9b022b4ed420","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f80818283848586878889","output":"51d08bd2747e0b3db8490dadbb8d48e47461f4ff95bf3107cc69d7c84e86c4baa304589bb9d5e45e63105478259c676519e09f1b44d8c9e395ead5782ac2ceaa393f4b14807eede36c8c3fd936e8217c24484ace60fb21b602c1642b27b342e1535753cdb5b3758865f84fa1108b730989a9f6f11a7213dbc1ac1b31dd406b73612e3795b5ce58370472","state_after":"51d08bd2747e0b3db8490dadbb8d48e47461f4ff95bf3107cc69d7c84e86c4baa304589bb9d5e45e63105478259c676519e09f1b44d8c9e395ead5782ac2ceaa393f4b14807eede36c8c3fd936e8217c24484ace60fb21b602c1642b27b342e1535753cdb5b3758865f84fa1108b730989a9f6f11a7213dbc1ac1b31dd406b73612e3795b5ce58370472c00e0bf103890d7245b8379bea59b1d471555a7ce5fbb19ddac7220346b01da61e97867552c78f25a7640d11ab4e8a2dc60ecd1b22b303235061f8137d58","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898ade4189cf8d0da504660c4ab5528bb25bf74898b9172b717ade27fb5423285bb82a036c7a279ef376eb54e46e1551daa60dada72c7713f602ea6666b9b7","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b","state_after":"89b74da12d361e675d63430ff88edd422d15282ccba220e4b805dd52245f37ff4ff44acc73ce48ed7a4d04c4dc9e19c013ca76701e03db4790bbe1b452154a05a0e96bd80bb0930c33c1dc386d8da6e262fa1ed042a2b3018c552948d10117256aa521efee0fbafe2cfada8b423daa4ea25239ea8007920d86436cf082a03c33d9f65475822baeb54d44e993ff264265eab289d7d3ab1e9a2df9d37c8a659ae2ddefb65ad4314d16970e8ac0de9752630a1bf42362a7b8a3285efbab48e1d9a2133d667b57ef2626","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c","output":"25647484c88f270419b3a1654e6e06943be873f0b3925ed8e8d8afdd1a3978d22b31a459374af352a0ad6afd341aa54faf53666f6ebe281265ee6a12448a480d039ecae0394a852b0de24e932d1f6b2c32d15e97f4c59bc4604d33ea19598cf3443a5ddd667f14248542680c3749721acdc6f6ec3c2b4b5a15f834028ec2e4a95e53bdabe00f4e49076f4a2bf6","state_after":"25647484c88f270419b3a1654e6e06943be873f0b3925ed8e8d8afdd1a3978d22b31a459374af352a0ad6afd341aa54faf53666f6ebe281265ee6a12448a480d039ecae0394a852b0de24e932d1f6b2c32d15e97f4c59bc4604d33ea19598cf3443a5ddd667f14248542680c3749721acdc6f6ec3c2b4b5a15f834028ec2e4a95e53bdabe00f4e49076f4a2bf64f08dbf31cf8de24ade0c0d39f6998a553281b215c41089873fec74172c2c57ca761d61310e461f9c75972b7d08d9caa8646dc64df19dc33487435","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d81b02db384b582ce1c134b944e0350546483c4284e97e5eda207b063a933d51bb4d88a5bd20168b95e25fdf16cb703b21dd92b3b15ca3e6e1453","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e","state_after":"71080a5dbdfcb7ecd402abca6b9319ae24a49fae28a1ed2f05da6d976b90f32ff3448bcd0adff8fcef25030c0af3076dd9e8d40696ab9b5d1a4bc3bbe26571e4e94260e1b460bcc815a38eac1fd9c934830394702c125810cb741f8623509da79093497aa441a37b1227dd2a690166444475a0236989e1f6bdf8a0f9a650fe4b29a4a94f234d7a14bfff8c9ee4b4836e7d3a270feed88a6f7d66af1df46066518b035434fe6e932cf77cb3a6f056198623ed3500e9f2da0583366e41642be5839e27bfaac33b6939","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f","output":"5b05f22c1bf25146ac42ce5b4d3a623c491f4b72bb157ae95df9efcb2c77abff9d9b2bb7ca70442486f4e211dff3959e662d1eb37af9fa323e7a7042a8026ad7dec88fcd65bb1543b8b9a16b9abe1f50b18fdf36dc62cccb0867ebb1949ab7587c534da371f39419e3c6cbfbd4df57e73d570a5e3cc307882657ba766f0966a67418c0ba70fc2fdae16c3efdd15fe32e","state_after":"5b05f22c1bf25146ac42ce5b4d3a623c491f4b72bb157ae95df9efcb2c77abff9d9b2bb7ca70442486f4e211dff3959e662d1eb37af9fa323e7a7042a8026ad7dec88fcd65bb1543b8b9a16b9abe1f50b18fdf36dc62cccb0867ebb1949ab7587c534da371f39419e3c6cbfbd4df57e73d570a5e3cc307882657ba766f0966a67418c0ba70fc2fdae16c3efdd15fe32ef2bb53c80737d788bcaf7f071000906d926f077efdfddd693ad4c216ddb05fe34608074e89b2bfbc8093e62273dcca62ac65553e92315347","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f9023818fe1503a8089934705c1633b7a8debe090d823ee99c5d0301bc1fa194cd2619adf35385b876593c455e7d2476dd00591af41d89bc8","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f9091","state_after":"3be8470beb5106f850d06623ae4444de07226738ce9b122809608a4a5e714189483d09224ff88825b577d9b429f7cd2ec159a7ac7d839a4dde1e02032fcbde438fe281b9ed068b2dc639634e1c692cfc166165a2dd42f1ad1fe69e81daa8048e8456576754d7d3692b85acac90597a3da0394143b1508ced62de9f1a6591c9b5e90859f66d4f0e931be78bf73457808ad60c2f9d9ae99c3892a39e402493f645baef503ac9c80294cda756bc3eb6b5f2a729158b75167eb5647924cfcb13e56617221edb7f39dad1","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192","output":"b0baa791c5ad2bc1c1788dae031f9b4c037a1c55108fe8ba6b8eb14601f50c11371afcee5adcd38cf063c4c40832ae6f53fb00a044f5e6346a53da11ec74a0aca594b73eea806c400f257bd2dd442c2728f32d327fe51fc3b23d02a553cb0073100074a54b3157db5862bc5f8acf466e2389e4db5dc05d23e2ff4f6ada017c96a6af0f37f1e03b9bded2c2a095a1c691e0b731","state_after":"b0baa791c5ad2bc1c1788dae031f9b4c037a1c55108fe8ba6b8eb14601f50c11371afcee5adcd38cf063c4c40832ae6f53fb00a044f5e6346a53da11ec74a0aca594b73eea806c400f257bd2dd442c2728f32d327fe51fc3b23d02a553cb0073100074a54b3157db5862bc5f8acf466e2389e4db5dc05d23e2ff4f6ada017c96a6af0f37f1e03b9bded2c2a095a1c691e0b731a28abb119b61b84e0e06b75b1ba82e3db0e729170362d555dec96b8aaa7e9e78f5f444a948eae9ff8135ecbb7a0a0951a393adbbf3","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f9091929339d6980eb203584e7796a528c43add2ac4a869b3ee3eca3f38c20a24f3ef8c3d700561351d9abeac4874095cd2dfed63fa91240e","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f9091929394","state_after":"bae0a4a91287dbf14fb29a8c67b911d8af49f87177d281f335a5afc3348e520cc67c5e204a480fbb173152cec55284a77b0d9e472d7635e314d9381c7f5dc3094b8256e52afa448ad5d20c7ad5d3b07a635b302b35250e3f82b71829cc1545aa17579be0ffd92a1e5cd5e7120d2a5556ebc99b7cc6de2ba2dd1eb36a3b02dae19073b08ccd4a24b6af4084d141307c077f6cc8cbfddef698adf52fd4d12283c7bc86065f71ca05d8aff53be03a15b2c696119303a3f91270dc848d96b70e7d7396da75111c8ec7d4","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495","output":"5d5c639d6cd976b7bf01ca2c25d088de6c4de082ff7b542e4903c6dd379bebc1ab3cd30c49f616b9fb45a1fee6ea50d3a3badb747d6ba75e0f7c63dc2a33483e43eb86360224c85c0ec1cf383ebba45e1fa3a05c9e53ac363a66228b47b37fee247d242a2ca2ce13be2379b815ef6cd68170ff29d30a5e263f79d26d4d94c868c2d76d162f015df2e2a28b411d49c06ce22c10273cb5","state_after":"5d5c639d6cd976b7bf01ca2c25d088de6c4de082ff7b542e4903c6dd379bebc1ab3cd30c49f616b9fb45a1fee6ea50d3a3badb747d6ba75e0f7c63dc2a33483e43eb86360224c85c0ec1cf383ebba45e1fa3a05c9e53ac363a66228b47b37fee247d242a2ca2ce13be2379b815ef6cd68170ff29d30a5e263f79d26d4d94c868c2d76d162f015df2e2a28b411d49c06ce22c10273cb55c28b26d4dc05dfabb78e839e2cee299fd9a2844fbb48e64562c56b56b2ef52476ff952d13bac9a7723fbf1f229a5875453e","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293949596","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495968ddb16d37f51ece45eaf093ae9aec1b1f01d05cf2f0d3d34348c7c0c735c5202fa74f6967aea56c0b919d829dfbc5f0563","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f9091929394959697","state_after":"5a78d653df9de0d22fab336a29a2908ba50fc42d6841df60265b55c92601d523535f5894a9645911ae6d561542b492b24816080a3265fd6f4f2b65fdcc1fd0a252306a2df5ebb2b722c64514f893a09f73e6a877b4c611a8e67900ae0040db0e1cd4b01d51bf5a284c30ca8626f820ea2fdf4f7aa2af9684f4ac0ff76c0aa3d3bbab746108349bccf125ace9d03914c94eef5d7b8c56e688ddfade1aa0ce0aa70db6ac5b4af73e33c1d54e48f1d4bc8b1ecaf5614b2ba687a20af470cc3a91f5abc97ab94bd08ea6","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798","output":"68b704466c18d72a7422e17c8619884be1ce9338a1124b5c26d84f34a9ea130700f8062ed30eba82ae05d0e3e40ea2e69beba969cbb84f0371fb7b061c5da5a61a57f202c78c787043f28939207586f0f8dd07a341449a837555c61b2d9275fc971729eaac17cb7d5e9f5b162fec61e8c2cd87cf0eb8941834e9b392ee4b141db35f568edfc43d4f3a79274ff7c984d3dd1878d2483f60612d","state_after":"68b704466c18d72a7422e17c8619884be1ce9338a1124b5c26d84f34a9ea130700f8062ed30eba82ae05d0e3e40ea2e69beba969cbb84f0371fb7b061c5da5a61a57f202c78c787043f28939207586f0f8dd07a341449a837555c61b2d9275fc971729eaac17cb7d5e9f5b162fec61e8c2cd87cf0eb8941834e9b392ee4b141db35f568edfc43d4f3a79274ff7c984d3dd1878d2483f60612d83880d409d610df0b2d386533b451a80a12af54ea6b7df9008cf78bcc4901ecee52eb875112bcfc66fe0c842ca3bec","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293949596979899","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f90919293949596979899c7e129ed9542b812674e444c1367a1ca51f67a9c7ec0ab0858b347dba4fdf8dab260feaf821ca8550b7e9853bb0c","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a","state_after":"73725472fe7b1446eacaad482b22455f6b99d0c516d9b67ba3b3cc677554b12599452a0b4b27ee6a086a6629ab513204785662bfcb39ac5ca82a6226e65851ada92560a81ee97e610441181c74c87e506cd40694e235cca59dc5ba13eba0f6bfddd09f8f108b544402b382f03e871e763036f40761ebd3663354c46b75a879c7d6f11a628242f078e6290f6808e7b80219b8d6944159ad297a2747066f3463de73aa0587dc4cea447bc23ea4d541282c0b0a86c00efe8f4c44f94fedca627ec61a918084af61b341","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b","output":"a5656d80d4124540adfe22d137e225e897a4b2eccae961a313429e685521160228414dfd1920250e2eaaf2e8cef336b1c501b504b84508d1fa5094951691b3889ec02b7dfc5d0db91c7f2320ecf2fe46c3f52a03a276392280c7f8c562d80bd74c647cc8241f8c48c10fd052b4eb58a50fb0859a8afc5efe1f184184d9cebd81e429f1cc2321432f73bb08fabd76c94022f7f4c7413b66e64228cd62","state_after":"a5656d80d4124540adfe22d137e225e897a4b2eccae961a313429e685521160228414dfd1920250e2eaaf2e8cef336b1c501b504b84508d1fa5094951691b3889ec02b7dfc5d0db91c7f2320ecf2fe46c3f52a03a276392280c7f8c562d80bd74c647cc8241f8c48c10fd052b4eb58a50fb0859a8afc5efe1f184184d9cebd81e429f1cc2321432f73bb08fabd76c94022f7f4c7413b66e64228cd6292e034615482d0551acd9a55b66cda0ec01ca753ab119e964286089c9a2df37f2059ce7bd32bdf928240e3ae","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9cafb4e979698e1ae0beb4e3cf3022c07cb7f52c03582b0f5c027aa4b44746fed3408f64c9eedfc27dc468c6","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d","state_after":"106c8426fce687d536a2d1cf6b0c38a6de4d6824ea86f63c43ef95ae9d0b83a3fb4cd8bba771a364052bcae9da00290a682e0caff0c220069c69d2c8815b3e1c470d55baaa823b2b27dfef95011a86377c6cd160382414f543462140eef9cd4448ae7113f543d53bf9f99bd0a5c4c4a18260e683a28f0c1db8b5d2859145622dc9c05a86b1a38de8cce6f0deaae6256d5affc6c0064254204b50353c12bd8f9512bc99c170d71c08ffabde72f00dcb3998b3ce6e62ba405ecd070f8fb0a2374613e9ba872226a990","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e","output":"170596c7b0cf3a8c098da939f8e72de3c6c0b20495cec5c9c268f1e8c7b483b1e560e2d5b4b16c0c68762e8221e3d4ff758c46ab859a2c9a71e4410d4cd8a0f2f28f9d70f011d3cb69df537e90ea1c9fdc2d550ae04a9c15c54c9712185703ab9a0e44d56c2be76fbbe48efab4df88100690de373aad1b0f3a82401518969a22fb085ff4cffb2e4d2bb45259477fc64a20968a8888869469247e73b1c366cd","state_after":"170596c7b0cf3a8c098da939f8e72de3c6c0b20495cec5c9c268f1e8c7b483b1e560e2d5b4b16c0c68762e8221e3d4ff758c46ab859a2c9a71e4410d4cd8a0f2f28f9d70f011d3cb69df537e90ea1c9fdc2d550ae04a9c15c54c9712185703ab9a0e44d56c2be76fbbe48efab4df88100690de373aad1b0f3a82401518969a22fb085ff4cffb2e4d2bb45259477fc64a20968a8888869469247e73b1c366cd973bc30f7da7b91c5e2c3ad51295d3dfeee4af9c333ef06bcf95556f50fb3c428cabbdbf6da0f37dee","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9f","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fc75e80a20bd7fff37eee5d7fcb6039b0e37893cfd993a66238cfb85457266bee05d8f725dc4593ce","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0","state_after":"05d7c4a13bbc7ac58eb080f71a4f04e0063d81a0cadef198ed04f5668f236748304015402a0ec32ec41bc9c5b4d9c05a94ccd2ce6d5f77d77220f9c857adbd45fc6df7e75d176cb89901f68b6950dd02df764b2d251987da9f83e367e6263d67d17213d318a6342add482a7e414340d5ed4c5f755d7044db1bbc64a7c24e0045d979f80df91c451c268def53aa34a31e9ee7e4fba70db5f20baa30af7fe699f6ce5eec6171135edd0f3d77de40bd5f76cc08e041979b7b1a620c91550a73b39349799f26ef244fad","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1","output":"26768b7eeec082e83300fad0b91aadb602a1157b30fa35e5bdc2ba0273c46a65b32cabcecfccf82e0b4cd7f1cbf29ab27f0d6c42cde86cd02d99bf267b0a79ccaec93c15f2179a4724354e7059aeaf99ad168b4446e4f354e53a49d4060798f54c17428caeadc7048a5e6465f367f9114a4e71712e4a5d91d64571f9927771f1848ee8b81f02bfcfba07277ea242389625115ed034d30e342666d37322b9a602a77c","state_after":"26768b7eeec082e83300fad0b91aadb602a1157b30fa35e5bdc2ba0273c46a65b32cabcecfccf82e0b4cd7f1cbf29ab27f0d6c42cde86cd02d99bf267b0a79ccaec93c15f2179a4724354e7059aeaf99ad168b4446e4f354e53a49d4060798f54c17428caeadc7048a5e6465f367f9114a4e71712e4a5d91d64571f9927771f1848ee8b81f02bfcfba07277ea242389625115ed034d30e342666d37322b9a602a77c5859ba81af5c2734d027f72909a90671ea66c74f2ae047b989f37c6f7f0c248effeb09b0e582","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2","state_after":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2e4317cfacbce311403b77225eff1fc96796e0e4c237e7707bda1fab3c7a96ae30b7bcaf6f6","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3","state_after":"22b32d8a527ef72d69cc5b25899c507d073babebc3a89dbf0f7f17739904f770f6990df3c2199552861f35984d990cce3dcb9c4a02ad74a91d6ccbd44bf0876260e5f0b161ab2ca422d321a7db6fc77c2c9494ce71f6148db2688ec75f13b808cd783d4b60918041ef5216f755d732e04b7125ef4bbbd7959cb05f297ccdba7e69aa38ed9cc249fcde69d653a85a288faad8bb35b57bb39f5e1dbcdbbcdc9011831c1dec91bcc8cb192da12a912baf128ffb217e96729ac2389eda7d6882f6b56054f86be4dc6b52","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4","output":"f616f165916649d0a864788d40e2f58d1e028d4bbfbd21318041fa10af3a52c91cdd97fa9e973e866276e17d84395bea324dc01e41a5cc053ae27ca1a2123823323f27cd6c323b063aa2e5ea3369f102f5918d66579005a843dde506223fe0effd8297e121db6620e7a3b2a17b119199eee9f94733ee4b0d7ee93519ea98e4270eb2459a5365721ff86d96241ab7059d9d90919f3f038d549931e8e47a447286f343839cea","state_after":"f616f165916649d0a864788d40e2f58d1e028d4bbfbd21318041fa10af3a52c91cdd97fa9e973e866276e17d84395bea324dc01e41a5cc053ae27ca1a2123823323f27cd6c323b063aa2e5ea3369f102f5918d66579005a843dde506223fe0effd8297e121db6620e7a3b2a17b119199eee9f94733ee4b0d7ee93519ea98e4270eb2459a5365721ff86d96241ab7059d9d90919f3f038d549931e8e47a447286f343839cea44de74bfe8dd57e88dd389e587d1154099a9c9e9810d520b0724e616c4091c33f1ffcf","stream":false},{"name":"KEY","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5","state_after":"130f205751b0b6c68ec8c238de814980682d2c93ddf595b0eaa2ade021fbca4d1d546da553d31ae7a320b360d9a6625df495d27a40eddeb084a0ce962630532a45f1fbda3a04099c8ebe6c45c4c625e1063bcfe01c7ac5b4f0a7ea7a77b31db3524aad0789b835afb687053437941f2876d3d3e8ed4eb85d77629c575c005f0a029c7e5a201713a75b84f515497dd10da88bef32ff696fe5194ffda021da4a5f3142edc5a8d61e88364245f1d62f976a99aeaef8dca4ad1f607eb43f0d01f2985c67c5d5a3a53f48","stream":false},{"name":"AD","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6","state_after":"989011d66963d6c9440958e4a72bfc7381ce92f9be7c1bf81a8bc9c7345d88f6400406bd967dbb5a3a29fa7fd4b158077efd041e8baf21629dece85fcf403664946264d2c8b2b9d0a320c2a429c74622f7fa2e25372325efd9ae6e1d0a8d0c7016cd88d91d92fb5159d909ec54b06eec023256a0182cbde4cad927382c532e63145e01367679f6b99da4bd45e80da36ae6ea3055f0ccb90aa8e94d388903f53d8051b8da8cc730a0efb89995b17c16e7d20b0992e45f52c90896435fcfc92c6c8e9ab7b8d271f8cb","stream":false},{"name":"send_ENC","meta":false,"input_data":"000102030405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7","output":"948f9286c1af3ad870bfb7066ada250275410f4ac39d7a4dc99717b79f410dd58d6466752f3db43a0be6c45010f2b62b6b22819358e98740949cde517bba07b2be3e3c7238144ee401bca1f847ceabba57888b87c7efa232ba27b093fb7f1a94ca35b7fccfcea7973958f5e49d27e73150499b7d5c55a52e4c58a3d1066a7d14aebf5824b9f9fe654f1eb1a872efc69ecd8bbb36a476c1c407ff85f5da713be7f2b7936b0a8c75a2","state_after":"75a286e3980b3179e7d81609c092a572fd37e986cd67bf761e898d057533fd46deab8392bd446b04d6d5ba501edf0f03b8d2b9eb27c667e62bfb987eeb86b6bd45c614d806d9094692d9cc7fd54c38a8181bf376e1ec14bf09c9271091d3f06d4a37baeb1799929d02cdba6ed9ab80c08c8cd8801921413e77f226a295de611b8047c3854a9b11e27fc8a6a2b961f87cc661f6a064006c4009d851e6ca5daae517092319dd0a1c1daf69a247eb40f24d121e51ac6dc7d8337c33e345fd2cf2a28cde5ade52324b57","stream":false},{"name":"send_MAC","meta":true,"input_length":16,"output":"b68915353421a201fd4570a3c4de17cb","state_after":"b68915353421a201fd4570a3c4de17cb9161524ff97819cfb726838799e8c2281dc639b849533f4f128a6eee4f88e39a80e0bb7f4cb0716db393a6b9392edb4d8813c9e74ba5c7dedc00d0654b801b5e9502be2cee9e35c6ffb5f9aa95bdcbbf02d601a670000865c6058610f817cf6901247339092f60737222832af64f6bd7278a7c18daa7f96502cc030c2ecf00aeef568e391b103089fbeab51d579cd9369f819986316daac3025a677b5e8338106ad2c06d360381b03426ed702000e6ce25739c30ba8fc2f6","stream":false}]}]} -------------------------------------------------------------------------------- /strobe/vectors_test.go: -------------------------------------------------------------------------------- 1 | package strobe 2 | 3 | import ( 4 | "encoding/hex" 5 | "encoding/json" 6 | "fmt" 7 | "os" 8 | "testing" 9 | ) 10 | 11 | // Operation is holding a test vector operation 12 | type Operation struct { 13 | OpName string `json:"name"` 14 | 15 | // for Init 16 | OpCustomString string `json:"custom_string,omitempty"` 17 | OpSecurity int `json:"security,omitempty"` 18 | 19 | // for other operations 20 | OpMeta bool `json:"meta"` 21 | OpInputData string `json:"input_data,omitempty"` 22 | OpInputLength int `json:"input_length,omitempty"` 23 | OpOutput string `json:"output,omitempty"` 24 | OpStateAfter string `json:"state_after"` 25 | OpStream bool `json:"stream"` 26 | } 27 | 28 | func DebugInit(customString string, security int) (_ Strobe, op Operation) { 29 | 30 | s := InitStrobe(customString, security) 31 | 32 | op.OpName = "init" 33 | op.OpCustomString = customString 34 | op.OpSecurity = 128 35 | op.OpStateAfter = s.debugPrintState() 36 | 37 | // 38 | return s, op 39 | } 40 | 41 | func (s *Strobe) DebugGoThroughOperation(operation string, meta bool, inputData []byte, inputLength int, stream bool) (op Operation) { 42 | // create operation object 43 | op.OpName = operation 44 | op.OpInputData = hex.EncodeToString(inputData) 45 | op.OpInputLength = inputLength 46 | op.OpMeta = meta 47 | op.OpStream = stream 48 | // go through operation 49 | outputData := s.Operate(meta, operation, inputData, inputLength, stream) 50 | if len(outputData) > 0 { 51 | op.OpOutput = hex.EncodeToString(outputData) 52 | } 53 | // state 54 | op.OpStateAfter = s.debugPrintState() 55 | // 56 | return 57 | } 58 | 59 | type TestVector struct { 60 | Name string `json:"name"` 61 | Operations []Operation `json:"operations"` 62 | } 63 | 64 | type TestVectors struct { 65 | TestVectors []TestVector `json:"test_vectors"` 66 | } 67 | 68 | func TestGenTestVectors(t *testing.T) { 69 | // skipping this 70 | if testing.Short() { 71 | t.Skip("skipping generation of test vectors.") 72 | } 73 | 74 | // test vector file 75 | out, err := os.Create("test_vectors/test_vectors.json") 76 | if err != nil { 77 | t.Fatal("couldn't create test vector file") 78 | } 79 | defer out.Close() 80 | 81 | // the structure 82 | var testVectors TestVectors 83 | 84 | // go through runs 85 | testVectors.TestVectors = append(testVectors.TestVectors, simpleTest()) 86 | testVectors.TestVectors = append(testVectors.TestVectors, metaTest()) 87 | testVectors.TestVectors = append(testVectors.TestVectors, streamingTest()) 88 | testVectors.TestVectors = append(testVectors.TestVectors, boundaryBlocksTest()) 89 | 90 | // save output 91 | jsonOutput, _ := json.Marshal(testVectors) 92 | fmt.Fprintf(out, string(jsonOutput)) 93 | } 94 | 95 | func simpleTest() (testVector TestVector) { 96 | // start the run 97 | testVector.Name = "simple tests" 98 | // init 99 | s, op := DebugInit("custom string", 128) 100 | testVector.Operations = append(testVector.Operations, op) 101 | // KEY 102 | key := []byte("010101") 103 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("KEY", false, key, 0, false)) 104 | // AD 105 | message := []byte("hello, how are you good sir?") 106 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("AD", false, message, 0, false)) 107 | // PRF 108 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("PRF", false, []byte{}, 16, false)) 109 | // RATCHET 110 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("RATCHET", false, []byte{}, 32, false)) 111 | // send_ENC 112 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_ENC", false, []byte("hi how are you"), 0, false)) 113 | // recv_ENC 114 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("recv_ENC", false, []byte("hi how are you"), 0, false)) 115 | // send_MAC 116 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_MAC", false, []byte{}, 16, false)) 117 | // recv_MAC 118 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("recv_MAC", false, []byte("hi how are you"), 0, false)) 119 | // send_CLR 120 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_CLR", false, []byte("hi how are you"), 0, false)) 121 | // recv_CLR 122 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("recv_CLR", false, []byte("hi how are you"), 0, false)) 123 | return 124 | } 125 | func metaTest() (testVector TestVector) { 126 | // start the run 127 | testVector.Name = "meta tests" 128 | // init 129 | s, op := DebugInit("custom string number 2, that's a pretty long string", 128) 130 | testVector.Operations = append(testVector.Operations, op) 131 | // KEY 132 | key := []byte("010101") 133 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("KEY", false, key, 0, false)) 134 | // AD 135 | message := []byte("hello, how are you good sir?") 136 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("AD", true, message, 0, false)) 137 | // PRF 138 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("PRF", false, []byte{}, 16, false)) 139 | // RATCHET 140 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("RATCHET", true, []byte{}, 32, false)) 141 | // send_ENC 142 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_ENC", true, []byte("hi how are you"), 0, false)) 143 | // recv_ENC 144 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("recv_ENC", true, []byte("hi how are you"), 0, false)) 145 | // send_MAC 146 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_MAC", true, []byte{}, 16, false)) 147 | // recv_MAC 148 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("recv_MAC", true, []byte("hi how are you"), 0, false)) 149 | // send_CLR 150 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_CLR", true, []byte("hi how are you"), 0, false)) 151 | // recv_CLR 152 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("recv_CLR", true, []byte("hi how are you"), 0, false)) 153 | return 154 | } 155 | 156 | func streamingTest() (testVector TestVector) { 157 | // start the run 158 | testVector.Name = "streaming tests" 159 | // init 160 | s, op := DebugInit("custom string number 2, that's a pretty long string", 128) 161 | testVector.Operations = append(testVector.Operations, op) 162 | // KEY 163 | key := []byte("0101010100100101010101010101001001") 164 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("KEY", false, key, 0, false)) 165 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("KEY", false, key, 0, true)) 166 | // AD 167 | message := []byte("hello, how are you good sir? ????") 168 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("AD", false, message, 0, false)) 169 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("AD", false, message, 0, true)) 170 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("AD", false, message, 0, false)) 171 | // send_MAC so there's an output vector at the end of this test 172 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_MAC", true, []byte{}, 16, false)) 173 | return 174 | } 175 | 176 | func boundaryBlocksTest() (testVector TestVector) { 177 | // start the run 178 | testVector.Name = "boundary tests" 179 | // init 180 | s, op := DebugInit("custom string number 2, that's a pretty long string", 128) 181 | testVector.Operations = append(testVector.Operations, op) 182 | // StrobeR is 166 for 128-bit security, so we go around it 183 | inputData := []byte{} 184 | for i := 0; i < 168; i++ { // 185 | inputData = append(inputData, byte(i)) 186 | if i%3 == 0 { 187 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("KEY", false, inputData, 0, false)) 188 | } else if i%3 == 1 { 189 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("AD", false, inputData, 0, false)) 190 | } else { 191 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_ENC", false, inputData, 0, false)) 192 | } 193 | } 194 | // send_MAC so there's an output vector at the end of this test 195 | testVector.Operations = append(testVector.Operations, s.DebugGoThroughOperation("send_MAC", true, []byte{}, 16, false)) 196 | return 197 | } 198 | --------------------------------------------------------------------------------