camellia-0.1.0/.cargo_vcs_info.json0000644000000001460000000000100126020ustar { "git": { "sha1": "5eb3b7b0392a0d75bd681e4ac3c823bc8f7c401b" }, "path_in_vcs": "camellia" }camellia-0.1.0/CHANGELOG.md000064400000000000000000000005541046102023000132060ustar 00000000000000# Changelog All notable changes to this project will be documented in this file. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## 0.1.0 (2022-09-26) - Initial release ([#293]) [#293]: https://github.com/RustCrypto/block-ciphers/pull/293 camellia-0.1.0/Cargo.toml0000644000000022550000000000100106030ustar # THIS FILE IS AUTOMATICALLY GENERATED BY CARGO # # When uploading crates to the registry Cargo will automatically # "normalize" Cargo.toml files for maximal compatibility # with all versions of Cargo and also rewrite `path` dependencies # to registry (e.g., crates.io) dependencies. # # If you are reading this file be aware that the original Cargo.toml # will likely look very different (and much more reasonable). # See Cargo.toml.orig for the original contents. [package] edition = "2021" rust-version = "1.56" name = "camellia" version = "0.1.0" authors = ["RustCrypto Developers"] description = "Camellia block cipher" documentation = "https://docs.rs/camellia" readme = "README.md" keywords = [ "crypto", "camellia", "block-cipher", ] categories = [ "cryptography", "no-std", ] license = "MIT OR Apache-2.0" repository = "https://github.com/RustCrypto/block-ciphers" resolver = "1" [package.metadata.docs.rs] rustdoc-args = [ "--cfg", "docsrs", ] [dependencies.byteorder] version = "1.1" default-features = false [dependencies.cipher] version = "0.4.2" [dev-dependencies.cipher] version = "0.4.2" features = ["dev"] [features] zeroize = ["cipher/zeroize"] camellia-0.1.0/Cargo.toml.orig0000644000000012340000000000100115360ustar [package] name = "camellia" version = "0.1.0" description = "Camellia block cipher" authors = ["RustCrypto Developers"] license = "MIT OR Apache-2.0" edition = "2021" rust-version = "1.56" readme = "README.md" documentation = "https://docs.rs/camellia" repository = "https://github.com/RustCrypto/block-ciphers" keywords = ["crypto", "camellia", "block-cipher"] categories = ["cryptography", "no-std"] [dependencies] byteorder = { version = "1.1", default-features = false } cipher = "0.4.2" [dev-dependencies] cipher = { version = "0.4.2", features = ["dev"] } [features] zeroize = ["cipher/zeroize"] [package.metadata.docs.rs] rustdoc-args = ["--cfg", "docsrs"] camellia-0.1.0/Cargo.toml.orig000064400000000000000000000012341046102023000142600ustar 00000000000000[package] name = "camellia" version = "0.1.0" description = "Camellia block cipher" authors = ["RustCrypto Developers"] license = "MIT OR Apache-2.0" edition = "2021" rust-version = "1.56" readme = "README.md" documentation = "https://docs.rs/camellia" repository = "https://github.com/RustCrypto/block-ciphers" keywords = ["crypto", "camellia", "block-cipher"] categories = ["cryptography", "no-std"] [dependencies] byteorder = { version = "1.1", default-features = false } cipher = "0.4.2" [dev-dependencies] cipher = { version = "0.4.2", features = ["dev"] } [features] zeroize = ["cipher/zeroize"] [package.metadata.docs.rs] rustdoc-args = ["--cfg", "docsrs"] camellia-0.1.0/LICENSE-APACHE000064400000000000000000000251411046102023000133200ustar 00000000000000 Apache License Version 2.0, January 2004 http://www.apache.org/licenses/ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 1. Definitions. "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and (b) You must cause any modified files to carry prominent notices stating that You changed the files; and (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. END OF TERMS AND CONDITIONS APPENDIX: How to apply the Apache License to your work. To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. Copyright [yyyy] [name of copyright owner] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. camellia-0.1.0/LICENSE-MIT000064400000000000000000000020361046102023000130260ustar 00000000000000Copyright (c) 2021 Shun Sakai Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. camellia-0.1.0/README.md000064400000000000000000000046611046102023000126570ustar 00000000000000# RustCrypto: Camellia Cipher [![crate][crate-image]][crate-link] [![Docs][docs-image]][docs-link] ![Apache2/MIT licensed][license-image] ![Rust Version][rustc-image] [![Project Chat][chat-image]][chat-link] [![Build Status][build-image]][build-link] [![HAZMAT][hazmat-image]][hazmat-link] Pure Rust implementation of the [Camellia block cipher][1]. [Documentation][docs-link] ## ⚠️ Security Warning: [Hazmat!][hazmat-link] This crate does not ensure ciphertexts are authentic (i.e. by using a MAC to verify ciphertext integrity), which can lead to serious vulnerabilities if used incorrectly! No security audits of this crate have ever been performed, and it has not been thoroughly assessed to ensure its operation is constant-time on common CPU architectures. USE AT YOUR OWN RISK! ## Minimum Supported Rust Version Rust **1.56** or higher. Minimum supported Rust version can be changed in the future, but it will be done with a minor version bump. ## SemVer Policy - All on-by-default features of this library are covered by SemVer - MSRV is considered exempt from SemVer as noted above ## License Licensed under either of: * [Apache License, Version 2.0](http://www.apache.org/licenses/LICENSE-2.0) * [MIT license](http://opensource.org/licenses/MIT) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in the work by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. [//]: # (badges) [crate-image]: https://img.shields.io/crates/v/camellia.svg [crate-link]: https://crates.io/crates/camellia [docs-image]: https://docs.rs/camellia/badge.svg [docs-link]: https://docs.rs/camellia/ [license-image]: https://img.shields.io/badge/license-Apache2.0/MIT-blue.svg [rustc-image]: https://img.shields.io/badge/rustc-1.56+-blue.svg [hazmat-image]: https://img.shields.io/badge/crypto-hazmat%E2%9A%A0-red.svg [hazmat-link]: https://github.com/RustCrypto/meta/blob/master/HAZMAT.md [chat-image]: https://img.shields.io/badge/zulip-join_chat-blue.svg [chat-link]: https://rustcrypto.zulipchat.com/#narrow/stream/260039-block-ciphers [build-image]: https://github.com/RustCrypto/block-ciphers/workflows/camellia/badge.svg?branch=master&event=push [build-link]: https://github.com/RustCrypto/block-ciphers/actions?query=workflow%3Acamellia [//]: # (general links) [1]: https://en.wikipedia.org/wiki/Camellia_(cipher) camellia-0.1.0/src/camellia.rs000064400000000000000000000244011046102023000142760ustar 00000000000000// // Based on src/lib/block/camellia/camellia.cpp from https://github.com/randombit/botan // Revision: 32bf9784bd6ee29cb3ffa173f0a734e9edce2dac // /* * Camellia * (C) 2012,2020 Jack Lloyd * * Botan is released under the Simplified BSD License (see license.txt) */ use core::fmt; use byteorder::{ByteOrder, BE}; use cipher::{ consts::{U16, U24, U32}, AlgorithmName, BlockCipher, Key, KeyInit, KeySizeUser, }; #[cfg(feature = "zeroize")] use cipher::zeroize::{Zeroize, ZeroizeOnDrop}; use crate::consts::{SBOXES, SIGMAS}; /// F-function of component of Camellia defined in RFC 3713. fn f(input: u64, key: u64) -> u64 { let x = (input ^ key).to_be_bytes(); let z1 = 0x0101_0100_0100_0001 * u64::from(SBOXES[0][usize::from(x[0])]); let z2 = 0x0001_0101_0101_0000 * u64::from(SBOXES[1][usize::from(x[1])]); let z3 = 0x0100_0101_0001_0100 * u64::from(SBOXES[2][usize::from(x[2])]); let z4 = 0x0101_0001_0000_0101 * u64::from(SBOXES[3][usize::from(x[3])]); let z5 = 0x0001_0101_0001_0101 * u64::from(SBOXES[1][usize::from(x[4])]); let z6 = 0x0100_0101_0100_0101 * u64::from(SBOXES[2][usize::from(x[5])]); let z7 = 0x0101_0001_0101_0001 * u64::from(SBOXES[3][usize::from(x[6])]); let z8 = 0x0101_0100_0101_0100 * u64::from(SBOXES[0][usize::from(x[7])]); z1 ^ z2 ^ z3 ^ z4 ^ z5 ^ z6 ^ z7 ^ z8 } /// FL-function of component of Camellia defined in RFC 3713. fn fl(input: u64, key: u64) -> u64 { let mut x1 = u32::try_from(input >> 32).unwrap(); let mut x2 = u32::try_from(input & 0xffff_ffff).unwrap(); let k1 = u32::try_from(key >> 32).unwrap(); let k2 = u32::try_from(key & 0xffff_ffff).unwrap(); x2 ^= (x1 & k1).rotate_left(1); x1 ^= x2 | k2; (u64::from(x1) << 32) | u64::from(x2) } /// FLINV-function of component of Camellia defined in RFC 3713. fn flinv(input: u64, key: u64) -> u64 { let mut y1 = u32::try_from(input >> 32).unwrap(); let mut y2 = u32::try_from(input & 0xffff_ffff).unwrap(); let k1 = u32::try_from(key >> 32).unwrap(); let k2 = u32::try_from(key & 0xffff_ffff).unwrap(); y1 ^= y2 | k2; y2 ^= (y1 & k1).rotate_left(1); (u64::from(y1) << 32) | u64::from(y2) } macro_rules! set_kl { ($key:expr) => { ( u64::from_be_bytes($key[0..8].try_into().unwrap()), u64::from_be_bytes($key[8..16].try_into().unwrap()), ) }; } fn set_ka(kl: (u64, u64), kr: (u64, u64)) -> (u64, u64) { let mut d1 = kl.0 ^ kr.0; let mut d2 = kl.1 ^ kr.1; d2 ^= f(d1, SIGMAS[0]); d1 ^= f(d2, SIGMAS[1]); d1 ^= kl.0; d2 ^= kl.1; d2 ^= f(d1, SIGMAS[2]); d1 ^= f(d2, SIGMAS[3]); (d1, d2) } fn set_kb(ka: (u64, u64), kr: (u64, u64)) -> (u64, u64) { let mut d1 = ka.0 ^ kr.0; let mut d2 = ka.1 ^ kr.1; d2 ^= f(d1, SIGMAS[4]); d1 ^= f(d2, SIGMAS[5]); (d1, d2) } /// Performs rotate left and taking the higher-half of it. fn rotate_left_high(val: (u64, u64), mut shift: u8) -> u64 { if shift >= 64 { shift -= 64; } (val.0 << shift) | (val.1 >> (64 - shift)) } /// Performs rotate left and taking the lower-half of it. fn rotate_left_low(val: (u64, u64), mut shift: u8) -> u64 { if shift >= 64 { shift -= 64; } (val.0 >> (64 - shift)) | (val.1 << shift) } impl Camellia128 { fn gen_subkeys(kl: (u64, u64), ka: (u64, u64)) -> Self { let mut k = [u64::default(); 26]; k[0] = kl.0; k[1] = kl.1; k[2] = ka.0; k[3] = ka.1; k[4] = rotate_left_high(kl, 15); k[5] = rotate_left_low(kl, 15); k[6] = rotate_left_high(ka, 15); k[7] = rotate_left_low(ka, 15); k[8] = rotate_left_high(ka, 30); k[9] = rotate_left_low(ka, 30); k[10] = rotate_left_high(kl, 45); k[11] = rotate_left_low(kl, 45); k[12] = rotate_left_high(ka, 45); k[13] = rotate_left_low(kl, 60); k[14] = rotate_left_high(ka, 60); k[15] = rotate_left_low(ka, 60); k[16] = rotate_left_low(kl, 77); k[17] = rotate_left_high(kl, 77); k[18] = rotate_left_low(kl, 94); k[19] = rotate_left_high(kl, 94); k[20] = rotate_left_low(ka, 94); k[21] = rotate_left_high(ka, 94); k[22] = rotate_left_low(kl, 111); k[23] = rotate_left_high(kl, 111); k[24] = rotate_left_low(ka, 111); k[25] = rotate_left_high(ka, 111); Self { k } } } macro_rules! impl_gen_subkeys { ($name:ident) => { impl $name { fn gen_subkeys(kl: (u64, u64), kr: (u64, u64), ka: (u64, u64), kb: (u64, u64)) -> Self { let mut k = [u64::default(); 34]; k[0] = kl.0; k[1] = kl.1; k[2] = kb.0; k[3] = kb.1; k[4] = rotate_left_high(kr, 15); k[5] = rotate_left_low(kr, 15); k[6] = rotate_left_high(ka, 15); k[7] = rotate_left_low(ka, 15); k[8] = rotate_left_high(kr, 30); k[9] = rotate_left_low(kr, 30); k[10] = rotate_left_high(kb, 30); k[11] = rotate_left_low(kb, 30); k[12] = rotate_left_high(kl, 45); k[13] = rotate_left_low(kl, 45); k[14] = rotate_left_high(ka, 45); k[15] = rotate_left_low(ka, 45); k[16] = rotate_left_high(kl, 60); k[17] = rotate_left_low(kl, 60); k[18] = rotate_left_high(kr, 60); k[19] = rotate_left_low(kr, 60); k[20] = rotate_left_high(kb, 60); k[21] = rotate_left_low(kb, 60); k[22] = rotate_left_low(kl, 77); k[23] = rotate_left_high(kl, 77); k[24] = rotate_left_low(ka, 77); k[25] = rotate_left_high(ka, 77); k[26] = rotate_left_low(kr, 94); k[27] = rotate_left_high(kr, 94); k[28] = rotate_left_low(ka, 94); k[29] = rotate_left_high(ka, 94); k[30] = rotate_left_low(kl, 111); k[31] = rotate_left_high(kl, 111); k[32] = rotate_left_low(kb, 111); k[33] = rotate_left_high(kb, 111); Self { k } } } }; } impl_gen_subkeys!(Camellia192); impl_gen_subkeys!(Camellia256); impl KeyInit for Camellia128 { fn new(key: &Key) -> Self { let kl = set_kl!(key); let kr = (u64::default(), u64::default()); let ka = set_ka(kl, kr); Self::gen_subkeys(kl, ka) } } impl KeyInit for Camellia192 { fn new(key: &Key) -> Self { let kl = set_kl!(key); let kr = u64::from_be_bytes(key[16..24].try_into().unwrap()); let kr = (kr, !kr); let ka = set_ka(kl, kr); let kb = set_kb(ka, kr); Self::gen_subkeys(kl, kr, ka, kb) } } impl KeyInit for Camellia256 { fn new(key: &Key) -> Self { let kl = set_kl!(key); let kr = ( u64::from_be_bytes(key[16..24].try_into().unwrap()), u64::from_be_bytes(key[24..32].try_into().unwrap()), ); let ka = set_ka(kl, kr); let kb = set_kb(ka, kr); Self::gen_subkeys(kl, kr, ka, kb) } } macro_rules! impl_camellia { ($name:ident, $subkey_size:literal, $key_size:ty, $doc:literal) => { #[doc = $doc] #[derive(Clone)] pub struct $name { /// Subkeys. k: [u64; $subkey_size], } impl BlockCipher for $name {} impl KeySizeUser for $name { type KeySize = $key_size; } impl fmt::Debug for $name { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(concat!(stringify!($name), " { ... }")) } } impl AlgorithmName for $name { fn write_alg_name(f: &mut fmt::Formatter<'_>) -> fmt::Result { f.write_str(stringify!($name)) } } #[cfg(feature = "zeroize")] #[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))] impl Drop for $name { fn drop(&mut self) { self.k.zeroize(); } } #[cfg(feature = "zeroize")] #[cfg_attr(docsrs, doc(cfg(feature = "zeroize")))] impl ZeroizeOnDrop for $name {} cipher::impl_simple_block_encdec!( $name, U16, cipher, block, encrypt: { let b = block.get_in(); let mut d1 = u64::from_be_bytes(b[0..8].try_into().unwrap()); let mut d2 = u64::from_be_bytes(b[8..16].try_into().unwrap()); d1 ^= cipher.k[0]; d2 ^= cipher.k[1]; for i in (2..$subkey_size - 2).step_by(2) { if i % 8 == 0 { d1 = fl(d1, cipher.k[i]); d2 = flinv(d2, cipher.k[i + 1]); continue; } d2 ^= f(d1, cipher.k[i]); d1 ^= f(d2, cipher.k[i + 1]); } d2 ^= cipher.k[$subkey_size - 2]; d1 ^= cipher.k[$subkey_size - 1]; BE::write_u64_into(&[d2, d1], block.get_out()); } decrypt: { let b = block.get_in(); let mut d1 = u64::from_be_bytes(b[0..8].try_into().unwrap()); let mut d2 = u64::from_be_bytes(b[8..16].try_into().unwrap()); d2 ^= cipher.k[$subkey_size - 1]; d1 ^= cipher.k[$subkey_size - 2]; for i in (2..$subkey_size - 2).rev().step_by(2) { if (i - 1) % 8 == 0 { d1 = fl(d1, cipher.k[i]); d2 = flinv(d2, cipher.k[i - 1]); continue; } d2 ^= f(d1, cipher.k[i]); d1 ^= f(d2, cipher.k[i - 1]); } d1 ^= cipher.k[1]; d2 ^= cipher.k[0]; BE::write_u64_into(&[d2, d1], block.get_out()); } ); }; } impl_camellia!(Camellia128, 26, U16, "Camellia-128 block cipher instance."); impl_camellia!(Camellia192, 34, U24, "Camellia-192 block cipher instance."); impl_camellia!(Camellia256, 34, U32, "Camellia-256 block cipher instance."); camellia-0.1.0/src/consts.rs000064400000000000000000000161361046102023000140460ustar 00000000000000/// Constants used as "keys" in the F-function in the key schedule part. pub const SIGMAS: [u64; 6] = [ // Sigma1 0xa09e_667f_3bcc_908b, // Sigma2 0xb67a_e858_4caa_73b2, // Sigma3 0xc6ef_372f_e94f_82be, // Sigma4 0x54ff_53a5_f1d3_6f1c, // Sigma5 0x10e5_27fa_de68_2d1d, // Sigma6 0xb056_88c2_b3e6_c1fd, ]; /// Sboxes of Camellia defined in RFC 3713. pub const SBOXES: [[u8; 256]; 4] = [ // SBOX1 [ 0x70, 0x82, 0x2c, 0xec, 0xb3, 0x27, 0xc0, 0xe5, 0xe4, 0x85, 0x57, 0x35, 0xea, 0x0c, 0xae, 0x41, 0x23, 0xef, 0x6b, 0x93, 0x45, 0x19, 0xa5, 0x21, 0xed, 0x0e, 0x4f, 0x4e, 0x1d, 0x65, 0x92, 0xbd, 0x86, 0xb8, 0xaf, 0x8f, 0x7c, 0xeb, 0x1f, 0xce, 0x3e, 0x30, 0xdc, 0x5f, 0x5e, 0xc5, 0x0b, 0x1a, 0xa6, 0xe1, 0x39, 0xca, 0xd5, 0x47, 0x5d, 0x3d, 0xd9, 0x01, 0x5a, 0xd6, 0x51, 0x56, 0x6c, 0x4d, 0x8b, 0x0d, 0x9a, 0x66, 0xfb, 0xcc, 0xb0, 0x2d, 0x74, 0x12, 0x2b, 0x20, 0xf0, 0xb1, 0x84, 0x99, 0xdf, 0x4c, 0xcb, 0xc2, 0x34, 0x7e, 0x76, 0x05, 0x6d, 0xb7, 0xa9, 0x31, 0xd1, 0x17, 0x04, 0xd7, 0x14, 0x58, 0x3a, 0x61, 0xde, 0x1b, 0x11, 0x1c, 0x32, 0x0f, 0x9c, 0x16, 0x53, 0x18, 0xf2, 0x22, 0xfe, 0x44, 0xcf, 0xb2, 0xc3, 0xb5, 0x7a, 0x91, 0x24, 0x08, 0xe8, 0xa8, 0x60, 0xfc, 0x69, 0x50, 0xaa, 0xd0, 0xa0, 0x7d, 0xa1, 0x89, 0x62, 0x97, 0x54, 0x5b, 0x1e, 0x95, 0xe0, 0xff, 0x64, 0xd2, 0x10, 0xc4, 0x00, 0x48, 0xa3, 0xf7, 0x75, 0xdb, 0x8a, 0x03, 0xe6, 0xda, 0x09, 0x3f, 0xdd, 0x94, 0x87, 0x5c, 0x83, 0x02, 0xcd, 0x4a, 0x90, 0x33, 0x73, 0x67, 0xf6, 0xf3, 0x9d, 0x7f, 0xbf, 0xe2, 0x52, 0x9b, 0xd8, 0x26, 0xc8, 0x37, 0xc6, 0x3b, 0x81, 0x96, 0x6f, 0x4b, 0x13, 0xbe, 0x63, 0x2e, 0xe9, 0x79, 0xa7, 0x8c, 0x9f, 0x6e, 0xbc, 0x8e, 0x29, 0xf5, 0xf9, 0xb6, 0x2f, 0xfd, 0xb4, 0x59, 0x78, 0x98, 0x06, 0x6a, 0xe7, 0x46, 0x71, 0xba, 0xd4, 0x25, 0xab, 0x42, 0x88, 0xa2, 0x8d, 0xfa, 0x72, 0x07, 0xb9, 0x55, 0xf8, 0xee, 0xac, 0x0a, 0x36, 0x49, 0x2a, 0x68, 0x3c, 0x38, 0xf1, 0xa4, 0x40, 0x28, 0xd3, 0x7b, 0xbb, 0xc9, 0x43, 0xc1, 0x15, 0xe3, 0xad, 0xf4, 0x77, 0xc7, 0x80, 0x9e, ], // SBOX2 [ 0xe0, 0x05, 0x58, 0xd9, 0x67, 0x4e, 0x81, 0xcb, 0xc9, 0x0b, 0xae, 0x6a, 0xd5, 0x18, 0x5d, 0x82, 0x46, 0xdf, 0xd6, 0x27, 0x8a, 0x32, 0x4b, 0x42, 0xdb, 0x1c, 0x9e, 0x9c, 0x3a, 0xca, 0x25, 0x7b, 0x0d, 0x71, 0x5f, 0x1f, 0xf8, 0xd7, 0x3e, 0x9d, 0x7c, 0x60, 0xb9, 0xbe, 0xbc, 0x8b, 0x16, 0x34, 0x4d, 0xc3, 0x72, 0x95, 0xab, 0x8e, 0xba, 0x7a, 0xb3, 0x02, 0xb4, 0xad, 0xa2, 0xac, 0xd8, 0x9a, 0x17, 0x1a, 0x35, 0xcc, 0xf7, 0x99, 0x61, 0x5a, 0xe8, 0x24, 0x56, 0x40, 0xe1, 0x63, 0x09, 0x33, 0xbf, 0x98, 0x97, 0x85, 0x68, 0xfc, 0xec, 0x0a, 0xda, 0x6f, 0x53, 0x62, 0xa3, 0x2e, 0x08, 0xaf, 0x28, 0xb0, 0x74, 0xc2, 0xbd, 0x36, 0x22, 0x38, 0x64, 0x1e, 0x39, 0x2c, 0xa6, 0x30, 0xe5, 0x44, 0xfd, 0x88, 0x9f, 0x65, 0x87, 0x6b, 0xf4, 0x23, 0x48, 0x10, 0xd1, 0x51, 0xc0, 0xf9, 0xd2, 0xa0, 0x55, 0xa1, 0x41, 0xfa, 0x43, 0x13, 0xc4, 0x2f, 0xa8, 0xb6, 0x3c, 0x2b, 0xc1, 0xff, 0xc8, 0xa5, 0x20, 0x89, 0x00, 0x90, 0x47, 0xef, 0xea, 0xb7, 0x15, 0x06, 0xcd, 0xb5, 0x12, 0x7e, 0xbb, 0x29, 0x0f, 0xb8, 0x07, 0x04, 0x9b, 0x94, 0x21, 0x66, 0xe6, 0xce, 0xed, 0xe7, 0x3b, 0xfe, 0x7f, 0xc5, 0xa4, 0x37, 0xb1, 0x4c, 0x91, 0x6e, 0x8d, 0x76, 0x03, 0x2d, 0xde, 0x96, 0x26, 0x7d, 0xc6, 0x5c, 0xd3, 0xf2, 0x4f, 0x19, 0x3f, 0xdc, 0x79, 0x1d, 0x52, 0xeb, 0xf3, 0x6d, 0x5e, 0xfb, 0x69, 0xb2, 0xf0, 0x31, 0x0c, 0xd4, 0xcf, 0x8c, 0xe2, 0x75, 0xa9, 0x4a, 0x57, 0x84, 0x11, 0x45, 0x1b, 0xf5, 0xe4, 0x0e, 0x73, 0xaa, 0xf1, 0xdd, 0x59, 0x14, 0x6c, 0x92, 0x54, 0xd0, 0x78, 0x70, 0xe3, 0x49, 0x80, 0x50, 0xa7, 0xf6, 0x77, 0x93, 0x86, 0x83, 0x2a, 0xc7, 0x5b, 0xe9, 0xee, 0x8f, 0x01, 0x3d, ], // SBOX3 [ 0x38, 0x41, 0x16, 0x76, 0xd9, 0x93, 0x60, 0xf2, 0x72, 0xc2, 0xab, 0x9a, 0x75, 0x06, 0x57, 0xa0, 0x91, 0xf7, 0xb5, 0xc9, 0xa2, 0x8c, 0xd2, 0x90, 0xf6, 0x07, 0xa7, 0x27, 0x8e, 0xb2, 0x49, 0xde, 0x43, 0x5c, 0xd7, 0xc7, 0x3e, 0xf5, 0x8f, 0x67, 0x1f, 0x18, 0x6e, 0xaf, 0x2f, 0xe2, 0x85, 0x0d, 0x53, 0xf0, 0x9c, 0x65, 0xea, 0xa3, 0xae, 0x9e, 0xec, 0x80, 0x2d, 0x6b, 0xa8, 0x2b, 0x36, 0xa6, 0xc5, 0x86, 0x4d, 0x33, 0xfd, 0x66, 0x58, 0x96, 0x3a, 0x09, 0x95, 0x10, 0x78, 0xd8, 0x42, 0xcc, 0xef, 0x26, 0xe5, 0x61, 0x1a, 0x3f, 0x3b, 0x82, 0xb6, 0xdb, 0xd4, 0x98, 0xe8, 0x8b, 0x02, 0xeb, 0x0a, 0x2c, 0x1d, 0xb0, 0x6f, 0x8d, 0x88, 0x0e, 0x19, 0x87, 0x4e, 0x0b, 0xa9, 0x0c, 0x79, 0x11, 0x7f, 0x22, 0xe7, 0x59, 0xe1, 0xda, 0x3d, 0xc8, 0x12, 0x04, 0x74, 0x54, 0x30, 0x7e, 0xb4, 0x28, 0x55, 0x68, 0x50, 0xbe, 0xd0, 0xc4, 0x31, 0xcb, 0x2a, 0xad, 0x0f, 0xca, 0x70, 0xff, 0x32, 0x69, 0x08, 0x62, 0x00, 0x24, 0xd1, 0xfb, 0xba, 0xed, 0x45, 0x81, 0x73, 0x6d, 0x84, 0x9f, 0xee, 0x4a, 0xc3, 0x2e, 0xc1, 0x01, 0xe6, 0x25, 0x48, 0x99, 0xb9, 0xb3, 0x7b, 0xf9, 0xce, 0xbf, 0xdf, 0x71, 0x29, 0xcd, 0x6c, 0x13, 0x64, 0x9b, 0x63, 0x9d, 0xc0, 0x4b, 0xb7, 0xa5, 0x89, 0x5f, 0xb1, 0x17, 0xf4, 0xbc, 0xd3, 0x46, 0xcf, 0x37, 0x5e, 0x47, 0x94, 0xfa, 0xfc, 0x5b, 0x97, 0xfe, 0x5a, 0xac, 0x3c, 0x4c, 0x03, 0x35, 0xf3, 0x23, 0xb8, 0x5d, 0x6a, 0x92, 0xd5, 0x21, 0x44, 0x51, 0xc6, 0x7d, 0x39, 0x83, 0xdc, 0xaa, 0x7c, 0x77, 0x56, 0x05, 0x1b, 0xa4, 0x15, 0x34, 0x1e, 0x1c, 0xf8, 0x52, 0x20, 0x14, 0xe9, 0xbd, 0xdd, 0xe4, 0xa1, 0xe0, 0x8a, 0xf1, 0xd6, 0x7a, 0xbb, 0xe3, 0x40, 0x4f, ], // SBOX4 [ 0x70, 0x2c, 0xb3, 0xc0, 0xe4, 0x57, 0xea, 0xae, 0x23, 0x6b, 0x45, 0xa5, 0xed, 0x4f, 0x1d, 0x92, 0x86, 0xaf, 0x7c, 0x1f, 0x3e, 0xdc, 0x5e, 0x0b, 0xa6, 0x39, 0xd5, 0x5d, 0xd9, 0x5a, 0x51, 0x6c, 0x8b, 0x9a, 0xfb, 0xb0, 0x74, 0x2b, 0xf0, 0x84, 0xdf, 0xcb, 0x34, 0x76, 0x6d, 0xa9, 0xd1, 0x04, 0x14, 0x3a, 0xde, 0x11, 0x32, 0x9c, 0x53, 0xf2, 0xfe, 0xcf, 0xc3, 0x7a, 0x24, 0xe8, 0x60, 0x69, 0xaa, 0xa0, 0xa1, 0x62, 0x54, 0x1e, 0xe0, 0x64, 0x10, 0x00, 0xa3, 0x75, 0x8a, 0xe6, 0x09, 0xdd, 0x87, 0x83, 0xcd, 0x90, 0x73, 0xf6, 0x9d, 0xbf, 0x52, 0xd8, 0xc8, 0xc6, 0x81, 0x6f, 0x13, 0x63, 0xe9, 0xa7, 0x9f, 0xbc, 0x29, 0xf9, 0x2f, 0xb4, 0x78, 0x06, 0xe7, 0x71, 0xd4, 0xab, 0x88, 0x8d, 0x72, 0xb9, 0xf8, 0xac, 0x36, 0x2a, 0x3c, 0xf1, 0x40, 0xd3, 0xbb, 0x43, 0x15, 0xad, 0x77, 0x80, 0x82, 0xec, 0x27, 0xe5, 0x85, 0x35, 0x0c, 0x41, 0xef, 0x93, 0x19, 0x21, 0x0e, 0x4e, 0x65, 0xbd, 0xb8, 0x8f, 0xeb, 0xce, 0x30, 0x5f, 0xc5, 0x1a, 0xe1, 0xca, 0x47, 0x3d, 0x01, 0xd6, 0x56, 0x4d, 0x0d, 0x66, 0xcc, 0x2d, 0x12, 0x20, 0xb1, 0x99, 0x4c, 0xc2, 0x7e, 0x05, 0xb7, 0x31, 0x17, 0xd7, 0x58, 0x61, 0x1b, 0x1c, 0x0f, 0x16, 0x18, 0x22, 0x44, 0xb2, 0xb5, 0x91, 0x08, 0xa8, 0xfc, 0x50, 0xd0, 0x7d, 0x89, 0x97, 0x5b, 0x95, 0xff, 0xd2, 0xc4, 0x48, 0xf7, 0xdb, 0x03, 0xda, 0x3f, 0x94, 0x5c, 0x02, 0x4a, 0x33, 0x67, 0xf3, 0x7f, 0xe2, 0x9b, 0x26, 0x37, 0x3b, 0x96, 0x4b, 0xbe, 0x2e, 0x79, 0x8c, 0x6e, 0x8e, 0xf5, 0xb6, 0xfd, 0x59, 0x98, 0x6a, 0x46, 0xba, 0x25, 0x42, 0xa2, 0xfa, 0x07, 0x55, 0xee, 0x0a, 0x49, 0x68, 0x38, 0xa4, 0x28, 0x7b, 0xc9, 0xc1, 0xe3, 0xf4, 0xc7, 0x9e, ], ]; camellia-0.1.0/src/lib.rs000064400000000000000000000025651046102023000133040ustar 00000000000000//! Pure Rust implementation of the [Camellia][1] block cipher. //! //! # ⚠️ Security Warning: Hazmat! //! //! This crate implements only the low-level block cipher function, and is intended //! for use for implementing higher-level constructions *only*. It is NOT //! intended for direct use in applications. //! //! USE AT YOUR OWN RISK! //! //! # Examples //! ``` //! use camellia::cipher::generic_array::GenericArray; //! use camellia::cipher::{BlockDecrypt, BlockEncrypt, KeyInit}; //! use camellia::Camellia128; //! //! let key = GenericArray::from([0_u8; 16]); //! let mut block = GenericArray::from([0_u8; 16]); //! //! // Initialize cipher //! let cipher = Camellia128::new(&key); //! //! let block_copy = block; //! //! // Encrypt block in-place //! cipher.encrypt_block(&mut block); //! //! // And decrypt it back //! cipher.decrypt_block(&mut block); //! //! assert_eq!(block, block_copy); //! ``` //! //! [1]: https://en.wikipedia.org/wiki/Camellia_(cipher) #![no_std] #![doc( html_logo_url = "https://raw.githubusercontent.com/RustCrypto/media/26acc39f/logo.svg", html_favicon_url = "https://raw.githubusercontent.com/RustCrypto/media/26acc39f/logo.svg" )] #![deny(unsafe_code)] #![cfg_attr(docsrs, feature(doc_cfg))] #![warn(missing_docs, rust_2018_idioms)] pub use cipher; mod camellia; mod consts; pub use crate::camellia::{Camellia128, Camellia192, Camellia256}; camellia-0.1.0/tests/data/camellia128.blb000064400000000000000000000654321046102023000161410ustar 00000000000000~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}||||||||||||||||{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuttttttttttttttttssssssssssssssssrrrrrrrrrrrrrrrrqqqqqqqqqqqqqqqqppppppppppppppppoooooooooooooooonnnnnnnnnnnnnnnnmmmmmmmmmmmmmmmmllllllllllllllllkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhggggggggggggggggffffffffffffffffeeeeeeeeeeeeeeeeddddddddddddddddccccccccccccccccbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaa````````````````________________^^^^^^^^^^^^^^^^]]]]]]]]]]]]]]]]\\\\\\\\\\\\\\\\[[[[[[[[[[[[[[[[ZZZZZZZZZZZZZZZZYYYYYYYYYYYYYYYYXXXXXXXXXXXXXXXXWWWWWWWWWWWWWWWWVVVVVVVVVVVVVVVVUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQPPPPPPPPPPPPPPPPOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJIIIIIIIIIIIIIIIIHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAA@@@@@@@@@@@@@@@@@????????????????>>>>>>>>>>>>>>>>================<<<<<<<<<<<<<<<<;;;;;;;;;;;;;;;;::::::::::::::::9999999999999999888888888888888877777777777777776666666666666666555555555555555544444444444444443333333333333333222222222222222211111111111111110000000000000000////////////////................----------------,,,,,,,,,,,,,,,,++++++++++++++++****************))))))))))))))))((((((((((((((((''''''''''''''''&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$$$################""""""""""""""""!!!!!!!!!!!!!!!!       @ @ @ @ @ @ @ @ @ @ @ @ @ @ @ G\MG\M+Eų,IHH"3DUfw  l"t}5Z, MQ^pm G D$.a2d~i d LӸ%l! { Bl #SH  _>>1׃  hj$;ijvC Cer.΋ ^ ގv%I *H 9 ( XV3 rB+Ҫ5ȃ5 kpG) AAt7 cT2?BN9 @dWҦ-Ip}; [VeZ-#= zdU]蜙š2lb? O 0zF A 'Y!^I` ooeC Ai1G_I|E EU}0aG ֖ze> qE4I t"*$ҘKzK K+ 紗7zM MN(RMf'*fjO O~koث+BoSٙ] e=.9&]m_ ]V츰a c$IbB^c ow-Hںre ϡ }09bg XaSЪ3ޕ?i /o=[VIk tf!}XD>n]m L ]cɉfጃo {mt/~Oq u_(CvWs N5b:8;Dtu ({# 뤝w p~t\ ЧCc-y | A 05e3譃{ VrEĐIk]̓} ,n*yckFy =@x. ^ +yŧl%|, Zɵ:~>G3 tC(3Ȫ8< h ҵ6}^B+Ԅ  O]zkYP,g  0oCM :cuI  [? As~%d WN ?# " ?B  MPz e %kibJ ~8뽭 <F럨 ׄ Te\AfZ'6˄ Pr3L Zș` š-! 29K7͈ # ao?L1-CluC% $?7 t08' <N/~TT̄) $6v{B}+ \%wŊ΅+M$- +;F?ѓS8/ ]uek!g81 Գh:-.3 )3 2X-5!B5 2iQMWvJ7 0(گ%9 -P~RK0; Q0[|M= jN_?6v:s˄? ZbP|sW-"A ۅ/ C _vA 5pZ9k{ Bwg} EI{* A-] w- :9 }M- Hdr4`ؚG t̲\ഔZ}i ]pH{ wљ'p4)b/ AXz.V7tV EF\9E\ 봺\G/; !xEEQ* W͏8;kp X4QQ uZ@RG fSL'C3.Zش9 iJc™*_| ܾII+,{ '"|Ual08p6! 6\k ki^# =ւA2=C*V% n]^) Pse.:' ׳T" {) %=E4Å95+ )$ٟG[R- I$Yw{a/ eMU=-1 fJ$"kJ3 n-G wu#5 mYek#^7 R9TKj9 kXdք}*; )YSgZuH<%6= c ).;d1`^? KjTA [EW&C \]~OP "HSwE 8PBǤ1\^GG ?7.˰uB[:I MxxJpkuK p|߹|QoyM 8򎳎D 5R d' @̔L δB< %Q"| 6K>-vP D Xg=Klh ⌮8NWGewU͗l da{Եff@ KАeG {l)s, Q, LzgYN_ # 6iVjRS Bֱy9r! &n'hEv4(# Wl&oWK}&% mUKoqt"^' lX"vuIP#) e(%4(ꍏ+ uһ搿- }1/{BO/ n_D}EcfD1 Ky׫迢 3 4uG+f[:ǜ5 W-Xѭ!M,7 z }Gv#U)9 <#v:*j5W; KXiv[ p= 9g(Vq0Q? ޅ:s̨Z>.EA xHWM?@ΗqtC vcQ^yƙ]E 4O.pM 7G 9_V{ BI >Ue?1YK ~"4qQ9i00M a89 vgO +Bf|IMQ {$6hS <$ZfA+Y 3@_m8l[ 8JقΩ!vZ] }kGB1f X_ y!s7ZPa iH3~,9 Nc z]lAHRe Efxg ;bf/~i دi,1׶bk u՛3#a&S) m E^8h5o M~/Ō4?q (|56̿s U:Y*Du .[X<uzw %L1T oy ъ!IqC5{ B7XQ0#^M} > \TKO*ZF!  WJ1Hː 1M =%V2|bq cp ]0@' a(4knu Ş6c`6Tq@ OWNeq/h  ^XL& / lꖏhţ*P}} '}"w8oyy >\pTZLww t츲,Fuu 4%x8Cۂss t렷qq *]Sx}R9oo ,sce_߂mm H|r%Efa kk Οu/xpQˎ@~lgg _ vk=iA ee bl֟OH=v32cc .logDkNaa c?/v__ TvB{cAe]] CHkz_Q[[ lu8S'wVW78YY x-,~+WW gSS +LT}p'' a[gJUN%% ST̟|)q5## %HX }7!! K G$U  S6j@J m i Ten 4 >u 1VM\ڂ zPp $l!3! 19|!XB)N^ =UKHpނ ` G87P+ La ܧ3jć SVV1!!ce HqX:Z_ ˅qÏ D ۧ 6-Q\  ƚ SܾJ4£rւ uxFE#%7ǁ CnNaU}} [C 3{{ M0͓y~\yy au&!zR'ww Z'T,u.Nuu &y7e\ss nq"gʍJN:iqq k[&Xoo dD-[ȯmm 5d@%,kk ExfB5̍ii gXUle&gg :>5-v Tee |o~x_̡Icc rTS*kaa )HˉxtR\Bρ__ 0E/Nm]] W]bx*"[[ z :;ޯIYY lQЋ8IWW l`X.19ĦWUU x_eJgl:kSS D)_2bQQ SER`hAv\ȠOO MQ6Oo#?9MM 2&LVă_ KK :0Nw.sgHII _ )M'~lHGG 7bq'DhgEE #޽`p:3|sÁCC ;Fl7G"AA j1Hvoy9?? d=<7=0 >i}ށ== vL ];; ^5(R2299 N_J )77 m%t͊55  _A1RP?33 ҘD/f(w11 ATkƵi;E// VnVg?;mc-- I7/܁Zo/v++ N Oy3)) VqXŀS?#'' _Z!H%% y( e&$B## RR5l)af!! O#UH\ *@h ޓEڸ^%wuo 6 D8>ҁ `2ѳKJ΁* %:官t ݠy 1@( ǂi#㠺Y GpYLy1g +'}_r-2A ӳ6`V@ tWh٭] zgqvu ̴y> v'kT#-6$Y Af*f|6z}} -qM~H.4_(A{{ ʣ};%_H%yy *rA~D_'(WWww BMivzS&XOuu ^##NX@a.<満ss KMn5Tbqq k@ukH yoo &fU.}4Qmm _r5-1X,D΀kk F!z{bn3|yii lvCP:ggg \&4'#lA~ee v܂i5s^cc / > F*aa g؆!`\__ зض[VWj[D=]] ҃YF;q}[[ ZSƭ{<1<ހYY )$4kƩ WW ڥ4Jw]!mUU %?e"ȭ%tSS ilm/8(~QQ =:f5ޜm ]OO 8e6:PQ2{{ 2sGό5yy p%~l@~"Kww g}9'-q}>puu eih+a|'ss MhHnϘ3Kchqq j8@x ֊sȜNoo DǙ&Z+G*ymm 8t&F4kk HVxG:eii ><*hggg O>{pmF:ee W(H1ac24YY R;9Q0 WW 'km~UU h}i'6vqSS o V[}Rȗ5QQ 9GyɱOO oș*MM ӞB_uVKK m$} ,):,PII O$p` j/hpGG 2˫.?4EE 74Pt >b{CC ."d4bAA H~9`QZ?? 欒MxX[5 ,\== 䳵"T()E;; 9wڡp99 5VM='T77 D3Tjc׋Nй55 .gq-zfi33 K^(G11 R1ۗ// P`:eCOy-- {LŽ`++ zd&ՀBYӎ)) 1Sr|2"144+1'' ƀٌD 1sR%% Et6퀯I## \BY!! c7wk 3d玞r*4z +P>uZGLW[F `{Omʣ1 ~W-2N V$/Sd y~Ϥ)O&-XN ji>S{ IsC<  sB`gj& ?  (9oRP :FzN7PF4 =jC:yY 9>D%¬+m6 nEy9`^! EԢs}ޘ# 6Dj,C D% KqHtJ' U%(r\`^) C.! % [+ 1P@a`- )q~s[2/ X9 J}Ɔ[Q1 Ѥa H"3 )'O67k5 yw-(ʀ7 S*nCx&m 4(:#3k2o !$3G>(бOCq ӚJaаs 8O" XxMp14?u VB{Mfpw ,g?6ay iاT,yܹ7{ 3PB*5MS} n~|<5s d?,`>W -(/ I0uMx rEY&S ydv龿V &ȳĠ"z bs 5A?g ? ~U"_Fou ˺,9 n~ ApT ~qHaGJ dY3Z<҂ X<IrT a^18Q#jy ]X)W38$ ڱu<>'6A 3)a п ,+1uI! bE)̄C# b<7,% ЖS*m< fS' l|aMk˧) <:Ǵv9P|+ X3 >{+D9e- _ҫFo˼a/ 'K>;1 ti=ö&n3 CXӒ.785 .4QAB6t77 #'ꃏ<":9 ,p 㡖ns|z; Hb1rO1P}0a= R\y.]ǰk1w? C9 C Ɉ7A .u^ c$9wyC  XaZfbE Nt:?(*lG fA):XzOZI 7xMQ6GVK Z|)}#WnM ܌hcE^6&VtO r@fʍ>c@(fQ n?DkcJS z\7hP~ b + U CP2Nj9٭oW ^xe!#Y -@7&kx6Up[[ ? bzDvX] F dP6&m_ e9VDa 3sWqv)c FR48~e dp,2T1Yrg D7XTu\Ii д;.)Kq!'k i^@jڊYCm X8-U;މ2o nWEԭȦq h:ʕ?||s s>ޯc6Vu {31Hvw XE~-ׁ33S"y z%3 Yhη{ m7T}eBS} 7*:PWfr)h _Fd;n2ف CUS;)>* s9p }6!i]G {32n^#< }Mqx߸ Y} |b-<m WRo;6W jx< :9 ޤ+}ʃ ?,al%ZI! XM'n # e;?Z./=C)% x)w;mh}Im' &eEWbQ!) Y FH:+ 24voVmij- RcrVӃ/ ˔jގ)di1  6N\<QÃ3 $cE0sᩃ5 Ǝ7E絤Ǫs7 /FL)`⧃9 A.jnzΙ4z; f5: s= \bVk'Y{D? th̓0-βA  w1%<[ЃC diL29+ZE ۍ}j%vܒ{G !(`.VwI *an!T.l;K y?%Dޥ{!qM )*#!eO > 0? 丣Q [9mlqM*nS qsggY"8U dC/c.d&v΃W ,($oľfY nKs/Q&Xx(w[ 4E J6*{D] +al-M_ 0}~C{BhTa |eF}9c  =6g7qe ϡ%w-^DxO aFg zE#s2rgRi KcݗEu^# -N)CsdT  SXp!6#Xvv8 ٣CȮ Jl߄  .zI0   dn6̏.RCT  6$z7O9 űu mС1 B"M D/3 5ob[u 5 E"aJ[ۄ7 GN뽾?A"UJ9 Bp ) >lw; >?Ѐ׾''[`9>V= ^A@iV+Ap~w? X..a&@A fEyڴ[ىY^C O{܎E  "F_ߒw_7;G Uπlah/jI *Ą#QH×K PMifDnrMM jF#"O cp*ZhQ %z||ÿ́S \*'"kU *lF5mr5@J蛄W EST v} WT~>Y &( u_5h<6[ m1hvX ΄] _n6!0 L&{_ yZ Cc8Fa Qg<&qc MVTa?e =nSg ^x_;mfi 2lhDCk lS'Wkm $_l ܉3< e5io +^̔h>h sJq ENK^"s puu !axdw 9/0Jy PNKI܌,z{ 9d,^{?` Bf6 >Q8gȃ  i3 s(z {<|@=39?$\ 1R wp 02 -`6ga7} {޲ךUj0gt}y 1x׏( qyw ٳNLV9Qnwu xofXa:[9!us Q]? H305sq Ӆ4yɂqo FF'p9k> y]om u FLR>Dmk )D %Blkg E:4_iJйge H 9vqec o%8ʞ~dca o֯ͅﶷQ2ea_ Vt&xtт_] òifZ9][ ΆNYO՞J[Y /f0tYW QPG9,Fb|'3GL%# f"tC(O1+#! -W&;fz]cF䎂! ??idS'`A K /dQ`Xᶈ yDX .I=l,^ ~uRG }1%2 ((ǜ> B )Z!-b@Ce: CZlxmsEZls܊ ԚQzW] IXȹy; ƠeDzz /% ww:BOˡE~I7  fl۷%aʅ BpG nVW Ӝo` 0𓔌 i5)e ź} #d\e6 RLs}{ *[%z'{:'ځ{y 4#::Y V1eTxׁsq z #m\ qo 7::}e2+\f8l߸GE ʻqGWl؁EC }+C[8w; CA mj(:\>}ݴ"VTA? Z ĜiF?=  ܅)-+=V=; vՋ(:y;9 u]2CT97 JtT) 7ؖý75 CJE}bY|?053 ev))Vv31 OVКE0̋01/ j$ZFp~5*/- =Sf9tUxP-+ 7ZDVV Y?Ӂ+) ܠb-kfd휁)' 徰1N{~N`ہ'% ;5a]ȁ%# >E#.y‡#! 7ֈT!K\g:! K$;>pa݁ \pjb c[ݿ: ` _,_ ‡{ ?yZi d .Wz '+ZT pHZ`3H @ʾ/ǩ́ ˫PV!S8 t?@I-U hɪ<@   Ӏ15 ֊u$l q \>ύ  !洁 Gys\6=Z7E#aw} [h&Z[d}{ 2vO{y P^Nȍױyw omV3yKwu saRz8aus A*.^ɜ׹%sq aࡦy~qo S'wE lom bXO2ԶQmk baVr˅ki C_ףwWpig y4`F$^Djge Jϲ?( ec G4T:eXހca EV"&6[Xa_  W]MԀ_] QEܩE}v][ 4CE9N3a[Y TeW<ɀYW Sh\ϮW呂WU C Gږ<US L+uiSQ 6WgegT$&+ZQO fםsid?uOM i/"J_MK |qF15D\ KI ,g!}%y0uIG T'yNA/GE ➌@'(മEC )nF? .CA nT{B }6A? :BN{+tȀ?= ѓ7ߦ>=; 䍊s_Fڀ;9 FKr{ n97 NrCɉЄlJK75 @=D/RJ.qJ#53 ÈfND TI4}31 {k!mnˀ1/ A{O7_FF/- CS%o^HN -+ OaG>ʶ%ˀ+) \jdVf dcgD`-#J)' `) 6vZ'% .: ZRh %# ,Њ5t3, a#! ӣΪ-0a! U,2A PNrwJ ԼN}bMހ E[!tficj |C%3Tv F*6>)z Q@hŸ6T| q\޻B"V\ի Ž8v},Ų -kNdPH[ـ ^Cx? |j{ #i2IGNy#P€  EΦ*pp0E ס.4{ev̀ dhE]ůWր A{~ \~E)S 0Kq F &8} h飑2uSUQJ9}{ 3W!3 s{y pS 0yFqhyRyw p'07~wu 3CM =E1;us ԋ[Zy%XCsq vA4rN' I+{qo 5.=fl`tom z-xX9mk .#oiX4kxki /wE_[fൗig !Po{Sge )20zec tZw,xgca 2j"Yo*dSa_ <;­/Ӵb_] 4WbY:.ә][ ޵;Ǵ~i[Y ނD Faj6YW W`MnsA?WU >vp'VG-hUS iYQu xSQ 77^v GkQO :T]ܸ`OM bO4-MK K&!WúgܕםKI zMf a%3IG hlI %7GE /&pF$6UEC nGT])T+kCA xP$C:a'A? $-n=_=q?= 9Jg\Ala=; `/FϾs:;9 Y 8mW}N[97  g&bZ75 :;pazz*53 WmsoeJcQb"31 2SZ+ p1/ byjӶKJuY/- m.l^k-+ of`kכAvy+) J䪎f3)' Qj5T ]'% Zer)A<%# aD'@s#! 'N:E?yJfa! ͢*w sbPp| ]% ,CsMi'Z @#1O~ 8-I=)4K* 6>h"z)+K 8xԾy =T?iKy}1  W[:$is9( t~¥$tC 'hV$D$ 3<22.  Z푥 4fSzII ~SI(+!,ud A3Jr+A1M x5xf,ѻ4 camellia-0.1.0/tests/data/camellia192.blb000064400000000000000000001205521046102023000161350ustar 00000000000000DG\MG\M~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}}||||||||||||||||||||||||||||||||||||||||{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{{zzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzzyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyyxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwwvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvvuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuttttttttttttttttttttttttttttttttttttttttssssssssssssssssssssssssssssssssssssssssrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqppppppppppppppppppppppppppppppppppppppppoooooooooooooooooooooooooooooooooooooooonnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllllllllllllllllllllllllllllllllllllllllkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkkjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjjiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiiihhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhggggggggggggggggggggggggggggggggggggggggffffffffffffffffffffffffffffffffffffffffeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeeddddddddddddddddddddddddddddddddddddddddccccccccccccccccccccccccccccccccccccccccbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa````````````````````````````````````````________________________________________^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[[ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVVUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUUTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTTSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSSRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRRQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQQPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPPOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOONNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNNMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLLKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKKJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJJIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHHGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGGFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDDCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@????????????????????????????????????????>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>========================================<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::::::::::::::::::::::::::::::::::::::9999999999999999999999999999999999999999888888888888888888888888888888888888888877777777777777777777777777777777777777776666666666666666666666666666666666666666555555555555555555555555555555555555555544444444444444444444444444444444444444443333333333333333333333333333333333333333222222222222222222222222222222222222222211111111111111111111111111111111111111110000000000000000000000000000000000000000////////////////////////////////////////........................................----------------------------------------,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,+Eų,IHH+Eų++++++++++++++++++++++++++++++++++++++++****************************************))))))))))))))))))))))))))))))))))))))))((((((((((((((((((((((((((((((((((((((((''''''''''''''''''''''''''''''''''''''''&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$########################################""""""""""""""""""""""""""""""""""""""""!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!              @@  "3DUfw @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @@  @ @ @ @ @ @ @ @  b elAe  mȒ_#2H s0%8OӕU ,Ť}\b4{2}Sy :^ /〒  ΙZ~_~T xC5CT60x! abY448Md"To% F욹Km7) o,rk>V- d}k+N3 ZP`y{b㧇7 6di>a2{}b; 7]C!c? tb޸SlxivKSE 4s=o+w;ŇI P.sM 2SGT{hXC[0Q IZ,r31%B2U 354L"g(Y -sBcwL] vGI]n]9Wa ;7v~}e (*4)O!i I0)Ԫ▇m z+1jq _͗m(• 2PBu F59iELqy >#S_-]Y!չɰjڈ5 O6W_bNPMܓ9 dd絈= {SEkAᚐPA %JAB|[* tE 51lzD{I  BXhPM o\p<׌WƈQ :omi,|1U !IY k<1Q28s=] !  ¤M,a u@;`{Άe -=@83xi bvQϏRγm /52FR4uq $1M{#u ?OW;gVPy e:Dsv[\2} vN-=} {۲G܉ g2ª?! }^S' % #^1wH[) {sy`V- Xkm(*{"TB1 0%Ӿ-*廊5 28P Ko#9 g`Ahzq= $;18T7y*A &2M~,Sfdis`E J*_'GkI ^Gkg%y\M _k)o.WƚQ mRJfߊU Hl'&Z4Y Nl;^r] _N\;{ɲa {s4(Ǿ~e 1ڻȭdu+̊i 3~k{e7m ԡ=q yl|;Xu;3\u g$Ʒ7y VMAYKU=[} E"cr9Iu ~HդLx VkI  Km/Z=tD58S  S|;dݙ  kic"g9 ]'F/A]N^ˮy| (2-K> Ӗ n®A oBvUQ[K ӹVc:tW<* l 30YJHoi ,Z=R:*b󂟞3d Z6,DۨO ;5r{@u p! 3 jU)6K" b# !Rˁ&})g 5% 9C|眸Q' d(X%dKJ2) &ވ̿- #~Nj+ k+3Hۋ- aP܉{! x/ fd|`{h1 |.]T U^3 o֩3Ӧ87Jҋ5 m~JzX=s7 qj};u):9 =ejC/Mb; $coAA= ELӅ8%? Ma>xs쾘d> A ))"[ɳ-C } 't .EۗȁOIE (y#ewvʞG [7`9HFfI vY% PxTq0K G@[ﶌ{M w~>W,0v4"lXO |g.QQ }up6LS ]x;U RBu>p݌+sW [:SKw Y 3 6G[ De>n彋] Z%C j_ 2?s)8a ۢ*x9 G;2+c < ΋i X"0li8ok %Ϧ^߯K;.=m ^f˜lXo +c&Xnm.J>q H;Ǘ$js 6|@!ެQiu $:<`LQ*ʮw I|T,& SCrVy 5nW%_{ 4B葰vr t+*N} ,z>Nhkųi z}P8 XR{첌 %C  l%2S| uwdVɄU Pt ELtZJk. 6dԗ*Vj W 8U(e 6{ 짎yZVC g+E1ju`  /ٱ# 6P_SG9 gXe ܌== l(eA S AoG I8h^WU ;K kfat~]ę0O uMjщ_WY{tS EQήw6;)H{[ D(S3I_ E7Uso:-c s@}}Jg ;5%!~\zA;k 掗\+5L o 71`ٷpo%Ks yO4d@pn`w LOdMk{ Ñ_r@) ĎkI#L| *H1 $L a>^;;\>iɏ ZPd!ޮ ivXL3p *)4 % `ڸ=  %5jtuJ/ǿ 1j)ڠ(jVz# v?|0o|d' ff 3zݢ(+ O(Et3lZޫmJ/ qvb$%K3 Ʊ${:Z=¶%?7 XS}5&(n; AiEѐ"8)Uf? $x Ƿ坢!@C j#Ih>yG A"q4[B~N>K ,j'l,O ?! EL4S xt ±ZW -mչHF[ V.Uh.U _ !H `@$+c 1VR~n"(bg =h.K]CsF7Uk >;f^ro Pvt0s 0 TxmC w h'Pβ~F{ aΜG Ll/&> ],O'5f2 mxXgy5< Ҳ[>Tp@s 5^bYU2W S  φ N+ v.jbj $~a')rx @3fS# oX G%w˳' Җ&4pU+ LWB4DbAr7w/ 3GI|#sf3 |j,=5hlbJ7 Uw*; [;PC? 8i{7dC ^ ~et:4sG ^20{u^ԂK  Ηb)O *Bbwb S Q$ Qm&W WY-s᳎@Z/[ ɣk*q_ LcDW0c D 0`@e؂g e_㋑T#?k A|OT}:{o UC ${8s I; yMw J"Dj䞔Ӏ{ ?%"% X;Eu&rf !q@R/ P_Ŀn ϥ=x .s| usBgSI ^F'$w > 8uZ.BN y `x1 c3 Ȣq Qea~0\# @i;A[ٹ' 1'B-ɺ*+ Ll#9 $,./ 9ES~Ƚ @93 TnZ؄7 O]7w+3{; <Gj{4S r$D~Pj<W J]k7^SF[ ` z瑩{LUk_ ґZwp|Sc K(\nƐg dꈣ':Nk bӕo 3-؁]s WB_=фX#w di N<#4{ /:A꺁@Ǭw@ {i Ro6e  Tȋf^mA KQ\ V)\jÇ vC Kv"[ `tD{ZaQ͇ Cp]TPR o7|U5 LD^kA8/ac qXtӅ[] bINj~3_sWY &^KyռSU UΙz}OمOQ I\/$8WС~KM 㺙mn0P GI K|ݲVcC΅CE .S-=%TiP{#?A W(x߸3`;= X(ZgPF؏79 kOT2kԊ35 wg$ʈլ/1 >ӑxم+- :*D#1') AT&CT'onՂ#% Ցxl}9EJ! ~ GKCc3T |5hrkܸ ##Up=NVFk4 ,{lg8UXS7 .$e%;; r: :3o B"q#2{} sez%d^bHĂJwy !} + b-su r/|MR}hen|oq Ay;TS#̽~km {(dhBeɄgi 4zĴЮ .ebce &:tY˼ф_a "$a#݄[] ճ 䞠%KWY 8՝ьHQ (SU 7 |{HKN:a(OQ >٣O([dԂ7KM ̳%2߳9 GI ߨ5UX$/CE 䂯GU_=*?A _&[k;Ύ;= y+\gXfhf/79 6:H'_r:35 X.!&bWYЄ/1 B**3wj~<+- DW2;`{') xSa]#% oڒXTF*΄! ̦Ԕwu1խ hʟ[m ? *U /5 h.27a .زWHH2' `j krtq* Fdo튎9[ܗ_ X|Y7OT&Մjb.{} lCl'5Ӄwy :ꟙ͐osu EGlx`Aoq 43|XėVXkm ME?uu\&gi !#AL1ce GMsԿy_a H~ o|Rf=uσ[] 9g+/)-GHǃWY ٸo84JSU ,J3B_%OQ -S^;L@<᷊KM :~"߃GI N?WgcCE |5( ̃?A ?kcgH*;= Ffk?fڃ79 N4Ì73j]35 &nWcl}/؃/1  vL(?"x+- G45Z;)⺮') ۬BV5޻#% Kn# Ar}! hDPCYec Z+tv!ym! ѕfa7g>$ /H+>:J` _-)MÆ& Ő 38,(1Q^ Q[)@ HPb<'g2{} 1cYYbwy m{!, QLq-su V#jRɖ}pGoq EQM?}Jkm cVHP* )+'gi QhVKQh5rce sME%,_a  }e51)[] x^oZIxheWY !MָSU p*@KM <8 f_{ȷrGI Nrmԫ \}CE r]pd瀕s HV?A ʹ)<:U;= 3_kԾ79 9S c*xI35 Ư*/1 J0R((Scvǁ+- wݶgǨۧw') 2"")tgpG9#% "I}MHs! j`j7[d3P +c'~Qm ,sU-D {M,8bgh 7ZϦ6f!V L!u] M\S'vA_ ߅ف u^k; ) ^X\ 424\C~㠀{} Y-Kwy fVsvn?]su ohdE{E?BMoq |Djx*/km r)bIGgi (@uS<Zce fb 5_a oܽRG[] e8I:-|WY t| [;nbSU z}fzhZOQ [\JJA~KM _=ƣO`*aGI C6v7R1CE +fRc">5?A 6#o ZZ5;= .rFQ;*=[ IK E5o$ 夽EG #!a5[0"AC 6{́_jިQ==? %&U-9; ] bQc57 у31]%G13 ߞJצ]]O-/ ״{Ҹڋ)+ z6쨨`%' eRpP9$u!#  ɉD9~q۴W T%Puuf ne\IMjY? FxW.^ ܫiL%  fQ<0rI:QD )ep # ?Vv=ý'>C1 /<6-12lh_] x!?X' = R6*S'频 [DY?2 -n qO2"JMyL>wU  oZ[7y [xR*AFkDw q?  S$ou ! iae6% ➢ \3enM7'X) MFEzO- Cuz^ \3 {d7i|]H>U7 ց:Ʋ7u; cd<,ׂfNӄ? l\$ Dj^E ޠéC3SI @ĥk@xM GlM!zgeQ %8 "$YTU zhJ}Q,@jY uڢ]:K] XE;[~쾼5a &@?1U4He Wr(F-c NXi vq psYm gYb%YYg#q ,\k}Эw[=u >*~y2}dy kƚ-} gDA?hNG$^= 5-eW7S zF IX ðDwr˸ l1%Q3) VN p [, y& 56!Joz_ Bn͊"sS] [[k!=9! L&EZh% Nh}V/E4S) MP,( ~Ra- `ͮ;Qg1 PϾlm>5 j9W`g9 [6"Yw= g4qDNlbekuoA Ul8Bbs~E ?$rQ,I ",b Aӓ:M }IZt- Q -NG_#,A"U w'.:SbY ȡ(B7: z] -pa y\AMI\?e g ϱ=\li ֲǘRwkkSn*m L! Sx 6Kq fsBeZ u r]`tZń=9y N} %̻B Y-d)Bp *>`_l ٫_U |+ި Tv8 x@|pnVR -ȉnF> a+ _ܙ: =FR E,9/&o{7۰ [4>< W! bNS#6A1S±% P΅Ż 4K0) 蝊C_b/]- x؉ԫ1 חuMB /b5 @e6oG߫$9 qY%Wݐ.9n= N`䓰dwA If.Y޼$7YE x\Q [Ad[~U .\Ư#wfY {GS3c/ 3F] IQwփ*$ee'a m|Tgk>e {"1iv{i rmhHm v>ӕ 좣q /+vqu pfgl5jy H)U'޹} .`=]$&K1l{ U0.W4_3 `xSi =4_3>e䲣c ?yОXZ "ܾl' C44/"ay~޷ } Fs"Aq) G ɦH 4-vr# ۆf6Kg5[% hw}q8g' &t20+@[) Nq+ \Rq\G5;g- YSM' K6*|fΓZ+ _ǽd؈/ 1j!yX$͈3 djUp#zĎ~7 T(I Gt1߈; 9@I{3:nݜjD5? >I8׈C DE{wvG "o E*ojK I%CJ/#:?O k[Wr͐%W*HS tb?T^шW 69 ;%Yn[ eo_ 䧳Ft`{c F`rt4Dg t2nEAuk 5zͽ o (PΧ_\*{s 5g1z9*we- ҳ)8UO  XbQ  h0[)# +(%PiC}' W/ xL0+ ;$BvK%*n/ _[(  {3 B ?#v2}7 RaPn; D~0V57؈*? Dmӄ#@#K"c&2C ۛ`Abwv_tG a5(W;Hrk If?;uo 9ȁ٫\ĉs #CI->\ =VǙw vt { YZLinSI# lG|z8ap' !R%6Ĉ|zʊ+ /UO(YŊPGG Ɍ>K :isF݀O pej5F *S 8 tu,PxV0W j#qɿY[[ 2܌.Tܪ?w j82s>kƊ{ BL"l_(Ͼ Z9Y1ű-## ]#b$g] Ɩ -y,ɐ ԋ -QZ9 bwt G @ +cA cd ˿TdpsSe@L(|  BTCE _ؙۡA >6+X`ZX } cR5 cYzu .hvj$wq }WĆsm dP#e>goi rf#H\>dhO'ke 0?/7ԷrW.ga q. *J[Q 8%J3j%Ӷ̆SM sKT>:wm}K)<ʆOI Tx52!B`KE \z}t{xS"GA F S-|!FJ.C= Θ#&.ǜ?9 ѯrԶb5j;5 EsJT4F71 3T3@3EU3- >:NZœ/) xyTV sGш뵆+% s5K6+e'! ][{%\!E# xW4c*`wKkj MNwHh澙n& O_6/{BI Y悅 u 2#  Fft}"@{؆  TQ8X -kH :>/qs$} .XsP*y \I9f{u &] [4xdw`Rfwq pj?nQJ8sm { P! boi xxƈx:CJke ym9a[Cga wK4}#QD5"Fc[ :h{>?|Ej]W ƚwI{Wĭk'YS E{heUO 0TXߕP QK Ǣ!2Y+x%uMG <28iC3IC h W6A>n. E? *ǫ#/^!G:A; KAVr!tX =7 \aRy(l܅93 ؓv175/ tJGH8a|1+ (WjwX$-' KkVFg#)# \xmU"K*% N{+lO7w^(! ضɉU bv+fCҔ G$pW~xxݽ? !hU)_M6z х :y;Y?G۸  >f<|" @|Q@{ B1J0JR1}w }7xH͚`ys uZzfAuo vU'/eqk #ۗuS#WhDmg 24uf^욘pic l)Mge_ 5hb "a[ }x-lt(xք]W BSm@GiYS WQCOUQmuHUO uk{6(QK zF*`ӄE? F%B my A; -tqr`r>[=7 ^A, V2v93 55/ [){ )ߺ1+ G?7vL0`?%-' ԝ"xZH)# E?uo ?=V6)a%qk GR@U|P1>mg ;1I-_3ic ?&J(#$>Ee_ 7+tƒ]W >/n(9YS DV܏%,YUO K ݗިW3T6QK jBzfAbKMG :,IC phTuGME? !!2<%N-׃A; R+@׸Hqw=7 VM '.93 >۟'%3WSc5/ f|iE{Yd1+ +3^ ϝ,Є7$-' d†_%~q)# x|  Q$ृ% ŶU L! {=U^%˞H 5 hZi) OϚ0V ]N}a9;b '5- z(Ճ yxW׮0P  A"nL+| E[_a#N4 ٮɃ{ ;J]Q #Ą}w (,΃x?'vays ][637iW(uo GxA.&GXqk a$uv#lmg ڊ}/„!LÂic g~5#XZ'e_ rKƖgݿ[[Q93 cn-85d҂5/ ]U)\& Bc1+ m(1s8@$-' A^^g ͂)# #1~yCMY% uij>Dc nX! /|De6 FJs̒ U\޾^5/ d+c*a1+ b\KxF-' mdt.2LCV)# K(2(e:dq% Q\TE^(! E'}+taZޒӣ Cǁ yehD sOaO#]r ) m?"Jف  p*C*O^(x~l  rw;c'bdS '&P+G /E.{ :"A$"}F}w XWƤЀys YD2o{t17Tiuo F4#V4 227qk h1aqDmg V~a` F/r Dic nfVT+g"Ea[e_ i|ǖ{=".x8a[ O{swd]]W N\'ECpֽYS RFi2{pUO />fwQK W oI MG z]O yT|rIC q$ 85-p&E? DW竒:zT*)ȀA; LET.w=7 e>7m\93 g۠8C܏5/ $?OKYq<1+ !z/?j{-' tܕvq25Ms V)# s5 ΤUXD% n2u ZRgr-! ,=1Lq:0Z eay_Xl  si8 b  I /1[SХ S }nTxI9  FX`O4m  CV_83:bDf| 7NWhG{ GuC4=<k}w W^db1~ys lOy7Kg|uo HPW>l`qk H 4 I mg EHnY43aic ٔ;} bgT'e_ oy+(%Kr aY ]4wj[U oEUs*IWQ -#_0OQ5NSM nQ7Ǩh@EOI Y'(OK%bKE $@K&l Y!edkGA D}bC= =cW?9 #|F Qav6|;5 GUD71 3@n .Ul3- ӢcFhC^/) $Z#hrz @+% 셤Y y"'! \sL^# p`?5''Vr t@4)kj5 GH=Q\ʃqb 2Ś2[h%\2t ~ʠH5Y+< O ]OǠnNn"  z QҢLC E>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> ================================================ <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; :::::::::::::::::::::::::::::::::::::::::::::::: 999999999999999999999999999999999999999999999999 888888888888888888888888888888888888888888888888 777777777777777777777777777777777777777777777777 666666666666666666666666666666666666666666666666 555555555555555555555555555555555555555555555555 444444444444444444444444444444444444444444444444 333333333333333333333333333333333333333333333333 222222222222222222222222222222222222222222222222 111111111111111111111111111111111111111111111111 000000000000000000000000000000000000000000000000 //////////////////////////////////////////////// ................................................ ------------------------------------------------ ,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,, +Eų,IHH+Eų,IHH ++++++++++++++++++++++++++++++++++++++++++++++++ ************************************************ )))))))))))))))))))))))))))))))))))))))))))))))) (((((((((((((((((((((((((((((((((((((((((((((((( '''''''''''''''''''''''''''''''''''''''''''''''' &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% $$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ ################################################ """""""""""""""""""""""""""""""""""""""""""""""" !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!                                        @@  "3DUfw         @@        @@        @@        @@        @@        @@        @@        @@        @@        @@        @@        @@        @@        @@       @      @      @      @      @      @      @      @      @      @      @      @      @      @      @      @      !6ߵ]  nO3]%=4 :{: ǜӋU `RZb1jBJy ע5K-r ,  i _*Ha&h yoF$peJo! ~$/9_671% A-RnDWO3YS) t;>~3r^|- -6 }TۍS@~q3 h=>t L7 c?lc]P; Hi#diN? m΢II աH/هE >}φCwI %A;<%y7M C<hgϿ\ԇQ }|(q"#,kU [u39FE-.PY HzP+D h."] sBEyQp%a Ɋ$>s+e Xܔ/j95i e WR2 RJm S່F* q č4H0~ou "7E#R?jy g* .9`} z>ƨ.7}0 rxDZL |kE2% 8.aD6̝3  G3VG~l)eԈ  &T>[S| e78I xwl΃^qˆ Eq=:ٜb X|VZۮar! |s{׫{ʈ% Ku|Z^֞^s) BaO&v 58- ؿ'8|d7Ee1 1~7*dOΈ5 T*KH_:OԨ9 * = U#GLePPA |6p GDE ۭN 9"ġI '憑ѵh-eM mNX{+p==|΢)Q Cu#:>1:vkU yZKCgY ؚy4YJ] 9aQGW/[ a $PKFjoBse N?3K\i qSꭺ φmm 섻Ltf"\غq ޳5לBwu P/X~ԑ!l 3@_tyq)N  "b `e   {~ژS oZJ{(W3<( srIUN! '﬌ejB { ѽ_fT! gnAV̈́% !d)a޴ʞ p) ~.04M - To2(B1 J\B؉5 iڋe:9 hխv9iO)= 8IJ.T(eA Q:*BьE Ž7= ͖I [9}t6GxC[M ;T~MWQ o4/CU Z?PcwT^Y L:em~] }S\߭i-s/`a W ˚<щe zYy~.Gԉi C{u64΅m +qAܞ"9q V"xk}҉u ujO9-y03 y ΄Iv0SA} P#eL7 Vd>˵ m +ZƆmkՀg  DZ%{V  sGj o}ZUQ Y wdBxhW{ݲJ5 }&HhL qSb-Sxpf! 5U )P % )@:|.͓*) q^p JJH- r(`XU1 !-YP=1G0i 2 JBqm /ؔRh>q iA :nvAlkUˊu l?8iG)?y I>¦54c*dVG#<} _pUİMqha (z㿿qV ɂ."߉#=3]  . =G BL  *;5)-  LuNN} pĿ vzo=;^ Ѯ S V8̂   XXa'fhJ% rߍ1:|> T8Wp΋ z Pk T! 폻uk# \v{ń6S|ز % +/@̋' "&gH) #Qj) A ˟td+ H|\.h)- r1Y|&/ sL16ǥiӋ1 CFzo8Q3 Cݱ"U<<5 L xŋ7 s;R-݌19 C'(\h@ϖ; ]~O,SHq= RFfr`7-{ n0u~Wk5o} Eoc.w=U9 v# kb  "=tx8_Œ Ŧia*#Uyeq@ -r.ҺbxP B,* ^@eLj  hJ1Wv9  I*b*}ʿ3L  QqfԾW  U͸  P)(ڵDA:WCS^ r_sG>B}" O,Xd qWE%u -|G>b )`D` $-b20lg 1p/=*XLx  cFBZ꜀Rih"! T ^=Ȩ`xc# XhE[q*z% "3zOF^ ڬ&j' V Pc(֙P9) D(R_. + 3B@bz| OT.- oûR>͝\U/ \Wg1 (i"o^{q3 Ϗ3}`/"J5 ݻ6E#9ic7 rKڊU9 P}0ԇ; oi P5Gh= Ar^ d ֗N񨆌? aa0FuA }7$ =a;"ЌC D`U IE ;gR- G zu@+VWY=II ±9h|w0NK /Ev0^K|M 5tI]:ƺed9O mdK pwQ rW>>:H<:*S P&aսy`A+)oTU V@RkzW <[P;RӌY @4ts=U[ $'W/sjG^] f﹫c)'Uϴ_ %#>+Y#a rhbj 9pavc |GƈptTJfe vWsIg Μ.9 SuՌi :ܡ!/=Sik kCB9wvרm *#Ae8uʼno OJ/=>e܌q Bjts Ud3ՋK5DsLu P'.E |4ew O1I_à{y +EEYBE%f{ B#`>jW} d%`?ӬpxL 7<6ČEZN _攺D֧z 'Fp}hkKwݍ @0L?Џg 860N0 ƸQrH hN5[zHeX ՚/yiQI'PW qcSV Ģ${ b5USL5d!2 OH 0%;DM)5p,j# /S phP>' H9"M=+ uB40X/ G~k.^6e`5 ~Anşc[m9 j|Jh‘ݍ= L% ]7zuEWA Ro0[c|8G ˉ D %ƫf)K .NNV7`LO &\?.̺VS ) Mg; W p Cmu+HT[ }vfHL~6F :x|_ V-lCd*`c Yuk}vrE4g ue8+{k RH/o AUeV ]{ s 'TnjtdxVVw q5ר5N(-z{ OPD9F$뎾 sim6  嗧w&ou aX\%&# Mz--s [Kp*5@} dC uX +틢)j+ ۹S*M wR"ڮˁg\N  HS`ef# $|]GC5' =)p˽&$+ 3[fu=M/ ^ⴹ}'H63 x5DT5'W{7 'ݠ`Q"'-s>; T1Xij? ')䂙;C ex;ZC_G m DT|) K O,71I?5OO GP*=,UٝS noeP';zmW V2b{=NjVU[ ʬߢ}_ D]"׳c \6I^GH*fg iT6nsx^k Ak)-,] o zO)tބs HvIب~w )l񧒐^{ f@o)) ЁEN ;ZbCY YʀHE`?zS )%xK- ? 8|LHdEt _SV)7 aZTj7 {,Mȸ! tЖu| m ը6@j軹eU# F uՏ^' iD8UJ)+ >b&w&__ΌD/ yG 6*z3 <\NȨ P7 (nP@5x; ;lne*<? IH=OmgC nw[l~GG  <G 2M+B2H~uK V51-q#y֊O .NYasS,߾{{ m#WIx몇w ЈsDBS$ rC|(?8 hojY nUQKQ+ ^ż`M:;h r:'w\e $D&k}瀅" c b<l̽td Lj4F >kٸX!v# k\َ X' u* K;+  + ;T/ ,p/J}A?3 Y mT7 s: jN`_; v{٭^3Igy? sѿԾj@UC ȝ$,Qzs(jG *.--mCp5K r5;8UO -їӹx+S \ZRQ΢kW qP6Pc)l|Nh[ Wpk e&Z]2_ 0VLdHc c8d_g *` []ik od0lC2+Eo $x|4zs ziw:f# Ew fJØUQѳ{ |MH\ݿ j?%-x@k =K,fga]0Qxg &]);ۜUWٵ 9aTP ɐ8 C .~V;fj S^xbm c Z4p2 ^0ɂ:Lg# Ɉ?q,U/ a P YALtXmІ} _kSX:3ڎuw T Tܝqs mfuZ͹ Y ǿHmo U'( =ik 'ե(Gteg F`"2fNU ac +SG\{ bj]_ ʳ܋ ;Y[ \蔮(Twz sQS fiQݢMO $rC)V*3džIK c!\_lo^uEG }#.Q~AC !d2mSΆ=? a#?W5b S9; bi7H U]$-57 f/V=#e?13 'Ζ,Q/-/ idP ]()+ #.J xv'%' XB@2k,1Z!# \K_zVA& Va؟x&ߗ8k OQHL} }oz?  1GeL)Ɛ I1!"UP䂆 WjB[C{>S҆ W) \~&k} OfNعWiKy{ t.Dѽ7uw y0-{z`-qs OM& E.=mo mu Pa6+ik ]J@nk$M҄{} ?Xu5&ֲwy ͘F H.kmqsu Tt%|&˗Koq y؝KL.Dkm 40#쿉s\gi ũvYsZce JE.4DDPd_a =^ gU[] ۺ|'Mَ{WY -ޙ09޸SU Ɏ2 ;ݒ|/OQ VɹXf_KM rЋv)GI {D~85F fCE 7fX`5BtY?A jh^a XG% *;= ¨3*79 dG{}k[PV35 O>КhfOp/1 PAN1u+- ߈}lnr') ;f:=BT8#% #;|AK! ,ֹځqtr[ ζ5L|@ Cy]ϳf so@z}>ы[  hƥsKA ڇu&|"t:_m _r†v 䓍xҞG._ OYsϒ{} @'89su ;3^YW0w•o{') >tBR77xXL#% zd\E]e! T҃5_ԃ ߫ )p>ĦW [lnR"O h4@E, fX̃ DfbFcm  #\-k %ͮK&&A2 vZH19L f d-\<{} $J\3#֞Wwy FSl<1'=Zsu -MϷc×LbiԂoq S?WnIkm TQ+KH+gi aVSNsf>yce z$8cIn߂_a o> }Xo $ru[] @?spl}a aWY +43U t/33SU 9Z7|KۆOQ %c H̎uKM 7 ?EZGI wJ;uCE n Vi3%7?A g)}bOHuo;= Za "PC79 Jޣ@~LOPd35 7ZTA5/1 QfT&O%+- &Km = [') .*,b..#% %+u\CA-Â! !SZ E L A#- mxqMOԂ Hf?voƂ ޕekҴ9S %'w =:)_xzLH[ 9D༸D\O4T -.Ub_cIg{} $)%ġ飸Ɂwy oyc4x&܁su CvV=#pCoq ^@`Fskm -0 x.ۻ5?Aggi 9<3P!Hcce KԢCEp_a h|{U "Qn[] A YWCR,E6!WY 5+kkaoSU KX='֓OQ djH;yOKM 7d-w\/@'NVGI )kuoȯ"CE oE HxS&?A h%2S<\`;= ]'P'[]0279 :JfיWИm35 M 5{v"SO/1 }s8jqxbp+- cG_ 'Ձ') Oxeව#% HRG ϓa/>p! K0f:XŁ bbnpqX B-oQ.rBN̎ m_a!l], \ĥ}~(PCz°' d25dF OX95 o!gC3U X _"@)h{} hd:d""Հwy h?+Pfsu 4T1 lmBu oq | b=MaASkm BHōO,mgi :S"_v@[ce &} mc0xC+_a L耮ftKLC[] 3lL>WY SÝbߍ;:SU  ^vM9OQ }K8jyJsEԀKM ^>aөԨ*bGI f*LxTG@ACE ] 6nw׼]?A vIm8UkχF;= <;sڌ^ }ps]79 9Ĉ(Ñ:;F35 ƥӭXlހ/1 }t#MInW+- I!\X') ?ߖ{g-q8|R#% LDiӡⴰ𥒀! hoe[$_YI z{pѪzm|Hʀ 7?̀ +"vJb= q6L9R_I ^kғQEeI;& ǐ(娥WӀ [S) ?~Wv #PM!{>>q"{} c^썕i$c %}wy SFzI̘Xsu ~Iׅi# ?oq |N~km MASgLTgi >ˆyO Aece s@QT_a .4A|U7Y[ WH!Xw57 a' } 13 ȗs<,-/ X@ušVU)+ mٽ~"ދF ާ%' d[R̘ؖ(]!# U$؏? dnK+JB )mcn,| : P V  Ƚ[!/ųSf  ,c"!͠kS ۰<:DX O>{RC1 .4;Ș__] mB{Β2p1z *e@ڮ"R˯ 5D1 TfI ,SU Llt 6йB0Dy pn! [V$?"M*l% ck?QE) < ОeTAL\G{- 5=p!(-S1 I9^-w E5 2EZ⼧0F9 [rd܋9= 7L6_~A r?^#Cu"KE }JI xȿ sL~.M wqTQ ,ZϘN3r^^U -,-,p@) Y n3Hku8K] 熌go9a FOX e Ujf߫! i E6,.Ձ dm w/N3B'gq Fbuhvou KQv#5o&y Noy1{"u:ӌ}  {JklB ; Ѳ6yIYP 7ӪF5D !wx$Vl{Ѧ jw!c K&6 !V"߇U: `|)vƗ3C. }Y33Lg/ =rm7! 4U1߾% _^҈ExD))  w6č kv- `No%S1 ~"I*kw+;;l5 l2-ɘͨipe9 i9< 3A= r=c@OuI xA XW)i]l@?E *ODhp} )cWEoCf- (uA@OhI S#x Y ghAc; F2j"V  xv4R %\c[ cJ O~X=[ 0 H@s [Q)Հ! _[+ylFp}% 'Rb|e) VQ#*v(d- <%=1 0 }|45 ~7+]n9m9 6fL~U= "b b<EA 7V/ rJ>rE oo|Eot-I :X2vXb3M GeI1GB=E nQ :unO IgVU }PjX ܦY ]aCSLFqJ6n] 0ͅeav5&ita q(Oo5Ie s13-\ki n6u/ :b+ ݆m lC‹ä~eC0gq W&sLEםAtu MA|Vi;y X uGH} lK`\Mu@ y ‹-/+ Ū}ZC*J xq#WaӤ| Ͻ![ר ߟR0$I?[~ E옸$۔I;% 0ir6 Unt Ȩt(Ud궎 ,$ZOk (g Fڶ.G,r ٺ)6ήCg  o V@i>gT |4)c% j7%2 {ؠ}t5zP0W! Ecq圥# tS9ے9۴% Qf9Xüoヂ'  wbTǪ]) }4uŜe$WH+ N3L6ɧXA?- U~G:^b'2/ ]Lr[~iv1 9̀ Ϸ3 `$[[J}DL5 2X}ց7 x*/u 9 ؚDUa~eR; 2 I7Ȅ&Sz= WoRl!HL? ہj0(C4#BxA Y!˵Jlz7C i:4E 9˟'l{0PG .YuwI 9ݭWֈc_DK L%y+awwEM 'UBۓzb9SO EpnG(vQ Cel}WS cJmd'~)U T ެ/f6OW fc+ na ۆKn6K=bİ'c %eCSo0e 阱X OAam g r 뛰11#i !1CnZCUnm@k ԱFZI;PfvSm Tu.8#E_o d*s ᱏq kVH Ss ~1 _|`B6(6u v)T{.XX;w U"`7] )~y B;KeAr{ Kswa_)} 5 eY) 4m_M[ K [ L&C  ,7݇G  han6_3tE B/6GںPaZɭ CDģ8zz9#4mh U٥*s4L" mM- 7 _L Q'8 9, bȑ& 0n{n ؊Iڮh~?L2  9AH o 燐;ħ qs=M!56${ i;[dM4` ]F *6j$= /VA`Ry! t;Jhf# K :!K4% CC5ԫ' ':msPQ) ܢ75@ + u ~w)"- [!Ukڻ1H/ h5"hAFAgy1 ƫN3ӐPUbRM3 Ha#\5 IJƅfu6{7 xٵoT9 n 7}lSOw; ѢbvwKo#`= $}KpP? /6V=|:A <ֹsV2C 'XSd4PE #czzX&dG 6Y@˰?rߥI (!((gK G-)1NuR\M 心O&[JO ZƮU9W™O}ZVQ B)-AS _-ât? ~U SoE&dߗdW Y%v5:[Y pWaBܼ)u` [e %tH xg yHb1qg!i AFIT|1k FypQUI|m X9*@}Z#o Q{TWNuq 0:'s #ź/T]Z}u 9^Y_j1w yҀɑb.ȅy yb#8IE|g@k{ 24sa} ڒmNVa ףVE^?d/ ׍N+3&fu t״cDf upẂ]Rp)OⰄ +d=,} m/540ӄ豃  bVKUk5C  )(k"b~F ׍3W N\ngn..{ f?ن{WW I7Χ-P% a_KX`;֗3# t9Q:Vʥy:Y' ڍ[|=`+ EµYz˴v]y/ 9V Qs;$'G5 &*<9 0;MP3K-= (xMzC@A S_<'a3]G i?N:"a&K fue3ޢO "~]>A.ԇS `~&ɶӴΫW yalMR`N[ ^+DWj_ -8SjvR}vQc @4X@g tp5ok ^Y'O\`v&?Po i߀~gqaZs ) i1z 1w )7XO^TGGǵ?{ Rd{ X:UE lZFqm%K 7Aq\ZbIɈ  HPf -\ J3),"ֈ vXHI׈ dC f d8*%8 j5?|ytgT szFC\ # ݋遽ƙο' e6xϊ;ɜ zE|+ J˙ UQrN/ 6n9 WiA3 QɄXv[:!7 t?ct} XƉ.}~; "Q:3CIEo? "5hz[s (|C :U0ӟK|ouG /`k2K !BI憓x(O k^ma"mS Y6ԞP<W ȠV[ [7>pЋq"a~؏_ }ˍ&NV\c ^:ivg U:,:_pk ^u$'ݪEI?'o g0U8q8-s AѱXE=؈w Gϑ԰jwbfV{ J ?Aj@ OíZi/2ָ u@.ʄ.iY" :`9on!]  \MY(3Z  "v$Nb:PՏ -؞ n $5Xx ʬog DQmTi  dL{zU=!# #I䦤m&b' ѽQ S+ %캦N$އ/ ,r.3 ڹE+ft7됉7 4FɚιX%; iLK[k\n`Z? @U 2^8C r`p{ڴG Ȩ;al\+RK ŬpO B(Ki3oS sQYZ!yW 5G:MY[ o֯)M׻./ڣ08H_ #@51tc O)Sf #8g =omb]5k ^R|j}۰Bo l =A`ws P[lux&ow Қ5&i{ ]Iv_2 HסR )7%?9 VD3PK= &,^[t  ^AEbv45 % )jEap|I xMhi@M EP qs[vnܸTJ  x 6暺  t =|L+k-# [F|?0L)' =}fo3JL}y+ (Ȧbv/ Ht] q8w5^23 Ɔ_C+7 {wT3ItJ ׆M; ﷧г#D { У? y H-c O9szW\Yωg UNaƤ- k M%- X`4go pvwPV }%MHDs f?CMJw 3>E{ }L9'y w^A@~<B͋ : &}R'w]hsm w3'ƳNe*oi (ga0ke -!5=Ega +hߐYyMC Mc] $6˾ W_Y ȝa%t#oD[Q >AcH5#mSM w nˮ|COI Z¯@Cxp ! KE 4_ЬsTنGA "OUyed\C= *YA⏔ G;?9 4]^*hٱ0ۆ;5 1V|!TlQlȆ71 ݮ HF,6҆3- _~8\D/) f?MM跹+% -"2/'! h9q T# U٣Bn`ҙ pҸN#  ʒD1́5 bt\L\?ؓچ ({u = GG0S<Յwq L?=sm OUȿgM?oi @>~h"?I0ke Cr5Aga E~=5yԡc[ <4:ǀU]W xe1s5{NYS Pܰ9U9߅UO oM-31+ ԦMIvb=Q-' MBdsukݖ@")# 2 D8!M% <=W_,VS! Ti>C j8htLqJ: c1Ed#fMd D^ƪ<}kI= [+W$Yvx  َIwRt3^N 1ai(+K.R|{ ={X o!)#,}w S[x9K* (ys JO!uo d98GMjоG>! ?z!qJtm GͬqlϺP_݂˄ !4;W z%$R[w xVY:/9 4WmY>X  LCZt<iaU&=  ? I$S ta`޾ S·D*`,Gcf{ Q Ї64h}w +.Yxbys ^|ث5uo bO][7qk Ca{O$mg dTRS@ E:bic Rb#,[UzB#s/]ze_ k¿y;KU kƒa[ l#ղQ=%L&]W x]hb oYS Ƥ5nv.băUO M B9QK j!\)J л![MG +jϻIIC 7q ?}ŃE? s@volC*A"A; #):Nv vZ=7 @5G,dx"d93 3 0i]A(E5/ ͩMvSc 1+ qD\C-' 8⪼ʾj 2`)# jQ&'{32tg% /SigwZ! F|KC]$ɢ ?;k\Y0l(j?YS O!e7H-UO 0aҾ;^W-g҂QK VV8ưXWO%MG 8,:?RM[a>IC xcY%䫩"WE? !z׫w{M+#ضA; ZU7)_=7  PVkJ93 Yh ԩQ8 5/ x߈$OKax0p+1+ & yzk}U|-' QmSF!oR)} )# c0#ΨSf% ZqS 2! G ڋ<8 b PiYoFLs$ Cm6 -jzj: koisRT'[Α x߅ Ol  M8ɻfBHn;_ /  ,΢}qk{ Bę"r>}w cͫ;w( ~ys WǾG+Ϡuo =iYk_Tqk Q9 & 7mg y(EE'T-ic u|''漯OAe_ /vZ~"34a[ Pc3X06]W aApg IC (:2T9X:E? vɓ>J ^A; aG8^Sy߁=7 P>z\őn93 ׸̅p] RVG5/ fƢr'=iQNᏁ1+ 53wCl,^-' YypMfV)# ƤWOY % N_IukV߁! IY'ҟ7! mAlЪrgMX F_mMKn0b#A .ξP}9<=`N Sh[#9  KbΔb-ځ  C"zp 9^ )Oꁝ9tt{ }ArF#tBW}w H˶b!Q=S8bys ~.>&k?uo GwpPmO'qk |amg k"Ai!eIoA-WrgGK}  {^?XN{ 5 DO}w :q:1 V|2tys %+dyUuo x~4>olqk 2טTm2p-ۃmg zzWE_O[ic *SN-Ĵe_ R$x haۋ\GaY _:[Ĺ*^[U '̚ x{hWQ  [`'|uZ2kH'SM )%RBcAOI .`fKE 1v Sc.s GA 2RSILC= ;÷>YyE[?9 #PJV3 f;5 Nx1| Iϛ71 Gp0$&S&n3- Gbh|`S/) ,Spc_4QX+% bqwOR7'! X+5 *# E;;t4æMdA J.(j)2 KhRi %f5K! ? Sձؤ5 2%C [  Tn-ƃE]H@C 66CyȋIgq1_ B vQ _]camellia-0.1.0/tests/mod.rs000064400000000000000000000005341046102023000136620ustar 00000000000000//! Test vectors are from NESSIE: //! cipher::block_cipher_test!(camellia128_test, "camellia128", camellia::Camellia128); cipher::block_cipher_test!(camellia192_test, "camellia192", camellia::Camellia192); cipher::block_cipher_test!(camellia256_test, "camellia256", camellia::Camellia256);