pgp-0.15.0/.cargo_vcs_info.json0000644000000001360000000000100117050ustar { "git": { "sha1": "ac6c0f8066c0db48270f5c9e41dd64d13b0813fe" }, "path_in_vcs": "" }pgp-0.15.0/.codespellrc000064400000000000000000000003401046102023000127720ustar 00000000000000[codespell] skip = ./tests,./Cargo.lock,./CHANGELOG.md check-filenames = true # FIXME: drop "worl" once https://github.com/codespell-project/codespell/pull/2400 is in a release ignore-words-list = crate,ser,worl,ThirdParty pgp-0.15.0/.github/dependabot.yml000064400000000000000000000002011046102023000146560ustar 00000000000000version: 2 updates: - package-ecosystem: cargo directory: "/" schedule: interval: monthly open-pull-requests-limit: 10 pgp-0.15.0/.github/workflows/ci.yml000064400000000000000000000127011046102023000152110ustar 00000000000000name: CI on: pull_request: push: branches: - main concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true env: RUST_BACKTRACE: 1 RUSTFLAGS: -Dwarnings RUST_NIGHTLY: nightly-2024-12-04 jobs: build_and_test_nix: name: Build and test (Nix) runs-on: ${{ matrix.os }} strategy: matrix: os: [ubuntu-latest, macOS-latest] rust: - nightly-2024-12-04 - stable steps: - name: Checkout uses: actions/checkout@master with: submodules: recursive - name: Install ${{ matrix.rust }} uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true - name: Install cargo-nextest uses: taiki-e/install-action@v2 with: tool: nextest@0.9.80 - name: tests run: cargo nextest run --lib --bins --tests --all - name: asm if: ${{ matrix.rust == env.RUST_NIGHTLY }} run: cargo nextest run --lib --bins --tests --all --features asm - name: tests ignored run: cargo nextest run --lib --bins --tests --all --run-ignored ignored-only --release - name: asm ignored run: cargo nextest run --lib --bins --tests --all --run-ignored ignored-only --release --features asm build_and_test_windows: name: Build and test (Windows) runs-on: ${{ matrix.os }} strategy: matrix: os: [windows-latest] rust: - nightly-2024-07-07 - stable target: - x86_64-pc-windows-gnu # FIXME # - x86_64-pc-windows-msvc steps: - name: Checkout uses: actions/checkout@master with: submodules: recursive - name: Install ${{ matrix.rust }} uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} target: ${{ matrix.target }} override: true - name: check curve448 uses: actions-rs/cargo@v1 with: command: test args: --features unstable-curve448 --all --target ${{ matrix.target }} - name: Install cargo-nextest uses: taiki-e/install-action@v2 with: tool: nextest@0.9.80 - name: tests run: cargo nextest run --lib --bins --tests --all - name: tests ignored run: cargo nextest run --lib --bins --tests --all --run-ignored ignored-only --release cross: name: Cross compile runs-on: ubuntu-latest strategy: matrix: target: - i686-unknown-linux-gnu - powerpc-unknown-linux-gnu - arm-linux-androideabi steps: - name: Checkout uses: actions/checkout@master with: submodules: recursive - name: Install stable uses: actions-rs/toolchain@v1 with: toolchain: 1.81 target: ${{ matrix.target }} override: true - name: Install cross run: cargo install cross - name: test run: cross test --all --target ${{ matrix.target }} check_wasm: name: Check wasm targets runs-on: ubuntu-latest strategy: matrix: rust: - nightly-2024-07-07 - stable steps: - uses: actions/checkout@master - name: Install rust with wasm32-unknown-unknown uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} target: wasm32-unknown-unknown override: true - name: Cache cargo registry uses: actions/cache@v2 with: path: ~/.cargo/registry key: wasm32-${{ matrix.rust }}-cargo-registry-${{ hashFiles('**/Cargo.toml') }} - name: check uses: actions-rs/cargo@v1 with: command: check args: --target wasm32-unknown-unknown --features wasm check_fmt_and_docs: name: Checking fmt and docs runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ env.RUST_NIGHTLY }} override: true components: rustfmt - name: setup run: | rustup component add rustfmt rustc --version - name: fmt run: cargo fmt --all -- --check - name: Docs run: cargo doc clippy_check: runs-on: ubuntu-latest steps: - uses: actions/checkout@master - uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ env.RUST_NIGHTLY }} override: true components: clippy - uses: actions-rs/clippy-check@v1 with: token: ${{ secrets.GITHUB_TOKEN }} args: --all-features --all-targets --tests --bins --examples --benches codespell: runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - uses: codespell-project/actions-codespell@master cargo_deny: timeout-minutes: 30 name: cargo deny runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: EmbarkStudios/cargo-deny-action@v2 with: arguments: --workspace --all-features command: check command-arguments: "-Dwarnings" minimal_versions: runs-on: ubuntu-latest steps: - name: Checkout uses: actions/checkout@master - name: Install toolchain uses: actions-rs/toolchain@v1 with: profile: minimal toolchain: ${{ env.RUST_NIGHTLY }} override: true - name: check minimal version run: rm Cargo.lock && cargo check -Z direct-minimal-versions --all pgp-0.15.0/.gitignore000064400000000000000000000001161046102023000124630ustar 00000000000000/target/ **/*.rs.bk ios_simulator_app *.h pgp-ffi/build-stamp /*.asc *.profilepgp-0.15.0/.gitmodules000064400000000000000000000001271046102023000126520ustar 00000000000000[submodule "tests/tests"] path = tests/tests url = https://github.com/rpgp/tests.git pgp-0.15.0/CHANGELOG.md000064400000000000000000001712731046102023000123210ustar 00000000000000# Changelog All notable changes to rpgp will be documented in this file. ## [0.15.0](https://github.com/rpgp/rpgp/compare/v0.14.2..0.15.0) - 2025-01-29 ### โ›ฐ๏ธ Features - Implement TryFrom for Signed{Public,Secret}Key - ([f9e7694](https://github.com/rpgp/rpgp/commit/f9e76946789ad0de742f30bcaffb3b804acd834f)) - [**breaking**] Implement feature gate for x448 - ([e16fa47](https://github.com/rpgp/rpgp/commit/e16fa47ecf78a56e25d8f043eab414d4b92767d1)) - Update deps - ([8222112](https://github.com/rpgp/rpgp/commit/82221128ead1b71f0b38b7fc7c8844db7c9059f5)) ### ๐Ÿ› Bug Fixes - Correctly deal with multi buffer reads in dearmoring - ([7637f18](https://github.com/rpgp/rpgp/commit/7637f18e7827ad12b07bc99e4fb1fbd1830b5e4e)) ### ๐Ÿšœ Refactor - Remove unused feature flags - ([d800fb5](https://github.com/rpgp/rpgp/commit/d800fb55df6704b8ebe03e5da8c7c5a918222da0)) ### ๐Ÿ“š Documentation - Update changelog - ([2cdd934](https://github.com/rpgp/rpgp/commit/2cdd9345d880c8f01098306f129970e89f6a0832)) - Add information about ROS audit to security status - ([651bb28](https://github.com/rpgp/rpgp/commit/651bb28c8bfc86bd705fec2cab88504cc64f9b7f)) ### ๐Ÿงช Testing - Add cargo fuzz testing harnesses - ([de9dcf1](https://github.com/rpgp/rpgp/commit/de9dcf1bf9da9db860be6346525d241d359c4faa)) - Move some slow tests to ignore, to speed up default tests - ([7d16c1c](https://github.com/rpgp/rpgp/commit/7d16c1c835c2d4486ace36f7f8e516f25b3edaa7)) - Split up key tests for better speed - ([3bc007f](https://github.com/rpgp/rpgp/commit/3bc007fb7a0f7c47a7b1f43e6473ea64df410cdc)) - Split up tests more - ([9abb7fa](https://github.com/rpgp/rpgp/commit/9abb7fa7eef1166d2be2ea3f5a3b54f21394f4a3)) ### โš™๏ธ Miscellaneous Tasks - Clippy fixes - ([116568b](https://github.com/rpgp/rpgp/commit/116568bcf47cf4052a7ec940594766c7c77830b3)) - Drop rust-toolchain ([#449](https://github.com/rpgp/rpgp/issues/449)) - ([3a8267a](https://github.com/rpgp/rpgp/commit/3a8267aa8853bdc10dda80136c7e45e151c28919)) - Remove beta workflows - ([51727ad](https://github.com/rpgp/rpgp/commit/51727ad8266dddf9b2684a29ba54726a53ec5bbc)) - Remove duplicated check tasks - ([f21bf0c](https://github.com/rpgp/rpgp/commit/f21bf0cfb92e1a152e74aba5977f097a56a3f9ba)) - Remove even more duplicated checks - ([1a3b8d6](https://github.com/rpgp/rpgp/commit/1a3b8d619f2a161ed325b75b1ae6c0516bc57f46)) - Remove duplicated wasm checks - ([fef441b](https://github.com/rpgp/rpgp/commit/fef441ba648291ab3bd4342d869680e09b735900)) - Use nextest to run tests - ([3b4e22b](https://github.com/rpgp/rpgp/commit/3b4e22bfda8f01e80f0aa7b45de1d70dca6d6b3f)) - Add Cargo.lock - ([e6a6864](https://github.com/rpgp/rpgp/commit/e6a68645ad820f19ec66fc1d4b254a641de98a42)) ## [0.14.2](https://github.com/rpgp/rpgp/compare/v0.14.1..0.14.2) - 2024-12-05 ### ๐Ÿ› Bug Fixes - Fix CVE-2024-53857 "Potential Resource Exhaustion when handling Untrusted Messages" ### ๐Ÿ“š Documentation - Update changelog - ([d9aef6a](https://github.com/rpgp/rpgp/commit/d9aef6a3f99bf796e7671ca276bf744d7ce4787e)) ## [0.14.1](https://github.com/rpgp/rpgp/compare/v0.14.0..0.14.1) - 2024-12-05 ### โ›ฐ๏ธ Features - Derive Hash for KeyId ([#437](https://github.com/rpgp/rpgp/issues/437)) - ([779b76d](https://github.com/rpgp/rpgp/commit/779b76d947fff2385c2c4483751168a183467384)) ### ๐Ÿ› Bug Fixes - Fix CVE-2024-53856: "Panics on Malformed Untrusted Input" - Make strip_leading_zeros_vec() work correctly - ([57e11c5](https://github.com/rpgp/rpgp/commit/57e11c5829c3cca5dd5eb424ef4f46eb61a32115)) - Csf normalization for signing - ([8439a6d](https://github.com/rpgp/rpgp/commit/8439a6d0342d0e928b2aaaf810d4211f240e7442)) - Extend is_signing_key() and is_encryption_key() for RFC 9580 algorithms ([#434](https://github.com/rpgp/rpgp/issues/434)) - ([a1d9d5c](https://github.com/rpgp/rpgp/commit/a1d9d5c554902c3af9e3086e262ef870de58716e)) - Enable the zeroize feature for argon2 and sha1-checked ([#440](https://github.com/rpgp/rpgp/issues/440)) - ([0c45660](https://github.com/rpgp/rpgp/commit/0c4566094380cff1627a2b0615e66b0a23919cf6)) ### ๐Ÿšœ Refactor - Optimize `Display` implementation for `BlockType` - ([00b5027](https://github.com/rpgp/rpgp/commit/00b50273b16adbd0553b9a660259b1f220ba3d39)) - Merge write_packet_len into write_packet_length - ([33dcc83](https://github.com/rpgp/rpgp/commit/33dcc83ee35a11150eb21e4a891cdcff95e62f8a)) ### ๐Ÿงช Testing - Avoid writing to the crate source unnecessarily during tests ([#431](https://github.com/rpgp/rpgp/issues/431)) - ([3a1bb5c](https://github.com/rpgp/rpgp/commit/3a1bb5cb5ba88370a6966c7f5d4a48e2dd839001)) ### โš™๏ธ Miscellaneous Tasks - Remove unused and erratic end_of_line() fn ([#421](https://github.com/rpgp/rpgp/issues/421)) - ([69ab41c](https://github.com/rpgp/rpgp/commit/69ab41c25bc376bfa9dc6f2d3d43e2a58998df3d)) - Relax dependencies - ([c6662a3](https://github.com/rpgp/rpgp/commit/c6662a3156a51256c5bf860b6b81baf1fef93020)) - Adjust allowed licenses to match what we're using ([#438](https://github.com/rpgp/rpgp/issues/438)) - ([910d9af](https://github.com/rpgp/rpgp/commit/910d9af85079fb0d0ad9ed9880f700882be16878)) - Use prepend for changelog gen - ([7a60d1a](https://github.com/rpgp/rpgp/commit/7a60d1a1466a7209c3eef2e69295fc5f74b9e75b)) ## [0.14.0](https://github.com/rpgp/rpgp/compare/v0.13.1..0.14.0) - 2024-09-25 ### โ›ฐ๏ธ Features - Improve more debug impls - ([3d73320](https://github.com/rpgp/rpgp/commit/3d73320131adb7660ee59b0d1261c4e429a3430b)) - Password protection removal and setting for secret key packets - ([700cba2](https://github.com/rpgp/rpgp/commit/700cba275d22b04d3e3c52af44fa2a32a4f2d877)) - Improve API of LiteralData to provide more flexibility - ([34728e0](https://github.com/rpgp/rpgp/commit/34728e09c81f4398df5d2c8bf633c5af05490dd8)) - Rfc9580 keys - ([f09666c](https://github.com/rpgp/rpgp/commit/f09666ced322a895a3b7790be4575a94d52361f9)) - Make `SignatureConfig::hash_signature_data` more flexible - ([c6d6b2c](https://github.com/rpgp/rpgp/commit/c6d6b2c0fae3b7ece11fa39c6ea6108b14bd5c68)) - Rfc9580 encryption - ([5d3547a](https://github.com/rpgp/rpgp/commit/5d3547a4cdc791234b556541881fc1fe1db0aefe)) ### ๐Ÿ› Bug Fixes - Decrypted data must contain exactly one message - ([00ee8ee](https://github.com/rpgp/rpgp/commit/00ee8eed9bed2827c2c503ecd4b8e5e4d31d78be)) - V6 ESK may only be combined with v2 SEIPD - ([5ec3578](https://github.com/rpgp/rpgp/commit/5ec3578344383c225cdf02b34e77af0a42129c5a)) - Parameter ordering for set_password - ([39dd449](https://github.com/rpgp/rpgp/commit/39dd4494796970f37e04496d69679c31e4a14dd3)) - Add special error message for packet 20 - ([49c8403](https://github.com/rpgp/rpgp/commit/49c840325f066a7f02b44ef27f8fac6f64476b76)) - Revert to producing short padding for ecdh - ([7c94189](https://github.com/rpgp/rpgp/commit/7c941891ee01b2052b54b6d18f86eafc05a75d1c)) - Parameter name - ([c9cdfaf](https://github.com/rpgp/rpgp/commit/c9cdfaf5bfc90eeb66b7d0d1092503be22dfb1bd)) - Reject unknown critical subpackets while hashing for signature verification - ([b8b43a7](https://github.com/rpgp/rpgp/commit/b8b43a7635db785afb48f182c136e23de0168d71)) - Implement various constraints that rfc 9580 mandates - ([5682b08](https://github.com/rpgp/rpgp/commit/5682b08f15221b9943ea46f93dd88ef268be3cf7)) - Limit the use of S2K KDF with weak hash algorithms - ([cb26cfd](https://github.com/rpgp/rpgp/commit/cb26cfd0e8177c3071ea6959bee2f081dec67c6c)) - When verifying signatures, check alignment between key version and signature version - ([b771b78](https://github.com/rpgp/rpgp/commit/b771b78d5bc830b8b95de2f96f307e86897074f1)) - Message parser: drop esk packets with versions that are not aligned with the encrypted container - ([5b27240](https://github.com/rpgp/rpgp/commit/5b27240671b7644349710f293f10ef83d294b2c9)) - Fail composed key parsing on hard errors during packet parsing - ([a9de958](https://github.com/rpgp/rpgp/commit/a9de958a89f08ff9a65f851a46a311db41b1ce55)) ### ๐Ÿšœ Refactor - Remove bigger macros in favor of direct types - ([0b1d778](https://github.com/rpgp/rpgp/commit/0b1d7785ebcb14d2db282aaa5692bd762ca3e410)) - Smaller refactors - ([8dcba01](https://github.com/rpgp/rpgp/commit/8dcba013244f414f5c9495ae6981d3c84af253f1)) - Derive debug impls - ([d714064](https://github.com/rpgp/rpgp/commit/d7140645981350b616f2fc83c01c578b7579f843)) - Remove unused Deserialize trait - ([b18f046](https://github.com/rpgp/rpgp/commit/b18f046eaf063181af9e012343f1e7d83b27cb27)) - Cleanup and improve Mpi API - ([1803407](https://github.com/rpgp/rpgp/commit/180340740510294cbb7fd3e139ddd327d6207b3a)) ### ๐Ÿ“š Documentation - Update RFC links ([#414](https://github.com/rpgp/rpgp/issues/414)) - ([9473cf5](https://github.com/rpgp/rpgp/commit/9473cf55919c92bb430ad835f6f80663a3ebcaab)) - Add/improve comments - ([73c89d0](https://github.com/rpgp/rpgp/commit/73c89d04459588aed68b03ac1e1d502edd4f6945)) - Update text about implementation status ([#417](https://github.com/rpgp/rpgp/issues/417)) - ([92123ee](https://github.com/rpgp/rpgp/commit/92123eeaf6cc1a503838670826474fa48b13e5b2)) ### ๐Ÿงช Testing - Roundtrip ecdh test against rPGP 0.10 - ([1dd91ea](https://github.com/rpgp/rpgp/commit/1dd91ea673ee72758d62c218d16074c7fe3c6321)) - Ignore another sks-dump test failure - ([1c0cd84](https://github.com/rpgp/rpgp/commit/1c0cd8411d9b48d8dce814b3a9183da3d939ec98)) - Rename "opengpg-interop" to "openpgp-interop" - ([f3292f7](https://github.com/rpgp/rpgp/commit/f3292f73ed2bca4b81916b8cd6deca290711152d)) - Skip writing files by default ([#404](https://github.com/rpgp/rpgp/issues/404)) - ([6e51094](https://github.com/rpgp/rpgp/commit/6e51094fbee39d3a33020d8e3a5ee74b5de03d2a)) - Add signature verification tests (RFC 9580 Annex A.6 and A.7) ([#409](https://github.com/rpgp/rpgp/issues/409)) - ([0439dd5](https://github.com/rpgp/rpgp/commit/0439dd5d23e5340115388cb023ded8ec1b6562cc)) - Exercise SEIPDv2 encrypt/decrypt for a range of message sizes - ([f9c48dd](https://github.com/rpgp/rpgp/commit/f9c48dda2bd612ff14772316f61162fbfedb8446)) ### โš™๏ธ Miscellaneous Tasks - Rename PublicKeyAlgorithm::EdDSA to EdDSALegacy - ([d30ce26](https://github.com/rpgp/rpgp/commit/d30ce2632f6eceb38f192a1ee5a059d255703e21)) - Rename PublicKeyTrait::to_writer_old into serialize_for_hashing - ([017be15](https://github.com/rpgp/rpgp/commit/017be1507bbd03d928a01b8a60016a941096bf76)) - Bump MSRV to 1.75 - ([67551a8](https://github.com/rpgp/rpgp/commit/67551a8023de10c1a127b74ea97cbfaa5705f921)) - Update push from master to main ([#386](https://github.com/rpgp/rpgp/issues/386)) - ([7b5f5b7](https://github.com/rpgp/rpgp/commit/7b5f5b7ca424a4caa94d1ce478a59a0a05b20a97)) - Use write_u8 - ([882dcc3](https://github.com/rpgp/rpgp/commit/882dcc33d8b96e5727eb9358274dca2d5650eb19)) - Add cargo deny check - ([d4a7905](https://github.com/rpgp/rpgp/commit/d4a7905e27cdad69cf4be28c10c77043a2a3fdd4)) - Add PkeskVersion, SkeskVersion types - ([bc79460](https://github.com/rpgp/rpgp/commit/bc794603224152370729a248aaf737008d7ab75e)) - Rework ecdh public params to be able to represent opaque data - ([276768e](https://github.com/rpgp/rpgp/commit/276768eedd65d754f5d5c29e9fe260dad091b61c)) ## [0.13.1](https://github.com/rpgp/rpgp/compare/v0.13.0..v0.13.1) - 2024-06-30 ### ๐Ÿ› Bug Fixes - Remove stray eprintln - ([683c529](https://github.com/rpgp/rpgp/commit/683c5294d61a20669725501fe6f1c3b4b7f49f4b)) ### ๐Ÿ“š Documentation - *(readme)* Fix the example - ([cd7a253](https://github.com/rpgp/rpgp/commit/cd7a2530e4fb8607609d3813a894addc6c6fbc77)) - *(readme)* Some more example adjustments - ([99daf15](https://github.com/rpgp/rpgp/commit/99daf1551c7d732f1a1c9e83074af02c66cbd684)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.13.1 - ([36023a4](https://github.com/rpgp/rpgp/commit/36023a447b2a1eda163da862e39ce252aed5c279)) ## [0.13.0](https://github.com/rpgp/rpgp/compare/v0.12.0-alpha.3..v0.13.0) - 2024-06-17 ### ๐Ÿ“š Documentation - Provide more FAQ items and improve comparisons - ([374026f](https://github.com/rpgp/rpgp/commit/374026f6bf63e94219099b0fe0e33ed01d6eb43c)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.13.0 - ([66fbbb3](https://github.com/rpgp/rpgp/commit/66fbbb31d0bd7597820496b85b914682674b81ea)) ## [0.12.0-alpha.3](https://github.com/rpgp/rpgp/compare/v0.12.0-alpha.2..v0.12.0-alpha.3) - 2024-05-31 ### โ›ฐ๏ธ Features - *(ecdh)* [**breaking**] Implement support for nist p curves - ([1b6d5dd](https://github.com/rpgp/rpgp/commit/1b6d5dd3421196d941eca579f1a089315f78cf48)) - Update deps - ([f0477f4](https://github.com/rpgp/rpgp/commit/f0477f47cfd44a9c2f809057c5f3c98bacedb1ca)) - Enable SEIPDv2 decryption via the public API ([#345](https://github.com/rpgp/rpgp/issues/345)) - ([deb8a92](https://github.com/rpgp/rpgp/commit/deb8a92e30176e24a4ba655b25d80e4a0860f79a)) - Add APIs to create and verify third-party certifications ([#349](https://github.com/rpgp/rpgp/issues/349)) - ([ab39417](https://github.com/rpgp/rpgp/commit/ab394179a6c93da7bd5a1bdf34bcf1bc3b5ac754)) - Use sha1_checked for Sha1 hashing, except MDC - ([7c5e6ae](https://github.com/rpgp/rpgp/commit/7c5e6ae9cc8c9e180abf9ad354b9d5e236ea5c7c)) ### ๐Ÿšœ Refactor - Improve & simplify packet parsing logic - ([3b71f41](https://github.com/rpgp/rpgp/commit/3b71f41ebbe180af42b830b65e0b511362e11e1e)) ### ๐Ÿ“š Documentation - *(readme)* Fixup copyright - ([9773052](https://github.com/rpgp/rpgp/commit/9773052ae550809bacee2cd96bccbab5bc777cc9)) - Nist p521 support for ECDH was merged in #304 ([#335](https://github.com/rpgp/rpgp/issues/335)) - ([8e67756](https://github.com/rpgp/rpgp/commit/8e67756ebce780c91b8c2ffc7db1f6230f8a9419)) - Fix typo "secret" -> "public" - ([f68aa3d](https://github.com/rpgp/rpgp/commit/f68aa3dc5df4eda6516be7ad83ed5f8d16a09ac6)) - Update and expand status and readme - ([9b27d81](https://github.com/rpgp/rpgp/commit/9b27d811e5693d21e2f3c8dfb43ac8ab1aafb922)) - Small refinements/typo-fixes ([#342](https://github.com/rpgp/rpgp/issues/342)) - ([34d1c79](https://github.com/rpgp/rpgp/commit/34d1c79c1d254245711793688cbd722b730ec789)) - Add link to interop test suite - ([cc46fa5](https://github.com/rpgp/rpgp/commit/cc46fa5e7906beadf89ebd9d54466fffcbfa6815)) ### ๐Ÿงช Testing - Camellia decryption ([#354](https://github.com/rpgp/rpgp/issues/354)) - ([066c1c5](https://github.com/rpgp/rpgp/commit/066c1c5f3f8547d3fe38c964685871635b8d876a)) ### โš™๏ธ Miscellaneous Tasks - *(echd)* [**breaking**] Prepare for handling more curves - ([35343e0](https://github.com/rpgp/rpgp/commit/35343e061c74e2fa7217e71edabb2dd9e7a3f1ec)) - *(pgp)* Release 0.12.0-alpha.3 - ([82d49b3](https://github.com/rpgp/rpgp/commit/82d49b3f386003a9ab65196c3409af6efd25d383)) - Remove unused ios-simulator code ([#339](https://github.com/rpgp/rpgp/issues/339)) - ([8bec797](https://github.com/rpgp/rpgp/commit/8bec797e48188251f0f4dec3729c8f738385f5ac)) - Add codespell CI job; apply fixes ([#341](https://github.com/rpgp/rpgp/issues/341)) - ([a6b6ad7](https://github.com/rpgp/rpgp/commit/a6b6ad70a2f54e76786214bca1e4ccea229afb56)) - Remove asm feature from windows - ([56505aa](https://github.com/rpgp/rpgp/commit/56505aa9cdfe32c57703c79da52c04b82feb1981)) - Pacify codespell - ([06e840c](https://github.com/rpgp/rpgp/commit/06e840cc34fe1d675a6003da60cdd91d4c387f77)) ## [0.12.0-alpha.2](https://github.com/rpgp/rpgp/compare/v0.12.0-alpha.1..v0.12.0-alpha.2) - 2024-04-07 ### โ›ฐ๏ธ Features - Basic support for AEAD ([#316](https://github.com/rpgp/rpgp/issues/316)) - ([93ca7d8](https://github.com/rpgp/rpgp/commit/93ca7d8f5d002677c51be0438564522e636b014d)) - Avoid Seek - ([fa82b12](https://github.com/rpgp/rpgp/commit/fa82b12fcd69ea7dbfba83914a972c0cabbe1b5f)) - Cleartext framework support - ([66b005c](https://github.com/rpgp/rpgp/commit/66b005c11467068bac9599c27c9d90bc405095d6)) ### ๐Ÿ› Bug Fixes - *(packet-parser)* Increase buffer size for unknown size - ([1013c13](https://github.com/rpgp/rpgp/commit/1013c134c90b7e38c02de9d74fc61780e06bfa05)) ### ๐Ÿšœ Refactor - Improve internal crypto abstractions to allow for more flexibility - ([a3dd485](https://github.com/rpgp/rpgp/commit/a3dd485f9be48024b7756358e0e6d13d54101790)) - Break out ecdh unwrap - ([bde459c](https://github.com/rpgp/rpgp/commit/bde459ccb759903e63e90f201a1526353a33c6d5)) - Move benches to criterion and expand benchmarks - ([8e87774](https://github.com/rpgp/rpgp/commit/8e87774cc08b9549e5a374d75b41b585768c053d)) ### ๐Ÿงช Testing - Approximate decryption and signing operations with an OpenPGP card - ([42cfa11](https://github.com/rpgp/rpgp/commit/42cfa11b5c3661166f561b613439d0ac6d40a9b8)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.12.0-alpha.2 - ([817bf65](https://github.com/rpgp/rpgp/commit/817bf658bc719ad868829307d71923851e2d6cf6)) - Fix feature = "cargo-clippy" deprecation - ([a75db54](https://github.com/rpgp/rpgp/commit/a75db5470ea75f5c392f0b5688da76762a42ca0b)) - Set debug in Cargo.toml to the normalized value - ([29adca7](https://github.com/rpgp/rpgp/commit/29adca744539955ccc16895afb8e7f8504936aa3)) ### Bench - Add benchmarks for s2k ([#325](https://github.com/rpgp/rpgp/issues/325)) - ([ff2a3fc](https://github.com/rpgp/rpgp/commit/ff2a3fcd26ce951a6f45e90fbb87d42e8d13fab7)) ## [0.12.0-alpha.1](https://github.com/rpgp/rpgp/compare/v0.11.0..v0.12.0-alpha.1) - 2024-03-17 ### โ›ฐ๏ธ Features - Export a crate VERSION string - ([1808c99](https://github.com/rpgp/rpgp/commit/1808c994746b3e54d76ed16d5512dee2ff031ba1)) - Obfuscate symmetric key length with ecdh padding - ([2fc374a](https://github.com/rpgp/rpgp/commit/2fc374aeb4eccee16238109159e62e8e58187b7b)) - Implement hash_alg() and public_params() for SecretKeyTrait - ([bb7782d](https://github.com/rpgp/rpgp/commit/bb7782dbcbf839ddefb05664c574ecc2ed653ba0)) - Implement support for ECDSA over NIST P-521 - ([14d0f6a](https://github.com/rpgp/rpgp/commit/14d0f6a185a597a317a39437397a0a929b0a600d)) - Eadd reader functions that autodetect armored vs. binary - ([efd27c0](https://github.com/rpgp/rpgp/commit/efd27c0bf0d22499f9739c46f9539859fde26874)) ### ๐Ÿ› Bug Fixes - *(ecdsa)* Never pad ecdsa secret MPIs - ([87cb242](https://github.com/rpgp/rpgp/commit/87cb2421fc2cc9d604ca74c691f0878e3fc3436d)) - *(parser)* There should be no edata except after ESKs - ([cadccd5](https://github.com/rpgp/rpgp/commit/cadccd5c66c46a2b86cb7ae39e34ef4da45dcc4f)) - *(test)* Adjust to changed message decryption interface - ([e57c49a](https://github.com/rpgp/rpgp/commit/e57c49af90a2657887dce980d69a48971865f808)) - Avoid stack overflow when verifying recursively compressed message - ([bfa34bb](https://github.com/rpgp/rpgp/commit/bfa34bbe3ced26b28c411ebbdd4e9a96800949d9)) - Configure hash_alg based on signing key type - ([6cda288](https://github.com/rpgp/rpgp/commit/6cda28834af077889fbfd60adfaab5feafbaf1d3)) ### ๐Ÿงช Testing - Increase key_gen_ecdsa_p256 rounds - ([f7fd18d](https://github.com/rpgp/rpgp/commit/f7fd18d2986f00e7536881bab1416ababdeda8bf)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.12.0-alpha.1 - ([2d255ed](https://github.com/rpgp/rpgp/commit/2d255ed462374e19ac6c8a9b60a274cd0b794c9c)) - Adjust to chrono deprecations - ([d0bf0fd](https://github.com/rpgp/rpgp/commit/d0bf0fdb6e61dfeb8a7c4adabc10696d522465b1)) ### S2k - Restructure, implement argon2 - ([6298c15](https://github.com/rpgp/rpgp/commit/6298c1580b7e631f5bdec1a96f56ba6e9cf85217)) ## [0.11.0](https://github.com/rpgp/rpgp/compare/v0.10.2..v0.11.0) - 2024-02-21 ### โ›ฐ๏ธ Features - Add Signature::verify_key_binding_primary_back_sig - ([2764b39](https://github.com/rpgp/rpgp/commit/2764b39f065c69ee7276af872ec1e529753f68f9)) - Implement support for Secp256k1 ([#275](https://github.com/rpgp/rpgp/issues/275)) - ([0d8e580](https://github.com/rpgp/rpgp/commit/0d8e58096cdc7770460942c653815463a925f954)) - Add dsa support - ([4ed459b](https://github.com/rpgp/rpgp/commit/4ed459be58d09d9949894a8fffe30e75bc1a8b7d)) - Generalize packet parsing to accept more unknown values; packet parser error type distinguishes "hard and soft" errors. - ([48af40c](https://github.com/rpgp/rpgp/commit/48af40c9afa787fd8815d8da038c2425ceee4477)) - Handle distinction between hard and soft packet parsing errors - ([6752d83](https://github.com/rpgp/rpgp/commit/6752d835384068bf710d87550550e49a1e384f1a)) - Implement From for SignedPublicKey and From for SignedPublicSubKey - ([43370c5](https://github.com/rpgp/rpgp/commit/43370c5a97d431d97f11aad8761877bd8dd0840d)) ### ๐Ÿ› Bug Fixes - *(terminology)* Use "certification" where we mean signatures that confirm identities - ([44bccd3](https://github.com/rpgp/rpgp/commit/44bccd3a026b6eda7099065f80e972ef88863f8a)) - Handle other RevocationCode values - ([6167e99](https://github.com/rpgp/rpgp/commit/6167e99473220d5e3c1bee3ce60fa62216a0247c)) - Return an error in Message::verify if we don't know what to verify - ([e29d089](https://github.com/rpgp/rpgp/commit/e29d089ec96b985c5263b7637713d0a9ecad60fa)) - Handle expiration times as Duration - ([1cb17a1](https://github.com/rpgp/rpgp/commit/1cb17a122ede618d8bd1af01b7de9ab464475ee5)) - Check SHA-1 checksum before parsing - ([fd36c23](https://github.com/rpgp/rpgp/commit/fd36c23d47a08e58a7d44b94e6915edf1edb3961)) - Normalize line endings when hashing data for a Text signature - ([65c9e46](https://github.com/rpgp/rpgp/commit/65c9e46975c62ede7ac3427dc458109a371041cb)) - Move line ending normalization from Message::verify to Signature::verify - ([20dd658](https://github.com/rpgp/rpgp/commit/20dd6584c8587ecaea3483ffb5356647f914b385)) - Debug output cleanup - ([4e7ba07](https://github.com/rpgp/rpgp/commit/4e7ba07f5c10239f7fe7961c906c6c4ebef9ddf7)) - Do not allow decryption with "Plaintext" algorithm - ([9201b7e](https://github.com/rpgp/rpgp/commit/9201b7e59d96e6873c284ab428fd038b778d7dfc)) - Enforce Partial Body Length "MUST" from RFC 4880 - ([d37a7b5](https://github.com/rpgp/rpgp/commit/d37a7b538852c208ebe2e7adcf82464b239bcd57)) - Clarify use of subpackets from hashed and unhashed areas - ([7f1ae5c](https://github.com/rpgp/rpgp/commit/7f1ae5c650dc1f2b735274c5ad9fae9214318fd7)) - [**breaking**] Generalize issuer subpacket checks - ([7c43d22](https://github.com/rpgp/rpgp/commit/7c43d2298fe37a4c1188e9110c00e622640ee1b3)) - Make ECDH unpadding more robust - ([bf7a3f3](https://github.com/rpgp/rpgp/commit/bf7a3f3dba0822611c34941d5d820061f803ea60)) ### ๐Ÿšœ Refactor - Switch from num_derive to num_enum - ([8014e49](https://github.com/rpgp/rpgp/commit/8014e4959579dc4ccf2791fef601fbd48bdce3df)) ### ๐Ÿ“š Documentation - *(readme)* Fix CI status image and rust version badge - ([59c9d73](https://github.com/rpgp/rpgp/commit/59c9d732694c34694b99ea3c1c511afef0cd258c)) - Remove unnecessary backticks ([#252](https://github.com/rpgp/rpgp/issues/252)) - ([2b17b30](https://github.com/rpgp/rpgp/commit/2b17b30b8acb2eff0d330c60bb46080ce59e837b)) - Roughly reflect formats/mechanisms from draft-ietf-openpgp-crypto-refresh - ([97edf8f](https://github.com/rpgp/rpgp/commit/97edf8fd3073eac2f11cd717896db288c61f6589)) - Clarify parameters in verify_key_binding_internal - ([b82cd3f](https://github.com/rpgp/rpgp/commit/b82cd3f71d1c4ffacb27ea287d5041e8ec0f8959)) - Switch to git-cliff for changelog - ([39444e5](https://github.com/rpgp/rpgp/commit/39444e5a316168412eab0c59c072fc5feaf4b275)) ### โšก Performance - Avoid `concat` in sha1 checksum impl - ([f56529f](https://github.com/rpgp/rpgp/commit/f56529faf44e37984328286220aa266d4ec0d26a)) ### ๐Ÿงช Testing - Read signature with "other" revocation code - ([dd3742b](https://github.com/rpgp/rpgp/commit/dd3742b77a8e9c05276d0c51eb4ff937f391df5e)) - Add test for normalization of line endings with text-mode signatures - ([19c3d1d](https://github.com/rpgp/rpgp/commit/19c3d1dc6ed1d3db6a9aa22df4c2f22d87956d81)) - Test that verifying unsigned messages fails - ([5a1e8c7](https://github.com/rpgp/rpgp/commit/5a1e8c784446e99295de310bd885c4078ed91374)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.11.0 - ([20335b3](https://github.com/rpgp/rpgp/commit/20335b387037bfedd1b3cdb4a48fb7466f721b56)) - Fix deprecation warning reported by clippy - ([a9a7a0b](https://github.com/rpgp/rpgp/commit/a9a7a0b02cab4a6892ae0158b23757f3ad41371e)) - Fix vec performance lint - ([7aa80c9](https://github.com/rpgp/rpgp/commit/7aa80c9dd94b5fda0d2d9c9f9798e9379a5ea6d0)) - Use 1.72 stabley toolchain instead of stable for mips - ([334c0b8](https://github.com/rpgp/rpgp/commit/334c0b83e6339c774b6ed05e7ff9d8b0aed54894)) - Set Rust version to 1.67 - ([0e673a2](https://github.com/rpgp/rpgp/commit/0e673a2f88aea89e33d6e921dfd51ac6a0dc7ee9)) - Fix clippy lint - ([8c4c27f](https://github.com/rpgp/rpgp/commit/8c4c27f8c078411a9d4df43d236fdef0f0af56d0)) - Fix clippy lints in tests - ([30b15e7](https://github.com/rpgp/rpgp/commit/30b15e71897ed16782992a08e1beb15381125e66)) - Update dalek deps and fix nightly on CI - ([414250a](https://github.com/rpgp/rpgp/commit/414250ad85f924ced11c45f3d44ed99089890278)) - Bump to Rust 1.70 - ([1dd37d2](https://github.com/rpgp/rpgp/commit/1dd37d2d9d106d3a1a4dbce99f734cd4fbed897b)) ### Cleanup - Rename Indeterminated to Indeterminate - ([5357815](https://github.com/rpgp/rpgp/commit/535781523618d99d90107deadb9927087dd516f3)) ## [0.10.2](https://github.com/rpgp/rpgp/compare/v0.10.1..v0.10.2) - 2023-07-24 ### โ›ฐ๏ธ Features - Implement `LowerHex` and `UpperHex` for `KeyId` ([#244](https://github.com/rpgp/rpgp/issues/244)) - ([9bb9d97](https://github.com/rpgp/rpgp/commit/9bb9d97c91cbc5c9ed4b5aec1a9becf02f950681)) - Update dalek crypto deps ([#247](https://github.com/rpgp/rpgp/issues/247)) - ([93866d2](https://github.com/rpgp/rpgp/commit/93866d24673e4407f3c83873f83bf917c20feaba)) ### ๐Ÿ› Bug Fixes - Update to released rsa@0.9.0 - ([9226269](https://github.com/rpgp/rpgp/commit/922626913d495458eeff8a3255d6935b981e6d0a)) ### ๐Ÿšœ Refactor - *(packet)* Make members of OnePassSignature public - ([6036902](https://github.com/rpgp/rpgp/commit/60369027980552a765d6f4fcf0f1776ea91c0c86)) - Fix warnings - ([1e300ac](https://github.com/rpgp/rpgp/commit/1e300acefc6b14641869cb2a8be77fd0f2e1d19c)) ### ๐Ÿ“š Documentation - *(readme)* Update a couple of minor points in README - ([caf57aa](https://github.com/rpgp/rpgp/commit/caf57aa75dbe20b73f051daa6d3bdf5d989de20b)) - Update changelog - ([659989b](https://github.com/rpgp/rpgp/commit/659989b94c626edf1f1d5b819f9d6c96370a750d)) - Changelog for 0.10.2 - ([8e762fa](https://github.com/rpgp/rpgp/commit/8e762fa0b230c6ab5413fed6abcf102dcfb245e8)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.10.2 - ([6a3430c](https://github.com/rpgp/rpgp/commit/6a3430c500b77b5b3285912b174a8177789a1a48)) - Fix clippy - ([e557ec7](https://github.com/rpgp/rpgp/commit/e557ec7aafa09476981f240c68d35e5a9d295b8e)) ## [0.10.1](https://github.com/rpgp/rpgp/compare/v0.10.0..v0.10.1) - 2023-03-30 ### ๐Ÿ› Bug Fixes - *(ecdsa)* Store original MPI to preserve padding - ([848af8f](https://github.com/rpgp/rpgp/commit/848af8f9a6772c187e7f184cd75488b78d13f9eb)) - *(signature)* Return error on KeyId missmatch - ([02bef50](https://github.com/rpgp/rpgp/commit/02bef50de14f2e4300a9e709de87e4838c28a019)) ### ๐Ÿ“š Documentation - *(changelog)* Prepare v0.10.1 - ([fe3c69f](https://github.com/rpgp/rpgp/commit/fe3c69fbb083f3b0572c020debc2c2a0f9e2b1b9)) ### ๐Ÿงช Testing - Check critical bit encoding roundtrips - ([cc78011](https://github.com/rpgp/rpgp/commit/cc780117d7d6dd64c999acfb80ba4cefa55f356c)) - Skip non validating keys again - ([a0556f5](https://github.com/rpgp/rpgp/commit/a0556f53602a091c66a84fb7d6a91ae3b7ad4471)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.10.1 - ([951b8f9](https://github.com/rpgp/rpgp/commit/951b8f9d9b2818fdce964581a08f0e636fd3ecf1)) ## [0.10.0](https://github.com/rpgp/rpgp/compare/v0.9.0..v0.10.0) - 2023-03-27 ### โ›ฐ๏ธ Features - *(crypto)* Add missing symmetric cipher support - ([1648fbb](https://github.com/rpgp/rpgp/commit/1648fbb341987612e84590a3321db34469252a9a)) - *(deps)* Update base64 and derive_builder - ([59dcda7](https://github.com/rpgp/rpgp/commit/59dcda7761f027707b4f295c231b961f74b4e3e7)) - Implement support for ECDSA keys - ([65e2f86](https://github.com/rpgp/rpgp/commit/65e2f86a3e45867f95414bbd57061309f2ff0b26)) - Update nom to v7 - ([be4eaaa](https://github.com/rpgp/rpgp/commit/be4eaaaade6d57c3c2a9eebba0ce0b1ab0065823)) - Update to latest dependencies ([#218](https://github.com/rpgp/rpgp/issues/218)) - ([013923b](https://github.com/rpgp/rpgp/commit/013923b62af995fc1a26e9c918d1dbe8b1299c5d)) - Move from String to BString - ([b388e4e](https://github.com/rpgp/rpgp/commit/b388e4e1f17d22492b81c66483e3255d76b7235a)) ### ๐Ÿ› Bug Fixes - Update to new chrono apis - ([8651965](https://github.com/rpgp/rpgp/commit/8651965a689fd35bbd5f53cb64eb40eb348312be)) - Resolve merge issue - ([ed98330](https://github.com/rpgp/rpgp/commit/ed983308bb4f75800214962f86f52500e999473a)) - Edcsa support - ([a463cca](https://github.com/rpgp/rpgp/commit/a463cca1cb2bbefe4bb3148babee3685a06a14a6)) - Fixup doc comments - ([f55c7a5](https://github.com/rpgp/rpgp/commit/f55c7a56a987e5c92fb740029ff112b0a410564f)) - Nightly warnings - ([0917b01](https://github.com/rpgp/rpgp/commit/0917b015b1e82f0fcc87be94d83556b1b0eadfe8)) ### ๐Ÿšœ Refactor - Remove unused param from `decrypt` - ([810379f](https://github.com/rpgp/rpgp/commit/810379f781f66c51cde309f46741232d4fbdca15)) - Followup to #214 - ([3730457](https://github.com/rpgp/rpgp/commit/3730457315bd6da72defe358ff86259a32d6843e)) - Switch from buf_redux to buffer-redux - ([8e42501](https://github.com/rpgp/rpgp/commit/8e42501119cea413ec52b3df0383dd4454e5a271)) ### ๐Ÿ“š Documentation - Create changelog - ([3f72a28](https://github.com/rpgp/rpgp/commit/3f72a28dca657cf5e1af502703d01ecb69d18f2a)) - Changelog for v0.10.0 - ([d5ea053](https://github.com/rpgp/rpgp/commit/d5ea0537153788474013a3a533e2ad0a866fd763)) ### โš™๏ธ Miscellaneous Tasks - *(crypto/sym)* Drop unused block size arguments - ([5beeb40](https://github.com/rpgp/rpgp/commit/5beeb40cef9bf4ced1db33485a11efe30115fe58)) - *(pgp)* Release 0.10.0 - ([69db862](https://github.com/rpgp/rpgp/commit/69db862cca24ced16810f123890a07b8b69609bc)) - Happy clippy - ([30d83a8](https://github.com/rpgp/rpgp/commit/30d83a81fd8d41074908199c081bd0459211bc9d)) - Remove old release config - ([a8ced15](https://github.com/rpgp/rpgp/commit/a8ced157095dee9478a3511e9a660f6cf01f577b)) ## [0.9.0](https://github.com/rpgp/rpgp/compare/v0.8.0..v0.9.0) - 2022-11-07 ### โ›ฐ๏ธ Features - Remove unused clear_on_drop dependency - ([446c91b](https://github.com/rpgp/rpgp/commit/446c91bec7c2e022180f94764d9d5c9034260493)) - Allow subkeys to be created with the authentication flag enabled - ([e37e921](https://github.com/rpgp/rpgp/commit/e37e921cdfb724931bfcf52aaf2d321a2cf55372)) - Update to RSA 0.7.0 interfaces - ([c57232e](https://github.com/rpgp/rpgp/commit/c57232ea73ef35e3a5d3ffa08d880c2dd37cbd8c)) - Edition 2021 and update crypto deps - ([a0a71cc](https://github.com/rpgp/rpgp/commit/a0a71cc3f836cea69e721877baf2f9895657f85d)) ### ๐Ÿšœ Refactor - Replace find_map with a find - ([721b287](https://github.com/rpgp/rpgp/commit/721b287983702316cdbf23cad0f416ab69c5e42a)) - Remove unused circular dependency and also rewrite IV handling to not require lazy_static - ([30aea2e](https://github.com/rpgp/rpgp/commit/30aea2eca4f45accf28867c294c9fe8a6b619172)) ### ๐Ÿ“š Documentation - *(readme)* Update msrv - ([ac20fa0](https://github.com/rpgp/rpgp/commit/ac20fa03fcaa07897c698160e219f6b1a4111279)) - Add comma in `README` for clearer message ([#185](https://github.com/rpgp/rpgp/issues/185)) - ([28c80c8](https://github.com/rpgp/rpgp/commit/28c80c85d1b3694e3f2622e9a9ee22e5c1d82702)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.9.0 - ([e07f443](https://github.com/rpgp/rpgp/commit/e07f443d2d3464e2d3b07ad9564a582ef59681d5)) - Upgrade pretty_assertions to 1 - ([0277001](https://github.com/rpgp/rpgp/commit/027700108a6b5f4c4dbd8a493c39f9dffed3e6d3)) ## [0.8.0](https://github.com/rpgp/rpgp/compare/v0.7.2..v0.8.0) - 2022-07-01 ### โ›ฐ๏ธ Features - Update deps & introduce MSRV - ([5d86ab3](https://github.com/rpgp/rpgp/commit/5d86ab33242fb5489b17017a742259a8c781b4cd)) - Add a method to construct a PublicKey from parameters - ([f0d3fa8](https://github.com/rpgp/rpgp/commit/f0d3fa859c72d82245c511b446ce10da92a8449b)) - Derive Clone on hasher types - ([d878faa](https://github.com/rpgp/rpgp/commit/d878faac629ef0ebd30746e70092bf158afcdbc4)) - Apply clippy and update some deps - ([66c4f76](https://github.com/rpgp/rpgp/commit/66c4f76ee7420c51d4f04e1f44400d4ec2d34ffb)) ### ๐Ÿ› Bug Fixes - *(deps)* Fix zeroize version - ([e8ca41c](https://github.com/rpgp/rpgp/commit/e8ca41c6a1ea79f22ac2f57bc1d3a6d1f0254ac6)) - Disable `oldtime` feature of `chrono` - ([9d24203](https://github.com/rpgp/rpgp/commit/9d2420396eed95c43d16c925c9883518898e99e8)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.8.0 - ([b3671d5](https://github.com/rpgp/rpgp/commit/b3671d572a9e2b161f80932324895f98faef0bc4)) - Switch to github actions - ([202e7c1](https://github.com/rpgp/rpgp/commit/202e7c1059393ae6540d3376348924e12e8c8c17)) - Update release.toml - ([fd6e45d](https://github.com/rpgp/rpgp/commit/fd6e45d5b1006ee7d6464010f2a0da5ac7d674d7)) ## [0.7.2](https://github.com/rpgp/rpgp/compare/v0.7.1..v0.7.2) - 2021-08-27 ### ๐Ÿ› Bug Fixes - Do not panic on IDEA cipher - ([1b7e2d5](https://github.com/rpgp/rpgp/commit/1b7e2d53732ff3e2a5f339599464639c68fc6593)) - Update & freeze deps to ensure build ([#135](https://github.com/rpgp/rpgp/issues/135)) - ([054e00b](https://github.com/rpgp/rpgp/commit/054e00b081caa828335e52d39eb39b89a7eea2eb)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.7.2 - ([f0dd2d8](https://github.com/rpgp/rpgp/commit/f0dd2d8ff5d0da988530309edf81151b683110e3)) - Update dependencies - ([90c9e6e](https://github.com/rpgp/rpgp/commit/90c9e6e50ad9e342ad9f8756ae9de4859097cc14)) ## [0.7.1](https://github.com/rpgp/rpgp/compare/v0.7.0..v0.7.1) - 2020-09-17 ### โ›ฐ๏ธ Features - Update crypto deps - ([cacb24d](https://github.com/rpgp/rpgp/commit/cacb24d926d671b3d5ab523ddfd949f8a2b213ab)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.7.1 - ([eb4c151](https://github.com/rpgp/rpgp/commit/eb4c151979cceee503bd6c79d16ec4c558693199)) ## [0.7.0](https://github.com/rpgp/rpgp/compare/v0.6.1..v0.7.0) - 2020-08-24 ### โ›ฐ๏ธ Features - Make sign/verify utilize trait std::io::Read - ([b77e20e](https://github.com/rpgp/rpgp/commit/b77e20e706719c1a85fb9ba1246b9813550a3da7)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.7.0 - ([94af2bc](https://github.com/rpgp/rpgp/commit/94af2bc21408f55e13be1e45168342c25a85a2c3)) - Fmt + clippy - ([ca81f7b](https://github.com/rpgp/rpgp/commit/ca81f7b65e5ad7a421aaa4bd9a78dbb41a346acf)) ## [0.6.1](https://github.com/rpgp/rpgp/compare/v0.6.0..v0.6.1) - 2020-07-20 ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.6.1 - ([5c5b2d0](https://github.com/rpgp/rpgp/commit/5c5b2d04dd5a803f762462feb04128f18e752cdc)) - Update some dependencies - ([cbb8b14](https://github.com/rpgp/rpgp/commit/cbb8b1405d171f44b60cf2800786bce0c46ed9b4)) ## [0.6.0](https://github.com/rpgp/rpgp/compare/v0.5.2..v0.6.0) - 2020-06-11 ### โ›ฐ๏ธ Features - Update to the latest rustrcrypto deps - ([218ddbd](https://github.com/rpgp/rpgp/commit/218ddbdb831b39f396a9cc9ad2f7ed52c22a42b4)) ### ๐Ÿšœ Refactor - Happy clippy - ([709132b](https://github.com/rpgp/rpgp/commit/709132b972f329f1b7ba553a49f6be23b81bead5)) ### ๐Ÿ“š Documentation - Add a few doctests to showcase API usage - ([c7b7442](https://github.com/rpgp/rpgp/commit/c7b7442c82e1ad315482f2082a5dcff169a0b3e4)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.6.0 - ([931f4a1](https://github.com/rpgp/rpgp/commit/931f4a14dd2476ec567636742c47646d6fec8f06)) - Update rust-toolchain - ([2370f72](https://github.com/rpgp/rpgp/commit/2370f729f5cabfc2f87c278028742a0b24c4bcf9)) ## [0.5.2](https://github.com/rpgp/rpgp/compare/v0.5.1..v0.5.2) - 2020-04-02 ### ๐Ÿ› Bug Fixes - Handle short x25519 keys properly - ([c07ecab](https://github.com/rpgp/rpgp/commit/c07ecabfd058e79d1cb6aa841fc9488f466c550a)) ### ๐Ÿงช Testing - Introduce failing test for ecdh keygen - ([b7d5ee4](https://github.com/rpgp/rpgp/commit/b7d5ee4bb44f3dfa0dccc6f0712e7d7ad49bde11)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.5.2 - ([ff0b43c](https://github.com/rpgp/rpgp/commit/ff0b43cf6820fd952d93f304d72e18bd92f3965b)) ## [0.5.1](https://github.com/rpgp/rpgp/compare/v0.5.0..v0.5.1) - 2020-03-04 ### ๐Ÿ› Bug Fixes - Undo regression in base64_decoder - ([e23fa4e](https://github.com/rpgp/rpgp/commit/e23fa4ef0ff3e4fb6e415764cb0c4adeae435a91)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.5.1 - ([921a370](https://github.com/rpgp/rpgp/commit/921a3701f10cf042feaf1732702786c3edb0d03e)) ## [0.5.0](https://github.com/rpgp/rpgp/compare/v0.4.1..v0.5.0) - 2020-03-04 ### ๐Ÿ› Bug Fixes - Remove usage of slice_dequeu - ([d176e2e](https://github.com/rpgp/rpgp/commit/d176e2ea168d16696e3cf6ef2ab2d5fa9ed1f5b2)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.5.0 - ([ef4a1ca](https://github.com/rpgp/rpgp/commit/ef4a1cae8545264ad72ccd7c8bdf64747516c429)) ## [0.4.1](https://github.com/rpgp/rpgp/compare/0.4.0..v0.4.1) - 2020-03-01 ### ๐Ÿ› Bug Fixes - Encode leading zeros in ECDH session key - ([c53ade9](https://github.com/rpgp/rpgp/commit/c53ade9dd789bb3395ddb0572f76b985e51900b9)) - Correct typo in feature name for ringbuf - ([52e2339](https://github.com/rpgp/rpgp/commit/52e233955a5f6490c57822899b6344498901c858)) ### ๐Ÿšœ Refactor - Happy clippy - ([9ac9213](https://github.com/rpgp/rpgp/commit/9ac9213f54ad93c914711ae8d9329f9f533aadb3)) ### ๐Ÿงช Testing - Encrypt 1000 times in test_x25519_encryption - ([1cc0e22](https://github.com/rpgp/rpgp/commit/1cc0e223e6b4f4b63494e3828506bcaedf2b5b9b)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.4.1 - ([cfe081d](https://github.com/rpgp/rpgp/commit/cfe081d1cd08e74b32fca15a9886eb5d1c8df50c)) - Cargo fmt - ([d05f50b](https://github.com/rpgp/rpgp/commit/d05f50b7c1ec4efb0dcfa34b819fda1872e8e47d)) - Update rust-toolchain - ([cd59306](https://github.com/rpgp/rpgp/commit/cd59306f04a46fe87e0f95e23600f0df408f3cef)) ## [0.4.0](https://github.com/rpgp/rpgp/compare/0.3.2..0.4.0) - 2019-12-11 ### โ›ฐ๏ธ Features - *(key)* Add Signed(Public|Secret)Key::expires_at() method - ([8928a24](https://github.com/rpgp/rpgp/commit/8928a249f848d46889f618fde914417f698ea76f)) - Update dependencies - ([bcbd6b6](https://github.com/rpgp/rpgp/commit/bcbd6b6682a1753619fc37b19c0762afc18614ab)) - Update dependencies ([#82](https://github.com/rpgp/rpgp/issues/82)) - ([4d8af17](https://github.com/rpgp/rpgp/commit/4d8af17841b3e09739aa48d35617169f13b3d534)) ### ๐Ÿ› Bug Fixes - Remove unused enum_primitive dependency - ([4cc60a1](https://github.com/rpgp/rpgp/commit/4cc60a1e45a781ea6e7f394ae2583844ac75d214)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.4.0 - ([a6cba1d](https://github.com/rpgp/rpgp/commit/a6cba1d2afcf3f387ecb9378ecb55c66aee2f702)) ## [0.3.2](https://github.com/rpgp/rpgp/compare/0.3.1..0.3.2) - 2019-11-20 ### โ›ฐ๏ธ Features - *(ci)* Add cargo audit job - ([aca6121](https://github.com/rpgp/rpgp/commit/aca6121cb0b53a4a3f5c5f8f67c9f15a43265fb5)) - Return the same error from decrypt_protected on invalid MDC - ([83f7c03](https://github.com/rpgp/rpgp/commit/83f7c03283567fb8582d09a814e6b17cbe32a6c2)) - Add is_encryption_key for KeyTrait - ([4a82994](https://github.com/rpgp/rpgp/commit/4a829941104596544fccb866bdd4617790db2d55)) - Turn info!() that are used for debugging/tracing into debug!() - ([5da47f4](https://github.com/rpgp/rpgp/commit/5da47f48e5a864c845d440ea1b06c068b8379ca8)) ### ๐Ÿ› Bug Fixes - *(line-reader)* Improve correctness of LineReader::seek - ([2a8e22a](https://github.com/rpgp/rpgp/commit/2a8e22a370f0a5deee9d0235080b756bd9dfe93c)) - Do not log sensitive information - ([b47b07f](https://github.com/rpgp/rpgp/commit/b47b07fc45838050fe0d63d48c7a18b1f2cc3103)) - Clarify error message for EdDSA encryption - ([347c804](https://github.com/rpgp/rpgp/commit/347c804ccea314fd6732c8c57ee6dffa47ea47e1)) - Return true from is_signing_key for ECDSA keys - ([6977b14](https://github.com/rpgp/rpgp/commit/6977b14479ffa079d5857861ca89e69e93c8bd55)) ### ๐Ÿšœ Refactor - Remove email module - ([3dd50a7](https://github.com/rpgp/rpgp/commit/3dd50a7d68fa8f4efac7e117553104914938318a)) ### ๐Ÿ“š Documentation - Improve documentation and comments - ([610f23f](https://github.com/rpgp/rpgp/commit/610f23fcc3b8ffabe5459cf4e153fadceddbbd52)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.3.2 - ([33ff206](https://github.com/rpgp/rpgp/commit/33ff206379d826a922c9fad822f178a0987e657c)) ## [0.3.1](https://github.com/rpgp/rpgp/compare/0.3.0..0.3.1) - 2019-10-22 ### ๐Ÿ› Bug Fixes - Improve feature handling - ([6008e8c](https://github.com/rpgp/rpgp/commit/6008e8cf95e907bda0211a2cc00838b1e9df510c)) ### ๐Ÿ“š Documentation - *(readme)* Merge security review info into Status - ([ae230ea](https://github.com/rpgp/rpgp/commit/ae230eaa88bacbd56f50a8c723e53cef5e7ca4e5)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.3.1 - ([4b04dd0](https://github.com/rpgp/rpgp/commit/4b04dd06313f54de1634e08660f89c331e613ae8)) ## [0.3.0](https://github.com/rpgp/rpgp/compare/0.2.5..0.3.0) - 2019-10-19 ### โ›ฐ๏ธ Features - Add nice api for standalone signatures - ([bb18f39](https://github.com/rpgp/rpgp/commit/bb18f39e5249e7555bf6525a15ba25e2318b152f)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.3.0 - ([fe1702f](https://github.com/rpgp/rpgp/commit/fe1702fdb2caafbdcf07dcd2a53f216215a1d940)) ## [0.2.5](https://github.com/rpgp/rpgp/compare/0.2.4..0.2.5) - 2019-10-18 ### โ›ฐ๏ธ Features - Expose api to parse signatures easily - ([42ac01a](https://github.com/rpgp/rpgp/commit/42ac01a5c6fd121bb64cacdbed3de1ae96e11fed)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.2.5 - ([5bb4952](https://github.com/rpgp/rpgp/commit/5bb4952eaa01cac611fc4932b461f36fdef85d54)) ## [0.2.4](https://github.com/rpgp/rpgp/compare/0.2.3..0.2.4) - 2019-10-13 ### โ›ฐ๏ธ Features - Add experimental wasm support - ([6e46489](https://github.com/rpgp/rpgp/commit/6e464896dba7b8a87c5aa1ec55c5591d612a4faa)) - Zero out memory for secret key structures - ([0837833](https://github.com/rpgp/rpgp/commit/0837833a6f35fdd8eebb4b5bc8e8483d52bf6f56)) - Zero out memory for secret key structures ([#57](https://github.com/rpgp/rpgp/issues/57)) - ([1b8b3a8](https://github.com/rpgp/rpgp/commit/1b8b3a837ad401c94f256cc383805d8953122e7a)) ### ๐Ÿ› Bug Fixes - *(crypto)* Do not panic on inputs being too short - ([5a01b79](https://github.com/rpgp/rpgp/commit/5a01b796c84860c1696f541c4de7f4529254c2af)) - Typ in debug impl for public params - ([86601ce](https://github.com/rpgp/rpgp/commit/86601ce470b825228eca80448ff1295bbf6b5bbe)) ### ๐Ÿšœ Refactor - Improve some debug impls - ([2bc8e43](https://github.com/rpgp/rpgp/commit/2bc8e43ff39848c45e580aa9428adafc47e61503)) ### ๐Ÿ“š Documentation - *(readme)* Updates to reflect current status better - ([e633dda](https://github.com/rpgp/rpgp/commit/e633dda536c6caf2da38782dac8a9db846808550)) - *(readme)* Improve layout a bit - ([a073622](https://github.com/rpgp/rpgp/commit/a0736224c092d89d7b83c05b2b74c627dfda4227)) - *(readme)* Move wasm note - ([5a73721](https://github.com/rpgp/rpgp/commit/5a737214e2b68ce312be685aff9f234ce69acdde)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.2.4 - ([eec5aed](https://github.com/rpgp/rpgp/commit/eec5aed3e65616488586dfb3333216badab1987e)) ## [0.2.3](https://github.com/rpgp/rpgp/compare/0.2.2..0.2.3) - 2019-10-09 ### ๐Ÿ› Bug Fixes - *(packet)* Correct string creation for LiteralData::to_string - ([dec514c](https://github.com/rpgp/rpgp/commit/dec514cd5f93c92609dd7e9e208ea01d24a6112a)) - *(packet)* Correct string creation for LiteralData::to_string ([#52](https://github.com/rpgp/rpgp/issues/52)) - ([4498a32](https://github.com/rpgp/rpgp/commit/4498a32dbb6de8bd742a61b739f84eeff566a653)) - Make armor parsing more resilient - ([425e76e](https://github.com/rpgp/rpgp/commit/425e76eb9b1ea361ef70676cf602dfc3995a1357)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.2.3 - ([004255c](https://github.com/rpgp/rpgp/commit/004255c6b3d1c6399431668d1e6d9eec324b2d22)) ## [0.2.2](https://github.com/rpgp/rpgp/compare/0.2.1..0.2.2) - 2019-09-26 ### ๐Ÿ› Bug Fixes - *(ffi)* Ensure dpeendency is found again - ([15d274b](https://github.com/rpgp/rpgp/commit/15d274b6d1a89985d3f99cd9b8f59cb95924a1c8)) - Handle incomplete packets in a safer way - ([f0a831a](https://github.com/rpgp/rpgp/commit/f0a831a640a10f9d2ac48636c3b6cd1a17707327)) ### ๐Ÿšœ Refactor - Migrate to 2018 edition - ([27c7d4f](https://github.com/rpgp/rpgp/commit/27c7d4fb0846e9b4651f947d29e6578ecc61d064)) ### โš™๏ธ Miscellaneous Tasks - *(pgp)* Release 0.2.2 - ([b9b505e](https://github.com/rpgp/rpgp/commit/b9b505eba1bd60bfc3174474b7cdd3c0be7ebf31)) - Update toolchain - ([2f89841](https://github.com/rpgp/rpgp/commit/2f898418649a41c78322d5c79d9b06d09b56552f)) - Update clippy rules and rust-toolchain - ([b40641b](https://github.com/rpgp/rpgp/commit/b40641be665a4bdd189219468beec24bc4060ff1)) - Configure release - ([840582b](https://github.com/rpgp/rpgp/commit/840582bc7cf860ef7813831799fcb74c2b13af92)) ## [0.2.1](https://github.com/rpgp/rpgp/compare/v0.2.0-alpha..0.2.1) - 2019-05-28 ### ๐Ÿ› Bug Fixes - *(armor)* Normalize line writing to ensure no empty new lines are written - ([0c17c48](https://github.com/rpgp/rpgp/commit/0c17c48336d00b2be95a8e404f1a437181c345be)) - *(ffi)* Compress messages by default - ([83c1e10](https://github.com/rpgp/rpgp/commit/83c1e101a32f48eba5abc4e343be90c58b30942f)) - *(packets)* Handle incomplete packets properly - ([b9ecee8](https://github.com/rpgp/rpgp/commit/b9ecee8aff4f835fc0ce50e2f3fd43e28cdefce9)) - *(signature)* Generate non nested one pass signature packets by default - ([44d6a44](https://github.com/rpgp/rpgp/commit/44d6a44a2b2ea4c69974604caa97345ef53448d7)) ## [0.2.0-alpha](https://github.com/rpgp/rpgp/compare/0.2.0..v0.2.0-alpha) - 2019-03-26 ### โš™๏ธ Miscellaneous Tasks - *(cargo)* Fix ffi nesting - ([39cd03d](https://github.com/rpgp/rpgp/commit/39cd03d48d30c74d9c43da9f68e8bd9a1b8d80bd)) ## [0.2.0](https://github.com/rpgp/rpgp/compare/v0.1.0..0.2.0) - 2019-03-26 ### โ›ฐ๏ธ Features - *(build)* Better feature selections - ([20ad4b8](https://github.com/rpgp/rpgp/commit/20ad4b830c6e52a3e3ab451d1e4386e65cccca36)) - *(crypto)* Bring back blowfish and twofish - ([eb18f39](https://github.com/rpgp/rpgp/commit/eb18f39759a620ac9041eb7be75608ca78c45b52)) - *(errors)* Implement From for nom::Err - ([b175ede](https://github.com/rpgp/rpgp/commit/b175ede83df2dc420f909d6ca6523f5d3f768aa2)) - *(ffi)* Add from_bytes and fingerprint methods - ([a1fd36d](https://github.com/rpgp/rpgp/commit/a1fd36df0ff13d1f9398b5237908716afc2d53fa)) - *(ffi)* Implement skey_from_bytes - ([460efdd](https://github.com/rpgp/rpgp/commit/460efdde1a9e2ec97394df0cef6244589357eb36)) - *(ffi)* Add error handling and is_public, is_secret - ([ea196bd](https://github.com/rpgp/rpgp/commit/ea196bd1bdadc4b36bb46d70f82fbb10dbc9243a)) - *(ffi)* Implement decryption - ([4a8d3a3](https://github.com/rpgp/rpgp/commit/4a8d3a377b64ac0fbddd9e8f492667058da8602d)) - *(ffi)* Add instructions to build for ios - ([3632230](https://github.com/rpgp/rpgp/commit/36322307f056e185b89addb8afa9ddd13d4a773f)) - *(ffi)* Enable some optimizations for building - ([81ae4ec](https://github.com/rpgp/rpgp/commit/81ae4ec0ddbc023f106d17a4d1654fe1b36529fb)) - *(ffi)* Better flags setting - ([370888f](https://github.com/rpgp/rpgp/commit/370888f93d0fad2fa7c4bba3e70a0e5c2719b4fc)) - *(hash)* Add support for SHA3 - ([1dfb7f7](https://github.com/rpgp/rpgp/commit/1dfb7f7298df0facb554cc4a731558307e859641)) - *(key)* Initial implementation of private key parsing - ([856b29f](https://github.com/rpgp/rpgp/commit/856b29f951eeeabb18d754c4f471f43a4ec8b562)) - *(key)* Setup infrastructure for decrypting private keys, decode rsa private keys - ([de45a64](https://github.com/rpgp/rpgp/commit/de45a643a6d3bf9646978ea1f310a4415d2a6a82)) - *(key)* Handle expiration and creation time - ([c314d09](https://github.com/rpgp/rpgp/commit/c314d09db404fb4623c76460aa7d1e150a3a3b3f)) - *(key)* Add fingerprint placeholder methods - ([62b4aef](https://github.com/rpgp/rpgp/commit/62b4aef4b268cafa9808c3010467b5dc7491fdb9)) - *(key)* Import private rsa keys into openssl - ([11ce8e4](https://github.com/rpgp/rpgp/commit/11ce8e434039acd655dc5bc5a94efcefeff42984)) - *(message)* Implement basic public key encryption - ([a2f6aeb](https://github.com/rpgp/rpgp/commit/a2f6aeb6ea35a22b8090ecf2acb657db8962ee91)) - *(message)* Implement password based encryption and decryption - ([a28167c](https://github.com/rpgp/rpgp/commit/a28167c4825198de30f68a6317e42c1e999a4096)) - *(message)* Implement signing - ([8c4f8f3](https://github.com/rpgp/rpgp/commit/8c4f8f3dea4e8d4323d461dcd6bb28a6b3a5ae38)) - *(messages)* Handle more test cases - ([e7bffdc](https://github.com/rpgp/rpgp/commit/e7bffdc82b0ed12c026d5fde80fbf8eabe0029f4)) - *(packet)* Add nids to ecccurve - ([23c89e3](https://github.com/rpgp/rpgp/commit/23c89e3e4fc02bb881f5d89920a05662e5b920e6)) - *(pgp-ffi)* Implement public key encryption & signing - ([7f89d3a](https://github.com/rpgp/rpgp/commit/7f89d3a119c38054afb18c17f4caebc887d9c1d1)) - *(pgp-ffi)* Add hashing and password en/decryption - ([6a667ed](https://github.com/rpgp/rpgp/commit/6a667ed49874c54f85a6050b520b70b2236baaab)) - *(sig)* Serialize all subpackets - ([85ec336](https://github.com/rpgp/rpgp/commit/85ec336ed3b144dee8f0c409d722652d1c495a0a)) - *(sym)* Add support for blowfish - ([2376d47](https://github.com/rpgp/rpgp/commit/2376d47db2bbf73a769771884c394a30c8ec35c6)) - *(util)* Add mpi_big - ([4a0ac3b](https://github.com/rpgp/rpgp/commit/4a0ac3b68933633d7e898bfbf7146802a4f3907c)) - Upgrade deps - ([a77d542](https://github.com/rpgp/rpgp/commit/a77d542debbb275fdb4b8189e2e010168f456b40)) - Add cast5 support - ([519974b](https://github.com/rpgp/rpgp/commit/519974b4b257e9119874f9ffa3c7664eba5fc937)) - Add zlib support - ([4c4abb9](https://github.com/rpgp/rpgp/commit/4c4abb9e320822cf2c736c1ee630b73d7b0a3c5c)) - Armor parsing is now fully streaming - ([a258ab7](https://github.com/rpgp/rpgp/commit/a258ab7fc0a91572758be2c2a2c0a62269f5800c)) - Less panics, no more unwraps, better error handling - ([f0bc505](https://github.com/rpgp/rpgp/commit/f0bc505a34581cb97b620d590c89d2807b7b918f)) - Packet parsing is now an iterator - ([9335fbe](https://github.com/rpgp/rpgp/commit/9335fbef7ba575cd73f271c6bea132e66fd6d16d)) - Print warning when skipping packets - ([c8d8680](https://github.com/rpgp/rpgp/commit/c8d86808690303bf748d3704280a8d5caef74d0d)) - Run tests and cross compile for more envs - ([ab9e87a](https://github.com/rpgp/rpgp/commit/ab9e87a10730c2b69d7a0ddd0fcffff4d61b9016)) - Signature parsing for v3 sigs - ([2c7795f](https://github.com/rpgp/rpgp/commit/2c7795f50c2eb1d036a45992d33a39a3628362ac)) - Start setting up infra structure for signature validation - ([2b03025](https://github.com/rpgp/rpgp/commit/2b03025bafad9bb50835dc40cdb290011536a7f0)) - Start implementation of packet serialization - ([91ebdf2](https://github.com/rpgp/rpgp/commit/91ebdf22028c76c4e3356d8e526e465e96c8a9e1)) - Validat subkey bindings - ([91a4235](https://github.com/rpgp/rpgp/commit/91a42359b73f0f8763281bd21e47fec759bbcc0c)) - Validate v2/v3 signatures - ([c3b0978](https://github.com/rpgp/rpgp/commit/c3b0978df9c3e27ee85ad1d316f544fc3195cd83)) - Signature verification - round 1 - ([d335fd5](https://github.com/rpgp/rpgp/commit/d335fd5180c2c5f88fdaaa8dba4fd6485e210096)) - Better serialization for signatures and key packets - ([f53e068](https://github.com/rpgp/rpgp/commit/f53e068128534f3eeb6d3e562daf38cfad625dae)) - Handle partial body lengths packets - ([605374f](https://github.com/rpgp/rpgp/commit/605374f9e008338c01beae689fdb06d9e99ba97f)) - Basic ascii armor message serialization - ([c2012b0](https://github.com/rpgp/rpgp/commit/c2012b0a3a4bb1fcd309de769da770e4b2150c6f)) - Handle more serialization cases - ([1fd92b0](https://github.com/rpgp/rpgp/commit/1fd92b0a46bb3c654baca9bb0aebb6995e9b7dbe)) - Much better key serialization - ([574ae42](https://github.com/rpgp/rpgp/commit/574ae42c702404847100ab6f3d4bdae3b27c4493)) - More custom debug impls - ([d8ed5a3](https://github.com/rpgp/rpgp/commit/d8ed5a3ede96862575b3c0ceade45230459382a6)) - Initial setup for key gen and signature generation - ([7e1ab66](https://github.com/rpgp/rpgp/commit/7e1ab6642095f880be68a8a394ada3e5a602bb4e)) - Implement secret key encryption - ([eedad02](https://github.com/rpgp/rpgp/commit/eedad029a73d04f30fb789911ac24520370e839e)) - Public key export - ([14b9615](https://github.com/rpgp/rpgp/commit/14b9615ee9f5776956db9c722ac6de99e2188e43)) - Basic C FFI - ([9710f20](https://github.com/rpgp/rpgp/commit/9710f20843a43b1078c4539cf29a52e59837968c)) - Upgrade rand and use thread_rng by default - ([833971f](https://github.com/rpgp/rpgp/commit/833971f90f5bffc6de37f9fd9ae296500a98d9a8)) - Improved decrypt and KeyId handling - ([0f0046d](https://github.com/rpgp/rpgp/commit/0f0046d8f88eac686b9498f2b820fdc3eb83957a)) - Expose armor headers - ([c3ee4b3](https://github.com/rpgp/rpgp/commit/c3ee4b3c09d992c5bd0e1dc1b33f2b24a24bebb1)) - Switch to upstream dependencies - ([9b8ee1a](https://github.com/rpgp/rpgp/commit/9b8ee1afcac6a8bce99cd2a940d5071f8f691f41)) ### ๐Ÿ› Bug Fixes - *(ci)* Correct testing for pgp-ffi - ([6674760](https://github.com/rpgp/rpgp/commit/6674760be061c7a96652a448cb764d95434322a7)) - *(ffi)* Improve Makefile voodoo - ([280372e](https://github.com/rpgp/rpgp/commit/280372ecda9d3ded609e7eb9d55d48b3556d70a0)) - *(ffi)* Do not depend on generated files, clean the stamp file - ([61c81c0](https://github.com/rpgp/rpgp/commit/61c81c064b825c5ce5c0a32af70eff0bed6d585c)) - *(ffi)* Msg_decrypt_no_pw: use fingerprints instead of ids - ([8d712fb](https://github.com/rpgp/rpgp/commit/8d712fb02ac6c75e5fffb2af6b0f601e9a47c311)) - *(ffi)* Update crate name in the makefile - ([3a5e12f](https://github.com/rpgp/rpgp/commit/3a5e12fe07c01f0636951f6ed1e1f0fd3ce5ed9b)) - *(ffi)* Typo in Makefile - ([005cde0](https://github.com/rpgp/rpgp/commit/005cde017c931480e55e9af7f565b928d55c1d18)) - *(sym)* Disable broken blowfish - ([b63fa44](https://github.com/rpgp/rpgp/commit/b63fa44e3015f3176904201c26e189ece7aaef35)) - Partial boy reading with partial content - ([1b5d770](https://github.com/rpgp/rpgp/commit/1b5d7705d1934d01a8b0f634a01ae43ab32d253c)) - Proper random prefix in symmetric encryption - ([eb1ea53](https://github.com/rpgp/rpgp/commit/eb1ea5334332b22e05ee7236f5dae35ce5e76221)) - Correct handling of indeterminated length packets - ([86e8b77](https://github.com/rpgp/rpgp/commit/86e8b7723f8c9acd65b45b76013621510c7be753)) - Update x25519 libs - ([cdf7bc8](https://github.com/rpgp/rpgp/commit/cdf7bc8bc1a2b3c7023671c6fea2940a8afeed60)) - Include secret subkeys when converting to a public key - ([7508827](https://github.com/rpgp/rpgp/commit/75088276ffec8a2d1dd9e5cf76788e85c5958ac6)) - Gperftools dep - ([df364c8](https://github.com/rpgp/rpgp/commit/df364c8c8db6aea565bbc64dea5f4c6551c83d0f)) - Split asm and nightly flags - ([fa5932e](https://github.com/rpgp/rpgp/commit/fa5932e8fa12e8457eecb6f17ccf451657453753)) - Strip leading zeros when creating signatures - ([60366fc](https://github.com/rpgp/rpgp/commit/60366fc37f330dac54f6da3656c8dca3efc252a5)) - Stray newline - ([758327c](https://github.com/rpgp/rpgp/commit/758327c75d8328ff7088c227e95e0ec6ab0443df)) ### ๐Ÿšœ Refactor - *(composed)* Remove code duplication in keyid and fingerprint generation - ([ceaad5a](https://github.com/rpgp/rpgp/commit/ceaad5a2a6c0f2578c82eb6b765854c8c7480230)) - *(pgp-ffi)* Split into multiple files - ([de978e4](https://github.com/rpgp/rpgp/commit/de978e4b65591b5b9c670f0d17c6132e69425487)) - Cleanup packet module - ([01b0ac9](https://github.com/rpgp/rpgp/commit/01b0ac97a0cc3c52473635c63da9934c624a9c1a)) - Improve type structure for public/private keys - ([127018b](https://github.com/rpgp/rpgp/commit/127018bbc90f09d6e08a7c093301a99a5d29e94d)) - Use derive(FromPrimitive) - ([d84faa7](https://github.com/rpgp/rpgp/commit/d84faa7bfe1876c7e2c65ee2489237b870df8433)) - Message parser as an iterator - ([2d9fe6f](https://github.com/rpgp/rpgp/commit/2d9fe6ff71d6eaec60c55dfd2109aff4a1d9a38b)) - Key parser is now an iterator - ([41d4c46](https://github.com/rpgp/rpgp/commit/41d4c4661c4c84df6568d3720717702a790342c3)) - Message decryption as iterator - ([3b8abbd](https://github.com/rpgp/rpgp/commit/3b8abbdc96e7c6a9342841f4c2091014db76ea0e)) - Split up composed key into multiple files - ([b0f620d](https://github.com/rpgp/rpgp/commit/b0f620d5d940d9a9fec88d6d65f9f1aede3a9f4c)) - Move logic for secret params into its own place - ([d81c13a](https://github.com/rpgp/rpgp/commit/d81c13a73eee7b1d08cb47d2286be1e900118445)) - More cleanup - ([da49313](https://github.com/rpgp/rpgp/commit/da4931338f671f1d1d883b1e0e68ae87987c19b5)) - Cleanup message code - ([9dfb076](https://github.com/rpgp/rpgp/commit/9dfb076054abb41e9f264dcbcb462df38491a173)) - Pull params into their own module - ([5f69b2c](https://github.com/rpgp/rpgp/commit/5f69b2c6f550eeec06d1399d2b2c2d5a54f96bce)) - Cleanup crypto code - ([a75d381](https://github.com/rpgp/rpgp/commit/a75d381e8b5df94a3b1524d547a5e21fb422724e)) - Extract proper type for mpis - ([9378195](https://github.com/rpgp/rpgp/commit/9378195770094f954397664bf43305e577b47a32)) - Split sks-dump tests into their own git submodule - ([1b69d70](https://github.com/rpgp/rpgp/commit/1b69d7028a1ce231716b533168589c1120bf6468)) ### ๐Ÿ“š Documentation - *(cargo)* Add some more metadata - ([a7b27a8](https://github.com/rpgp/rpgp/commit/a7b27a862cbdc1ceae2f0f25cebda701f8685820)) - *(readme)* Update appveyor badge - ([cdd824d](https://github.com/rpgp/rpgp/commit/cdd824d59566ac09f8c47ac53b9a683bef5706c6)) - *(readme)* Update for current ci status - ([250bc57](https://github.com/rpgp/rpgp/commit/250bc57241821a73b1f9d6ade28d7d70eb0844c6)) - *(status)* Fix typo - ([170a98c](https://github.com/rpgp/rpgp/commit/170a98ceb2e6fbc3d090fd2eb6f96e9f4124724b)) - *(status)* Update - ([7fba149](https://github.com/rpgp/rpgp/commit/7fba149aa4a8199096b294a2be9727f612a065e0)) - *(status)* Update - ([5dd57de](https://github.com/rpgp/rpgp/commit/5dd57de37cea535499342552aeeb5e66256932d5)) - *(status)* Update - ([1834c95](https://github.com/rpgp/rpgp/commit/1834c95f236c95977cebc70bd086b8f7f9eefea3)) - Fix typo - ([c01ebb0](https://github.com/rpgp/rpgp/commit/c01ebb0ae9f877077d65982d29fc2d21447698b4)) - Update references and clarify some things - ([50ce46d](https://github.com/rpgp/rpgp/commit/50ce46de909f0534caa89695cd23a3e2751f3c18)) - Document current status - ([c016c32](https://github.com/rpgp/rpgp/commit/c016c32776ec70991d335f336c0cc82583d01ec3)) - Move platform suppport to its own document - ([a5bbdb3](https://github.com/rpgp/rpgp/commit/a5bbdb32525c2aa0a23401e0574b8d4e30aace0d)) ### โšก Performance - Reduce allocations in key handling and armor writing - ([1c10de5](https://github.com/rpgp/rpgp/commit/1c10de5db9b65b08b0db020597b33f72903de77e)) - Use smallvec for signature subpackets - ([61069c6](https://github.com/rpgp/rpgp/commit/61069c6c0f52639ffa0194b6d0d01e18498bfb41)) - Use more efficient ringbuffer when available - ([ddbac31](https://github.com/rpgp/rpgp/commit/ddbac31e8357cefada71d4da7c038db0ae823929)) ### ๐Ÿงช Testing - Import openpgp test suite - ([20c1429](https://github.com/rpgp/rpgp/commit/20c1429131722c8972a1ff9b8866715e886b09c4)) - Update key dump test numbers - ([2bb794a](https://github.com/rpgp/rpgp/commit/2bb794aa729228edf1c01df2f2c716e3ccd7b1c0)) ### โš™๏ธ Miscellaneous Tasks - *(cargo)* Exclude submodule from publishing - ([6d98faf](https://github.com/rpgp/rpgp/commit/6d98fafe6ba6e8366449c0a7128da8b814ae0348)) - *(cargo)* Fix keywords - ([a37e24f](https://github.com/rpgp/rpgp/commit/a37e24fce77ce9b7a057f41b9d3a380d6224ca9e)) - *(ci)* Try and fix appveyor - ([1370640](https://github.com/rpgp/rpgp/commit/13706409904de045ffa828b27c1a7bef4c4a358e)) - *(ci)* Appveyor fixes - ([69e2e48](https://github.com/rpgp/rpgp/commit/69e2e48eb4e98c7b99242a0d58b875fcb739439b)) - *(ci)* Stop installing openssl - ([080f518](https://github.com/rpgp/rpgp/commit/080f5189121a37cbf8ebd1581eef26f669296aab)) - *(ci)* Switch to circle ci - ([dfbaab5](https://github.com/rpgp/rpgp/commit/dfbaab5a97833db3d47513369b6eda0c14a2e1ad)) - Cleanup unused test files - ([7f65c54](https://github.com/rpgp/rpgp/commit/7f65c542a528529555d835ff6a84a5262eafae9b)) - Drop gitmodules - ([694cfd7](https://github.com/rpgp/rpgp/commit/694cfd748ca2431642659406a7f8e396ee8b1e94)) - Include testcases manually - ([0096947](https://github.com/rpgp/rpgp/commit/0096947fbc893d8cf92e92e8144b6778418df717)) - Remove test file - ([1a6f9ad](https://github.com/rpgp/rpgp/commit/1a6f9ad71f3f12c99bb1ca46d14d5b6ac6eceefc)) - Remove profile files - ([affd2e4](https://github.com/rpgp/rpgp/commit/affd2e42a0b9a5400a193a94eec8b23773ed74dd)) - Update dependencies - ([0d76a71](https://github.com/rpgp/rpgp/commit/0d76a71f3ce5f46d44f709fd838783f3d965fec4)) - Move to org - ([5426d46](https://github.com/rpgp/rpgp/commit/5426d4670e5a8c5ba77ebc7318eebe8f203ad7e8)) - Update to latest nightly - ([c09c47f](https://github.com/rpgp/rpgp/commit/c09c47f22b4c5a1f057c8f4e10003573b1e09bd0)) ### Bench - *(key)* Add key gen benchmarks - ([4f325cd](https://github.com/rpgp/rpgp/commit/4f325cdd89d13ef6940e023c7cca269e8eacc4bf)) - *(message)* Fix compile errors - ([86525a1](https://github.com/rpgp/rpgp/commit/86525a1ae7149f806c79b7167e0bf2280e9090a9)) ### Crypto - Impl aes - ([bfdef22](https://github.com/rpgp/rpgp/commit/bfdef225e1bbf24cb3667e7a33ba3859acd139be)) ### Key - Add revocation key option - ([cd75dca](https://github.com/rpgp/rpgp/commit/cd75dcabbb2fcffe414f9c095efbd2b38bc08e89)) - Add issuer fingerprint subpacket - ([944e6b6](https://github.com/rpgp/rpgp/commit/944e6b6c4461029c41b411556ebd1ba703fd6c56)) ### Travis - Build on osx and linux - ([f8d235a](https://github.com/rpgp/rpgp/commit/f8d235a485b3e811b57240e24dab5c7bd8cc57f7)) pgp-0.15.0/CONTRIBUTING.md000064400000000000000000000004451046102023000127310ustar 00000000000000# Contributing ## Development To run the stress tests, ```sh > git submodule update --init --recursive > cargo test --release -- --ignored ``` To enable debugging, add ```rust use pretty_env_logger; let _ = pretty_env_logger::try_init(); ``` And then run tests with `RUST_LOG=pgp=info`. pgp-0.15.0/Cargo.toml0000644000000132750000000000100077130ustar # 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.81" name = "pgp" version = "0.15.0" authors = ["dignifiedquire "] build = false exclude = ["tests/tests/*"] autolib = false autobins = false autoexamples = false autotests = false autobenches = false description = "OpenPGP implementation in Rust" homepage = "https://github.com/rpgp/rpgp" readme = "README.md" keywords = [ "pgp", "gpg", "openpgp", "email", "encryption", ] categories = [ "cryptography", "email", ] license = "MIT OR Apache-2.0" repository = "https://github.com/rpgp/rpgp" resolver = "2" [profile.bench] debug = 2 [lib] name = "pgp" path = "src/lib.rs" bench = false [[test]] name = "backward-compat" path = "tests/backward-compat.rs" [[test]] name = "hsm-test" path = "tests/hsm-test.rs" [[test]] name = "key_test" path = "tests/key_test.rs" [[test]] name = "message_test" path = "tests/message_test.rs" [[test]] name = "rfc9580" path = "tests/rfc9580.rs" [[test]] name = "security" path = "tests/security.rs" [[bench]] name = "benches_main" path = "benches/benches_main.rs" harness = false [dependencies.aes] version = "0.8.4" [dependencies.aes-gcm] version = "0.10.3" [dependencies.aes-kw] version = "0.2.1" features = ["std"] [dependencies.argon2] version = "0.5" features = ["zeroize"] [dependencies.base64] version = ">=0.21.7, < 0.23" [dependencies.bitfield] version = "0.17" [dependencies.block-padding] version = "0.3" [dependencies.blowfish] version = "0.9" [dependencies.bstr] version = "1.4.0" features = ["std"] default-features = false [dependencies.buffer-redux] version = "1.0.0" default-features = false [dependencies.byteorder] version = "1.4" [dependencies.camellia] version = "0.1" [dependencies.cast5] version = "0.11" [dependencies.cfb-mode] version = "0.8.2" [dependencies.chrono] version = "0.4.39" features = [ "clock", "std", ] default-features = false [dependencies.cipher] version = "0.4.2" [dependencies.const-oid] version = "0.9.6" [dependencies.crc24] version = "0.1.6" [dependencies.curve25519-dalek] version = "4.1.3" features = [ "alloc", "precomputed-tables", "zeroize", ] default-features = false [dependencies.derive_builder] version = "0.20.0" [dependencies.derive_more] version = "1.0.0-beta.6" features = ["debug"] [dependencies.des] version = "0.8" [dependencies.digest] version = "0.10.7" [dependencies.dsa] version = "0.6.3" [dependencies.eax] version = "0.5.0" [dependencies.ecdsa] version = "0.16.9" [dependencies.ed25519-dalek] version = "2.0.0" features = [ "std", "zeroize", "fast", ] default-features = false [dependencies.elliptic-curve] version = "0.13" [dependencies.flate2] version = "1.0" features = ["rust_backend"] default-features = false [dependencies.generic-array] version = "0.14.6" [dependencies.getrandom] version = "0.2" optional = true [dependencies.hex] version = "0.4" [dependencies.hkdf] version = "0.12.4" [dependencies.idea] version = "0.5" [dependencies.iter-read] version = "1" [dependencies.k256] version = "0.13" features = ["ecdsa"] [dependencies.log] version = "0.4.22" [dependencies.md-5] version = "0.10.5" features = ["oid"] [dependencies.nom] version = "7.0" [dependencies.num-bigint] version = "0.8.4" features = [ "rand", "i128", "u64_digit", "prime", "zeroize", ] package = "num-bigint-dig" [dependencies.num-traits] version = "0.2.19" [dependencies.num_enum] version = ">=0.5.7, < 0.8" [dependencies.ocb3] version = "0.1" [dependencies.p256] version = "0.13" features = [ "ecdsa", "ecdh", ] [dependencies.p384] version = "0.13" features = ["ecdsa"] [dependencies.p521] version = "0.13" features = [ "ecdsa", "ecdh", ] [dependencies.rand] version = "0.8.5" [dependencies.ripemd] version = "0.1.3" features = ["oid"] [dependencies.rsa] version = "0.9.7" [dependencies.sha1] version = "0.10.6" features = ["oid"] [dependencies.sha1-checked] version = "0.10" features = ["zeroize"] [dependencies.sha2] version = "0.10.6" features = ["oid"] [dependencies.sha3] version = "0.10.5" features = ["oid"] [dependencies.signature] version = "2.1" [dependencies.smallvec] version = "1.10.0" [dependencies.thiserror] version = "2.0" [dependencies.twofish] version = "0.7" [dependencies.x25519-dalek] version = "2.0.1" features = [ "alloc", "precomputed-tables", "zeroize", "static_secrets", ] default-features = false [dependencies.x448] version = "0.6" optional = true [dependencies.zeroize] version = "1.7" features = ["zeroize_derive"] [dev-dependencies.criterion] version = "0.5" features = ["html_reports"] [dev-dependencies.glob] version = "0.3" [dev-dependencies.hex-literal] version = "0.4" [dev-dependencies.pretty_assertions] version = "1" [dev-dependencies.pretty_env_logger] version = "0.5" [dev-dependencies.rand_chacha] version = "0.3" [dev-dependencies.rand_xorshift] version = "0.3" [dev-dependencies.regex] version = "1.7" [dev-dependencies.rpgp_0_10] version = "=0.10.2" package = "pgp" [dev-dependencies.serde] version = "1.0.217" features = ["derive"] [dev-dependencies.serde_json] version = "1.0" [features] asm = [ "sha1/asm", "sha2/asm", "md-5/asm", ] default = [] unstable-curve448 = ["dep:x448"] wasm = [ "chrono/wasmbind", "getrandom", "getrandom/js", ] pgp-0.15.0/Cargo.toml.orig000064400000000000000000000064751046102023000134000ustar 00000000000000[package] name = "pgp" version = "0.15.0" authors = ["dignifiedquire "] description = "OpenPGP implementation in Rust" license = "MIT OR Apache-2.0" homepage = "https://github.com/rpgp/rpgp" repository = "https://github.com/rpgp/rpgp" readme = "README.md" resolver = "2" keywords = ["pgp", "gpg", "openpgp", "email", "encryption"] categories = ["cryptography", "email"] exclude = ["tests/tests/*"] edition = "2021" rust-version = "1.81" [dependencies] aes = "0.8.4" argon2 = { version = "0.5", features = ["zeroize"] } base64 = ">=0.21.7, < 0.23" bitfield = "0.17" block-padding = "0.3" blowfish = "0.9" byteorder = "1.4" camellia = "0.1" chrono = { version = "0.4.39", default-features = false, features = [ "clock", "std", ] } cast5 = "0.11" cfb-mode = "0.8.2" cipher = "0.4.2" const-oid = "0.9.6" crc24 = "0.1.6" derive_builder = "0.20.0" des = "0.8" digest = "0.10.7" dsa = "0.6.3" ecdsa = "0.16.9" elliptic-curve = "0.13" generic-array = "0.14.6" hex = "0.4" idea = "0.5" iter-read = "1" log = "0.4.22" md-5 = { version = "0.10.5", features = ["oid"] } nom = "7.0" num_enum = ">=0.5.7, < 0.8" num-traits = "0.2.19" p256 = { version = "0.13", features = ["ecdsa", "ecdh"] } p384 = { version = "0.13", features = ["ecdsa"] } p521 = { version = "0.13", features = ["ecdsa", "ecdh"] } k256 = { version = "0.13", features = ["ecdsa"] } rand = "0.8.5" ripemd = { version = "0.1.3", features = ["oid"] } rsa = { version = "0.9.7" } sha1 = { version = "0.10.6", features = ["oid"] } sha1-checked = { version = "0.10", features = ["zeroize"] } sha2 = { version = "0.10.6", features = ["oid"] } sha3 = { version = "0.10.5", features = ["oid"] } signature = "2.1" smallvec = "1.10.0" thiserror = "2.0" twofish = "0.7" zeroize = { version = "1.7", features = ["zeroize_derive"] } getrandom = { version = "0.2", optional = true } bstr = { version = "1.4.0", default-features = false, features = ["std"] } hkdf = "0.12.4" aes-gcm = "0.10.3" eax = "0.5.0" ocb3 = "0.1" aes-kw = { version = "0.2.1", features = ["std"] } derive_more = { version = "1.0.0-beta.6", features = ["debug"] } x448 = { version = "0.6", optional = true } buffer-redux = { version = "1.0.0", default-features = false} curve25519-dalek = { version = "4.1.3", default-features = false, features = ["alloc", "precomputed-tables", "zeroize"] } ed25519-dalek = { version = "2.0.0", default-features = false, features = ["std", "zeroize", "fast"] } flate2 = {version = "1.0", default-features = false, features = ["rust_backend"] } num-bigint = { version = "0.8.4", features = ["rand", "i128", "u64_digit", "prime", "zeroize"], package = "num-bigint-dig" } x25519-dalek = { version = "2.0.1", default-features = false, features = ["alloc", "precomputed-tables", "zeroize", "static_secrets"] } [dev-dependencies] glob = "0.3" hex-literal = "0.4" pretty_assertions = "1" pretty_env_logger = "0.5" rand_chacha = "0.3" rand_xorshift = "0.3" regex = "1.7" rpgp_0_10 = { version = "=0.10.2", package = "pgp" } serde = { version = "1.0.217", features = ["derive"] } serde_json = "1.0" criterion = { version = "0.5", features = ["html_reports"] } [features] default = [] asm = ["sha1/asm", "sha2/asm", "md-5/asm"] wasm = ["chrono/wasmbind", "getrandom", "getrandom/js"] unstable-curve448 = ["dep:x448"] [profile.bench] debug = 2 [[bench]] name = "benches_main" harness = false [lib] bench = false pgp-0.15.0/LICENSE-APACHE000064400000000000000000000251361046102023000124300ustar 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.pgp-0.15.0/LICENSE-MIT000064400000000000000000000017761046102023000121440ustar 00000000000000Permission 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.pgp-0.15.0/README.md000064400000000000000000000141141046102023000117550ustar 00000000000000# rPGP
> OpenPGP implemented in pure Rust, permissively licensed rPGP is a pure Rust implementation of OpenPGP. rPGP implements OpenPGP as specified in [RFC9580], including the commonly used v4 formats, as well as the latest v6 key formats and AEAD encryption mechanisms. All formats specified in the historical RFCs [RFC4880] and [RFC6637], such as v3 keys and signatures, are supported as well. See [`IMPL_STATUS.md`](docs/IMPL_STATUS.md) for more details on the implemented PGP features. rPGP offers a flexible low-level API and gives users the ability to build higher level PGP tooling in the most compatible way possible. Additionally, it fully supports all functionality required by the [Autocrypt 1.1 e-mail encryption specification]. ## Usage ```sh > cargo add pgp ``` ### Load a public key and verify an inline-signed message ```rust use std::fs; use pgp::{SignedPublicKey, Message, Deserializable}; let pub_key_file = "key.asc"; let msg_file = "msg.asc"; let key_string = fs::read_to_string(pub_key_file).unwrap(); let (public_key, _headers_public) = SignedPublicKey::from_string(&key_string).unwrap(); let msg_string = fs::read_to_string(msg_file).unwrap(); let (msg, _headers_msg) = Message::from_string(&msg_string).unwrap(); // Verify this message // NOTE: This assumes that the primary serves as the signing key, which is not always the case! msg.verify(&public_key).unwrap(); let msg_content = msg.get_content().unwrap(); // actual message content let msg_string = String::from_utf8(msg_content.unwrap()).expect("expect UTF8"); println!("Signed message: {:?}", msg_string); ``` ### Generate and verify a detached signature with an OpenPGP keypair ```rust use std::fs; use pgp::{Deserializable, SignedPublicKey, SignedSecretKey}; use pgp::types::{PublicKeyTrait, SecretKeyTrait}; use pgp::crypto::hash::HashAlgorithm; let priv_key_file = "key.sec.asc"; let pub_key_file = "key.asc"; let data = b"Hello world!"; // Create a new signature using the private key let secret_key_string = fs::read_to_string(priv_key_file).expect("Failed to load secret key"); let signed_secret_key = SignedSecretKey::from_string(&secret_key_string).unwrap().0; let new_signature = signed_secret_key.create_signature(|| "".to_string(), HashAlgorithm::default(), &data[..]).unwrap(); // Verify the signature using the public key let key_string = fs::read_to_string(pub_key_file).expect("Failed to load public key"); let public_key = SignedPublicKey::from_string(&key_string).unwrap().0; public_key.verify_signature(HashAlgorithm::default(), &data[..], &new_signature).unwrap(); ``` ## Features ### Experimental Cryptography Some cryptographic primitives are relatively new and under development. Those primitives are gated behind "unstable" features, so that they need to be explicitly enabled to make use of them. Currently, there is only one such feature: - The `unstable-curve448` enables public key encryption with the `x448` algorithm. ## Current Status > Last updated *September 2024* - Implementation Status: [IMPL_STATUS.md](docs/IMPL_STATUS.md) - Security Status: [STATUS_SECURITY.md](docs/SECURITY_STATUS.md) - Supported Platforms: [PLATFORMS.md](docs/PLATFORMS.md) ## Users & Libraries built using rPGP - [Delta Chat]: Cross-platform messaging app that works over e-mail - [`rpm`]: A pure rust library for parsing and creating RPM files - [`rpgpie`]: An experimental high level OpenPGP API - [`rsop`]: A SOP CLI tool based on rPGP and rpgpie - [`debian-packaging`]: a library crate for dealing with Debian packages Don't see your project here? Please send a PR :) ### FAQs Checkout [FAQ.md](docs/FAQ.md). ## Minimum Supported Rust Version (MSRV) All crates in this repository support Rust 1.81 or higher. In future minimally supported version of Rust can be changed, but it will be done with a minor version bump. ## Funding [RFC 9580 support for rPGP](https://nlnet.nl/project/rPGP-cryptorefresh/) has been funded in part through [NGI0 Core](https://nlnet.nl/core/), a fund established by [NLnet](https://nlnet.nl) with financial support from the European Commission's [Next Generation Internet](https://ngi.eu) programme. ## License This project is licensed under either of * Apache License, Version 2.0, ([LICENSE-APACHE](LICENSE-APACHE) or http://www.apache.org/licenses/LICENSE-2.0) * MIT license ([LICENSE-MIT](LICENSE-MIT) or http://opensource.org/licenses/MIT) at your option. ### Contribution Unless you explicitly state otherwise, any contribution intentionally submitted for inclusion in this project by you, as defined in the Apache-2.0 license, shall be dual licensed as above, without any additional terms or conditions. [RFC2440]: https://tools.ietf.org/html/rfc2440 [RFC4880]: https://tools.ietf.org/html/rfc4880.html [RFC6637]: https://www.rfc-editor.org/rfc/rfc6637 [RFC9580]: https://www.rfc-editor.org/rfc/rfc9580.html [Autocrypt 1.1 e-mail encryption specification]: https://autocrypt.org/level1.html [the `pgp` Crate]: https://crates.io/crates/pgp/ [Delta Chat]: https://delta.chat [`rsop`]: https://crates.io/crates/rsop/ [`rpgpie`]: https://crates.io/crates/rpgpie [`rpm`]: https://crates.io/crates/rpm [`debian-packaging`]: https://crates.io/crates/debian-packaging pgp-0.15.0/SECURITY.md000064400000000000000000000017451046102023000122750ustar 00000000000000# Security policy If you have discovered a security vulnerability in this project, please report it privately. Do not disclose it as a public issue. This gives us time to work with you to fix the issue before public exposure, reducing the chance that the exploit will be used before a patch is released. This project is maintained by a team of volunteers on a reasonable-effort basis. As such, please give us at least 90 days to work on a fix before public exposure. We will contact you back within 2 business days after reporting the issue. Thanks for helping make the project safe for everyone! ## Reporting a vulnerability Please, report the vulnerability either through [new security advisory form][ADV] or by directly contacting our security contacts. [ADV]: https://github.com/rpgp/rpgp/security/advisories/new Security contacts: - [dignifiedquire][dig] [dig]: https://github.com/dignifiedquire ## Supported Versions Security updates are applied only to the most recent release. pgp-0.15.0/benches/benches_main.rs000064400000000000000000000002421046102023000150630ustar 00000000000000use criterion::criterion_main; mod benchmarks; criterion_main!( benchmarks::key::benches, benchmarks::message::benches, benchmarks::s2k::benches ); pgp-0.15.0/benches/benchmarks/key.rs000064400000000000000000000066071046102023000153700ustar 00000000000000use std::fs::File; use criterion::{black_box, criterion_group, Criterion}; use pgp::composed::{Deserializable, KeyType, SignedSecretKey}; use pgp::crypto::ecc_curve::ECCCurve; use pgp::ser::Serialize; use rand::thread_rng; use super::build_key; fn bench_key(c: &mut Criterion) { let mut rng = thread_rng(); let mut g = c.benchmark_group("secret_key"); g.bench_function("rsa_parse", |b| { let p = "./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc"; b.iter(|| { let mut decrypt_key_file = File::open(p).unwrap(); black_box(SignedSecretKey::from_armor_single(&mut decrypt_key_file).unwrap()) }); }); g.bench_function("rsa_parse_raw", |b| { let key = build_key(KeyType::Rsa(2048), KeyType::Rsa(2048)) .sign(&mut rng, || "".into()) .unwrap(); let bytes = key.to_bytes().unwrap(); b.iter(|| black_box(SignedSecretKey::from_bytes(&bytes[..]).unwrap())) }); g.bench_function("parse_armored_rsa", |b| { let key = build_key(KeyType::Rsa(2048), KeyType::Rsa(2048)) .sign(&mut rng, || "".into()) .unwrap(); let bytes = key.to_armored_bytes(None.into()).unwrap(); b.iter(|| black_box(SignedSecretKey::from_armor_single(&bytes[..]).unwrap())); }); g.bench_function("x25519_parse_armored", |b| { let key = build_key(KeyType::EdDSALegacy, KeyType::ECDH(ECCCurve::Curve25519)) .sign(&mut rng, || "".into()) .unwrap(); let bytes = key.to_armored_bytes(None.into()).unwrap(); b.iter(|| black_box(SignedSecretKey::from_armor_single(&bytes[..]).unwrap())); }); g.bench_function("x25519_generate", |b| { b.iter(|| { black_box(build_key( KeyType::EdDSALegacy, KeyType::ECDH(ECCCurve::Curve25519), )) }) }); g.bench_function("x25519_self_sign", |b| { let key = build_key(KeyType::EdDSALegacy, KeyType::ECDH(ECCCurve::Curve25519)); b.iter(|| black_box(key.clone().sign(&mut rng, || "".into()).unwrap())) }); g.bench_function("rsa_2048_self_sign", |b| { let key = build_key(KeyType::Rsa(2048), KeyType::Rsa(2048)); b.iter(|| black_box(key.clone().sign(&mut rng, || "".into()).unwrap())) }); for curve in [ECCCurve::P256, ECCCurve::P384, ECCCurve::P521] { g.bench_function(format!("nistp{}_parse_armored", curve.nbits()), |b| { let key = build_key(KeyType::ECDSA(curve.clone()), KeyType::ECDH(curve.clone())) .sign(&mut rng, || "".into()) .unwrap(); let bytes = key.to_armored_bytes(None.into()).unwrap(); b.iter(|| black_box(SignedSecretKey::from_armor_single(&bytes[..]).unwrap())); }); g.bench_function(format!("nistp{}_generate", curve.nbits()), |b| { b.iter(|| { black_box(build_key( KeyType::ECDSA(curve.clone()), KeyType::ECDH(curve.clone()), )) }) }); g.bench_function(format!("nistp{}_self_sign", curve.nbits()), |b| { let key = build_key(KeyType::ECDSA(curve.clone()), KeyType::ECDH(curve.clone())); b.iter(|| black_box(key.clone().sign(&mut rng, || "".into()).unwrap())) }); } g.finish(); } criterion_group!(benches, bench_key); pgp-0.15.0/benches/benchmarks/message.rs000064400000000000000000000171001046102023000162120ustar 00000000000000use std::fs::{self, File}; use std::io::Read; use criterion::{black_box, criterion_group, BenchmarkId, Criterion, Throughput}; use pgp::composed::{Deserializable, Message, SignedSecretKey}; use pgp::crypto::ecc_curve::ECCCurve; use pgp::crypto::sym::SymmetricKeyAlgorithm; use pgp::types::{SecretKeyTrait, StringToKey}; use pgp::KeyType; use rand::{thread_rng, RngCore}; use super::build_key; fn bench_message(c: &mut Criterion) { let mut g = c.benchmark_group("message"); let mut rng = thread_rng(); g.bench_function("parse_armored_rsa", |b| { let message_file_path = "./tests/openpgp-interop/testcases/messages/gnupg-v1-001.asc"; let mut message_file = File::open(message_file_path).unwrap(); let mut bytes = Vec::new(); message_file.read_to_end(&mut bytes).unwrap(); b.iter(|| black_box(Message::from_armor_single(&bytes[..]).unwrap())); }); g.bench_function("parse_armored_x25519", |b| { let message_file_path = "./tests/openpgpjs/x25519.asc"; let mut message_file = File::open(message_file_path).unwrap(); let mut bytes = Vec::new(); message_file.read_to_end(&mut bytes).unwrap(); b.iter(|| black_box(Message::from_armor_single(&bytes[..]).unwrap())); }); g.bench_function("rsa_decrypt", |b| { let mut decrypt_key_file = File::open("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc") .unwrap(); let (decrypt_key, _headers) = SignedSecretKey::from_armor_single(&mut decrypt_key_file).unwrap(); let message_file_path = "./tests/openpgp-interop/testcases/messages/gnupg-v1-001.asc"; let message_file = fs::read(message_file_path).unwrap(); b.iter(|| { let (message, _headers) = Message::from_armor_single(&message_file[..]).unwrap(); black_box( message .decrypt(|| "test".to_string(), &[&decrypt_key][..]) .unwrap(), ); }); }); const KB: usize = 1000; let sizes = [KB, 10 * KB, 100 * KB, 1000 * KB]; for size in &sizes { g.throughput(Throughput::BytesDecimal(*size as u64)); g.bench_with_input( BenchmarkId::new("encrypt_password_s2k_iter_aes128_seipdv1", size), size, |b, &size| { let mut bytes = vec![0u8; size]; rng.fill_bytes(&mut bytes); let s2k = StringToKey::new_default(&mut rng); let message = Message::new_literal_bytes("test", &bytes); b.iter(|| { let res = message .encrypt_with_password_seipdv1( &mut rng, s2k.clone(), SymmetricKeyAlgorithm::default(), || "pw".into(), ) .unwrap(); black_box(res); }); }, ); } for size in &sizes { g.throughput(Throughput::BytesDecimal(*size as u64)); g.bench_with_input( BenchmarkId::new("decrypt_password_s2k_iter_aes128_seipdv1", size), size, |b, &size| { let mut bytes = vec![0u8; size]; let mut rng = rand::thread_rng(); rng.fill_bytes(&mut bytes); let s2k = StringToKey::new_default(&mut rng); let message = Message::new_literal_bytes("test", &bytes) .encrypt_with_password_seipdv1( &mut rng, s2k, SymmetricKeyAlgorithm::default(), || "pw".into(), ) .unwrap(); // sanity check let res = message.decrypt_with_password(|| "pw".into()).unwrap(); assert_eq!(res.get_content().unwrap().unwrap(), bytes); b.iter(|| { let res = message.decrypt_with_password(|| "pw".into()).unwrap(); black_box(res); }); }, ); } for (kt1, kt2, sym, asym_name, sym_name) in [ ( KeyType::EdDSALegacy, KeyType::ECDH(ECCCurve::Curve25519), SymmetricKeyAlgorithm::AES128, "x25519", "aes128", ), ( KeyType::ECDSA(ECCCurve::P256), KeyType::ECDH(ECCCurve::P256), SymmetricKeyAlgorithm::AES128, "nistp256", "aes128", ), ( KeyType::ECDSA(ECCCurve::P384), KeyType::ECDH(ECCCurve::P384), SymmetricKeyAlgorithm::AES192, "nistp384", "aes192", ), ( KeyType::ECDSA(ECCCurve::P521), KeyType::ECDH(ECCCurve::P521), SymmetricKeyAlgorithm::AES256, "nistp521", "aes256", ), ] { for size in &sizes { g.throughput(Throughput::BytesDecimal(*size as u64)); g.bench_with_input( BenchmarkId::new( format!("{}_encrypt_key_{}_seipdv1", asym_name, sym_name), size, ), size, |b, &size| { let mut bytes = vec![0u8; size]; let mut rng = rand::thread_rng(); rng.fill_bytes(&mut bytes); let key = build_key(kt1.clone(), kt2.clone()); let signed_key = key.sign(&mut rng, || "".into()).unwrap(); let message = Message::new_literal_bytes("test", &bytes); b.iter(|| { let res = message .encrypt_to_keys_seipdv1( &mut rng, SymmetricKeyAlgorithm::AES128, &[&signed_key.secret_subkeys[0].public_key()], ) .unwrap(); black_box(res); }); }, ); } for size in &sizes { g.throughput(Throughput::BytesDecimal(*size as u64)); g.bench_with_input( BenchmarkId::new( format!("{}_decrypt_key_{}_seipdv1", asym_name, sym_name), size, ), size, |b, &size| { let mut bytes = vec![0u8; size]; let mut rng = rand::thread_rng(); rng.fill_bytes(&mut bytes); let key = build_key(kt1.clone(), kt2.clone()); let signed_key = key.sign(&mut rng, || "".into()).unwrap(); let message = Message::new_literal_bytes("test", &bytes) .encrypt_to_keys_seipdv1( &mut rng, sym, &[&signed_key.secret_subkeys[0].public_key()], ) .unwrap(); // sanity check let (res, _) = message.decrypt(|| "".into(), &[&signed_key]).unwrap(); assert_eq!(res.get_content().unwrap().unwrap(), bytes); b.iter(|| { let res = message.decrypt(|| "".into(), &[&signed_key]).unwrap(); black_box(res); }); }, ); } } } criterion_group!(benches, bench_message); pgp-0.15.0/benches/benchmarks/mod.rs000064400000000000000000000027131046102023000153510ustar 00000000000000use pgp::crypto::{hash::HashAlgorithm, sym::SymmetricKeyAlgorithm}; use pgp::types::CompressionAlgorithm; use pgp::{KeyType, SecretKey, SecretKeyParamsBuilder, SubkeyParamsBuilder}; use rand::thread_rng; use smallvec::smallvec; pub mod key; pub mod message; pub mod s2k; pub fn build_key(kt: KeyType, kt_sub: KeyType) -> SecretKey { let key_params = SecretKeyParamsBuilder::default() .key_type(kt) .can_certify(true) .can_sign(true) .primary_user_id("Me ".into()) .preferred_symmetric_algorithms(smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, ]) .preferred_hash_algorithms(smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, HashAlgorithm::SHA1, ]) .preferred_compression_algorithms(smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::ZIP, ]) .passphrase(None) .subkey( SubkeyParamsBuilder::default() .key_type(kt_sub) .passphrase(None) .can_encrypt(true) .build() .unwrap(), ) .build() .unwrap(); key_params .generate(thread_rng()) .expect("failed to generate secret key, encrypted") } pgp-0.15.0/benches/benchmarks/s2k.rs000064400000000000000000000042161046102023000152710ustar 00000000000000use criterion::{black_box, criterion_group, BenchmarkId, Criterion}; use pgp::{ crypto::{hash::HashAlgorithm, sym::SymmetricKeyAlgorithm}, types::StringToKey, }; use rand::distributions::{Alphanumeric, DistString}; fn bench_s2k(c: &mut Criterion) { let sizes = [10, 100, 1000]; let mut rng = rand::thread_rng(); let mut group = c.benchmark_group("s2k"); { let algs = [ HashAlgorithm::SHA1, HashAlgorithm::SHA2_256, HashAlgorithm::SHA3_256, HashAlgorithm::SHA2_512, ]; let counts = [ 1u8, 224u8, // default in rpgp u8::MAX, // maximum possible ]; let sym_algs = [SymmetricKeyAlgorithm::AES128, SymmetricKeyAlgorithm::AES256]; for size in sizes { for sym_alg in sym_algs { for alg in algs { for count in counts { group.bench_with_input( BenchmarkId::new( "iterated_and_salted", format!("{size}/{alg:?}/{count}/{sym_alg:?}"), ), &(size, alg, count, sym_alg), |b, &(size, alg, count, sym_alg): &( usize, HashAlgorithm, u8, SymmetricKeyAlgorithm, )| { let s2k = StringToKey::new_iterated(&mut rng, alg, count); let passphrase = Alphanumeric.sample_string(&mut rng, size); b.iter(|| { let res = s2k.derive_key(&passphrase, sym_alg.key_size()).unwrap(); black_box(res); }) }, ); } } } } } group.finish(); } criterion_group!(benches, bench_s2k); pgp-0.15.0/cliff.toml000064400000000000000000000045201046102023000124560ustar 00000000000000[changelog] # changelog header header = """ # Changelog\n All notable changes to rpgp will be documented in this file.\n """ body = """ {% if version %}\ {% if previous.version %}\ ## [{{ version | trim_start_matches(pat="v") }}](/compare/{{ previous.version }}..{{ version }}) - {{ timestamp | date(format="%Y-%m-%d") }} {% else %}\ ## [{{ version | trim_start_matches(pat="v") }}] - {{ timestamp | date(format="%Y-%m-%d") }} {% endif %}\ {% else %}\ ## [unreleased] {% endif %}\ {% macro commit(commit) -%} - {% if commit.scope %}*({{ commit.scope }})* {% endif %}{% if commit.breaking %}[**breaking**] {% endif %}\ {{ commit.message | upper_first }} - ([{{ commit.id | truncate(length=7, end="") }}](/commit/{{ commit.id }}))\ {% endmacro -%} {% for group, commits in commits | group_by(attribute="group") %} ### {{ group | striptags | trim | upper_first }} {% for commit in commits | filter(attribute="scope") | sort(attribute="scope") %} {{ self::commit(commit=commit) }} {%- endfor -%} {% raw %}\n{% endraw %}\ {%- for commit in commits %} {%- if not commit.scope -%} {{ self::commit(commit=commit) }} {% endif -%} {% endfor -%} {% endfor %}\n """ footer = "" postprocessors = [ { pattern = '', replace = "https://github.com/rpgp/rpgp" }, { pattern = "\\(#([0-9]+)\\)", replace = "([#${1}](https://github.com/rpgp/rpgp/issues/${1}))"} ] [git] # regex for parsing and grouping commits commit_parsers = [ { message = "^feat", group = "โ›ฐ๏ธ Features" }, { message = "^fix", group = "๐Ÿ› Bug Fixes" }, { message = "^doc", group = "๐Ÿ“š Documentation" }, { message = "^perf", group = "โšก Performance" }, { message = "^refactor", group = "๐Ÿšœ Refactor" }, { message = "^style", group = "๐ŸŽจ Styling" }, { message = "^test", group = "๐Ÿงช Testing" }, { message = "^chore\\(release\\)", skip = true }, { message = "^chore\\(deps\\)", skip = true }, { message = "^chore\\(pr\\)", skip = true }, { message = "^chore\\(pull\\)", skip = true }, { message = "^chore|ci", group = "โš™๏ธ Miscellaneous Tasks" }, { body = ".*security", group = "๐Ÿ›ก๏ธ Security" }, { message = "^revert", group = "โ—€๏ธ Revert" }, ] pgp-0.15.0/deny.toml000064400000000000000000000006501046102023000123320ustar 00000000000000[bans] multiple-versions = "allow" deny = [] [licenses] allow = [ "Apache-2.0", "Apache-2.0 WITH LLVM-exception", "BSD-2-Clause", "BSD-3-Clause", "MIT", "Unicode-3.0", "Zlib" ] [[licenses.clarify]] name = "ring" expression = "MIT AND ISC AND OpenSSL" license-files = [ { path = "LICENSE", hash = 0xbd0eed23 }, ] [advisories] ignore = [ "RUSTSEC-2023-0071" # Waiting for upstream fix ] pgp-0.15.0/docs/FAQ.md000064400000000000000000000043031046102023000123560ustar 00000000000000## FAQs ### Is rPGP considering adding support for Post Quantum Cryptography (PQC)? Yes, it is tracked in [#356](https://github.com/rpgp/rpgp/issues/356). We are following the IETF [Post-Quantum Cryptography in OpenPGP](https://datatracker.ietf.org/doc/draft-ietf-openpgp-pqc/) work and discussed with some of its authors but have not fully assessed yet the work needed to support it in rPGP. ### What other standards are you considering for implementation? IETF standards currently tracked for implementation in rPGP use the ["ietf-draft" label on the issues](https://github.com/rpgp/rpgp/labels/ietf-draft). If you want to help either with coding or with funding, please get in contact. We are also participating in renewed [Autocrypt specification efforts](https://autocrypt.org), a multi-stakeholder community-driven specification for automated e-mail encryption. ### Is rPGP considering support for LibrePGP? No, at least not soon. While we might not agree with, or not praise every detail of the V6 crypto refresh, we highly appreciate the work of the IETF OpenPGP WG and the contributors and stakeholders around it. If [LibrePGP](https://librepgp.org/) evolves towards a multi-stakeholder community-driven specification, we might consider partially supporting LibrePGP keys and formats. Helping to smoothly and securely move the many [Delta Chat](https://delta.chat) users of rPGP to V6 keys is sufficiently challenging for us without considering LibrePGP. ### How is rPGP different from Sequoia? The [Sequoia project](https://sequoia-pgp.org/) offers an alternative Rust implementation of OpenPGP. Here are some key differences, without claiming to exhaust the question: - rPGP has a more permissive license than Sequoia. - rPGP is a library with a low-level API and relatively small feature-set (with higher level APIs evolving in https://codeberg.org/heiko/rpgpie ) whereas Sequoia has a comprehensive set of crates and also offers the `sq` CLI and aims to be a replacement for the GPG command line tool. - All cryptographic primitives used in rPGP are implemented in Rust, whereas Sequoia by default uses Nettle, which is implemented in C, but also offers optional Rust backends. pgp-0.15.0/docs/IMPL_STATUS.md000064400000000000000000000036401046102023000136160ustar 00000000000000# Implementation Status For an overall comparison with other implementations see the "rpgpie" results in the [OpenPGP interoperability test suite](https://tests.sequoia-pgp.org/) **Symbols:** - ๐Ÿšง Work in Progress - ๐Ÿšซ Not planned - โ“ Maybe implement ## Low Level API - [x] Packet Parser - [x] Historical RFC 1991 (PGP 2.x, "v2/v3") - [x] RFC 2440, 4880 ("v4") - [ ] draft-koch-librepgp Format ("v5") - [x] RFC 9580 ("v6") - [x] Packet Generation - [x] ASCII Armor - [x] Reading - [x] Writing - [x] Cleartext Signature Framework - [x] Signatures (v4) - [x] Validation - [x] Generation - [x] Signatures (v6) - [x] Validation - [x] Generation - [x] Encryption - [x] PKESK v3, SKESK v4, SEIPD v1 - [x] PKESK v6, SKESK v6, SEIPD v2 - [x] Decryption - [x] PKESK v3, SKESK v4, SEIPD v1 - [x] PKESK v6, SKESK v6, SEIPD v2 - [x] Keys (v4) - [x] Generation - [x] Export - [x] Import - [x] Keys (v6) - [x] Generation - [x] Export - [x] Import - [x] Public-Key Algorithms - [x] RSA - [ ] ๐Ÿšซ Elgamal (Encrypt only) - [x] DSA - [x] ECDH - [x] ECDSA - [x] EdDSA - [ ] Supported Elliptic Curves - [X] NIST P256 - [X] NIST P384 - [X] NIST P521 - [ ] brainpoolP256r1 - [ ] brainpoolP384r1 - [ ] brainpoolP512r1 - [x] Curve 25519 - [ ] Ed448 - [x] X448 - [x] Secp256k1 - [x] Symmetric Algorithms - [x] Plaintext - [x] IDEA - [x] DES - [x] CAST5 - [x] Blowfish - [x] AES 128 - [x] AES 192 - [x] AES 256 - [x] Twofish - [x] Camellia 128 - [x] Camellia 192 - [x] Camellia 256 - [x] Hash Algorithms - [x] MD5 - [x] SHA-1 - [x] RIPE-MD/160 - [x] SHA2 256 - [x] SHA2 384 - [x] SHA2 512 - [x] SHA2 224 - [x] SHA3 256 - [x] SHA3 512 - [ ] Compression Algorithms - [x] ZIP - [x] ZLIB - [ ] ๐Ÿšซ BZip2 - [x] AEAD Algorithms - [x] OCB - [x] EAX - [x] GCM - S2K - [x] Iterated and Salted - [x] Argon2 ## High Level API Not yet started pgp-0.15.0/docs/PLATFORMS.md000064400000000000000000000020241046102023000133140ustar 00000000000000# Supported Platforms **Symbols:** - โœ… Checked in CI - โ“ Should work, but not in CI ## Linux * โœ… `x86_64-unknown-linux-gnu` * โ“`aarch64-unknown-linux-gnu` * โ“`arm-unknown-linux-gnueabi` * โ“`armv7-unknown-linux-gnueabihf` * โ“`i586-unknown-linux-gnu` * โœ… `i686-unknown-linux-gnu` * โ“`mips-unknown-linux-gnu` * โ“`mips64-unknown-linux-gnuabi64` * โ“`mips64el-unknown-linux-gnuabi64` * โ“`mipsel-unknown-linux-gnu` * โ“`powerpc-unknown-linux-gnu` * โœ… `powerpc64-unknown-linux-gnu` * โ“`powerpc64le-unknown-linux-gnu` * โ“`x86_64-unknown-linux-musl` ## Android * โ“`aarch64-linux-android` * โœ… `arm-linux-androideabi` * โ“`armv7-linux-androideabi` * โ“`x86_64-linux-android` ## iOS * โ“`i386-apple-ios` * โ“`x86_64-apple-ios` * โ“`armv7-apple-ios` * โ“`armv7s-apple-ios` ## MacOS X * โœ… `x86_64-apple-darwin` * โ“`i686-apple-darwin` ## Windows * โ“`i686-pc-windows-gnu` * โœ… `x86_64-pc-windows-gnu` * โ“`i686-pc-windows-msvc` * โ“`x86_64-pc-windows-msvc` ## Wasm * โœ… `wasm32-unknown-unknown` pgp-0.15.0/docs/SECURITY_STATUS.md000064400000000000000000000027671046102023000143350ustar 00000000000000# Security Status ## Known Issues The used [`rsa`](https://crates.io/crates/rsa) crate is vulnerable to the Marvin attack and potentitally other side channel attacks. This is being tracked and worked on actively: - https://github.com/RustCrypto/RSA/issues/19 - https://github.com/RustCrypto/RSA/pull/394 ## Security Audits rPGP and its RSA dependency received two independent security audits and a security analysis. ### 2024-12 Audit ["Nlnet Security Evaluation rPGP"](https://github.com/rpgp/docs/blob/main/audits/NGI%20Core%20rPGP%20penetration%20test%20report%202024%201.0.pdf) by [Radically Open Security](https://www.radicallyopensecurity.com/). Two advisories were released about the findings of this audit: - ["Panics on Malformed Untrusted Input"](https://github.com/rpgp/rpgp/security/advisories/GHSA-9rmp-2568-59rv) CVE-2024-53856 - ["Potential Resource Exhaustion when handling Untrusted Messages"](https://github.com/rpgp/rpgp/security/advisories/GHSA-4grw-m28r-q285) CVE-2024-53857 The issues outlined in these advisories have been fixed. ### 2024-03 [Hardening Guaranteed End-to-End encryption based on a security analysis from ETH researchers](https://delta.chat/en/2024-03-25-crypto-analysis-securejoin) All discovered issues have been fixed. ### 2019 [Security Assessment of DeltaChat's RPGP and RustCrypto RSA Libraries for the Open Tech Fund](https://delta.chat/assets/blog/2019-first-security-review.pdf). No critical flaws were found and we have fixed most high, medium and low risk ones. pgp-0.15.0/release.toml000064400000000000000000000002641046102023000130140ustar 00000000000000pre-release-commit-message = "chore({{crate_name}}): release {{version}}" pre-release-hook = ["git", "cliff", "--prepend", "CHANGELOG.md", "--tag", "{{version}}", "--unreleased" ] pgp-0.15.0/src/armor/mod.rs000064400000000000000000000004001046102023000135230ustar 00000000000000//! # Armor module //! //! Armor module provides implementation of ASCII Armor as specified in RFC 9580. //! mod reader; mod writer; pub use self::reader::*; pub use self::writer::*; pgp-0.15.0/src/armor/reader.rs000064400000000000000000001065151046102023000142240ustar 00000000000000use std::collections::BTreeMap; use std::hash::Hasher; use std::io::prelude::*; use std::{fmt, io, str}; use base64::engine::{general_purpose::STANDARD, Engine as _}; use buffer_redux::BufReader; use byteorder::{BigEndian, ByteOrder}; use nom::branch::alt; use nom::bytes::streaming::{tag, take_until1}; use nom::bytes::streaming::{take, take_until}; use nom::character::streaming::{alphanumeric1, digit1, line_ending, not_line_ending, space0}; use nom::combinator::{complete, map, map_res, opt, success, value}; use nom::multi::many0; use nom::sequence::{delimited, pair, preceded, terminated}; use nom::IResult; use crate::base64_decoder::Base64Decoder; use crate::base64_reader::Base64Reader; use crate::errors::Result; use crate::ser::Serialize; /// Armor block types. /// /// Both OpenPGP (RFC 9580) and OpenSSL PEM armor types are included. #[derive(Debug, PartialEq, Eq, Copy, Clone)] pub enum BlockType { /// PGP public key PublicKey, /// PEM encoded PKCS#1 public key PublicKeyPKCS1(PKCS1Type), /// PEM encoded PKCS#8 public key PublicKeyPKCS8, /// Public key OpenSSH PublicKeyOpenssh, /// PGP private key PrivateKey, /// PEM encoded PKCS#1 private key PrivateKeyPKCS1(PKCS1Type), /// PEM encoded PKCS#8 private key PrivateKeyPKCS8, /// OpenSSH private key PrivateKeyOpenssh, Message, MultiPartMessage(usize, usize), Signature, // gnupgp extension File, /// Cleartext Framework message CleartextMessage, } impl fmt::Display for BlockType { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { BlockType::PublicKey => f.write_str("PGP PUBLIC KEY BLOCK"), BlockType::PrivateKey => f.write_str("PGP PRIVATE KEY BLOCK"), BlockType::MultiPartMessage(x, y) => write!(f, "PGP MESSAGE, PART {x}/{y}"), BlockType::Message => f.write_str("PGP MESSAGE"), BlockType::Signature => f.write_str("PGP SIGNATURE"), BlockType::File => f.write_str("PGP ARMORED FILE"), BlockType::PublicKeyPKCS1(typ) => write!(f, "{typ} PUBLIC KEY"), BlockType::PublicKeyPKCS8 => f.write_str("PUBLIC KEY"), BlockType::PublicKeyOpenssh => f.write_str("OPENSSH PUBLIC KEY"), BlockType::PrivateKeyPKCS1(typ) => write!(f, "{typ} PRIVATE KEY"), BlockType::PrivateKeyPKCS8 => f.write_str("PRIVATE KEY"), BlockType::PrivateKeyOpenssh => f.write_str("OPENSSH PRIVATE KEY"), BlockType::CleartextMessage => f.write_str("PGP SIGNED MESSAGE"), } } } impl Serialize for BlockType { fn to_writer(&self, w: &mut W) -> Result<()> { write!(w, "{}", self)?; Ok(()) } } /// OpenSSL PKCS#1 PEM armor types #[derive(Debug, PartialEq, Eq, Copy, Clone)] pub enum PKCS1Type { RSA, DSA, EC, } impl fmt::Display for PKCS1Type { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { PKCS1Type::RSA => write!(f, "RSA"), PKCS1Type::DSA => write!(f, "DSA"), PKCS1Type::EC => write!(f, "EC"), } } } /// Armor Headers. pub type Headers = BTreeMap>; /// Parses a single ascii armor header separator. fn armor_header_sep(i: &[u8]) -> IResult<&[u8], &[u8]> { tag(b"-----")(i) } #[inline] fn parse_digit(x: &[u8]) -> Result { let s = str::from_utf8(x)?; let digit: usize = s.parse()?; Ok(digit) } /// Parses the type inside of an ascii armor header. fn armor_header_type(i: &[u8]) -> IResult<&[u8], BlockType> { alt(( value(BlockType::PublicKey, tag("PGP PUBLIC KEY BLOCK")), value(BlockType::PrivateKey, tag("PGP PRIVATE KEY BLOCK")), map( preceded( tag("PGP MESSAGE, PART "), pair( map_res(digit1, parse_digit), opt(preceded(tag("/"), map_res(digit1, parse_digit))), ), ), |(x, y)| BlockType::MultiPartMessage(x, y.unwrap_or(0)), ), value(BlockType::Message, tag("PGP MESSAGE")), value(BlockType::Signature, tag("PGP SIGNATURE")), value(BlockType::File, tag("PGP ARMORED FILE")), value(BlockType::CleartextMessage, tag("PGP SIGNED MESSAGE")), // OpenSSL formats // Public Key File PKCS#1 value( BlockType::PublicKeyPKCS1(PKCS1Type::RSA), tag("RSA PUBLIC KEY"), ), // Public Key File PKCS#1 value( BlockType::PublicKeyPKCS1(PKCS1Type::DSA), tag("DSA PUBLIC KEY"), ), // Public Key File PKCS#1 value( BlockType::PublicKeyPKCS1(PKCS1Type::EC), tag("EC PUBLIC KEY"), ), // Public Key File PKCS#8 value(BlockType::PublicKeyPKCS8, tag("PUBLIC KEY")), // OpenSSH Public Key File value(BlockType::PublicKeyOpenssh, tag("OPENSSH PUBLIC KEY")), // Private Key File PKCS#1 value( BlockType::PrivateKeyPKCS1(PKCS1Type::RSA), tag("RSA PRIVATE KEY"), ), // Private Key File PKCS#1 value( BlockType::PrivateKeyPKCS1(PKCS1Type::DSA), tag("DSA PRIVATE KEY"), ), // Private Key File PKCS#1 value( BlockType::PrivateKeyPKCS1(PKCS1Type::EC), tag("EC PRIVATE KEY"), ), // Private Key File PKCS#8 value(BlockType::PrivateKeyPKCS8, tag("PRIVATE KEY")), // OpenSSH Private Key File value(BlockType::PrivateKeyOpenssh, tag("OPENSSH PRIVATE KEY")), ))(i) } /// Parses a single armor header line. fn armor_header_line(i: &[u8]) -> IResult<&[u8], BlockType> { delimited( pair(armor_header_sep, tag(b"BEGIN ")), armor_header_type, pair(armor_header_sep, line_ending), )(i) } /// Parses a single key value pair, for the header. fn key_value_pair(i: &[u8]) -> IResult<&[u8], (&str, &str)> { let (i, key) = map_res( alt(( complete(take_until1(":\r\n")), complete(take_until1(":\n")), complete(take_until1(": ")), )), str::from_utf8, )(i)?; // consume the ":" let (i, _) = tag(":")(i)?; let (i, t) = alt((tag(" "), line_ending))(i)?; let (i, value) = if t == b" " { let (i, value) = map_res(not_line_ending, str::from_utf8)(i)?; let (i, _) = line_ending(i)?; (i, value) } else { // empty value (i, "") }; Ok((i, (key, value))) } /// Parses a list of key value pairs. fn key_value_pairs(i: &[u8]) -> IResult<&[u8], Vec<(&str, &str)>> { many0(complete(key_value_pair))(i) } /// Parses the full armor header. fn armor_headers(i: &[u8]) -> IResult<&[u8], Headers> { map(key_value_pairs, |pairs| { // merge multiple values with the same name let mut out = BTreeMap::>::new(); for (k, v) in pairs { let e = out.entry(k.to_string()).or_default(); e.push(v.to_string()); } out })(i) } /// Armor Header fn armor_header(i: &[u8]) -> IResult<&[u8], (BlockType, Headers)> { let (i, typ) = armor_header_line(i)?; let (i, headers) = match typ { BlockType::CleartextMessage => armor_headers_hash(i)?, _ => armor_headers(i)?, }; Ok((i, (typ, headers))) } fn armor_headers_hash(i: &[u8]) -> IResult<&[u8], Headers> { let (i, headers) = many0(complete(hash_header_line))(i)?; let (i, _) = pair(space0, line_ending)(i)?; let mut res = BTreeMap::new(); let headers = headers.into_iter().flatten().collect(); res.insert("Hash".to_string(), headers); Ok((i, res)) } fn hash_header_line(i: &[u8]) -> IResult<&[u8], Vec> { let (i, _) = tag("Hash: ")(i)?; let (i, mut values) = many0(map_res(terminated(alphanumeric1, tag(",")), |s| { str::from_utf8(s).map(|s| s.to_string()) }))(i)?; let (i, last_value) = terminated( map_res(alphanumeric1, |s| str::from_utf8(s).map(|s| s.to_string())), line_ending, )(i)?; values.push(last_value); Ok((i, values)) } /// Read the checksum from an base64 encoded buffer. fn read_checksum(input: &[u8]) -> std::io::Result { let checksum = STANDARD .decode(input) .map_err(|_| io::ErrorKind::InvalidData)?; let mut buf = [0; 4]; let mut i = checksum.len(); for a in checksum.iter().rev() { buf[i] = *a; i -= 1; } Ok(u64::from(BigEndian::read_u32(&buf))) } pub fn header_parser(i: &[u8]) -> IResult<&[u8], (BlockType, Headers, bool)> { let (i, prefix) = take_until("-----")(i)?; let has_leading_data = !prefix.is_empty(); let (i, (typ, headers)) = armor_header(i)?; let (i, _) = many0(pair(space0, line_ending))(i)?; Ok((i, (typ, headers, has_leading_data))) } fn footer_parser(i: &[u8]) -> IResult<&[u8], (Option, BlockType)> { let (i, checksum) = map_res( alt(( delimited( tag(b"="), map(take(4u8), Some), pair(many0(line_ending), tag(b"--")), ), delimited( many0(tag(b"=")), success(None), pair(many0(line_ending), tag(b"--")), ), )), |c| c.map(read_checksum).transpose(), )(i)?; let (i, typ) = armor_footer_line(i)?; Ok((i, (checksum, typ))) } /// Parses a single armor footer line fn armor_footer_line(i: &[u8]) -> IResult<&[u8], BlockType> { // Only 3, because we parsed two already in the `footer_parser`. delimited( tag(b"---END "), armor_header_type, pair(armor_header_sep, opt(complete(line_ending))), )(i) } /// Streaming based ascii armor parsing. pub struct Dearmor { /// The ascii armor parsed block type. pub typ: Option, /// The headers found in the armored file. pub headers: Headers, /// Optional crc checksum pub checksum: Option, /// Current state current_part: Part, crc: crc24::Crc24Hasher, /// Maximum buffer limit max_buffer_limit: usize, } /// Internal indicator, where in the parsing phase we are #[derive(Debug)] #[allow(clippy::large_enum_variant)] enum Part { Header(R), Body(Base64Decoder>), Footer(BufReader), Done(BufReader), Temp, } impl Dearmor { /// Creates a new `Dearmor`, with the default limit of 1GiB. pub fn new(input: R) -> Self { Self::with_limit(input, 1024 * 1024 * 1024) } /// Creates a new `Dearmor` with the provided maximum buffer size. pub fn with_limit(input: R, limit: usize) -> Self { Dearmor { typ: None, headers: BTreeMap::new(), checksum: None, current_part: Part::Header(input), crc: Default::default(), max_buffer_limit: limit, } } pub fn into_parts(self) -> (Option, Headers, Option, BufReader) { let Self { typ, headers, checksum, current_part, .. } = self; let Part::Done(b) = current_part else { panic!("can only be called when done"); }; (typ, headers, checksum, b) } /// The current maximum buffer limit. pub fn max_buffer_limit(&self) -> usize { self.max_buffer_limit } pub fn read_only_header(mut self) -> Result<(BlockType, Headers, bool, R)> { let header = std::mem::replace(&mut self.current_part, Part::Temp); if let Part::Header(mut b) = header { let (typ, headers, leading) = Self::read_header_internal(&mut b, self.max_buffer_limit)?; return Ok((typ, headers, leading, b)); } bail!("invalid state, cannot read header"); } pub fn after_header(typ: BlockType, headers: Headers, input: R, limit: usize) -> Self { Self { typ: Some(typ), headers, checksum: None, current_part: Part::Body(Base64Decoder::new(Base64Reader::new(input))), crc: Default::default(), max_buffer_limit: limit, } } pub fn read_header(&mut self) -> Result<()> { let header = std::mem::replace(&mut self.current_part, Part::Temp); if let Part::Header(mut b) = header { let (typ, headers, _has_leading_data) = Self::read_header_internal(&mut b, self.max_buffer_limit)?; self.typ = Some(typ); self.headers = headers; self.current_part = Part::Body(Base64Decoder::new(Base64Reader::new(b))); return Ok(()); } bail!("invalid state, cannot read header"); } fn read_header_internal(b: &mut R, limit: usize) -> Result<(BlockType, Headers, bool)> { let (typ, headers, leading) = read_from_buf(b, "armor header", limit, header_parser)?; Ok((typ, headers, leading)) } fn read_body( &mut self, into: &mut [u8], base_decoder: &mut Base64Decoder>, ) -> io::Result { let size = base_decoder.read(into)?; if size > 0 { // update the hash self.crc.write(&into[0..size]); } Ok(size) } fn read_footer(&mut self, mut b: BufReader) -> Result<()> { let (checksum, footer_typ) = read_from_buf(&mut b, "armor footer", self.max_buffer_limit, footer_parser)?; if let Some(ref header_typ) = self.typ { if header_typ != &footer_typ { self.current_part = Part::Done(b); bail!( "armor ascii footer does not match header: {:?} != {:?}", self.typ, footer_typ ); } } self.checksum = checksum; self.current_part = Part::Done(b); // check checksum if there is one if let Some(expected) = self.checksum { let actual = self.crc.finish(); if expected != actual { bail!("invalid crc24 checksum"); } } Ok(()) } } impl Read for Dearmor { fn read(&mut self, into: &mut [u8]) -> io::Result { let mut read = 0; loop { let current_part = std::mem::replace(&mut self.current_part, Part::Temp); match current_part { Part::Header(mut b) => { let (typ, headers, _leading) = Self::read_header_internal(&mut b, self.max_buffer_limit) .map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?; self.typ = Some(typ); self.headers = headers; self.current_part = Part::Body(Base64Decoder::new(Base64Reader::new(b))); } Part::Body(mut b) => { let last_read = self.read_body(&mut into[read..], &mut b)?; if last_read == 0 && read < into.len() { // we are done with the body let (b, buf) = b.into_inner_with_buffer(); let b = BufReader::with_buffer(buf, b.into_inner()); self.current_part = Part::Footer(b); } else { self.current_part = Part::Body(b); } read += last_read; if read == into.len() { return Ok(read); } } Part::Footer(mut b) => { b.make_room(); while b.buf_len() < 128 { let read = b.read_into_buf()?; if read == 0 { break; } } self.read_footer(b) .map_err(|e| io::Error::new(io::ErrorKind::Other, e.to_string()))?; } Part::Done(b) => { self.current_part = Part::Done(b); return Ok(read); } Part::Temp => panic!("invalid state"), } } } } pub(crate) fn read_from_buf( b: &mut B, ctx: &str, limit: usize, parser: P, ) -> Result where P: Fn(&[u8]) -> IResult<&[u8], T>, { // Zero copy, single buffer let buf = b.fill_buf()?; if buf.is_empty() { bail!("not enough bytes in buffer: {}", ctx); } match parser(buf) { Ok((remaining, res)) => { let consumed = buf.len() - remaining.len(); b.consume(consumed); return Ok(res); } Err(nom::Err::Incomplete(_)) => {} Err(err) => { bail!("failed reading: {} {:?}", ctx, err); } }; // incomplete let mut back_buffer = buf.to_vec(); let len = back_buffer.len(); b.consume(len); let mut last_buffer_len; loop { // Safety check to not consume too much if back_buffer.len() >= limit { bail!("input too large"); } let buf = b.fill_buf()?; if buf.is_empty() { bail!("not enough bytes in buffer: {}", ctx); } last_buffer_len = buf.len(); back_buffer.extend_from_slice(buf); match parser(&back_buffer) { Ok((remaining, res)) => { let consumed = last_buffer_len - remaining.len(); b.consume(consumed); return Ok(res); } Err(nom::Err::Incomplete(_)) => { b.consume(last_buffer_len); continue; } Err(err) => { bail!("failed reading: {} {:?}", ctx, err); } }; } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; // helper function to parse all data at once pub fn parse(input: &str) -> Result<(BlockType, Headers, Vec)> { let mut dearmor = Dearmor::new(BufReader::new(input.as_bytes())); // estimate size let mut bytes = Vec::new(); dearmor.read_to_end(&mut bytes)?; Ok((dearmor.typ.unwrap(), dearmor.headers, bytes)) } // helper function to parse all data at once pub fn parse_raw(input: &str) -> Result<(BlockType, Headers, Vec)> { let mut dearmor = Dearmor::new(input.as_bytes()); // estimate size let mut bytes = Vec::new(); dearmor.read_to_end(&mut bytes)?; Ok((dearmor.typ.unwrap(), dearmor.headers, bytes)) } #[test] fn test_armor_header_line() { assert_eq!( armor_header_line(&b"-----BEGIN PGP MESSAGE-----\n"[..]).unwrap(), (&b""[..], BlockType::Message) ); assert_eq!( armor_header_line(&b"-----BEGIN PGP MESSAGE, PART 3/14-----\n"[..]).unwrap(), (&b""[..], BlockType::MultiPartMessage(3, 14)) ); assert_eq!( armor_header_line(&b"-----BEGIN PGP MESSAGE, PART 14-----\n"[..]).unwrap(), (&b""[..], BlockType::MultiPartMessage(14, 0)) ); } #[test] fn test_armor_headers() { let mut map = BTreeMap::new(); map.insert("Version".to_string(), vec!["12".to_string()]); map.insert("special-stuff".to_string(), vec!["cool12.0".to_string()]); map.insert("some:colon".to_string(), vec!["with:me".to_string()]); assert_eq!( armor_headers( &b"Version: 12\r\nspecial-stuff: cool12.0\r\nsome:colon: with:me\r\n"[..], ) .unwrap(), (&b""[..], map) ); } #[test] fn test_armor_header() { let mut map = BTreeMap::new(); map.insert("Version".to_string(), vec!["1.0".to_string()]); map.insert("Mode".to_string(), vec!["Test".to_string()]); assert_eq!( armor_header(&b"-----BEGIN PGP MESSAGE-----\nVersion: 1.0\nMode: Test\n"[..],).unwrap(), (&b""[..], (BlockType::Message, map)) ); let mut map = BTreeMap::new(); map.insert("Version".to_string(), vec!["GnuPG v1".to_string()]); assert_eq!( armor_header(&b"-----BEGIN PGP PUBLIC KEY BLOCK-----\nVersion: GnuPG v1\n"[..],) .unwrap(), (&b""[..], (BlockType::PublicKey, map)) ); } #[test] fn test_parse_armor_small() { let mut map = BTreeMap::new(); map.insert("Version".to_string(), vec!["GnuPG v1".to_string()]); let c = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\ Version: GnuPG v1\n\ \n\ aGVsbG8gd29ybGQ=\n\ -----END PGP PUBLIC KEY BLOCK-----\n"; let (typ, headers, res) = parse(c).unwrap(); assert_eq!(typ, (BlockType::PublicKey)); assert_eq!(headers, map); assert_eq!(res.as_slice(), &b"hello world"[..]); } #[test] fn test_parse_armor_missing_header_value() { let mut map = BTreeMap::new(); map.insert("NoVal".to_string(), vec!["".to_string()]); let c = "\ -----BEGIN PGP MESSAGE-----\n\ NoVal:\n\ \n\ aGVsbG8gd29ybGQ=\n\ -----END PGP MESSAGE-----\ "; let (typ, headers, res) = parse(c).unwrap(); assert_eq!(typ, (BlockType::Message)); assert_eq!(headers, map); assert_eq!(res.as_slice(), &b"hello world"[..]); } #[test] fn test_parse_armor_whitespace() { let c = "\ -----BEGIN PGP MESSAGE-----\n\ \t \n\ aGVsbG8gd29ybGQ=\n\ -----END PGP MESSAGE-----\ "; let (typ, headers, res) = parse(c).unwrap(); assert_eq!(typ, (BlockType::Message)); assert!(headers.is_empty()); assert_eq!(res.as_slice(), &b"hello world"[..]); } #[test] fn test_parse_armor_two_entries() { let mut map = BTreeMap::new(); map.insert("hello".to_string(), vec!["world".to_string()]); let c = "\ -----BEGIN PGP MESSAGE-----\n\ hello: world\n\ \n\ aGVsbG8gd29ybGQ=\n\ -----END PGP MESSAGE-----\n\ -----BEGIN PGP MESSAGE-----\n\ \n\ aGVsbG8gd29ybGQ=\n\ -----END PGP MESSAGE-----\ "; let (typ, headers, res) = parse(c).unwrap(); assert_eq!(typ, (BlockType::Message)); assert_eq!(headers, map); assert_eq!(res.as_slice(), &b"hello world"[..]); } #[test] fn test_parse_armor_full() { let mut map = BTreeMap::new(); map.insert("Version".to_string(), vec!["GnuPG v1".to_string()]); let c = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\ Version: GnuPG v1\n\ \n\ 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\n\ =XyBX\n\ -----END PGP PUBLIC KEY BLOCK-----\n"; let (typ, headers, decoded) = parse(c).unwrap(); assert_eq!(typ, (BlockType::PublicKey)); assert_eq!(headers, map); assert_eq!(decoded.len(), 1675); assert_eq!(decoded.len() % 3, 1); // two padding chars } #[test] fn test_parse_armor_full_no_header() { let c = "-----BEGIN RSA PRIVATE KEY----- MIIEpgIBAAKCAQEAxp4sIUtrNBl4Vbd4075CmtHmwxTc0FhQIGw36kptbrWReLb9 Np0RQylKyc6qUruxZlCdPVFo7iX3vs272/0GEakPv0DAsKGbe1nTsMyxxz0o3dP4 JQOlOGEnpETa0ybfPLMX1+qNiBdm7HLjqcP5+S0Exb0Z0deFNIhEP6XckUEgHmwA /AdDdUUKwwvZeZOi4XyBVt0vXzwM/+84ro27O+CZm9Du3qe1jTIsX7jUrqsUBhp9 eUwa1jXfXuJJo9b4/GeP4S9x8U7ho+BQ6/HH03dzcKaY3FftanCZkcwxfGBBUiCK pIA5WgKimLcgP2R75Y3jilDoBh5HyIdGXo0aFwIDAQABAoIBAQCBXLIHeXS4eUJc KeSjnQ8KgV4Yf3UWqf5+L533lkRSUCYQhrbDpGeC49kXOejLe/4eUrEnJ+f8/HOx LZSGwvT5+bAM9CLMqGV5YNc1Fw1PZHFCkfXUPdyVrQnBvyr7Th0mDsuf0OAf3IYn yOipQMCGX6D1HaY8e3AB+CLjhab0X1vAwvqzPb/HIdtMhRWlJxzbuqnE3kr+Ccvz us3vmD4VBp0CF0f+yblcibMCHdHY6j8Ir6Qeq6Mbd6lEXRPW1TgUqP15idVaJ4AF 1kGXDW9O0ycgrbopGZfk5yY60fEHGdr4QYjx2Gtx2xQcnPcjJ+j5kGgubKWxNhJE Qx7DPdYxAoGBAP29S+wD1df0U+Tr0x06N6M/nSjNacGs12Oq/ehNJHhTYUO9fWUl M2X/MXRMMMGsnGaLNsrLao9Jnq0ZU5GFICWYeVBvaCvRrGngbqJBy8jRv+QYyaQs AckLcdgLGvjhcXonHDcbcxpug7/qFwakT+KY2s11FrHBEzbAIuDiSSKfAoGBAMhj KPkrjWJh3xxpFrFnGYj5aF86ExrPe2LAP/8F6Ez7dQN+4bA6O5F4hpJ/X0q/6s0n IBljo/DgARCBjbwDSaAMEWdm8HDeBhJsSCdQHW38ylaRDi8CQDKR60N3a/tV1MRJ 4fKoHZ+7HH3wc+Bjv3oDovwVyUMG7ekCjeqbqI2JAoGBAOkhYX5Jz9KJBAPSwLeb 4760FfuFL+PooEVMt9kV96ouQbFxiqLB2UWfgJqv3iQ0Kcb1pbQRzag1Jfs4x9Vu ESk5vEyw729DSDxHHp8qAMhUHxC9zZZvcHx9bW3oVjHRQOfQw1XGfK0OWTKdK+bI VTWG55HaQK21DahCREmG31dVAoGBALBH80KHmsAioziGBi2YKjGCXtvu5eGfBsdP orzBQKOATmb91qLGB6MoaRI1NOo4POGu+qD7M7xyAt23aq0sIzfFhgX1260e1C6e zTawVsNsL7/JqbWXAEy8az+VrguTbTIkYL2sQStEWoM75WRPu6El09p5e+0YCnEC C0CJINUpAoGBAPF1fpPINHlUW+Bvo4Nj3935QgZI47yTplDusptyfYgFYXw6ZYel y5Zgv9TWZlmW9FDTp4XVgn5zQTEN1LdL7vNXWV9aOvfrqPk5ClBkxhndgq7j6MFs 9+9V06HJDIsSrC0D/ajIkP+iT9Hd6eEZMkJ6y6XtTbkJGYt2zOtnrpb6 -----END RSA PRIVATE KEY-----\n"; let (typ, _, _) = parse(c).unwrap(); assert_eq!(typ, (BlockType::PrivateKeyPKCS1(PKCS1Type::RSA))); } #[test] fn test_dearmor_small_stream() { let mut map = BTreeMap::new(); map.insert("Version".to_string(), vec!["GnuPG v1".to_string()]); let c = "-----BEGIN PGP PUBLIC KEY BLOCK-----\n\ Version: GnuPG v1\n\ \n\ aGVsbG8gd29ybGQ=\n\ -----END PGP PUBLIC KEY BLOCK-----\n"; let mut dec = Dearmor::new(BufReader::new(c.as_bytes())); let mut res = vec![0u8; 5]; let read = dec.read(&mut res).unwrap(); // first read reads the header assert_eq!(dec.typ, Some(BlockType::PublicKey)); assert_eq!(dec.headers, map); assert_eq!(read, 5); assert_eq!(res.as_slice(), &b"hello"[..]); let read = dec.read(&mut res).unwrap(); assert_eq!(read, 5); assert_eq!(res.as_slice(), &b" worl"[..]); // codespell:ignore worl let read = dec.read(&mut res).unwrap(); assert_eq!(read, 1); assert_eq!(res.as_slice()[0], b'd'); let read = dec.read(&mut res).unwrap(); assert_eq!(read, 0); assert_eq!(res.as_slice()[0], b'd'); // unchanged } #[test] fn test_key_value_pair_single() { assert_eq!( key_value_pair(&b"hello: world\n"[..]).unwrap(), (&b""[..], ("hello", "world")), "single" ); assert_eq!( key_value_pair(&b"hello:\n"[..]).unwrap(), (&b""[..], ("hello", "")), "empty" ); assert_eq!( key_value_pair(&b"hello:\r\n"[..]).unwrap(), (&b""[..], ("hello", "")), "empty" ); assert_eq!( key_value_pair(&b"hello: world\nother content"[..]).unwrap(), (&b"other content"[..], ("hello", "world")), "with rest" ); } #[test] fn test_key_value_pairs_single() { assert_eq!( key_value_pairs(&b"hello: world\ncool: stuff\n"[..]).unwrap(), (&b""[..], vec![("hello", "world"), ("cool", "stuff")]), "single" ); assert_eq!( key_value_pairs(&b"hello:\ncool: stuff\n"[..]).unwrap(), (&b""[..], vec![("hello", ""), ("cool", "stuff")]), "empty" ); assert_eq!( key_value_pairs(&b"hello: world\ncool: stuff\nother content"[..]).unwrap(), ( &b"other content"[..], vec![("hello", "world"), ("cool", "stuff")] ), "with rest" ); } #[test] fn test_key_value_pairs_multiple() { assert_eq!( key_value_pairs(&b"hello: world\nhello: stuff\n"[..]).unwrap(), (&b""[..], vec![("hello", "world"), ("hello", "stuff")]), "single" ); } #[test] fn test_footer_parser() { assert!(footer_parser(b"-----END PGP MESSAGE----").is_err()); assert_eq!( footer_parser(b"-----END PGP PUBLIC KEY BLOCK-----"), Ok((&b""[..], (None, BlockType::PublicKey))) ); assert_eq!( footer_parser(b"-----END PGP PUBLIC KEY BLOCK-----\n"), Ok((&b""[..], (None, BlockType::PublicKey))) ); assert_eq!( footer_parser(b"=-----END PGP PUBLIC KEY BLOCK-----\n"), Ok((&b""[..], (None, BlockType::PublicKey))) ); assert_eq!( footer_parser(b"=4JBj-----END PGP PUBLIC KEY BLOCK-----\r\n"), Ok((&b""[..], (Some(14717027), BlockType::PublicKey))) ); assert_eq!( footer_parser(b"=4JBj\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n"), Ok((&b""[..], (Some(14717027), BlockType::PublicKey))) ); assert_eq!( footer_parser(b"\r\n-----END PGP PUBLIC KEY BLOCK-----\r\n"), Ok((&b""[..], (None, BlockType::PublicKey))) ); assert_eq!( footer_parser(&b"=XyBX\n-----END PGP PUBLIC KEY BLOCK-----\n"[..]), Ok((&b""[..], (Some(6234199), BlockType::PublicKey))) ); assert_eq!( footer_parser(&b"-----END PGP MESSAGE-----\n-----BEGIN PGP MESSAGE-----\n\naGVsbG8gd29ybGQ=\n-----END PGP MESSAGE-----\n"[..]), Ok(( &b"-----BEGIN PGP MESSAGE-----\n\naGVsbG8gd29ybGQ=\n-----END PGP MESSAGE-----\n"[..], (None, BlockType::Message) )), ); } #[test] fn test_hash_header_line() { assert_eq!( hash_header_line(b"Hash: hello,world\n").unwrap(), (&[][..], vec!["hello".to_string(), "world".to_string()]), ); assert_eq!( hash_header_line(b"Hash: hello\n").unwrap(), (&[][..], vec!["hello".to_string()]), ); assert_eq!( hash_header_line(b"Hash: hello\n\n").unwrap(), (&b"\n"[..], vec!["hello".to_string()]), ); } #[test] fn test_armor_headers_lines() { let mut headers = BTreeMap::new(); headers.insert( "Hash".to_string(), vec!["hello".to_string(), "world".to_string()], ); assert_eq!( armor_headers_hash(b"Hash: hello,world\n\n").unwrap(), (&[][..], headers), ); let mut headers = BTreeMap::new(); headers.insert( "Hash".to_string(), vec!["hello".to_string(), "world".to_string(), "cool".to_string()], ); assert_eq!( armor_headers_hash(b"Hash: hello,world\nHash: cool\n\n").unwrap(), (&[][..], headers,), ); } #[test] fn test_regression_long_key_1() { let _ = pretty_env_logger::try_init(); let input = std::fs::read_to_string("./tests/unit-tests/long-key.asc").unwrap(); let (typ, headers, decoded) = parse(&input).unwrap(); assert_eq!(typ, BlockType::PublicKey); assert!(headers.is_empty()); let expected_binary_s: String = std::fs::read_to_string("./tests/unit-tests/long-key.asc.line") .unwrap() .lines() .collect(); let expected_binary = base64::engine::general_purpose::STANDARD .decode(expected_binary_s) .unwrap(); assert_eq!(hex::encode(expected_binary), hex::encode(decoded)); } #[test] fn test_regression_long_key_2_1() { let _ = pretty_env_logger::try_init(); let input = std::fs::read_to_string("./tests/unit-tests/long-key-2.asc").unwrap(); let (typ, headers, decoded) = parse(&input).unwrap(); assert_eq!(typ, BlockType::PublicKey); assert!(headers.is_empty()); let expected_binary_s: String = std::fs::read_to_string("./tests/unit-tests/long-key-2.asc.line") .unwrap() .lines() .collect(); let expected_binary = base64::engine::general_purpose::STANDARD .decode(expected_binary_s) .unwrap(); assert_eq!(hex::encode(expected_binary), hex::encode(decoded)); } #[test] fn test_regression_long_key_2_2() { let _ = pretty_env_logger::try_init(); let input = std::fs::read_to_string("./tests/unit-tests/long-key-2.asc").unwrap(); let (typ, headers, decoded) = parse_raw(&input).unwrap(); assert_eq!(typ, BlockType::PublicKey); assert!(headers.is_empty()); let expected_binary_s: String = std::fs::read_to_string("./tests/unit-tests/long-key-2.asc.line") .unwrap() .lines() .collect(); let expected_binary = base64::engine::general_purpose::STANDARD .decode(expected_binary_s) .unwrap(); assert_eq!(hex::encode(expected_binary), hex::encode(decoded)); } } pgp-0.15.0/src/armor/writer.rs000064400000000000000000000134011046102023000142650ustar 00000000000000use std::hash::Hasher; use std::io::Write; use base64::engine::{general_purpose, Engine as _}; use crc24::Crc24Hasher; use generic_array::typenum::U64; use crate::armor::BlockType; use crate::errors::Result; use crate::line_writer::{LineBreak, LineWriter}; use crate::ser::Serialize; use crate::util::TeeWriter; use super::Headers; pub fn write( source: &impl Serialize, typ: BlockType, writer: &mut impl Write, headers: Option<&Headers>, include_checksum: bool, ) -> Result<()> { write_header(writer, typ, headers)?; // write body let mut crc_hasher = include_checksum.then(Crc24Hasher::new); write_body(writer, source, crc_hasher.as_mut())?; write_footer(writer, typ, crc_hasher)?; Ok(()) } fn write_header(writer: &mut impl Write, typ: BlockType, headers: Option<&Headers>) -> Result<()> { // write armor header writer.write_all(&b"-----BEGIN "[..])?; typ.to_writer(writer)?; writer.write_all(&b"-----\n"[..])?; // write armor headers if let Some(headers) = headers { for (key, values) in headers.iter() { for value in values { writer.write_all(key.as_bytes())?; writer.write_all(&b": "[..])?; writer.write_all(value.as_bytes())?; writer.write_all(&b"\n"[..])?; } } } writer.write_all(&b"\n"[..])?; writer.flush()?; Ok(()) } fn write_body( writer: &mut impl Write, source: &impl Serialize, crc_hasher: Option<&mut Crc24Hasher>, ) -> Result<()> { { let mut line_wrapper = LineWriter::<_, U64>::new(writer.by_ref(), LineBreak::Lf); let mut enc = ZeroWrapper(base64::write::EncoderWriter::new( &mut line_wrapper, &general_purpose::STANDARD, )); if let Some(crc_hasher) = crc_hasher { let mut tee = TeeWriter::new(crc_hasher, &mut enc); source.to_writer(&mut tee)?; } else { source.to_writer(&mut enc)?; } } Ok(()) } fn write_footer( writer: &mut impl Write, typ: BlockType, crc_hasher: Option, ) -> Result<()> { // write crc if let Some(crc_hasher) = crc_hasher { writer.write_all(b"=")?; let crc = crc_hasher.finish() as u32; let crc_buf = [ // (crc >> 24) as u8, (crc >> 16) as u8, (crc >> 8) as u8, crc as u8, ]; let crc_enc = general_purpose::STANDARD.encode(crc_buf); writer.write_all(crc_enc.as_bytes())?; writer.write_all(&b"\n"[..])?; } // write footer writer.write_all(&b"-----END "[..])?; typ.to_writer(writer)?; writer.write_all(&b"-----\n"[..])?; Ok(()) } /// Wrapper to deal with the special way the base64 encoder works. /// Otherwise we can't use `write_all`. /// /// Ref https://github.com/marshallpierce/rust-base64/issues/148 struct ZeroWrapper(W); impl std::io::Write for ZeroWrapper { fn write(&mut self, buf: &[u8]) -> std::io::Result { self.0.write(buf) } fn write_all(&mut self, mut buf: &[u8]) -> std::io::Result<()> { while !buf.is_empty() { match self.write(buf) { Ok(0) => {} Ok(n) => buf = &buf[n..], Err(ref e) if e.kind() == std::io::ErrorKind::Interrupted => {} Err(e) => return Err(e), } } Ok(()) } fn flush(&mut self) -> std::io::Result<()> { self.0.flush() } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; use std::io; struct TestSource { content: Vec, } impl Serialize for TestSource { fn to_writer(&self, w: &mut W) -> Result<()> { w.write_all(&self.content).unwrap(); Ok(()) } } impl TestSource { pub fn new(content: Vec) -> Self { TestSource { content } } } #[test] fn writes_no_doubleline() { let rng = &mut XorShiftRng::seed_from_u64(0); for i in 2..1024 { let buf: Vec = (0..i).map(|_| rng.gen()).collect(); let source = TestSource::new(buf); let mut dest = Vec::new(); write(&source, BlockType::Message, &mut dest, None, true).unwrap(); let dest_str = std::str::from_utf8(&dest).unwrap(); let lines = dest_str.lines().collect::>(); assert_eq!(lines[0], "-----BEGIN PGP MESSAGE-----"); assert!( !lines[lines.len() - 3].is_empty(), "last line must not be empty" ); assert_eq!( lines[lines.len() - 2].len(), 5, "invalid checksum line: '{}'", lines[lines.len() - 2] ); assert_eq!(lines[lines.len() - 1], "-----END PGP MESSAGE-----"); } } #[test] fn writes_no_checksum() { let mut rng = XorShiftRng::seed_from_u64(0); for i in 2..1024 { let buf: Vec = (0..i).map(|_| rng.gen()).collect(); let source = TestSource::new(buf); let mut dest = Vec::new(); write(&source, BlockType::Message, &mut dest, None, false).unwrap(); let dest_str = std::str::from_utf8(&dest).unwrap(); let lines = dest_str.lines().collect::>(); assert_eq!(lines[0], "-----BEGIN PGP MESSAGE-----"); assert!( !lines[lines.len() - 2].is_empty(), "last line must not be empty" ); assert_eq!(lines[lines.len() - 1], "-----END PGP MESSAGE-----"); } } } pgp-0.15.0/src/base64_decoder.rs000064400000000000000000000222031046102023000144020ustar 00000000000000//! # base64 decoder module use std::io::{self, BufRead, Read}; use base64::engine::{general_purpose::GeneralPurpose, Engine}; use buffer_redux::{BufReader, Buffer}; const BUF_SIZE: usize = 1024; const BUF_CAPACITY: usize = BUF_SIZE / 4 * 3; const ENGINE: GeneralPurpose = base64::engine::general_purpose::STANDARD; /// Decodes Base64 from the supplied reader. #[derive(Debug)] pub struct Base64Decoder { /// The inner Read instance we are reading bytes from. inner: BufReader, /// leftover decoded output out: Buffer, out_buffer: [u8; BUF_CAPACITY], /// Memorize if we had an error, so we can return it on calls to read again. err: Option, } impl Base64Decoder { /// Creates a new `Base64Decoder`. pub fn new(input: R) -> Self { Base64Decoder { inner: BufReader::with_capacity(BUF_SIZE, input), out: Buffer::with_capacity(BUF_CAPACITY), out_buffer: [0u8; BUF_CAPACITY], err: None, } } pub fn into_inner_with_buffer(self) -> (R, Buffer) { self.inner.into_inner_with_buffer() } } impl Read for Base64Decoder { fn read(&mut self, into: &mut [u8]) -> io::Result { // take care of leftovers if !self.out.is_empty() { let len = self.out.copy_to_slice(into); return Ok(len); } // if we had an error before, return it if let Some(ref err) = self.err { return Err(copy_err(err)); } // fill our buffer if self.inner.buf_len() < 4 { let b = &mut self.inner; if let Err(err) = b.read_into_buf() { self.err = Some(copy_err(&err)); return Err(err); } } // short circuit empty read if self.inner.buf_len() == 0 { return Ok(0); } let nr = self.inner.buf_len() / 4 * 4; let nw = self.inner.buf_len() / 4 * 3; let (consumed, written) = if nw > into.len() { let (consumed, nw) = try_decode_engine_slice(&self.inner.buffer()[..nr], &mut self.out_buffer[..]); let n = std::cmp::min(nw, into.len()); let t = &self.out_buffer[0..nw]; let (t1, t2) = t.split_at(n); // copy what we have into `into` into[0..n].copy_from_slice(t1); // store the rest self.out.copy_from_slice(t2); (consumed, n) } else { try_decode_engine_slice(&self.inner.buffer()[..nr], into) }; self.inner.consume(consumed); Ok(written) } } /// Tries to decode as much of the given slice as possible. /// Returns the amount written and consumed. fn try_decode_engine_slice>( input: &T, output: &mut [u8], ) -> (usize, usize) { let input_bytes = input.as_ref(); let mut n = input_bytes.len(); while n > 0 { match ENGINE.decode_slice(&input_bytes[..n], output) { Ok(size) => { return (n, size); } Err(_) => { if n % 4 != 0 { n -= n % 4 } else { n -= 4 } } } } (0, 0) } // why, why why???? fn copy_err(err: &io::Error) -> io::Error { io::Error::new(err.kind(), err.to_string()) } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; use crate::base64_reader::Base64Reader; fn test_roundtrip(cap: usize, n: usize, insert_lines: bool) { let rng = &mut XorShiftRng::from_seed([ 0x3, 0x8, 0x3, 0xe, 0x3, 0x8, 0x3, 0xe, 0x3, 0x8, 0x3, 0xe, 0x3, 0x8, 0x3, 0xe, ]); for i in 0..n { let data: Vec = (0..i).map(|_| rng.gen()).collect(); let mut encoded_data = ENGINE.encode(&data); if insert_lines { for j in 0..i { // insert line break with a 1/10 chance if rng.gen_ratio(1, 10) { if j >= encoded_data.len() { encoded_data.push('\n'); } else { encoded_data.insert(j, '\n'); } } } println!("testing: \n{}", encoded_data); let mut r = Base64Decoder::new(Base64Reader::new( std::io::BufReader::with_capacity(cap, encoded_data.as_bytes()), )); let mut out = Vec::new(); r.read_to_end(&mut out).unwrap(); assert_eq!(data, out); } else { println!("testing: \n{}", encoded_data); let mut r = Base64Decoder::new(std::io::BufReader::with_capacity( cap, encoded_data.as_bytes(), )); let mut out = Vec::new(); r.read_to_end(&mut out).unwrap(); assert_eq!(data, out); } } } #[test] fn test_base64_decoder_roundtrip_standard_1000_no_newlines() { test_roundtrip(1, 1000, false); test_roundtrip(2, 1000, false); test_roundtrip(8, 1000, false); test_roundtrip(256, 1000, false); test_roundtrip(1024, 1000, false); test_roundtrip(8 * 1024, 1000, false); } #[test] fn test_base64_decoder_roundtrip_standard_1000_newlines() { test_roundtrip(1, 1000, true); test_roundtrip(2, 1000, true); test_roundtrip(8, 1000, true); test_roundtrip(256, 1000, true); test_roundtrip(1024, 1000, true); test_roundtrip(8 * 1024, 1000, true); } #[test] fn test_base64_decoder_with_base64_reader() { let source = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum."; let data = "TG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2Qgd\n\ GVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQgbWluaW0\n\ gdmVuaWFtLCBxdWlz\n\ IG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZW\n\ EgY29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2\n\ xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF\n\ 0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZm\n\ ZpY2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLg=="; let reader = Base64Reader::new(data.as_bytes()); let mut reader = Base64Decoder::new(reader); let mut res = String::new(); reader.read_to_string(&mut res).unwrap(); assert_eq!(source, res); } #[test] fn test_base64_decoder_with_end_base() { let data = "TG9yZW0g\n=TG9y\n-----hello"; let br = Base64Reader::new(data.as_bytes()); let mut reader = Base64Decoder::new(br); let mut res = vec![0u8; 32]; assert_eq!(reader.read(&mut res).unwrap(), 6); assert_eq!(&res[0..6], b"Lorem "); let (r, buffer) = reader.into_inner_with_buffer(); let mut r = r.into_inner(); assert_eq!(buffer.buf(), b"=TG9y"); let mut rest = Vec::new(); assert_eq!(r.read_to_end(&mut rest).unwrap(), 10); assert_eq!(&rest, b"-----hello"); } #[test] fn test_base64_decoder_with_end_one_linebreak() { let data = "TG9yZW0g\n=TG9y-----hello"; let br = Base64Reader::new(data.as_bytes()); let mut reader = Base64Decoder::new(br); let mut res = vec![0u8; 32]; assert_eq!(reader.read(&mut res).unwrap(), 6); assert_eq!(&res[0..6], b"Lorem "); let (r, buffer) = reader.into_inner_with_buffer(); let mut r = r.into_inner(); assert_eq!(buffer.buf(), b"=TG9y"); let mut rest = Vec::new(); assert_eq!(r.read_to_end(&mut rest).unwrap(), 10); assert_eq!(&rest, b"-----hello"); } #[test] fn test_base64_decoder_with_end_no_linebreak() { let data = "TG9yZW0g=TG9y-----hello"; let br = Base64Reader::new(data.as_bytes()); let mut reader = Base64Decoder::new(br); let mut res = vec![0u8; 32]; assert_eq!(reader.read(&mut res).unwrap(), 6); assert_eq!(&res[0..6], b"Lorem "); let (r, buffer) = reader.into_inner_with_buffer(); let mut r = r.into_inner(); assert_eq!(buffer.buf(), b"=TG9y"); let mut rest = Vec::new(); assert_eq!(r.read_to_end(&mut rest).unwrap(), 10); assert_eq!(&rest, b"-----hello"); } } pgp-0.15.0/src/base64_reader.rs000064400000000000000000000131311046102023000142370ustar 00000000000000//! # base64 reader module use std::io; use std::io::prelude::*; use crate::util::is_base64_token; /// Reads base64 values from a given byte input, stops once it detects the first non base64 char. #[derive(Debug)] pub struct Base64Reader { inner: R, } impl Base64Reader { /// Creates a new `Base64Reader`. pub fn new(input: R) -> Self { Base64Reader { inner: input } } /// Consume `self` and return the inner reader. pub fn into_inner(self) -> R { self.inner } } impl Read for Base64Reader { fn read(&mut self, into: &mut [u8]) -> io::Result { let mut buf = self.inner.fill_buf()?; if buf.is_empty() { return Ok(0); } let mut buf_i = 0; let mut n = 0; loop { // skip new lines while buf[buf_i] == b'\r' || buf[buf_i] == b'\n' { buf_i += 1; if buf_i == buf.len() { break; } } if buf_i < buf.len() { if !is_base64_token(buf[buf_i]) { break; } into[n] = buf[buf_i]; n += 1; buf_i += 1; if n == into.len() { break; } } if buf_i == buf.len() { self.inner.consume(buf_i); buf = self.inner.fill_buf()?; buf_i = 0; if buf.is_empty() { break; } } } self.inner.consume(buf_i); Ok(n) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; fn read_exact(data: &[u8], size: usize) -> Vec { let mut r = Base64Reader::new(data); let mut buf = vec![0; size]; r.read_exact(&mut buf).unwrap(); buf } #[test] fn test_base64_reader_n_lineending() { let data = b"mQGiBEigu7MRBAD7gZJzevtYLB3c1pE7uMwu+zHzGGJDrEyEaz0lYTAaJ2YXmJ1+\n\ IvmvBI/iMrRqpFLR35uUcz2UHgJtIP+xenCF4WIhHv5wg3XvBvTgG/ooZaj1gtez\n\ miXV2bXTlEMxSqsZKvkieQRrMv3eV2VYhgaPvp8xJhl+xs8eVhlrmMv94wCgzWUw\n\ BrOICLPF5lANocvkqGNO3UUEAMH7GguhvXNlIUncqOpHC0N4FGPirPh/6nYxa9iZ\n\ kQEEg6mB6wPkaHZ5ddpagzFC6AncoOrhX5HPin9T6+cPhdIIQMogJOqDZ4xsAYCY\n\ KwjkoLQjfMdS5CYrMihFm4guNMKpWPfCe/T4TU7tFmTug8nnAIPFh2BNm8/EqHpg"; // no new lines assert_eq!(read_exact(data, 10), &data[0..10]); // one new line assert_eq!(read_exact(data, 66), [&data[0..64], &data[65..67]].concat()); // two new lines assert_eq!( read_exact(data, 130), [&data[0..64], &data[65..129], &data[130..132]].concat() ); // all assert_eq!( read_exact(data, 6 * 64), [ &data[0..64], &data[65..129], &data[130..194], &data[195..259], &data[260..324], &data[325..], ] .concat() ); let data_with_garbage = b"KwjkoLQjfMdS5CYrMihFm4guNMKpWPfCe\n--"; assert_eq!( read_exact(&data_with_garbage[..], 10), &data_with_garbage[0..10] ); assert_eq!( read_exact(&data_with_garbage[..], 33), &data_with_garbage[0..33], ); { let mut r = Base64Reader::new(&data_with_garbage[..]); let mut buf = vec![0; 35]; assert_eq!(r.read(&mut buf).unwrap(), 33); assert_eq!(&buf[0..33], &data_with_garbage[0..33]); } { let c = &b"Kw--"[..]; let mut r = Base64Reader::new(c); let mut buf = vec![0; 5]; assert_eq!(r.read(&mut buf).unwrap(), 2); assert_eq!(buf, vec![b'K', b'w', 0, 0, 0]); } { // Checksum at the end of ascii armor let c = &b"Kwjk\n=Kwjk"[..]; let mut r = Base64Reader::new(c); let mut buf = vec![0; 10]; assert_eq!(r.read(&mut buf).unwrap(), 9); assert_eq!(&buf[..9], b"Kwjk=Kwjk"); } { // Leave things alone that are not us let c = &b"Kwjk\n-----BEGIN"[..]; let mut r = Base64Reader::new(c); let mut buf = vec![0; 100]; assert_eq!(r.read(&mut buf).unwrap(), 4); assert_eq!(&buf[..4], b"Kwjk"); assert_eq!(&buf[4..], &vec![0u8; 96][..]); } { // Leave things alone that are not us let c = &b"Kwjk\n-----BEGIN-----\nKwjk\n"[..]; let mut r = Base64Reader::new(c); let mut buf = vec![0; 100]; assert_eq!(r.read(&mut buf).unwrap(), 4); assert_eq!(&buf[..4], b"Kwjk"); assert_eq!(&buf[4..], &vec![0u8; 96][..]); } } #[test] fn test_regression_long_key() { // skip first line ---BEGIN let input: String = std::fs::read_to_string("./tests/unit-tests/long-key.asc") .unwrap() .lines() .skip(1) .collect(); let mut r = Base64Reader::new(input.as_bytes()); let mut out = Vec::new(); r.read_to_end(&mut out).unwrap(); let input_expected = std::fs::read_to_string("./tests/unit-tests/long-key.asc.expected").unwrap(); let expected: String = input_expected.lines().collect(); assert_eq!(std::str::from_utf8(&out).unwrap(), expected); } } pgp-0.15.0/src/composed/any.rs000064400000000000000000000053201046102023000142320ustar 00000000000000use std::io::{BufRead, Read}; use buffer_redux::BufReader; use crate::{ armor::{self, BlockType, Dearmor}, cleartext::CleartextSignedMessage, errors::Result, Deserializable, Message, SignedPublicKey, SignedSecretKey, StandaloneSignature, }; /// A flexible representation of what can be represented in an armor file. #[derive(Debug, Clone, PartialEq, Eq)] pub enum Any { Cleartext(CleartextSignedMessage), PublicKey(SignedPublicKey), SecretKey(SignedSecretKey), Message(Message), Signature(StandaloneSignature), } impl Any { /// Parse armored ascii data. pub fn from_armor(bytes: impl Read) -> Result<(Self, armor::Headers)> { Self::from_armor_buf(BufReader::new(bytes)) } /// Parse a single armor encoded composition. pub fn from_string(input: &str) -> Result<(Self, armor::Headers)> { Self::from_armor_buf(input.as_bytes()) } /// Parse armored ascii data. pub fn from_armor_buf(input: R) -> Result<(Self, armor::Headers)> { let dearmor = armor::Dearmor::new(input); let limit = dearmor.max_buffer_limit(); let (typ, headers, has_leading_data, rest) = dearmor.read_only_header()?; match typ { // Standard PGP types BlockType::PublicKey => { let dearmor = Dearmor::after_header(typ, headers.clone(), rest, limit); let key = SignedPublicKey::from_bytes(dearmor)?; Ok((Self::PublicKey(key), headers)) } BlockType::PrivateKey => { let dearmor = Dearmor::after_header(typ, headers.clone(), rest, limit); let key = SignedSecretKey::from_bytes(dearmor)?; Ok((Self::SecretKey(key), headers)) } BlockType::Message => { let dearmor = Dearmor::after_header(typ, headers.clone(), rest, limit); let msg = Message::from_bytes(dearmor)?; Ok((Self::Message(msg), headers)) } BlockType::Signature => { let dearmor = Dearmor::after_header(typ, headers.clone(), rest, limit); let sig = StandaloneSignature::from_bytes(dearmor)?; Ok((Self::Signature(sig), headers)) } BlockType::CleartextMessage => { ensure!( !has_leading_data, "must not have leading data for a cleartext message" ); let (sig, headers) = CleartextSignedMessage::from_armor_after_header(rest, headers, limit)?; Ok((Self::Cleartext(sig), headers)) } _ => unimplemented_err!("unsupported block type: {}", typ), } } } pgp-0.15.0/src/composed/cleartext.rs000064400000000000000000000476701046102023000154540ustar 00000000000000//! Implements Cleartext Signature Framework use std::collections::HashSet; use std::io::{BufRead, Read}; use buffer_redux::BufReader; use chrono::SubsecRound; use log::debug; use crate::armor::{self, header_parser, read_from_buf, BlockType, Headers}; use crate::crypto::hash::HashAlgorithm; use crate::errors::Result; use crate::line_writer::LineBreak; use crate::normalize_lines::Normalized; use crate::packet::{SignatureConfig, SignatureType, Subpacket, SubpacketData}; use crate::types::{KeyVersion, PublicKeyTrait, SecretKeyTrait}; use crate::{ArmorOptions, Deserializable, Signature, StandaloneSignature, MAX_BUFFER_SIZE}; /// Implementation of a Cleartext Signed Message. /// /// Ref #[derive(Debug, Clone, PartialEq, Eq)] pub struct CleartextSignedMessage { /// Normalized and dash-escaped representation of the signed text. /// This is exactly the format that gets serialized in cleartext format. /// /// This representation retains the line-ending encoding of the input material. csf_encoded_text: String, /// Hash algorithms that are used in the signature(s) in this message hashes: Vec, /// The actual signature(s). signatures: Vec, } impl CleartextSignedMessage { /// Construct a new cleartext message and sign it using the given key. pub fn new( text: &str, config: SignatureConfig, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where F: FnOnce() -> String, { let signature_text: Vec = Normalized::new(text.bytes(), LineBreak::Crlf).collect(); let hash = config.hash_alg; let signature = config.sign(key, key_pw, &signature_text[..])?; let signature = StandaloneSignature::new(signature); Ok(Self { csf_encoded_text: dash_escape(text), hashes: vec![hash], signatures: vec![signature], }) } /// Sign the given text. pub fn sign(rng: R, text: &str, key: &impl SecretKeyTrait, key_pw: F) -> Result where R: rand::Rng + rand::CryptoRng, F: FnOnce() -> String, { let key_id = key.key_id(); let algorithm = key.algorithm(); let hash_algorithm = key.hash_alg(); let hashed_subpackets = vec![ Subpacket::regular(SubpacketData::IssuerFingerprint(key.fingerprint())), Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), )), ]; let unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(key_id))]; let mut config = match key.version() { KeyVersion::V4 => SignatureConfig::v4(SignatureType::Text, algorithm, hash_algorithm), KeyVersion::V6 => { SignatureConfig::v6(rng, SignatureType::Text, algorithm, hash_algorithm)? } v => bail!("unsupported key version {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; Self::new(text, config, key, key_pw) } /// Sign the same message with multiple keys. /// /// The signer function gets invoked with the normalized original text to be signed, /// and needs to produce the individual signatures. pub fn new_many(text: &str, signer: F) -> Result where F: FnOnce(&[u8]) -> Result>, { let signature_text: Vec = Normalized::new(text.bytes(), LineBreak::Crlf).collect(); let raw_signatures = signer(&signature_text[..])?; let mut hashes = HashSet::new(); let mut signatures = Vec::new(); for signature in raw_signatures { hashes.insert(signature.hash_alg()); let signature = StandaloneSignature::new(signature); signatures.push(signature); } Ok(Self { csf_encoded_text: dash_escape(text), hashes: hashes.into_iter().collect(), signatures, }) } /// The signature on the message. pub fn signatures(&self) -> &[StandaloneSignature] { &self.signatures } /// Verify the signature against the normalized cleartext. /// /// On success returns the first signature that verified against this key. pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<&StandaloneSignature> { let nt = self.signed_text(); for signature in &self.signatures { if signature.verify(key, nt.as_bytes()).is_ok() { return Ok(signature); } } bail!("No matching signature found") } /// Verify each signature, potentially against a different key. pub fn verify_many(&self, verifier: F) -> Result<()> where F: Fn(usize, &StandaloneSignature, &[u8]) -> Result<()>, { let nt = self.signed_text(); for (i, signature) in self.signatures.iter().enumerate() { verifier(i, signature, nt.as_bytes())?; } Ok(()) } /// Normalizes the text to the format that was hashed for the signature. /// The output is normalized to "\r\n" line endings. pub fn signed_text(&self) -> String { let unescaped = dash_unescape_and_trim(&self.csf_encoded_text); let normalized: Vec = Normalized::new(unescaped.bytes(), LineBreak::Crlf).collect(); std::str::from_utf8(&normalized) .map(str::to_owned) .expect("csf_encoded_text is UTF8") } /// The "cleartext framework"-encoded (i.e. dash-escaped) form of the message. pub fn text(&self) -> &str { &self.csf_encoded_text } /// Parse from an arbitrary reader, containing the text of the message. pub fn from_armor(bytes: R) -> Result<(Self, Headers)> { Self::from_armor_buf(BufReader::new(bytes), MAX_BUFFER_SIZE) } /// Parse from string, containing the text of the message. pub fn from_string(input: &str) -> Result<(Self, Headers)> { Self::from_armor_buf(input.as_bytes(), MAX_BUFFER_SIZE) } /// Parse from a buffered reader, containing the text of the message. pub fn from_armor_buf(mut b: R, limit: usize) -> Result<(Self, Headers)> { debug!("parsing cleartext message"); // Headers let (typ, headers, has_leading_data) = read_from_buf(&mut b, "cleartext header", limit, header_parser)?; ensure_eq!(typ, BlockType::CleartextMessage, "unexpected block type"); ensure!( !has_leading_data, "must not have leading data for a cleartext message" ); Self::from_armor_after_header(b, headers, limit) } pub fn from_armor_after_header( mut b: R, headers: Headers, limit: usize, ) -> Result<(Self, Headers)> { let hashes = validate_headers(headers)?; debug!("Found Hash headers: {:?}", hashes); // Cleartext Body let (csf_encoded_text, prefix) = read_cleartext_body(&mut b)?; let b = std::io::Cursor::new(prefix).chain(b); // Signatures let mut dearmor = armor::Dearmor::with_limit(b, limit); dearmor.read_header()?; // Safe to unwrap, as read_header succeeded. let typ = dearmor .typ .ok_or_else(|| format_err!("dearmor failed to retrieve armor type"))?; ensure_eq!(typ, BlockType::Signature, "invalid block type"); let signatures = StandaloneSignature::from_bytes_many(&mut dearmor); let signatures = signatures.collect::>()?; let (_, headers, _, b) = dearmor.into_parts(); if has_rest(b)? { bail!("unexpected trailing data"); } Ok(( Self { csf_encoded_text, hashes, signatures, }, headers, )) } pub fn to_armored_writer( &self, writer: &mut impl std::io::Write, opts: ArmorOptions<'_>, ) -> Result<()> { // Header writer.write_all(HEADER_LINE.as_bytes())?; writer.write_all(b"\n")?; // Hashes for hash in &self.hashes { writer.write_all(b"Hash: ")?; writer.write_all(hash.to_string().as_bytes())?; writer.write_all(b"\n")?; } writer.write_all(b"\n")?; // Cleartext body writer.write_all(self.csf_encoded_text.as_bytes())?; writer.write_all(b"\n")?; armor::write( &self.signatures, armor::BlockType::Signature, writer, opts.headers, opts.include_checksum, )?; Ok(()) } pub fn to_armored_bytes(&self, opts: ArmorOptions<'_>) -> Result> { let mut buf = Vec::new(); self.to_armored_writer(&mut buf, opts)?; Ok(buf) } pub fn to_armored_string(&self, opts: ArmorOptions<'_>) -> Result { let res = String::from_utf8(self.to_armored_bytes(opts)?).map_err(|e| e.utf8_error())?; Ok(res) } } fn validate_headers(headers: Headers) -> Result> { let mut hashes = Vec::new(); for (name, values) in headers { ensure_eq!(name, "Hash", "unexpected header"); for value in values { let h: HashAlgorithm = value.parse()?; hashes.push(h); } } Ok(hashes) } /// Dash escape the given text. /// /// This implementation is implicitly agnostic between "\n" and "\r\n" line endings. /// /// Ref fn dash_escape(text: &str) -> String { let mut out = String::new(); for line in text.split_inclusive('\n') { if line.starts_with('-') { out += "- "; } out.push_str(line); } out } /// Undo dash escaping of `text`, and trim space/tabs at the end of lines. /// /// This implementation can handle both "\n" and "\r\n" line endings. fn dash_unescape_and_trim(text: &str) -> String { let mut out = String::new(); for line in text.split_inclusive('\n') { // break each line into "content" and "line ending" let line_end_len = if line.ends_with("\r\n") { 2 } else if line.ends_with('\n') { 1 } else { 0 }; let (content, end) = line.split_at(line.len() - line_end_len); // trim spaces/tabs from the end of line content let trimmed = content.trim_end_matches([' ', '\t']); // strip dash escapes if they exist if let Some(stripped) = trimmed.strip_prefix("- ") { out += stripped; } else { out += trimmed; } // output line ending out += end; } out } /// Does the remaining buffer contain any non-whitespace characters? fn has_rest(mut b: R) -> Result { let mut buf = [0u8; 64]; while b.read(&mut buf)? > 0 { if buf.iter().any(|&c| !char::from(c).is_ascii_whitespace()) { return Ok(true); } } Ok(false) } const HEADER_LINE: &str = "-----BEGIN PGP SIGNED MESSAGE-----"; fn read_cleartext_body(b: &mut B) -> Result<(String, String)> { let mut out = String::new(); loop { let read = b.read_line(&mut out)?; // early end if read == 0 { bail!("unexpected early end"); } // Look at the last line if let Some(pos) = out.rfind("\n-----") { // found our end let rest = out.split_off(pos + 1); // remove trailing line break if let Some(pos) = out.rfind("\r\n") { out.truncate(pos); } else { out.truncate(out.len() - 1); } return Ok((out, rest)); } } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use super::*; use crate::{Any, SignedPublicKey, SignedSecretKey}; #[test] fn test_cleartext_openpgp_1() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/openpgp/samplemsgs/clearsig-1-key-1.asc").unwrap(); let (msg, headers) = CleartextSignedMessage::from_string(&data).unwrap(); assert_eq!(normalize(msg.text()), normalize("You are scrupulously honest, frank, and straightforward. Therefore you\nhave few friends.")); assert_eq!(headers.len(), 1); assert_eq!( headers.get("Version").unwrap(), &vec!["GnuPG v2".to_string()] ); assert_eq!(msg.signatures().len(), 1); roundtrip(&data, &msg, &headers); } #[test] fn test_cleartext_openpgp_2() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/openpgp/samplemsgs/clearsig-2-keys-1.asc").unwrap(); let (msg, headers) = CleartextSignedMessage::from_string(&data).unwrap(); assert_eq!( normalize(msg.text()), normalize("\"The geeks shall inherit the earth.\"\n -- Karl Lehenbauer") ); assert_eq!(headers.len(), 1); assert_eq!( headers.get("Version").unwrap(), &vec!["GnuPG v2".to_string()] ); assert_eq!(msg.signatures().len(), 2); roundtrip(&data, &msg, &headers); } #[test] fn test_cleartext_openpgp_3() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/openpgp/samplemsgs/clearsig-2-keys-2.asc").unwrap(); let (msg, headers) = CleartextSignedMessage::from_string(&data).unwrap(); assert_eq!( normalize(msg.text()), normalize("The very remembrance of my former misfortune proves a new one to me.\n -- Miguel de Cervantes") ); assert_eq!(headers.len(), 1); assert_eq!( headers.get("Version").unwrap(), &vec!["GnuPG v2".to_string()] ); roundtrip(&data, &msg, &headers); } #[test] fn test_cleartext_interop_testsuite_1_good() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/unit-tests/cleartext-msg-01.asc").unwrap(); let (msg, headers) = CleartextSignedMessage::from_string(&data).unwrap(); assert_eq!( normalize(msg.text()), normalize( "- From the grocery store we need:\n\n- - tofu\n- - vegetables\n- - noodles\n\n" ) ); assert!(headers.is_empty()); assert_eq!( msg.signed_text(), "From the grocery store we need:\r\n\r\n- tofu\r\n- vegetables\r\n- noodles\r\n\r\n" ); let key_data = std::fs::read_to_string("./tests/unit-tests/cleartext-key-01.asc").unwrap(); let (key, _) = SignedSecretKey::from_string(&key_data).unwrap(); msg.verify(&key.public_key()).unwrap(); assert_eq!(msg.signatures().len(), 1); roundtrip(&data, &msg, &headers); } #[test] fn test_cleartext_interop_testsuite_1_any() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/unit-tests/cleartext-msg-01.asc").unwrap(); let (msg, headers) = CleartextSignedMessage::from_string(&data).unwrap(); let (any, headers2) = Any::from_string(&data).unwrap(); assert_eq!(headers, headers2); if let Any::Cleartext(msg2) = any { assert_eq!(msg, msg2); } else { panic!("got unexpected type of any: {:?}", any); } } #[test] fn test_cleartext_interop_testsuite_1_fail() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/unit-tests/cleartext-msg-01-fail.asc").unwrap(); let err = CleartextSignedMessage::from_string(&data).unwrap_err(); dbg!(err); let err = Any::from_string(&data).unwrap_err(); dbg!(err); } #[test] fn test_cleartext_interop_testsuite_2_fail() { let _ = pretty_env_logger::try_init(); let data = std::fs::read_to_string("./tests/unit-tests/cleartext-msg-02-fail.asc").unwrap(); let err = CleartextSignedMessage::from_string(&data).unwrap_err(); dbg!(err); let err = Any::from_string(&data).unwrap_err(); dbg!(err); } fn roundtrip(expected: &str, msg: &CleartextSignedMessage, headers: &Headers) { let expected = normalize(expected); let out = msg.to_armored_string(Some(headers).into()).unwrap(); let out = normalize(out); assert_eq!(expected, out); } fn normalize(a: impl AsRef) -> String { a.as_ref().replace("\r\n", "\n").replace('\r', "\n") } #[test] fn test_cleartext_body() { let mut data = std::io::Cursor::new(b"-- hello\n--world\n-----bla"); assert_eq!( read_cleartext_body(&mut data).unwrap(), ("-- hello\n--world".to_string(), "-----bla".to_string()), ); let mut data = std::io::Cursor::new(b"-- hello\r\n--world\r\n-----bla"); assert_eq!( read_cleartext_body(&mut data).unwrap(), ("-- hello\r\n--world".to_string(), "-----bla".to_string()), ); } #[test] fn test_dash_escape() { let input = "From the grocery store we need: - tofu - vegetables - noodles "; let expected = "From the grocery store we need: - - tofu - - vegetables - - noodles "; assert_eq!(dash_escape(input), expected); } #[test] fn test_dash_unescape_and_trim() { let input = "From the grocery store we need: - - tofu\u{20}\u{20} - - vegetables\t - - noodles "; let expected = "From the grocery store we need: - tofu - vegetables - noodles "; assert_eq!(dash_unescape_and_trim(input), expected); } #[test] fn test_sign() { let mut rng = ChaCha8Rng::seed_from_u64(0); let key_data = std::fs::read_to_string("./tests/unit-tests/cleartext-key-01.asc").unwrap(); let (key, _) = SignedSecretKey::from_string(&key_data).unwrap(); let msg = CleartextSignedMessage::sign( &mut rng, "hello\n-world-what-\nis up\n", &key, String::new, ) .unwrap(); msg.verify(&key.public_key()).unwrap(); } #[test] fn test_sign_no_newline() { const MSG: &str = "message without newline at the end"; let mut rng = ChaCha8Rng::seed_from_u64(0); let key_data = std::fs::read_to_string("./tests/unit-tests/cleartext-key-01.asc").unwrap(); let (key, _) = SignedSecretKey::from_string(&key_data).unwrap(); let msg = CleartextSignedMessage::sign(&mut rng, MSG, &key, String::new).unwrap(); assert_eq!(msg.signed_text(), MSG); msg.verify(&key.public_key()).unwrap(); } #[test] fn test_load_big_csf() { let msg_data = std::fs::read_to_string("./tests/unit-tests/csf-puppet/InRelease").unwrap(); // FIXME: this fails to read -> buffer_redux problem!? let (_msg, _) = CleartextSignedMessage::from_armor(msg_data.as_bytes()).unwrap(); } #[test] fn test_verify_csf_puppet() { // test data via https://github.com/rpgp/rpgp/issues/424 let msg_data = std::fs::read_to_string("./tests/unit-tests/csf-puppet/InRelease").unwrap(); let (Any::Cleartext(msg), headers) = Any::from_string(&msg_data).unwrap() else { panic!("couldn't read msg") }; // superficially look at message assert_eq!(headers.len(), 0); assert_eq!(msg.signatures().len(), 1); roundtrip(&msg_data, &msg, &headers); // validate signature let cert_data = std::fs::read_to_string("./tests/unit-tests/csf-puppet/DEB-GPG-KEY-puppet-20250406") .unwrap(); let (cert, _) = SignedPublicKey::from_string(&cert_data).unwrap(); msg.verify(&cert).expect("verify"); } } pgp-0.15.0/src/composed/key/builder.rs000064400000000000000000000754431046102023000156760ustar 00000000000000use std::time::Duration; use chrono::SubsecRound; use derive_builder::Builder; use rand::{CryptoRng, Rng}; use smallvec::SmallVec; use crate::composed::{KeyDetails, SecretKey, SecretSubkey}; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::ecc_curve::ECCCurve; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::crypto::{dsa, ecdh, ecdsa, eddsa, rsa, x25519}; use crate::errors::Result; use crate::packet::{self, KeyFlags, UserAttribute, UserId}; use crate::types::{self, CompressionAlgorithm, PublicParams, RevocationKey, S2kParams}; #[derive(Debug, PartialEq, Eq, Builder)] #[builder(build_fn(validate = "Self::validate"))] pub struct SecretKeyParams { key_type: KeyType, // -- Keyflags #[builder(default)] can_sign: bool, #[builder(default)] can_certify: bool, #[builder(default)] can_encrypt: bool, // -- Preferences /// List of symmetric algorithms that indicate which algorithms the key holder prefers to use. #[builder(default)] preferred_symmetric_algorithms: SmallVec<[SymmetricKeyAlgorithm; 8]>, /// List of hash algorithms that indicate which algorithms the key holder prefers to use. #[builder(default)] preferred_hash_algorithms: SmallVec<[HashAlgorithm; 8]>, /// List of compression algorithms that indicate which algorithms the key holder prefers to use. #[builder(default)] preferred_compression_algorithms: SmallVec<[CompressionAlgorithm; 8]>, #[builder(default)] preferred_aead_algorithms: SmallVec<[(SymmetricKeyAlgorithm, AeadAlgorithm); 4]>, #[builder(default)] revocation_key: Option, #[builder] primary_user_id: String, #[builder(default)] user_ids: Vec, #[builder(default)] user_attributes: Vec, #[builder(default)] passphrase: Option, #[builder(default)] s2k: Option, #[builder(default = "chrono::Utc::now().trunc_subsecs(0)")] created_at: chrono::DateTime, #[builder(default)] packet_version: types::Version, #[builder(default)] version: types::KeyVersion, #[builder(default)] expiration: Option, #[builder(default)] subkeys: Vec, } #[derive(Debug, Clone, PartialEq, Eq, Builder)] pub struct SubkeyParams { key_type: KeyType, #[builder(default)] can_sign: bool, #[builder(default)] can_certify: bool, #[builder(default)] can_encrypt: bool, #[builder(default)] can_authenticate: bool, #[builder(default)] user_ids: Vec, #[builder(default)] user_attributes: Vec, #[builder(default)] passphrase: Option, #[builder(default)] s2k: Option, #[builder(default = "chrono::Utc::now().trunc_subsecs(0)")] created_at: chrono::DateTime, #[builder(default)] packet_version: types::Version, #[builder(default)] version: types::KeyVersion, #[builder(default)] expiration: Option, } impl SecretKeyParamsBuilder { fn validate(&self) -> std::result::Result<(), String> { match &self.key_type { Some(KeyType::Rsa(size)) => { if *size < 2048 { return Err("Keys with less than 2048bits are considered insecure".into()); } } Some(KeyType::EdDSALegacy) => { if let Some(can_encrypt) = self.can_encrypt { if can_encrypt { return Err("EdDSA can only be used for signing keys".into()); } } } Some(KeyType::ECDSA(curve)) => { if let Some(can_encrypt) = self.can_encrypt { if can_encrypt { return Err("ECDSA can only be used for signing keys".into()); } }; match curve { ECCCurve::P256 | ECCCurve::P384 | ECCCurve::P521 | ECCCurve::Secp256k1 => {} _ => return Err(format!("Curve {} is not supported for ECDSA", curve.name())), } } Some(KeyType::ECDH(_)) => { if let Some(can_sign) = self.can_sign { if can_sign { return Err("ECDH can only be used for encryption keys".into()); } } } Some(KeyType::Dsa(_)) => { if let Some(can_encrypt) = self.can_encrypt { if can_encrypt { return Err("DSA can only be used for signing keys".into()); } } } _ => {} } Ok(()) } pub fn user_id>(&mut self, value: VALUE) -> &mut Self { if let Some(ref mut user_ids) = self.user_ids { user_ids.push(value.into()); } else { self.user_ids = Some(vec![value.into()]); } self } pub fn subkey>(&mut self, value: VALUE) -> &mut Self { if let Some(ref mut subkeys) = self.subkeys { subkeys.push(value.into()); } else { self.subkeys = Some(vec![value.into()]); } self } } impl SecretKeyParams { pub fn generate(self, mut rng: R) -> Result { let passphrase = self.passphrase; let s2k = self .s2k .unwrap_or_else(|| S2kParams::new_default(&mut rng, self.version)); let (public_params, secret_params) = self.key_type.generate(&mut rng)?; let mut primary_key = packet::SecretKey::new( packet::PublicKey::new( self.packet_version, self.version, self.key_type.to_alg(), self.created_at, self.expiration.map(|v| v.as_secs() as u16), public_params, )?, secret_params, ); if let Some(passphrase) = passphrase { primary_key.set_password_with_s2k(|| passphrase, s2k)?; } let mut keyflags = KeyFlags::default(); keyflags.set_certify(self.can_certify); keyflags.set_encrypt_comms(self.can_encrypt); keyflags.set_encrypt_storage(self.can_encrypt); keyflags.set_sign(self.can_sign); Ok(SecretKey::new( primary_key, KeyDetails::new( UserId::from_str(Default::default(), &self.primary_user_id), self.user_ids .iter() .map(|m| UserId::from_str(Default::default(), m)) .collect(), self.user_attributes, keyflags, self.preferred_symmetric_algorithms, self.preferred_hash_algorithms, self.preferred_compression_algorithms, self.preferred_aead_algorithms, self.revocation_key, ), Default::default(), self.subkeys .into_iter() .map(|subkey| { let passphrase = subkey.passphrase; let s2k = subkey .s2k .unwrap_or_else(|| S2kParams::new_default(&mut rng, subkey.version)); let (public_params, secret_params) = subkey.key_type.generate(&mut rng)?; let mut keyflags = KeyFlags::default(); keyflags.set_certify(subkey.can_certify); keyflags.set_encrypt_comms(subkey.can_encrypt); keyflags.set_encrypt_storage(subkey.can_encrypt); keyflags.set_sign(subkey.can_sign); keyflags.set_authentication(subkey.can_authenticate); let mut sub = packet::SecretSubkey::new( packet::PublicSubkey::new( subkey.packet_version, subkey.version, subkey.key_type.to_alg(), subkey.created_at, subkey.expiration.map(|v| v.as_secs() as u16), public_params, )?, secret_params, ); if let Some(passphrase) = passphrase { sub.set_password_with_s2k(|| passphrase, s2k)?; } Ok(SecretSubkey::new(sub, keyflags)) }) .collect::>>()?, )) } } #[derive(Clone, Debug, PartialEq, Eq)] pub enum KeyType { /// Encryption & Signing with RSA and the given bitsize. Rsa(u32), /// Encrypting with ECDH ECDH(ECCCurve), /// Signing with Curve25519, legacy format (deprecated in RFC 9580) EdDSALegacy, /// Signing with ECDSA ECDSA(ECCCurve), /// Signing with DSA for the given bitsize. Dsa(DsaKeySize), /// Signing with Ed25519 Ed25519, /// Encrypting with X25519 X25519, /// Encrypting with X448 #[cfg(feature = "unstable-curve448")] X448, } #[derive(Clone, Debug, Copy, PartialEq, Eq)] #[repr(u32)] pub enum DsaKeySize { /// DSA parameter size constant: L = 1024, N = 160 B1024 = 1024, /// DSA parameter size constant: L = 2048, N = 256 B2048 = 2048, /// DSA parameter size constant: L = 3072, N = 256 B3072 = 3072, } impl From for dsa::KeySize { fn from(value: DsaKeySize) -> Self { match value { #[allow(deprecated)] DsaKeySize::B1024 => dsa::KeySize::DSA_1024_160, DsaKeySize::B2048 => dsa::KeySize::DSA_2048_256, DsaKeySize::B3072 => dsa::KeySize::DSA_3072_256, } } } impl KeyType { pub fn to_alg(&self) -> PublicKeyAlgorithm { match self { KeyType::Rsa(_) => PublicKeyAlgorithm::RSA, KeyType::ECDH(_) => PublicKeyAlgorithm::ECDH, KeyType::EdDSALegacy => PublicKeyAlgorithm::EdDSALegacy, KeyType::ECDSA(_) => PublicKeyAlgorithm::ECDSA, KeyType::Dsa(_) => PublicKeyAlgorithm::DSA, KeyType::Ed25519 => PublicKeyAlgorithm::Ed25519, KeyType::X25519 => PublicKeyAlgorithm::X25519, #[cfg(feature = "unstable-curve448")] KeyType::X448 => PublicKeyAlgorithm::X448, } } pub fn generate( &self, rng: R, ) -> Result<(PublicParams, types::SecretParams)> { let (pub_params, plain) = match self { KeyType::Rsa(bit_size) => rsa::generate_key(rng, *bit_size as usize)?, KeyType::ECDH(curve) => ecdh::generate_key(rng, curve)?, KeyType::EdDSALegacy => eddsa::generate_key(rng, eddsa::Mode::EdDSALegacy), KeyType::ECDSA(curve) => ecdsa::generate_key(rng, curve)?, KeyType::Dsa(key_size) => dsa::generate_key(rng, (*key_size).into())?, KeyType::Ed25519 => eddsa::generate_key(rng, eddsa::Mode::Ed25519), KeyType::X25519 => x25519::generate_key(rng), #[cfg(feature = "unstable-curve448")] KeyType::X448 => crate::crypto::x448::generate_key(rng), }; Ok((pub_params, types::SecretParams::Plain(plain))) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use smallvec::smallvec; use super::*; use crate::composed::{Deserializable, SignedPublicKey, SignedSecretKey}; use crate::types::{KeyVersion, SecretKeyTrait}; #[test] #[ignore] // slow in debug mode fn test_key_gen_rsa_2048_v4() { let _ = pretty_env_logger::try_init(); let mut rng = ChaCha8Rng::seed_from_u64(0); for i in 0..5 { println!("round {i}"); gen_rsa_2048(&mut rng, KeyVersion::V4); } } #[test] #[ignore] // slow in debug mode fn test_key_gen_rsa_2048_v6() { let _ = pretty_env_logger::try_init(); let mut rng = ChaCha8Rng::seed_from_u64(0); for i in 0..5 { println!("round {i}"); gen_rsa_2048(&mut rng, KeyVersion::V6); } } fn gen_rsa_2048(mut rng: R, version: KeyVersion) { let mut key_params = SecretKeyParamsBuilder::default(); key_params .version(version) .key_type(KeyType::Rsa(2048)) .can_certify(true) .can_sign(true) .primary_user_id("Me ".into()) .preferred_symmetric_algorithms(smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, ]) .preferred_hash_algorithms(smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, HashAlgorithm::SHA1, ]) .preferred_compression_algorithms(smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::ZIP, ]); let key_params_enc = key_params .clone() .passphrase(Some("hello".into())) .subkey( SubkeyParamsBuilder::default() .version(version) .key_type(KeyType::Rsa(2048)) .passphrase(Some("hello".into())) .can_encrypt(true) .build() .unwrap(), ) .build() .unwrap(); let key_enc = key_params_enc .generate(&mut rng) .expect("failed to generate secret key, encrypted"); let key_params_plain = key_params .passphrase(None) .subkey( SubkeyParamsBuilder::default() .version(version) .key_type(KeyType::Rsa(2048)) .can_encrypt(true) .build() .unwrap(), ) .build() .unwrap(); let key_plain = key_params_plain .generate(&mut rng) .expect("failed to generate secret key"); let signed_key_enc = key_enc .sign(&mut rng, || "hello".into()) .expect("failed to sign key"); let signed_key_plain = key_plain .sign(&mut rng, || "".into()) .expect("failed to sign key"); let armor_enc = signed_key_enc .to_armored_string(None.into()) .expect("failed to serialize key"); let armor_plain = signed_key_plain .to_armored_string(None.into()) .expect("failed to serialize key"); // std::fs::write("sample-rsa-enc.sec.asc", &armor_enc).unwrap(); // std::fs::write("sample-rsa.sec.asc", &armor_plain).unwrap(); let (signed_key2_enc, _headers) = SignedSecretKey::from_string(&armor_enc).expect("failed to parse key (enc)"); signed_key2_enc.verify().expect("invalid key (enc)"); let (signed_key2_plain, _headers) = SignedSecretKey::from_string(&armor_plain).expect("failed to parse key (plain)"); signed_key2_plain.verify().expect("invalid key (plain)"); signed_key2_enc .unlock(|| "hello".into(), |_| Ok(())) .expect("failed to unlock parsed key (enc)"); signed_key2_plain .unlock(|| "".into(), |_| Ok(())) .expect("failed to unlock parsed key (plain)"); assert_eq!(signed_key_plain, signed_key2_plain); let public_key = signed_key_plain.public_key(); let public_signed_key = public_key .sign(&mut rng, &signed_key_plain, || "".into()) .expect("failed to sign public key"); public_signed_key.verify().expect("invalid public key"); let armor = public_signed_key .to_armored_string(None.into()) .expect("failed to serialize public key"); // std::fs::write("sample-rsa.pub.asc", &armor).unwrap(); let (signed_key2, _headers) = SignedPublicKey::from_string(&armor).expect("failed to parse public key"); signed_key2.verify().expect("invalid public key"); } #[ignore] #[test] fn key_gen_25519_legacy_long() { let mut rng = ChaCha8Rng::seed_from_u64(0); for i in 0..10_000 { println!("round {i}"); gen_25519_legacy(&mut rng); } } #[test] fn key_gen_25519_legacy_short() { let mut rng = ChaCha8Rng::seed_from_u64(0); for _ in 0..10 { gen_25519_legacy(&mut rng); } } fn gen_25519_legacy(mut rng: R) { // The v4-only key format variants based on Curve 25519 (EdDSALegacy/ECDH over 25519) let _ = pretty_env_logger::try_init(); let key_params = SecretKeyParamsBuilder::default() .key_type(KeyType::EdDSALegacy) .can_certify(true) .can_sign(true) .primary_user_id("Me-X ".into()) .passphrase(None) .preferred_symmetric_algorithms(smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, ]) .preferred_hash_algorithms(smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, HashAlgorithm::SHA1, ]) .preferred_compression_algorithms(smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::ZIP, ]) .subkey( SubkeyParamsBuilder::default() .key_type(KeyType::ECDH(ECCCurve::Curve25519)) .can_encrypt(true) .passphrase(None) .build() .unwrap(), ) .build() .unwrap(); let key = key_params .generate(&mut rng) .expect("failed to generate secret key"); let signed_key = key .sign(&mut rng, || "".into()) .expect("failed to sign key"); let armor = signed_key .to_armored_string(None.into()) .expect("failed to serialize key"); // std::fs::write("sample-25519-legacy.sec.asc", &armor).unwrap(); let (signed_key2, _headers) = SignedSecretKey::from_string(&armor).expect("failed to parse key"); signed_key2.verify().expect("invalid key"); assert_eq!(signed_key, signed_key2); let public_key = signed_key.public_key(); let public_signed_key = public_key .sign(&mut rng, &signed_key, || "".into()) .expect("failed to sign public key"); public_signed_key.verify().expect("invalid public key"); let armor = public_signed_key .to_armored_string(None.into()) .expect("failed to serialize public key"); // std::fs::write("sample-25519-legacy.pub.asc", &armor).unwrap(); let (signed_key2, _headers) = SignedPublicKey::from_string(&armor).expect("failed to parse public key"); signed_key2.verify().expect("invalid public key"); } #[ignore] #[test] fn key_gen_25519_rfc9580_long() { let mut rng = ChaCha8Rng::seed_from_u64(0); for key_version in [KeyVersion::V4, KeyVersion::V6] { println!("key version {:?}", key_version); for i in 0..10_000 { println!("round {i}"); gen_25519_rfc9580(&mut rng, key_version); } } } #[test] fn key_gen_25519_rfc9580_short() { let mut rng = ChaCha8Rng::seed_from_u64(0); for key_version in [KeyVersion::V4, KeyVersion::V6] { println!("key version {:?}", key_version); for _ in 0..10 { gen_25519_rfc9580(&mut rng, key_version); } } } fn gen_25519_rfc9580(mut rng: R, version: KeyVersion) { // The RFC 9580 key format variants based on Curve 25519 (X25519/Ed25519) let _ = pretty_env_logger::try_init(); let key_params = SecretKeyParamsBuilder::default() .version(version) .key_type(KeyType::Ed25519) .can_certify(true) .can_sign(true) .primary_user_id("Me-X ".into()) .passphrase(None) .preferred_symmetric_algorithms(smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, ]) .preferred_hash_algorithms(smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, HashAlgorithm::SHA1, ]) .preferred_compression_algorithms(smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::ZIP, ]) .subkey( SubkeyParamsBuilder::default() .version(version) .key_type(KeyType::X25519) .can_encrypt(true) .passphrase(None) .build() .unwrap(), ) .build() .unwrap(); let key = key_params .generate(&mut rng) .expect("failed to generate secret key"); let signed_key = key .sign(&mut rng, || "".into()) .expect("failed to sign key"); let armor = signed_key .to_armored_string(None.into()) .expect("failed to serialize key"); // std::fs::write("sample-25519-rfc9580.sec.asc", &armor).unwrap(); let (signed_key2, _headers) = SignedSecretKey::from_string(&armor).expect("failed to parse key"); signed_key2.verify().expect("invalid key"); assert_eq!(signed_key, signed_key2); let public_key = signed_key.public_key(); let public_signed_key = public_key .sign(&mut rng, &signed_key, || "".into()) .expect("failed to sign public key"); public_signed_key.verify().expect("invalid public key"); let armor = public_signed_key .to_armored_string(None.into()) .expect("failed to serialize public key"); // std::fs::write("sample-25519-rfc9580.pub.asc", &armor).unwrap(); let (signed_key2, _headers) = SignedPublicKey::from_string(&armor).expect("failed to parse public key"); signed_key2.verify().expect("invalid public key"); } fn gen_ecdsa_ecdh( mut rng: R, ecdsa: ECCCurve, ecdh: ECCCurve, version: KeyVersion, ) { let _ = pretty_env_logger::try_init(); let key_params = SecretKeyParamsBuilder::default() .version(version) .key_type(KeyType::ECDSA(ecdsa.clone())) .can_certify(true) .can_sign(true) .primary_user_id("Me-X ".into()) .passphrase(None) .preferred_symmetric_algorithms(smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, ]) .preferred_hash_algorithms(smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, HashAlgorithm::SHA1, ]) .preferred_compression_algorithms(smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::ZIP, ]) .subkey( SubkeyParamsBuilder::default() .version(version) .key_type(KeyType::ECDH(ecdh.clone())) .can_encrypt(true) .passphrase(None) .build() .unwrap(), ) .build() .unwrap(); let key = key_params .generate(&mut rng) .expect("failed to generate secret key"); let signed_key = key .sign(&mut rng, || "".into()) .expect("failed to sign key"); let armor = signed_key .to_armored_string(None.into()) .expect("failed to serialize key"); // std::fs::write( // format!("sample-ecdsa-{ecdsa:?}-ecdh-{ecdh:?}.pub.asc"), // &armor, // ) // .unwrap(); let (signed_key2, _headers) = SignedSecretKey::from_string(&armor).expect("failed to parse key"); signed_key2.verify().expect("invalid key"); assert_eq!(signed_key, signed_key2); let public_key = signed_key.public_key(); let public_signed_key = public_key .sign(&mut rng, &signed_key, || "".into()) .expect("failed to sign public key"); public_signed_key.verify().expect("invalid public key"); let armor = public_signed_key .to_armored_string(None.into()) .expect("failed to serialize public key"); // std::fs::write( // format!("sample-ecdsa-{ecdsa:?}-ecdh-{ecdh:?}.pub.asc"), // &armor, // ) // .unwrap(); let (signed_key2, _headers) = SignedPublicKey::from_string(&armor).expect("failed to parse public key"); signed_key2.verify().expect("invalid public key"); } #[test] fn key_gen_ecdsa_p256_v4() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..=175 { gen_ecdsa_ecdh(&mut rng, ECCCurve::P256, ECCCurve::P256, KeyVersion::V4); } } #[test] fn key_gen_ecdsa_p256_v6() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..=175 { gen_ecdsa_ecdh(&mut rng, ECCCurve::P256, ECCCurve::P256, KeyVersion::V6); } } #[test] #[ignore] fn key_gen_ecdsa_p384_v4() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..100 { gen_ecdsa_ecdh(&mut rng, ECCCurve::P384, ECCCurve::P384, KeyVersion::V4); } } #[test] #[ignore] fn key_gen_ecdsa_p384_v6() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..100 { gen_ecdsa_ecdh(&mut rng, ECCCurve::P384, ECCCurve::P384, KeyVersion::V6); } } #[test] #[ignore] fn key_gen_ecdsa_p521_v4() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..100 { gen_ecdsa_ecdh(&mut rng, ECCCurve::P521, ECCCurve::P521, KeyVersion::V4); } } #[test] #[ignore] fn key_gen_ecdsa_p521_v6() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..100 { gen_ecdsa_ecdh(&mut rng, ECCCurve::P521, ECCCurve::P521, KeyVersion::V6); } } #[test] fn key_gen_ecdsa_secp256k1() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..100 { gen_ecdsa_ecdh( &mut rng, ECCCurve::Secp256k1, ECCCurve::Curve25519, // we don't currently support ECDH over Secp256k1 KeyVersion::V4, // use of secp256k1 isn't specified in RFC 9580 ); } } fn gen_dsa(mut rng: R, key_size: DsaKeySize) { let _ = pretty_env_logger::try_init(); let key_params = SecretKeyParamsBuilder::default() .key_type(KeyType::Dsa(key_size)) .can_certify(true) .can_sign(true) .primary_user_id("Me-X ".into()) .passphrase(None) .preferred_symmetric_algorithms(smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, ]) .preferred_hash_algorithms(smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, HashAlgorithm::SHA1, ]) .preferred_compression_algorithms(smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::ZIP, ]) .subkey( SubkeyParamsBuilder::default() .key_type(KeyType::ECDH(ECCCurve::Curve25519)) .can_encrypt(true) .passphrase(None) .build() .unwrap(), ) .build() .unwrap(); let key = key_params .generate(&mut rng) .expect("failed to generate secret key"); let signed_key = key .sign(&mut rng, || "".into()) .expect("failed to sign key"); let armor = signed_key .to_armored_string(None.into()) .expect("failed to serialize key"); // std::fs::write("sample-dsa.sec.asc", &armor).unwrap(); let (signed_key2, _headers) = SignedSecretKey::from_string(&armor).expect("failed to parse key"); signed_key2.verify().expect("invalid key"); assert_eq!(signed_key, signed_key2); let public_key = signed_key.public_key(); let public_signed_key = public_key .sign(&mut rng, &signed_key, || "".into()) .expect("failed to sign public key"); public_signed_key.verify().expect("invalid public key"); let armor = public_signed_key .to_armored_string(None.into()) .expect("failed to serialize public key"); // std::fs::write(format!("sample-dsa-{key_size:?}.pub.asc"), &armor).unwrap(); let (signed_key2, _headers) = SignedPublicKey::from_string(&armor).expect("failed to parse public key"); signed_key2.verify().expect("invalid public key"); } // Test is slow in debug mode #[test] #[ignore] fn key_gen_dsa_1024() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..5 { gen_dsa(&mut rng, DsaKeySize::B1024); } } // Test is slow in debug mode #[test] #[ignore] fn key_gen_dsa_2048() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); for _ in 0..5 { gen_dsa(&mut rng, DsaKeySize::B2048); } } // Test is slow in debug mode #[test] #[ignore] fn key_gen_dsa_3072() { let mut rng = &mut ChaCha8Rng::seed_from_u64(0); gen_dsa(&mut rng, DsaKeySize::B3072); } } pgp-0.15.0/src/composed/key/mod.rs000064400000000000000000000036711046102023000150210ustar 00000000000000//! Internal key definitions //! //! These APIs do not provide guaranteed RFC 9580 compliance, //! since hashing is to be done externally. //! //! //! # Generating a signed secret key and deriving a public key //! //! ```rust //! use pgp::composed::{ //! key::SecretKeyParamsBuilder, KeyDetails, KeyType, SecretKey, SecretSubkey, //! }; //! use pgp::crypto::{hash::HashAlgorithm, sym::SymmetricKeyAlgorithm}; //! use pgp::errors::Result; //! use pgp::packet::{KeyFlags, UserAttribute, UserId}; //! use pgp::types::{CompressionAlgorithm, PublicKeyTrait, SecretKeyTrait}; //! use rand::thread_rng; //! use smallvec::*; //! //! let mut key_params = SecretKeyParamsBuilder::default(); //! key_params //! .key_type(KeyType::Rsa(2048)) //! .can_certify(false) //! .can_sign(true) //! .primary_user_id("Me ".into()) //! .preferred_symmetric_algorithms(smallvec![SymmetricKeyAlgorithm::AES256]) //! .preferred_hash_algorithms(smallvec![HashAlgorithm::SHA2_256]) //! .preferred_compression_algorithms(smallvec![CompressionAlgorithm::ZLIB]); //! let secret_key_params = key_params //! .build() //! .expect("Must be able to create secret key params"); //! let secret_key = secret_key_params //! .generate(thread_rng()) //! .expect("Failed to generate a plain key."); //! let passwd_fn = || String::new(); //! let signed_secret_key = secret_key //! .sign(&mut thread_rng(), passwd_fn) //! .expect("Must be able to sign its own metadata"); //! let public_key = signed_secret_key.public_key(); //! ``` //! //! [Packet based signing and verifying] as well as //! [signing and verifying with external hashing] are demoed separately. //! //! [Packet based signing and verifying]: super::super::packet //! [signing and verifying with external hashing]: super::signed_key mod builder; mod public; mod secret; mod shared; pub use self::builder::*; pub use self::public::*; pub use self::secret::*; pub use self::shared::*; pgp-0.15.0/src/composed/key/public.rs000064400000000000000000000132661046102023000155210ustar 00000000000000use std::io; use chrono::SubsecRound; use rand::{CryptoRng, Rng}; use crate::composed::{KeyDetails, SignedPublicKey, SignedPublicSubKey}; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::Result; use crate::packet::{self, KeyFlags, SignatureConfig, SignatureType, Subpacket, SubpacketData}; use crate::types::PkeskBytes; use crate::types::{ EskType, Fingerprint, KeyId, KeyVersion, PublicKeyTrait, PublicParams, SecretKeyTrait, SignatureBytes, }; /// User facing interface to work with a public key. #[derive(Debug, PartialEq, Eq, Clone)] pub struct PublicKey { primary_key: packet::PublicKey, details: KeyDetails, public_subkeys: Vec, } #[derive(Debug, PartialEq, Eq, Clone)] pub struct PublicSubkey { key: packet::PublicSubkey, keyflags: KeyFlags, } impl PublicKey { pub fn new( primary_key: packet::PublicKey, details: KeyDetails, public_subkeys: Vec, ) -> Self { PublicKey { primary_key, details, public_subkeys, } } pub fn sign( self, mut rng: R, sec_key: &impl SecretKeyTrait, key_pw: F, ) -> Result where R: CryptoRng + Rng, F: (FnOnce() -> String) + Clone, { let primary_key = self.primary_key; let details = self.details.sign(&mut rng, sec_key, key_pw.clone())?; let public_subkeys = self .public_subkeys .into_iter() .map(|k| k.sign(&mut rng, sec_key, key_pw.clone())) .collect::>>()?; Ok(SignedPublicKey { primary_key, details, public_subkeys, }) } } impl PublicKeyTrait for PublicKey { fn version(&self) -> crate::types::KeyVersion { self.primary_key.version() } fn fingerprint(&self) -> Fingerprint { self.primary_key.fingerprint() } fn key_id(&self) -> KeyId { self.primary_key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.primary_key.algorithm() } fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.primary_key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.primary_key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { self.primary_key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.primary_key.public_params() } fn created_at(&self) -> &chrono::DateTime { self.primary_key.created_at() } fn expiration(&self) -> Option { self.primary_key.expiration() } } impl PublicSubkey { pub fn new(key: packet::PublicSubkey, keyflags: KeyFlags) -> Self { PublicSubkey { key, keyflags } } pub fn sign( self, mut rng: R, sec_key: &impl SecretKeyTrait, key_pw: F, ) -> Result where R: CryptoRng + Rng, F: (FnOnce() -> String) + Clone, { let key = self.key; let hashed_subpackets = vec![ Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), )), Subpacket::regular(SubpacketData::KeyFlags(self.keyflags.into())), Subpacket::regular(SubpacketData::IssuerFingerprint(sec_key.fingerprint())), ]; let unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(sec_key.key_id()))]; let mut config = match sec_key.version() { KeyVersion::V4 => SignatureConfig::v4( SignatureType::SubkeyBinding, sec_key.algorithm(), sec_key.hash_alg(), ), KeyVersion::V6 => SignatureConfig::v6( &mut rng, SignatureType::SubkeyBinding, sec_key.algorithm(), sec_key.hash_alg(), )?, v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; let signatures = vec![config.sign_key_binding(sec_key, key_pw, &key)?]; Ok(SignedPublicSubKey { key, signatures }) } } impl PublicKeyTrait for PublicSubkey { fn version(&self) -> crate::types::KeyVersion { self.key.version() } fn fingerprint(&self) -> Fingerprint { self.key.fingerprint() } fn key_id(&self) -> KeyId { self.key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.key.algorithm() } fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { self.key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.key.public_params() } fn created_at(&self) -> &chrono::DateTime { self.key.created_at() } fn expiration(&self) -> Option { self.key.expiration() } } pgp-0.15.0/src/composed/key/secret.rs000064400000000000000000000065721046102023000155320ustar 00000000000000use aes_gcm::aead::rand_core::CryptoRng; use chrono::SubsecRound; use rand::Rng; use crate::composed::{KeyDetails, PublicSubkey, SignedSecretKey, SignedSecretSubKey}; use crate::errors::Result; use crate::packet::{self, KeyFlags, SignatureConfig, SignatureType, Subpacket, SubpacketData}; use crate::types::{KeyVersion, SecretKeyTrait}; /// User facing interface to work with a secret key. #[derive(Debug, PartialEq, Eq, Clone)] pub struct SecretKey { primary_key: packet::SecretKey, details: KeyDetails, public_subkeys: Vec, secret_subkeys: Vec, } #[derive(Debug, PartialEq, Eq, Clone)] pub struct SecretSubkey { key: packet::SecretSubkey, keyflags: KeyFlags, } impl SecretKey { pub fn new( primary_key: packet::SecretKey, details: KeyDetails, public_subkeys: Vec, secret_subkeys: Vec, ) -> Self { SecretKey { primary_key, details, public_subkeys, secret_subkeys, } } pub fn sign(self, mut rng: R, key_pw: F) -> Result where R: CryptoRng + Rng, F: (FnOnce() -> String) + Clone, { let primary_key = self.primary_key; let details = self.details.sign(&mut rng, &primary_key, key_pw.clone())?; let public_subkeys = self .public_subkeys .into_iter() .map(|k| k.sign(&mut rng, &primary_key, key_pw.clone())) .collect::>>()?; let secret_subkeys = self .secret_subkeys .into_iter() .map(|k| k.sign(&mut rng, &primary_key, key_pw.clone())) .collect::>>()?; Ok(SignedSecretKey { primary_key, details, public_subkeys, secret_subkeys, }) } } impl SecretSubkey { pub fn new(key: packet::SecretSubkey, keyflags: KeyFlags) -> Self { SecretSubkey { key, keyflags } } pub fn sign( self, mut rng: R, sec_key: &impl SecretKeyTrait, key_pw: F, ) -> Result where R: CryptoRng + Rng, F: (FnOnce() -> String) + Clone, { let key = self.key; let mut config = match sec_key.version() { KeyVersion::V4 => SignatureConfig::v4( SignatureType::SubkeyBinding, sec_key.algorithm(), sec_key.hash_alg(), ), KeyVersion::V6 => SignatureConfig::v6( &mut rng, SignatureType::SubkeyBinding, sec_key.algorithm(), sec_key.hash_alg(), )?, v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = vec![ Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), )), Subpacket::regular(SubpacketData::KeyFlags(self.keyflags.into())), Subpacket::regular(SubpacketData::IssuerFingerprint(sec_key.fingerprint())), ]; config.unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(sec_key.key_id()))]; let signatures = vec![config.sign_key_binding(sec_key, key_pw, &key)?]; Ok(SignedSecretSubKey { key, signatures }) } } pgp-0.15.0/src/composed/key/shared.rs000064400000000000000000000212441046102023000155040ustar 00000000000000use aes_gcm::aead::rand_core::CryptoRng; use chrono::SubsecRound; use rand::Rng; use smallvec::SmallVec; use crate::composed::SignedKeyDetails; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::hash::HashAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::Result; use crate::packet::{ KeyFlags, PacketTrait, SignatureConfig, SignatureType, Subpacket, SubpacketData, UserAttribute, UserId, }; use crate::types::{CompressionAlgorithm, KeyVersion, RevocationKey, SecretKeyTrait}; #[derive(Debug, PartialEq, Eq, Clone)] pub struct KeyDetails { user_ids: Vec, user_attributes: Vec, keyflags: KeyFlags, preferred_symmetric_algorithms: SmallVec<[SymmetricKeyAlgorithm; 8]>, preferred_hash_algorithms: SmallVec<[HashAlgorithm; 8]>, preferred_compression_algorithms: SmallVec<[CompressionAlgorithm; 8]>, preferred_aead_algorithms: SmallVec<[(SymmetricKeyAlgorithm, AeadAlgorithm); 4]>, revocation_key: Option, } impl KeyDetails { #[allow(clippy::too_many_arguments)] // FIXME pub fn new( primary_user_id: UserId, mut user_ids: Vec, user_attributes: Vec, keyflags: KeyFlags, preferred_symmetric_algorithms: SmallVec<[SymmetricKeyAlgorithm; 8]>, preferred_hash_algorithms: SmallVec<[HashAlgorithm; 8]>, preferred_compression_algorithms: SmallVec<[CompressionAlgorithm; 8]>, preferred_aead_algorithms: SmallVec<[(SymmetricKeyAlgorithm, AeadAlgorithm); 4]>, revocation_key: Option, ) -> Self { user_ids.insert(0, primary_user_id); Self::new_direct( user_ids, user_attributes, keyflags, preferred_symmetric_algorithms, preferred_hash_algorithms, preferred_compression_algorithms, preferred_aead_algorithms, revocation_key, ) } /// The primary UserId (if any) is expected to be contained in `user_ids` #[allow(clippy::too_many_arguments)] // FIXME pub(crate) fn new_direct( user_ids: Vec, user_attributes: Vec, keyflags: KeyFlags, preferred_symmetric_algorithms: SmallVec<[SymmetricKeyAlgorithm; 8]>, preferred_hash_algorithms: SmallVec<[HashAlgorithm; 8]>, preferred_compression_algorithms: SmallVec<[CompressionAlgorithm; 8]>, preferred_aead_algorithms: SmallVec<[(SymmetricKeyAlgorithm, AeadAlgorithm); 4]>, revocation_key: Option, ) -> Self { KeyDetails { user_ids, user_attributes, keyflags, preferred_symmetric_algorithms, preferred_hash_algorithms, preferred_compression_algorithms, preferred_aead_algorithms, revocation_key, } } pub fn sign( self, mut rng: R, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where R: CryptoRng + Rng, F: (FnOnce() -> String) + Clone, { let keyflags: SmallVec<[u8; 1]> = self.keyflags.into(); let preferred_symmetric_algorithms = self.preferred_symmetric_algorithms; let preferred_hash_algorithms = self.preferred_hash_algorithms; let preferred_compression_algorithms = self.preferred_compression_algorithms; let preferred_aead_algorithms = self.preferred_aead_algorithms; let revocation_key = self.revocation_key; let mut users = vec![]; // We consider the first entry in `user_ids` (if any) the primary user id // FIXME: select primary like in signed_key/shared.rs:116? (and adjust the set of non-primaries below?) if let Some(id) = self.user_ids.first() { let mut hashed_subpackets = vec![ Subpacket::regular(SubpacketData::IsPrimary(true)), Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), )), Subpacket::regular(SubpacketData::KeyFlags(keyflags.clone())), Subpacket::regular(SubpacketData::PreferredSymmetricAlgorithms( preferred_symmetric_algorithms.clone(), )), Subpacket::regular(SubpacketData::PreferredHashAlgorithms( preferred_hash_algorithms.clone(), )), Subpacket::regular(SubpacketData::PreferredCompressionAlgorithms( preferred_compression_algorithms.clone(), )), Subpacket::regular(SubpacketData::PreferredAeadAlgorithms( preferred_aead_algorithms.clone(), )), Subpacket::regular(SubpacketData::IssuerFingerprint(key.fingerprint())), ]; if let Some(rkey) = revocation_key { hashed_subpackets.push(Subpacket::regular(SubpacketData::RevocationKey(rkey))); } let mut config = match key.version() { KeyVersion::V4 => { SignatureConfig::v4(SignatureType::CertGeneric, key.algorithm(), key.hash_alg()) } KeyVersion::V6 => SignatureConfig::v6( &mut rng, SignatureType::CertGeneric, key.algorithm(), key.hash_alg(), )?, v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(key.key_id()))]; let sig = config.sign_certification(key, key_pw.clone(), id.tag(), &id)?; users.push(id.clone().into_signed(sig)); } // other user ids users.extend( self.user_ids .into_iter() .skip(1) // The first User ID was handled above, as the primary user id .map(|id| { let hashed_subpackets = vec![ Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), )), Subpacket::regular(SubpacketData::KeyFlags(keyflags.clone())), Subpacket::regular(SubpacketData::PreferredSymmetricAlgorithms( preferred_symmetric_algorithms.clone(), )), Subpacket::regular(SubpacketData::PreferredHashAlgorithms( preferred_hash_algorithms.clone(), )), Subpacket::regular(SubpacketData::PreferredCompressionAlgorithms( preferred_compression_algorithms.clone(), )), Subpacket::regular(SubpacketData::PreferredAeadAlgorithms( preferred_aead_algorithms.clone(), )), Subpacket::regular(SubpacketData::IssuerFingerprint(key.fingerprint())), ]; let unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(key.key_id()))]; let mut config = match key.version() { KeyVersion::V4 => SignatureConfig::v4( SignatureType::CertGeneric, key.algorithm(), key.hash_alg(), ), KeyVersion::V6 => SignatureConfig::v6( &mut rng, SignatureType::CertGeneric, key.algorithm(), key.hash_alg(), )?, v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; let sig = config.sign_certification(key, key_pw.clone(), id.tag(), &id)?; Ok(id.into_signed(sig)) }) .collect::>>()?, ); let user_attributes = self .user_attributes .into_iter() .map(|u| u.sign(&mut rng, key, key_pw.clone())) .collect::>>()?; Ok(SignedKeyDetails { revocation_signatures: Default::default(), direct_signatures: Default::default(), users, user_attributes, }) } } pgp-0.15.0/src/composed/message/decrypt.rs000064400000000000000000000061171046102023000165460ustar 00000000000000use log::debug; use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::Result; use crate::packet::SymKeyEncryptedSessionKey; use crate::types::{EskType, PkeskBytes, SecretKeyRepr, SecretKeyTrait, SkeskVersion}; /// Decrypts session key using secret key. pub fn decrypt_session_key( locked_key: &L, key_pw: F, values: &PkeskBytes, typ: EskType, ) -> Result where F: FnOnce() -> String, L: SecretKeyTrait, { debug!("decrypt session key"); locked_key.unlock(key_pw, |priv_key| priv_key.decrypt(values, typ, locked_key)) } /// Decrypted session key. /// /// A v3/v4 session key can be used v1 SEIPD (and historically with SED packets). /// A v6 session key can only be used with a v2 SEIPD. /// /// /// /// (Note that SED packets are malleable. They are historical and considered dangerous! /// They MUST NOT be produced and decryption is also discouraged: /// ) #[derive(derive_more::Debug, Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop)] pub enum PlainSessionKey { /// A session key from a v3 PKESK or a v4 SKESK /// /// (Note: for historical reasons, the OpenPGP format doesn't specify a v4 PKESK or a V3 SKESK) V3_4 { sym_alg: SymmetricKeyAlgorithm, #[debug("..")] key: Vec, }, V5 { #[debug("..")] key: Vec, }, /// A session key from a v6 PKESK or a v6 SKESK V6 { #[debug("..")] key: Vec, }, } /// Decrypts session key from SKESK packet. /// /// Returns decrypted or derived session key /// and symmetric algorithm of the key. pub fn decrypt_session_key_with_password( packet: &SymKeyEncryptedSessionKey, msg_pw: F, ) -> Result where F: FnOnce() -> String, { debug!("decrypt session key with password"); let packet_algorithm = packet.sym_algorithm(); ensure!( packet_algorithm != SymmetricKeyAlgorithm::Plaintext, "SKESK packet encryption algorithm cannot be plaintext" ); // Implementations MUST NOT decrypt a secret using MD5, SHA-1, or RIPEMD-160 as a hash function // in an S2K KDF in a version 6 (or later) packet. // // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.5-3) if packet.version() == SkeskVersion::V6 { ensure!( !packet.s2k().known_weak_hash_algo(), "Weak hash algorithm in S2K not allowed for v6 {:?}", packet.s2k() ) } let key = packet .s2k() .derive_key(&msg_pw(), packet_algorithm.key_size())?; debug!("derived key: {}", hex::encode(&key)); if packet.encrypted_key().is_none() { // There is no encrypted session key. // // S2K-derived key is the session key. return Ok(PlainSessionKey::V3_4 { key, sym_alg: packet_algorithm, }); } let decrypted_key = packet.decrypt(&key)?; Ok(decrypted_key) } pgp-0.15.0/src/composed/message/mod.rs000064400000000000000000000001271046102023000156460ustar 00000000000000mod decrypt; mod parser; mod types; pub use self::decrypt::*; pub use self::types::*; pgp-0.15.0/src/composed/message/parser.rs000064400000000000000000000215271046102023000163720ustar 00000000000000use std::iter::Peekable; use log::debug; use crate::armor::BlockType; use crate::composed::message::Message; use crate::composed::Deserializable; use crate::errors::{Error, Result}; use crate::packet::Packet; use crate::types::{PkeskVersion, SkeskVersion, Tag}; use crate::{Edata, Esk}; pub struct MessageParser>> { source: Peekable, } fn next>>(packets: &mut Peekable) -> Option> { while let Some(res) = packets.by_ref().next() { let packet = match res { Ok(packet) => packet, Err(err) => return Some(Err(err)), }; debug!("{:?}: ", packet); let tag = packet.tag(); match tag { Tag::LiteralData => { return match packet.try_into() { Ok(data) => Some(Ok(Message::Literal(data))), Err(err) => Some(Err(err)), }; } Tag::CompressedData => { return match packet.try_into() { Ok(data) => Some(Ok(Message::Compressed(data))), Err(err) => Some(Err(err)), }; } // ESK :- Public-Key Encrypted Session Key Packet | // Symmetric-Key Encrypted Session Key Packet. Tag::PublicKeyEncryptedSessionKey | Tag::SymKeyEncryptedSessionKey => { return match packet.try_into() { Ok(p) => { let mut esk: Vec = vec![p]; // while ESK take em while let Some(res) = packets.next_if(|res| { res.as_ref().is_ok_and(|p| { p.tag() == Tag::PublicKeyEncryptedSessionKey || p.tag() == Tag::SymKeyEncryptedSessionKey }) }) { match res { Ok(packet) => esk.push(packet.try_into().expect("peeked")), Err(e) => return Some(Err(e)), } } // we expect exactly one edata after the ESKs let edata = match packets.next() { Some(Ok(p)) if p.tag() == Tag::SymEncryptedData || p.tag() == Tag::SymEncryptedProtectedData => { Edata::try_from(p).expect("peeked") } Some(Ok(p)) => { return Some(Err(Error::Message(format!( "Expected encrypted data packet, but found {:?}", p )))); } None => { return Some(Err(Error::Message( "Missing encrypted data packet".to_string(), ))) } Some(Err(e)) => return Some(Err(e)), }; // Drop PKESK and SKESK with versions that are not aligned with the encryption container fn esk_filter( esk: Vec, pkesk_allowed: PkeskVersion, skesk_allowed: SkeskVersion, ) -> Vec { esk.into_iter() .filter(|esk| match esk { Esk::PublicKeyEncryptedSessionKey(pkesk) => { pkesk.version() == pkesk_allowed } Esk::SymKeyEncryptedSessionKey(skesk) => { skesk.version() == skesk_allowed } }) .collect() } // An implementation processing an Encrypted Message MUST discard any // preceding ESK packet with a version that does not align with the // version of the payload. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-10.3.2.1-7) let esk = match edata { Edata::SymEncryptedData(_) => { esk_filter(esk, PkeskVersion::V3, SkeskVersion::V4) } Edata::SymEncryptedProtectedData(ref p) if p.version() == 1 => { esk_filter(esk, PkeskVersion::V3, SkeskVersion::V4) } Edata::SymEncryptedProtectedData(ref p) if p.version() == 2 => { esk_filter(esk, PkeskVersion::V6, SkeskVersion::V6) } _ => { return Some(Err(format_err!("Unsupported Edata variant"))); } }; Some(Ok(Message::Encrypted { esk, edata })) } Err(err) => Some(Err(err)), }; } Tag::Signature => { return match packet.try_into() { Ok(signature) => { let message = match next(packets.by_ref()) { Some(Ok(m)) => Some(Box::new(m)), Some(Err(err)) => return Some(Err(err)), None => None, }; Some(Ok(Message::Signed { message, one_pass_signature: None, signature, })) } Err(err) => Some(Err(err)), }; } Tag::OnePassSignature => { return match packet.try_into() { Ok(p) => { let one_pass_signature = Some(p); let message = match next(packets.by_ref()) { Some(Ok(m)) => Some(Box::new(m)), Some(Err(err)) => return Some(Err(err)), None => None, }; let signature = if let Some(res) = packets .next_if(|res| res.as_ref().is_ok_and(|p| p.tag() == Tag::Signature)) { match res { Ok(packet) => packet.try_into().expect("peeked"), Err(e) => return Some(Err(e)), } } else { return Some(Err(format_err!( "missing signature for, one pass signature" ))); }; Some(Ok(Message::Signed { message, one_pass_signature, signature, })) } Err(err) => Some(Err(err)), }; } Tag::Marker => { // Marker Packets are ignored // see https://www.rfc-editor.org/rfc/rfc9580.html#marker-packet } Tag::Padding => { // Padding Packets are ignored // // "Such a packet MUST be ignored when received." // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-5.14-2) } _ => { return Some(Err(format_err!("unexpected packet {:?}", packet.tag()))); } } } None } impl>> Iterator for MessageParser { type Item = Result; fn next(&mut self) -> Option { next(self.source.by_ref()) } } impl Deserializable for Message { /// Parse a composed message. /// Ref: fn from_packets<'a, I: Iterator> + 'a>( packets: std::iter::Peekable, ) -> Box> + 'a> { Box::new(MessageParser { source: packets.peekable(), }) } fn matches_block_type(typ: BlockType) -> bool { matches!( typ, BlockType::Message | BlockType::MultiPartMessage(_, _) | BlockType::File ) } } pgp-0.15.0/src/composed/message/types.rs000064400000000000000000001605121046102023000162400ustar 00000000000000use std::io; use bstr::BStr; use chrono::SubsecRound; use flate2::write::{DeflateEncoder, ZlibEncoder}; use flate2::Compression; use log::{debug, warn}; use rand::{CryptoRng, Rng}; use crate::armor; use crate::composed::message::decrypt::*; use crate::composed::shared::Deserializable; use crate::composed::signed_key::SignedSecretKey; use crate::composed::StandaloneSignature; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::hash::HashAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{Error, Result}; use crate::packet::{ write_packet, CompressedData, LiteralData, OnePassSignature, Packet, PublicKeyEncryptedSessionKey, Signature, SignatureConfig, SignatureType, SignatureVersionSpecific, Subpacket, SubpacketData, SymEncryptedData, SymEncryptedProtectedData, SymKeyEncryptedSessionKey, }; use crate::ser::Serialize; use crate::types::{ CompressionAlgorithm, EskType, Fingerprint, KeyId, KeyVersion, PkeskVersion, PublicKeyTrait, SecretKeyTrait, StringToKey, Tag, }; /// An [OpenPGP message](https://www.rfc-editor.org/rfc/rfc9580.html#name-openpgp-messages) #[derive(Clone, Debug, PartialEq, Eq)] pub enum Message { Literal(LiteralData), Compressed(CompressedData), Signed { /// nested message message: Option>, /// for signature packets that contain a one pass message one_pass_signature: Option, // actual signature signature: Signature, }, Encrypted { esk: Vec, edata: Edata, }, } /// Encrypted Session Key /// /// Public-Key Encrypted Session Key Packet | /// Symmetric-Key Encrypted Session Key Packet. #[derive(Debug, Clone, PartialEq, Eq)] pub enum Esk { PublicKeyEncryptedSessionKey(PublicKeyEncryptedSessionKey), SymKeyEncryptedSessionKey(SymKeyEncryptedSessionKey), } impl Serialize for Esk { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { Esk::PublicKeyEncryptedSessionKey(k) => write_packet(writer, k), Esk::SymKeyEncryptedSessionKey(k) => write_packet(writer, k), } } } impl_try_from_into!( Esk, PublicKeyEncryptedSessionKey => PublicKeyEncryptedSessionKey, SymKeyEncryptedSessionKey => SymKeyEncryptedSessionKey ); impl Esk { pub fn tag(&self) -> Tag { match self { Esk::PublicKeyEncryptedSessionKey(_) => Tag::PublicKeyEncryptedSessionKey, Esk::SymKeyEncryptedSessionKey(_) => Tag::SymKeyEncryptedSessionKey, } } } impl TryFrom for Esk { type Error = Error; fn try_from(other: Packet) -> Result { match other { Packet::PublicKeyEncryptedSessionKey(k) => Ok(Esk::PublicKeyEncryptedSessionKey(k)), Packet::SymKeyEncryptedSessionKey(k) => Ok(Esk::SymKeyEncryptedSessionKey(k)), _ => Err(format_err!("not a valid edata packet: {:?}", other)), } } } impl From for Packet { fn from(other: Esk) -> Packet { match other { Esk::PublicKeyEncryptedSessionKey(k) => Packet::PublicKeyEncryptedSessionKey(k), Esk::SymKeyEncryptedSessionKey(k) => Packet::SymKeyEncryptedSessionKey(k), } } } /// Encrypted Data /// Symmetrically Encrypted Data Packet | /// Symmetrically Encrypted Integrity Protected Data Packet #[derive(Debug, Clone, PartialEq, Eq)] pub enum Edata { SymEncryptedData(SymEncryptedData), SymEncryptedProtectedData(SymEncryptedProtectedData), } impl Serialize for Edata { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { Edata::SymEncryptedData(d) => write_packet(writer, d), Edata::SymEncryptedProtectedData(d) => write_packet(writer, d), } } } impl_try_from_into!( Edata, SymEncryptedData => SymEncryptedData, SymEncryptedProtectedData => SymEncryptedProtectedData ); impl TryFrom for Edata { type Error = Error; fn try_from(other: Packet) -> Result { match other { Packet::SymEncryptedData(d) => Ok(Edata::SymEncryptedData(d)), Packet::SymEncryptedProtectedData(d) => Ok(Edata::SymEncryptedProtectedData(d)), _ => Err(format_err!("not a valid edata packet: {:?}", other)), } } } impl From for Packet { fn from(other: Edata) -> Packet { match other { Edata::SymEncryptedData(d) => Packet::SymEncryptedData(d), Edata::SymEncryptedProtectedData(d) => Packet::SymEncryptedProtectedData(d), } } } impl Edata { pub fn data(&self) -> &[u8] { match self { Edata::SymEncryptedData(d) => d.data(), Edata::SymEncryptedProtectedData(d) => d.data_as_slice(), } } pub fn tag(&self) -> Tag { match self { Edata::SymEncryptedData(_) => Tag::SymEncryptedData, Edata::SymEncryptedProtectedData(_) => Tag::SymEncryptedProtectedData, } } fn version(&self) -> Option { match self { Edata::SymEncryptedData(_) => None, Edata::SymEncryptedProtectedData(d) => Some(d.version()), } } /// Transform decrypted data into a message. /// Bails if the packets contain no message or multiple messages. fn process_decrypted(packet_data: &[u8]) -> Result { let mut messages = Message::from_bytes_many(packet_data); // First message is the one we want to return let Some(message) = messages.next() else { bail!("no valid message found"); }; let message = message?; // The only other message allowed is a padding packet, which will be skipped // by the parser, so check that we have only a single message. if let Some(msg) = messages.next() { bail!("unexpected message: {:?}", msg); } Ok(message) } pub fn decrypt(&self, key: PlainSessionKey) -> Result { let protected = self.tag() == Tag::SymEncryptedProtectedData; debug!("decrypting protected = {:?}", protected); match key { PlainSessionKey::V3_4 { sym_alg, ref key } => { ensure!( sym_alg != SymmetricKeyAlgorithm::Plaintext, "session key algorithm cannot be plaintext" ); match self { Self::SymEncryptedProtectedData(p) => { ensure_eq!( self.version(), Some(1), "Version mismatch between key and integrity packet" ); let data = p.decrypt(key, Some(sym_alg))?; Self::process_decrypted(&data[..]) } Self::SymEncryptedData(p) => { ensure_eq!( self.version(), None, "Version mismatch between key and integrity packet" ); let mut data = p.data().to_vec(); let res = sym_alg.decrypt(key, &mut data)?; Self::process_decrypted(res) } } } PlainSessionKey::V5 { .. } => match self { Self::SymEncryptedProtectedData(_p) => { ensure_eq!( self.version(), Some(2), "Version mismatch between key and integrity packet" ); unimplemented_err!("V5 decryption"); } Self::SymEncryptedData(_) => { bail!("invalid packet combination"); } }, PlainSessionKey::V6 { ref key } => match self { Self::SymEncryptedProtectedData(p) => { ensure_eq!( self.version(), Some(2), "Version mismatch between key and integrity packet" ); let decrypted_packets = p.decrypt(key, None)?; Self::process_decrypted(&decrypted_packets[..]) } Self::SymEncryptedData(_) => { bail!("invalid packet combination"); } }, } } } impl Serialize for Message { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { Message::Literal(data) => write_packet(writer, data), Message::Compressed(data) => write_packet(writer, data), Message::Signed { message, one_pass_signature, signature, .. } => { if let Some(ops) = one_pass_signature { write_packet(writer, ops)?; } if let Some(message) = message { (**message).to_writer(writer)?; } write_packet(writer, signature)?; Ok(()) } Message::Encrypted { esk, edata, .. } => { for e in esk { e.to_writer(writer)?; } edata.to_writer(writer)?; Ok(()) } } } } impl Message { pub fn new_literal(file_name: impl AsRef, data: &str) -> Self { Message::Literal(LiteralData::from_str(file_name.as_ref(), data)) } pub fn new_literal_bytes(file_name: impl AsRef, data: &[u8]) -> Self { Message::Literal(LiteralData::from_bytes(file_name.as_ref(), data)) } /// Compresses the message. pub fn compress(&self, alg: CompressionAlgorithm) -> Result { let data = match alg { CompressionAlgorithm::Uncompressed => { let mut data = Vec::new(); self.to_writer(&mut data)?; data } CompressionAlgorithm::ZIP => { let mut enc = DeflateEncoder::new(Vec::new(), Compression::default()); self.to_writer(&mut enc)?; enc.finish()? } CompressionAlgorithm::ZLIB => { let mut enc = ZlibEncoder::new(Vec::new(), Compression::default()); self.to_writer(&mut enc)?; enc.finish()? } CompressionAlgorithm::BZip2 => unimplemented_err!("BZip2"), CompressionAlgorithm::Private10 | CompressionAlgorithm::Other(_) => { unsupported_err!("CompressionAlgorithm {} is unsupported", u8::from(alg)) } }; Ok(Message::Compressed(CompressedData::from_compressed( alg, data, ))) } /// Decompresses the data if compressed. pub fn decompress(self) -> Result { match self { Message::Compressed(data) => Message::from_bytes(data.decompress()?), _ => Ok(self), } } /// Encrypt the message in SEIPDv1 format to a list of public keys `pkeys`. pub fn encrypt_to_keys_seipdv1( &self, mut rng: R, alg: SymmetricKeyAlgorithm, pkeys: &[&impl PublicKeyTrait], ) -> Result { // 1. Generate a session key. let session_key = alg.new_session_key(&mut rng); // 2. Encrypt (pub) the session key, to each PublicKey. let esk = pkeys .iter() .map(|pkey| { let pkes = PublicKeyEncryptedSessionKey::from_session_key_v3( &mut rng, &session_key, alg, pkey, )?; Ok(Esk::PublicKeyEncryptedSessionKey(pkes)) }) .collect::>()?; // 3. Encrypt (sym) the data using the session key. self.encrypt_symmetric_seipdv1(&mut rng, esk, alg, &session_key) } /// Encrypt the message in SEIPDv2 format to a list of public keys `pkeys`. pub fn encrypt_to_keys_seipdv2( &self, mut rng: R, alg: SymmetricKeyAlgorithm, aead: AeadAlgorithm, chunk_size: u8, pkeys: &[&impl PublicKeyTrait], ) -> Result { // 1. Generate a session key. let session_key = alg.new_session_key(&mut rng); // 2. Encrypt (pub) the session key, to each PublicKey. let esk = pkeys .iter() .map(|pkey| { let pkes = PublicKeyEncryptedSessionKey::from_session_key_v6( &mut rng, &session_key, pkey, )?; Ok(Esk::PublicKeyEncryptedSessionKey(pkes)) }) .collect::>()?; // 3. Encrypt (sym) the data using the session key. self.encrypt_symmetric_seipdv2(&mut rng, esk, alg, aead, chunk_size, &session_key) } /// Encrypt the message in SEIPDv1 format to a password `msg_pw`. pub fn encrypt_with_password_seipdv1( &self, mut rng: R, s2k: StringToKey, alg: SymmetricKeyAlgorithm, msg_pw: F, ) -> Result where R: Rng + CryptoRng, F: FnOnce() -> String + Clone, { // 1. Generate a session key. let session_key = alg.new_session_key(&mut rng); // 2. Encrypt (sym) the session key using the provided password. let skesk = Esk::SymKeyEncryptedSessionKey(SymKeyEncryptedSessionKey::encrypt_v4( msg_pw, &session_key, s2k, alg, )?); // 3. Encrypt (sym) the data using the session key. self.encrypt_symmetric_seipdv1(rng, vec![skesk], alg, &session_key) } /// Encrypt the message in SEIPDv2 format to a password `msg_pw`. pub fn encrypt_with_password_seipdv2( &self, mut rng: R, s2k: StringToKey, alg: SymmetricKeyAlgorithm, aead: AeadAlgorithm, chunk_size: u8, msg_pw: F, ) -> Result where R: Rng + CryptoRng, F: FnOnce() -> String + Clone, { // 1. Generate a session key. let session_key = alg.new_session_key(&mut rng); // 2. Encrypt (sym) the session key using the provided password. let skesk = Esk::SymKeyEncryptedSessionKey(SymKeyEncryptedSessionKey::encrypt_v6( &mut rng, msg_pw, &session_key, s2k, alg, aead, )?); // 3. Encrypt (sym) the data using the session key. self.encrypt_symmetric_seipdv2(rng, vec![skesk], alg, aead, chunk_size, &session_key) } /// Symmetrically encrypt this Message in SEIPDv1 format using the provided `session_key`. /// /// This function assumes that it is only called with Esk that are legal to use with SEIPDv1. fn encrypt_symmetric_seipdv1( &self, rng: R, esk: Vec, alg: SymmetricKeyAlgorithm, session_key: &[u8], ) -> Result { let data = self.to_bytes()?; let edata = Edata::SymEncryptedProtectedData(SymEncryptedProtectedData::encrypt_seipdv1( rng, alg, session_key, &data, )?); Ok(Message::Encrypted { esk, edata }) } /// Symmetrically encrypt this Message in SEIPDv2 format using the provided `session_key`. /// /// This function assumes that it is only called with Esk that are legal to use with SEIPDv2. fn encrypt_symmetric_seipdv2( &self, rng: R, esk: Vec, alg: SymmetricKeyAlgorithm, aead: AeadAlgorithm, chunk_size: u8, session_key: &[u8], ) -> Result { let data = self.to_bytes()?; let edata = Edata::SymEncryptedProtectedData(SymEncryptedProtectedData::encrypt_seipdv2( rng, alg, aead, chunk_size, session_key, &data, )?); Ok(Message::Encrypted { esk, edata }) } /// Sign this message using the provided key. pub fn sign( self, rng: R, key: &impl SecretKeyTrait, key_pw: F, hash_algorithm: HashAlgorithm, ) -> Result where R: CryptoRng + Rng, F: FnOnce() -> String, { let key_id = key.key_id(); let algorithm = key.algorithm(); let hashed_subpackets = vec![ Subpacket::regular(SubpacketData::IssuerFingerprint(key.fingerprint())), Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), )), ]; let unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(key_id.clone()))]; let (typ, signature) = match self { Message::Literal(ref l) => { let typ = if l.is_binary() { SignatureType::Binary } else { SignatureType::Text }; let mut config = match key.version() { KeyVersion::V4 => SignatureConfig::v4(typ, algorithm, hash_algorithm), KeyVersion::V6 => SignatureConfig::v6(rng, typ, algorithm, hash_algorithm)?, v => bail!("unsupported key version {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; (typ, config.sign(key, key_pw, l.data())?) } _ => { let typ = SignatureType::Binary; let mut config = match key.version() { KeyVersion::V4 => SignatureConfig::v4(typ, algorithm, hash_algorithm), KeyVersion::V6 => SignatureConfig::v6(rng, typ, algorithm, hash_algorithm)?, v => bail!("unsupported key version {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; let data = self.to_bytes()?; let signature = config.sign(key, key_pw, &data[..])?; (typ, signature) } }; let ops = match key.version() { KeyVersion::V4 => OnePassSignature::v3(typ, hash_algorithm, algorithm, key_id), KeyVersion::V6 => { let SignatureVersionSpecific::V6 { ref salt } = signature.config.version_specific else { // This should never happen bail!("Inconsistent Signature and OnePassSignature version") }; let Fingerprint::V6(fp) = key.fingerprint() else { bail!("Inconsistent Signature and Fingerprint version") }; OnePassSignature::v6(typ, hash_algorithm, algorithm, salt.clone(), fp) } v => bail!("Unsupported key version {:?}", v), }; Ok(Message::Signed { message: Some(Box::new(self)), one_pass_signature: Some(ops), signature, }) } /// Convert the message to a standalone signature according to the cleartext framework. pub fn into_signature(self) -> StandaloneSignature { match self { Message::Signed { signature, .. } => StandaloneSignature::new(signature), _ => panic!("only signed messages can be converted to standalone signature messages"), } } /// Verify this message. /// For signed messages this verifies the signature and for compressed messages /// they are decompressed and checked for signatures to verify. /// /// Decompresses up to one layer of compressed data. pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<()> { self.verify_internal(key, true) } /// Verifies this message. /// For signed messages this verifies the signature. /// /// If `decompress` is true and the message is compressed, /// the message is decompressed and verified. fn verify_internal(&self, key: &impl PublicKeyTrait, decompress: bool) -> Result<()> { match self { Message::Signed { signature, message, .. } => { if let Some(message) = message { match **message { Message::Literal(ref data) => signature.verify(key, data.data()), _ => { let data = message.to_bytes()?; signature.verify(key, &data[..]) } } } else { unimplemented_err!("no message, what to do?"); } } Message::Compressed(data) => { if decompress { let msg = Message::from_bytes(data.decompress()?)?; msg.verify_internal(key, false) } else { bail!("Recursive decompression not allowed"); } } // We don't know how to verify a signature for other Message types, and shouldn't return Ok _ => Err(Error::Unsupported(format!( "Unexpected message format: {self:?}", ))), } } /// Decrypt the message using the given key. /// Returns a message decrypter, and a list of [KeyId]s that are valid recipients of this message. pub fn decrypt(&self, key_pw: G, keys: &[&SignedSecretKey]) -> Result<(Message, Vec)> where G: FnOnce() -> String + Clone, { match self { Message::Compressed { .. } | Message::Literal { .. } => { bail!("not encrypted"); } Message::Signed { message, .. } => match message { Some(message) => message.as_ref().decrypt(key_pw, keys), None => bail!("not encrypted"), }, Message::Encrypted { esk, edata, .. } => { let valid_keys = keys .iter() .filter_map(|key| { // search for a packet with a key id that we have and that key. let mut packet = None; let mut encoding_key = None; let mut encoding_subkey = None; for esk_packet in esk.iter().filter_map(|k| match k { Esk::PublicKeyEncryptedSessionKey(k) => Some(k), _ => None, }) { debug!("esk packet: {:?}", esk_packet); debug!("{:?}", key.key_id()); debug!( "{:?}", key.secret_subkeys .iter() .map(PublicKeyTrait::key_id) .collect::>() ); // find the matching key or subkey if esk_packet.match_identity(&key.primary_key) { encoding_key = Some(&key.primary_key); } if encoding_key.is_none() { encoding_subkey = key .secret_subkeys .iter() .find(|&subkey| esk_packet.match_identity(&subkey)); } if encoding_key.is_some() || encoding_subkey.is_some() { packet = Some(esk_packet); break; } } packet.map(|packet| (packet, encoding_key, encoding_subkey)) }) .collect::>(); if valid_keys.is_empty() { return Err(Error::MissingKey); } let session_keys = valid_keys .iter() .map(|(pkesk, encoding_key, encoding_subkey)| { let typ = match pkesk.version() { PkeskVersion::V3 => EskType::V3_4, PkeskVersion::V6 => EskType::V6, PkeskVersion::Other(v) => { unimplemented_err!("Unexpected PKESK version {}", v) } }; if let Some(ek) = encoding_key { Ok(( ek.key_id(), decrypt_session_key(ek, key_pw.clone(), pkesk.values()?, typ)?, )) } else if let Some(ek) = encoding_subkey { Ok(( ek.key_id(), decrypt_session_key(ek, key_pw.clone(), pkesk.values()?, typ)?, )) } else { unreachable!("either a key or a subkey were found"); } }) .filter(|res| match res { Ok(_) => true, Err(err) => { warn!("failed to decrypt session_key for key: {:?}", err); false } }) .collect::>>()?; ensure!(!session_keys.is_empty(), "failed to decrypt session key"); // make sure all the keys are the same, otherwise we are in a bad place let session_key = { let (_key_id, k0) = &session_keys[0]; if !session_keys.iter().skip(1).all(|(_, k)| k0 == k) { bail!("found inconsistent session keys, possible message corruption"); } // TODO: avoid cloning k0.clone() }; let ids = session_keys.into_iter().map(|(k, _)| k).collect(); let msg = edata.decrypt(session_key)?; Ok((msg, ids)) } } } /// Decrypt the message using the given key. /// Returns a message decrypter, and a list of [KeyId]s that are valid recipients of this message. pub fn decrypt_with_password(&self, msg_pw: F) -> Result where F: FnOnce() -> String + Clone, { match self { Message::Compressed { .. } | Message::Literal { .. } => { bail!("not encrypted"); } Message::Signed { message, .. } => match message { Some(ref message) => message.decrypt_with_password(msg_pw), None => bail!("not encrypted"), }, Message::Encrypted { esk, edata, .. } => { // TODO: handle multiple passwords let skesk = esk.iter().find_map(|esk| match esk { Esk::SymKeyEncryptedSessionKey(k) => Some(k), _ => None, }); ensure!(skesk.is_some(), "message is not password protected"); let session_key = decrypt_session_key_with_password(skesk.expect("checked above"), msg_pw)?; edata.decrypt(session_key) } } } /// Check if this message is a signature, that was signed with a one pass signature. pub fn is_one_pass_signed(&self) -> bool { match self { Message::Signed { one_pass_signature, .. } => one_pass_signature.is_some(), _ => false, } } pub fn is_literal(&self) -> bool { match self { Message::Literal { .. } => true, Message::Signed { message, .. } => message .as_ref() .map(|msg| msg.is_literal()) .unwrap_or_default(), _ => false, } } pub fn get_literal(&self) -> Option<&LiteralData> { match self { Message::Literal(ref data) => Some(data), Message::Signed { message, .. } => message.as_ref().and_then(|msg| msg.get_literal()), _ => None, } } /// Returns the underlying content and `None` if the message is encrypted. /// /// Decompresses up to one layer of compressed data. pub fn get_content(&self) -> Result>> { self.get_content_internal(true) } /// Returns the underlying content and `None` if the message is encrypted. /// /// If `decompress` is true, may decompress a compressed message. fn get_content_internal(&self, decompress: bool) -> Result>> { match self { Message::Literal(ref data) => Ok(Some(data.data().to_vec())), Message::Signed { message, .. } => Ok(message .as_ref() .and_then(|m| m.get_literal()) .map(|l| l.data().to_vec())), Message::Compressed(data) => { if decompress { let msg = Message::from_bytes(data.decompress()?)?; msg.get_content_internal(false) } else { bail!("Recursive decompression not allowed"); } } Message::Encrypted { .. } => Ok(None), } } pub fn to_armored_writer( &self, writer: &mut impl io::Write, opts: ArmorOptions<'_>, ) -> Result<()> { armor::write( self, armor::BlockType::Message, writer, opts.headers, opts.include_checksum, ) } pub fn to_armored_bytes(&self, opts: ArmorOptions<'_>) -> Result> { let mut buf = Vec::new(); self.to_armored_writer(&mut buf, opts)?; Ok(buf) } pub fn to_armored_string(&self, opts: ArmorOptions<'_>) -> Result { let res = String::from_utf8(self.to_armored_bytes(opts)?).map_err(|e| e.utf8_error())?; Ok(res) } } /// Options for generating armored content. #[derive(Debug, Clone)] pub struct ArmorOptions<'a> { /// Armor headers pub headers: Option<&'a armor::Headers>, /// Should a checksum be included? Default to `true`. pub include_checksum: bool, } impl Default for ArmorOptions<'_> { fn default() -> Self { Self { headers: None, include_checksum: true, } } } impl<'a> From> for ArmorOptions<'a> { fn from(headers: Option<&'a armor::Headers>) -> Self { Self { headers, include_checksum: true, } } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use std::fs; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use super::*; use crate::cleartext::CleartextSignedMessage; use crate::SignedPublicKey; #[test] fn test_compression_zlib() { let lit_msg = Message::new_literal("hello-zlib.txt", "hello world"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); let uncompressed_msg = compressed_msg.decompress().unwrap(); assert_eq!(&lit_msg, &uncompressed_msg); } #[test] fn test_compression_zip() { let lit_msg = Message::new_literal("hello-zip.txt", "hello world"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZIP).unwrap(); let uncompressed_msg = compressed_msg.decompress().unwrap(); assert_eq!(&lit_msg, &uncompressed_msg); } #[test] fn test_compression_uncompressed() { let lit_msg = Message::new_literal("hello.txt", "hello world"); let compressed_msg = lit_msg .compress(CompressionAlgorithm::Uncompressed) .unwrap(); let uncompressed_msg = compressed_msg.decompress().unwrap(); assert_eq!(&lit_msg, &uncompressed_msg); } #[test] fn test_rsa_encryption_seipdv1() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc") .unwrap(), ) .unwrap(); // subkey[0] is the encryption key let pkey = skey.secret_subkeys[0].public_key(); let mut rng = rand::rngs::StdRng::seed_from_u64(100); let mut rng2 = rand::rngs::StdRng::seed_from_u64(100); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); // Encrypt and test that rng is the only source of randomness. let encrypted = compressed_msg .encrypt_to_keys_seipdv1(&mut rng, SymmetricKeyAlgorithm::AES128, &[&pkey][..]) .unwrap(); let encrypted2 = compressed_msg .encrypt_to_keys_seipdv1(&mut rng2, SymmetricKeyAlgorithm::AES128, &[&pkey][..]) .unwrap(); assert_eq!(encrypted, encrypted2); let armored = encrypted.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-rsa.asc", &armored).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; let decrypted = parsed.decrypt(|| "test".into(), &[&skey]).unwrap().0; assert_eq!(compressed_msg, decrypted); } #[test] fn test_rsa_encryption_seipdv2() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc") .unwrap(), ) .unwrap(); // subkey[0] is the encryption key let pkey = skey.secret_subkeys[0].public_key(); let mut rng = rand::rngs::StdRng::seed_from_u64(100); let mut rng2 = rand::rngs::StdRng::seed_from_u64(100); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); // Encrypt and test that rng is the only source of randomness. let encrypted = compressed_msg .encrypt_to_keys_seipdv2( &mut rng, SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Ocb, 0x06, &[&pkey][..], ) .unwrap(); let encrypted2 = compressed_msg .encrypt_to_keys_seipdv2( &mut rng2, SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Ocb, 0x06, &[&pkey][..], ) .unwrap(); assert_eq!(encrypted, encrypted2); let armored = encrypted.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-rsa.asc", &armored).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; let decrypted = parsed.decrypt(|| "test".into(), &[&skey]).unwrap().0; assert_eq!(compressed_msg, decrypted); } #[test] fn test_x25519_encryption_seipdv1() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/autocrypt/alice@autocrypt.example.sec.asc").unwrap(), ) .unwrap(); // subkey[0] is the encryption key let pkey = skey.secret_subkeys[0].public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); for _ in 0..1000 { let encrypted = compressed_msg .encrypt_to_keys_seipdv1(&mut rng, SymmetricKeyAlgorithm::AES128, &[&pkey][..]) .unwrap(); let armored = encrypted.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-x25519.asc", &armored).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; let decrypted = parsed.decrypt(|| "".into(), &[&skey]).unwrap().0; assert_eq!(compressed_msg, decrypted); } } fn x25519_encryption_seipdv2(aead: AeadAlgorithm, sym: SymmetricKeyAlgorithm) { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/autocrypt/alice@autocrypt.example.sec.asc").unwrap(), ) .unwrap(); // subkey[0] is the encryption key let pkey = skey.secret_subkeys[0].public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); for _ in 0..1000 { let encrypted = compressed_msg .encrypt_to_keys_seipdv2(&mut rng, sym, aead, 0x06, &[&pkey][..]) .unwrap(); let armored = encrypted.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-x25519.asc", &armored).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; let decrypted = parsed.decrypt(|| "".into(), &[&skey]).unwrap().0; assert_eq!(compressed_msg, decrypted); } } #[test] fn test_x25519_encryption_seipdv2_ocb_aes128() { x25519_encryption_seipdv2(AeadAlgorithm::Ocb, SymmetricKeyAlgorithm::AES128); } #[test] fn test_x25519_encryption_seipdv2_eax_aes128() { x25519_encryption_seipdv2(AeadAlgorithm::Eax, SymmetricKeyAlgorithm::AES128); } #[test] fn test_x25519_encryption_seipdv2_gcm_aes128() { x25519_encryption_seipdv2(AeadAlgorithm::Gcm, SymmetricKeyAlgorithm::AES128); } #[test] fn test_x25519_encryption_seipdv2_ocb_aes192() { x25519_encryption_seipdv2(AeadAlgorithm::Ocb, SymmetricKeyAlgorithm::AES192); } #[test] fn test_x25519_encryption_seipdv2_eax_aes192() { x25519_encryption_seipdv2(AeadAlgorithm::Eax, SymmetricKeyAlgorithm::AES192); } #[test] fn test_x25519_encryption_seipdv2_gcm_aes192() { x25519_encryption_seipdv2(AeadAlgorithm::Gcm, SymmetricKeyAlgorithm::AES192); } #[test] fn test_x25519_encryption_seipdv2_ocb_aes256() { x25519_encryption_seipdv2(AeadAlgorithm::Ocb, SymmetricKeyAlgorithm::AES256); } #[test] fn test_x25519_encryption_seipdv2_eax_aes256() { x25519_encryption_seipdv2(AeadAlgorithm::Eax, SymmetricKeyAlgorithm::AES256); } #[test] fn test_x25519_encryption_seipdv2_gcm_aes256() { x25519_encryption_seipdv2(AeadAlgorithm::Gcm, SymmetricKeyAlgorithm::AES256); } #[test] fn test_password_encryption_seipdv1() { let _ = pretty_env_logger::try_init(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); let s2k = StringToKey::new_default(&mut rng); let encrypted = compressed_msg .encrypt_with_password_seipdv1(&mut rng, s2k, SymmetricKeyAlgorithm::AES128, || { "secret".into() }) .unwrap(); let armored = encrypted.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-password.asc", &armored).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; let decrypted = parsed.decrypt_with_password(|| "secret".into()).unwrap(); assert_eq!(compressed_msg, decrypted); } fn password_encryption_seipdv2(aead: AeadAlgorithm, sym: SymmetricKeyAlgorithm) { let _ = pretty_env_logger::try_init(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let compressed_msg = lit_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); let s2k = StringToKey::new_default(&mut rng); let encrypted = compressed_msg .encrypt_with_password_seipdv2(&mut rng, s2k, sym, aead, 0x06, || "secret".into()) .unwrap(); let armored = encrypted.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-password.asc", &armored).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; let decrypted = parsed.decrypt_with_password(|| "secret".into()).unwrap(); assert_eq!(compressed_msg, decrypted); } #[test] fn test_password_encryption_seipdv2_ocb_aes128() { password_encryption_seipdv2(AeadAlgorithm::Ocb, SymmetricKeyAlgorithm::AES128); } #[test] fn test_password_encryption_seipdv2_eax_aes128() { password_encryption_seipdv2(AeadAlgorithm::Eax, SymmetricKeyAlgorithm::AES128); } #[test] fn test_password_encryption_seipdv2_gcm_aes128() { password_encryption_seipdv2(AeadAlgorithm::Gcm, SymmetricKeyAlgorithm::AES128); } #[test] fn test_password_encryption_seipdv2_ocb_aes192() { password_encryption_seipdv2(AeadAlgorithm::Ocb, SymmetricKeyAlgorithm::AES192); } #[test] fn test_password_encryption_seipdv2_eax_aes192() { password_encryption_seipdv2(AeadAlgorithm::Eax, SymmetricKeyAlgorithm::AES192); } #[test] fn test_password_encryption_seipdv2_gcm_aes192() { password_encryption_seipdv2(AeadAlgorithm::Gcm, SymmetricKeyAlgorithm::AES192); } #[test] fn test_password_encryption_seipdv2_ocb_aes256() { password_encryption_seipdv2(AeadAlgorithm::Ocb, SymmetricKeyAlgorithm::AES256); } #[test] fn test_password_encryption_seipdv2_eax_aes256() { password_encryption_seipdv2(AeadAlgorithm::Eax, SymmetricKeyAlgorithm::AES256); } #[test] fn test_password_encryption_seipdv2_gcm_aes256() { password_encryption_seipdv2(AeadAlgorithm::Gcm, SymmetricKeyAlgorithm::AES256); } #[test] fn test_no_plaintext_decryption() { // Invalid message "encrypted" with plaintext algorithm. // Generated with the Python script below. let msg_raw = b"\xc3\x04\x04\x00\x00\x08\xd2-\x01\x00\x00\xcb\x12b\x00\x00\x00\x00\x00Hello world!\xd3\x14\xc3\xadw\x022\x05\x0ek'k\x8d\x12\xaa8\r'\x8d\xc0\x82)"; /* import hashlib import sys data = ( b"\xc3" # PTag = 11000011, new packet format, tag 3 = SKESK b"\x04" # Packet length, 4 b"\x04" # Version number, 4 b"\x00" # Algorithm, plaintext b"\x00\x08" # S2K specifier, Simple S2K, SHA256 b"\xd2" # PTag = 1101 0010, new packet format, tag 18 = SEIPD b"\x2d" # Packet length, 45 b"\x01" # Version number, 1 ) inner_data = ( b"\x00\x00" # IV b"\xcb" # PTag = 11001011, new packet format, tag 11 = literal data packet b"\x12" # Packet length, 18 b"\x62" # Binary data ('b') b"\x00" # No filename, empty filename length b"\x00\x00\x00\x00" # Date b"Hello world!" ) data += inner_data data += ( b"\xd3" # Modification Detection Code packet, tag 19 b"\x14" # MDC packet length, 20 bytes ) data += hashlib.new("SHA1", inner_data + b"\xd3\x14").digest() print(data) */ let msg = Message::from_bytes(&msg_raw[..]).unwrap(); // Before the fix message eventually decrypted to // Literal(LiteralData { packet_version: New, mode: Binary, created: 1970-01-01T00:00:00Z, file_name: "", data: "48656c6c6f20776f726c6421" }) // where "48656c6c6f20776f726c6421" is an encoded "Hello world!" string. assert!(msg .decrypt_with_password(|| "foobarbaz".into()) .err() .unwrap() .to_string() .contains("plaintext")); } #[test] fn test_x25519_signing_string() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/autocrypt/alice@autocrypt.example.sec.asc").unwrap(), ) .unwrap(); let pkey = skey.public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); assert!(lit_msg.verify(&pkey).is_err()); // Unsigned message shouldn't verify let signed_msg = lit_msg .sign(&mut rng, &skey, || "".into(), HashAlgorithm::SHA2_256) .unwrap(); let armored = signed_msg.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-string-signed-x25519.asc", &armored).unwrap(); signed_msg.verify(&pkey).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; parsed.verify(&pkey).unwrap(); } #[test] fn test_x25519_signing_bytes() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/autocrypt/alice@autocrypt.example.sec.asc").unwrap(), ) .unwrap(); let pkey = skey.public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal_bytes("hello.txt", &b"hello world\n"[..]); let signed_msg = lit_msg .sign(&mut rng, &skey, || "".into(), HashAlgorithm::SHA2_256) .unwrap(); let armored = signed_msg.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-bytes-signed-x25519.asc", &armored).unwrap(); signed_msg.verify(&pkey).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; parsed.verify(&pkey).unwrap(); } #[test] fn test_x25519_signing_bytes_compressed() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/autocrypt/alice@autocrypt.example.sec.asc").unwrap(), ) .unwrap(); let pkey = skey.public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal_bytes("hello.txt", &b"hello world\n"[..]); let signed_msg = lit_msg .sign(&mut rng, &skey, || "".into(), HashAlgorithm::SHA2_256) .unwrap(); let compressed_msg = signed_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); let armored = compressed_msg.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-bytes-compressed-signed-x25519.asc", &armored).unwrap(); signed_msg.verify(&pkey).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; parsed.verify(&pkey).unwrap(); } #[test] fn test_rsa_signing_string() { for _ in 0..100 { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open( "./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc", ) .unwrap(), ) .unwrap(); let pkey = skey.public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal("hello.txt", "hello world\n"); let signed_msg = lit_msg .sign(&mut rng, &skey, || "test".into(), HashAlgorithm::SHA2_256) .unwrap(); let armored = signed_msg.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-string-signed-rsa.asc", &armored).unwrap(); signed_msg.verify(&pkey).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; parsed.verify(&pkey).unwrap(); } } #[test] fn test_rsa_signing_bytes() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc") .unwrap(), ) .unwrap(); let pkey = skey.public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal_bytes("hello.txt", &b"hello world\n"[..]); let signed_msg = lit_msg .sign(&mut rng, &skey, || "test".into(), HashAlgorithm::SHA2_256) .unwrap(); let armored = signed_msg.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-bytes-signed-rsa.asc", &armored).unwrap(); signed_msg.verify(&pkey).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; parsed.verify(&pkey).unwrap(); } #[test] fn test_rsa_signing_bytes_compressed() { let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc") .unwrap(), ) .unwrap(); let pkey = skey.public_key(); let mut rng = ChaCha8Rng::seed_from_u64(0); let lit_msg = Message::new_literal_bytes("hello.txt", &b"hello world\n"[..]); let signed_msg = lit_msg .sign(&mut rng, &skey, || "test".into(), HashAlgorithm::SHA2_256) .unwrap(); let compressed_msg = signed_msg.compress(CompressionAlgorithm::ZLIB).unwrap(); let armored = compressed_msg.to_armored_bytes(None.into()).unwrap(); // fs::write("./message-bytes-compressed-signed-rsa.asc", &armored).unwrap(); signed_msg.verify(&pkey).unwrap(); let parsed = Message::from_armor_single(&armored[..]).unwrap().0; parsed.verify(&pkey).unwrap(); } #[test] fn test_text_signature_normalization() { // Test verifying an inlined signed message. // // The signature type is 0x01 ("Signature of a canonical text document"). // // The literal data packet (which is in binary mode) contains the output of: // echo -en "foo\nbar\r\nbaz" // // RFC 9580 mandates that the hash for signature type 0x01 has to be calculated over normalized line endings, // so the hash for this message is calculated over "foo\r\nbar\r\nbaz". // // So it must also be verified against a hash digest over this normalized format. let (signed_msg, _header) = Message::from_armor_single( fs::File::open("./tests/unit-tests/text_signature_normalization.msg").unwrap(), ) .unwrap(); let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/unit-tests/text_signature_normalization_alice.key").unwrap(), ) .unwrap(); // Manually find the signing subkey let signing = skey .secret_subkeys .iter() .find(|key| { key.key_id() == KeyId::from_slice(&[0x64, 0x35, 0x7E, 0xB6, 0xBB, 0x55, 0xDE, 0x12]).unwrap() }) .unwrap(); // And transform it into a public subkey for signature verification let verify = signing.public_key(); // verify the signature with alice's signing subkey signed_msg.verify(&verify).expect("signature seems bad"); } /// Tests that decompressing compression quine does not result in stack overflow. /// quine.out comes from /// See for details. #[test] fn test_compression_quine() { // Public key does not matter as the message is not signed. let (skey, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/autocrypt/alice@autocrypt.example.sec.asc").unwrap(), ) .unwrap(); let pkey = skey.public_key(); let msg = Message::from_bytes(&include_bytes!("../../../tests/quine.out")[..]).unwrap(); assert!(msg.get_content().is_err()); assert!(msg.verify(&pkey).is_err()); } // Sample Version 6 Certificate (Transferable Public Key) // https://www.rfc-editor.org/rfc/rfc9580.html#name-sample-version-6-certificat const ANNEX_A_3: &str = "-----BEGIN PGP PUBLIC KEY BLOCK----- xioGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laPCsQYf GwoAAABCBYJjh3/jAwsJBwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxy KwwfHifBilZwj2Ul7Ce62azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lw gyU2kCcUmKfvBXbAf6rhRYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaE QsiPlR4zxP/TP7mhfVEe7XWPxtnMUMtf15OyA51YBM4qBmOHf+MZAAAAIIaTJINn +eUBXbki+PSAld2nhJh/LVmFsS+60WyvXkQ1wpsGGBsKAAAALAWCY4d/4wKbDCIh BssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce62azJAAAAAAQBIKbpGG2dWTX8 j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDEM0g12vYxoWM8Y81W+bHBw805 I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUrk0mXubZvyl4GBg== -----END PGP PUBLIC KEY BLOCK-----"; // Sample Version 6 Secret Key (Transferable Secret Key) // https://www.rfc-editor.org/rfc/rfc9580.html#name-sample-version-6-secret-key const ANNEX_A_4: &str = "-----BEGIN PGP PRIVATE KEY BLOCK----- xUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB exK+cH6NX1hs5hNhIB00TrJmosgv3mg1ditlsLfCsQYfGwoAAABCBYJjh3/jAwsJ BwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lwgyU2kCcUmKfvBXbAf6rh RYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaEQsiPlR4zxP/TP7mhfVEe 7XWPxtnMUMtf15OyA51YBMdLBmOHf+MZAAAAIIaTJINn+eUBXbki+PSAld2nhJh/ LVmFsS+60WyvXkQ1AE1gCk95TUR3XFeibg/u/tVY6a//1q0NWC1X+yui3O24wpsG GBsKAAAALAWCY4d/4wKbDCIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJAAAAAAQBIKbpGG2dWTX8j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDE M0g12vYxoWM8Y81W+bHBw805I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUr k0mXubZvyl4GBg== -----END PGP PRIVATE KEY BLOCK-----"; /// Verify Cleartext Signed Message /// /// Test data from RFC 9580, see /// https://www.rfc-editor.org/rfc/rfc9580.html#name-sample-cleartext-signed-mes #[test] fn test_v6_annex_a_6() { let (ssk, _) = SignedPublicKey::from_string(ANNEX_A_3).expect("SSK from armor"); let msg = "-----BEGIN PGP SIGNED MESSAGE----- What we need from the grocery store: - - tofu - - vegetables - - noodles -----BEGIN PGP SIGNATURE----- wpgGARsKAAAAKQWCY5ijYyIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJAAAAAGk2IHZJX1AhiJD39eLuPBgiUU9wUA9VHYblySHkBONKU/usJ9BvuAqo /FvLFuGWMbKAdA+epq7V4HOtAPlBWmU8QOd6aud+aSunHQaaEJ+iTFjP2OMW0KBr NK2ay45cX1IVAQ== -----END PGP SIGNATURE-----"; let (msg, _) = CleartextSignedMessage::from_string(msg).unwrap(); msg.verify(&ssk).expect("verify"); } /// Verify Inline Signed Message /// /// Test data from RFC 9580, see /// https://www.rfc-editor.org/rfc/rfc9580.html#name-sample-inline-signed-messag #[test] fn test_v6_annex_a_7() { let (ssk, _) = SignedPublicKey::from_string(ANNEX_A_3).expect("SSK from armor"); let msg = "-----BEGIN PGP MESSAGE----- xEYGAQobIHZJX1AhiJD39eLuPBgiUU9wUA9VHYblySHkBONKU/usyxhsTwYJppfk 1S36bHIrDB8eJ8GKVnCPZSXsJ7rZrMkBy0p1AAAAAABXaGF0IHdlIG5lZWQgZnJv bSB0aGUgZ3JvY2VyeSBzdG9yZToKCi0gdG9mdQotIHZlZ2V0YWJsZXMKLSBub29k bGVzCsKYBgEbCgAAACkFgmOYo2MiIQbLGGxPBgmml+TVLfpscisMHx4nwYpWcI9l JewnutmsyQAAAABpNiB2SV9QIYiQ9/Xi7jwYIlFPcFAPVR2G5ckh5ATjSlP7rCfQ b7gKqPxbyxbhljGygHQPnqau1eBzrQD5QVplPEDnemrnfmkrpx0GmhCfokxYz9jj FtCgazStmsuOXF9SFQE= -----END PGP MESSAGE-----"; let (msg, _) = Message::from_string(msg).unwrap(); msg.verify(&ssk).expect("verify"); } /// Decrypt an X25519-AEAD-OCB Encrypted Packet Sequence /// /// Test data from RFC 9580, see /// https://www.rfc-editor.org/rfc/rfc9580.html#name-sample-x25519-aead-ocb-encr #[test] fn test_v6_annex_a_8() { let (ssk, _) = SignedSecretKey::from_string(ANNEX_A_4).expect("SSK from armor"); // A.8. Sample X25519-AEAD-OCB Decryption let msg = "-----BEGIN PGP MESSAGE----- wV0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRmHzxjV8bU/gXzO WgBM85PMiVi93AZfJfhK9QmxfdNnZBjeo1VDeVZheQHgaVf7yopqR6W1FT6NOrfS aQIHAgZhZBZTW+CwcW1g4FKlbExAf56zaw76/prQoN+bAzxpohup69LA7JW/Vp0l yZnuSj3hcFj0DfqLTGgr4/u717J+sPWbtQBfgMfG9AOIwwrUBqsFE9zW+f1zdlYo bhF30A+IitsxxA== -----END PGP MESSAGE-----"; let (message, _) = Message::from_string(msg).expect("ok"); let (dec, _) = message.decrypt(String::default, &[&ssk]).expect("decrypt"); let decrypted = String::from_utf8(dec.get_literal().expect("literal").data().to_vec()).expect("utf8"); assert_eq!(&decrypted, "Hello, world!"); } } pgp-0.15.0/src/composed/mod.rs000064400000000000000000000004221046102023000142200ustar 00000000000000pub mod cleartext; pub mod key; pub mod message; pub mod signed_key; mod any; mod shared; mod signature; pub use self::any::Any; pub use self::key::*; pub use self::message::*; pub use self::shared::Deserializable; pub use self::signature::*; pub use self::signed_key::*; pgp-0.15.0/src/composed/shared.rs000064400000000000000000000210471046102023000147150ustar 00000000000000use std::io::{BufRead, Read}; use buffer_redux::BufReader; use log::{debug, warn}; use crate::armor::{self, BlockType}; use crate::errors::{Error, Result}; use crate::packet::{Packet, PacketParser}; pub trait Deserializable: Sized { /// Parse a single byte encoded composition. fn from_bytes(bytes: impl Read) -> Result { let mut el = Self::from_bytes_many(bytes); el.next().ok_or(Error::NoMatchingPacket)? } /// Parse a single armor encoded composition. fn from_string(input: &str) -> Result<(Self, armor::Headers)> { let (mut el, headers) = Self::from_string_many(input)?; Ok((el.next().ok_or(Error::NoMatchingPacket)??, headers)) } /// Parse an armor encoded list of compositions. #[allow(clippy::type_complexity)] fn from_string_many<'a>( input: &'a str, ) -> Result<(Box> + 'a>, armor::Headers)> { Self::from_armor_many_buf(input.as_bytes()) } /// Armored ascii data. fn from_armor_single(input: R) -> Result<(Self, armor::Headers)> { let (mut el, headers) = Self::from_armor_many(input)?; Ok((el.next().ok_or(Error::NoMatchingPacket)??, headers)) } /// Armored ascii data. fn from_armor_single_buf(input: R) -> Result<(Self, armor::Headers)> { let (mut el, headers) = Self::from_armor_many_buf(input)?; Ok((el.next().ok_or(Error::NoMatchingPacket)??, headers)) } /// Armored ascii data. #[allow(clippy::type_complexity)] fn from_armor_many<'a, R: Read + 'a>( input: R, ) -> Result<(Box> + 'a>, armor::Headers)> { Self::from_armor_many_buf(BufReader::new(input)) } #[allow(clippy::type_complexity)] fn from_armor_many_buf<'a, R: BufRead + 'a>( input: R, ) -> Result<(Box> + 'a>, armor::Headers)> { let mut dearmor = armor::Dearmor::new(input); dearmor.read_header()?; // Safe to unwrap, as read_header succeeded. let typ = dearmor .typ .ok_or_else(|| format_err!("dearmor failed to retrieve armor type"))?; // TODO: add typ information to the key possibly? match typ { // Standard PGP types BlockType::PublicKey | BlockType::PrivateKey | BlockType::Message | BlockType::MultiPartMessage(_, _) | BlockType::Signature | BlockType::CleartextMessage | BlockType::File => { let headers = dearmor.headers.clone(); // FIXME: avoid clone if !Self::matches_block_type(typ) { bail!("unexpected block type: {}", typ); } Ok((Self::from_bytes_many(dearmor), headers)) } BlockType::PublicKeyPKCS1(_) | BlockType::PublicKeyPKCS8 | BlockType::PublicKeyOpenssh | BlockType::PrivateKeyPKCS1(_) | BlockType::PrivateKeyPKCS8 | BlockType::PrivateKeyOpenssh => { unimplemented_err!("key format {:?}", typ); } } } /// Parse a list of compositions in raw byte format. fn from_bytes_many<'a>(bytes: impl Read + 'a) -> Box> + 'a> { let packets = PacketParser::new(bytes).filter_map(filter_parsed_packet_results); Self::from_packets(packets.peekable()) } /// Turn a list of packets into a usable representation. fn from_packets<'a, I: Iterator> + 'a>( packets: std::iter::Peekable, ) -> Box> + 'a>; /// Check if the given typ is a valid block type for this type. fn matches_block_type(typ: BlockType) -> bool; /// Parses a single composition, from either ASCII-armored or binary OpenPGP data. /// /// Returns a composition and a BTreeMap containing armor headers /// (None, if the data was unarmored) #[allow(clippy::type_complexity)] fn from_reader_single<'a, R: Read + 'a>(input: R) -> Result<(Self, Option)> { Self::from_reader_single_buf(BufReader::new(input)) } #[allow(clippy::type_complexity)] fn from_reader_single_buf<'a, R: BufRead + 'a>( mut input: R, ) -> Result<(Self, Option)> { if !is_binary(&mut input)? { let (keys, headers) = Self::from_armor_single(input)?; Ok((keys, Some(headers))) } else { Ok((Self::from_bytes(input)?, None)) } } /// Parses a list of compositions, from either ASCII-armored or binary OpenPGP data. /// /// Returns an iterator of compositions and a BTreeMap containing armor headers /// (None, if the data was unarmored) #[allow(clippy::type_complexity)] fn from_reader_many<'a, R: Read + 'a>( input: R, ) -> Result<( Box> + 'a>, Option, )> { Self::from_reader_many_buf(BufReader::new(input)) } /// Parses a list of compositions, from either ASCII-armored or binary OpenPGP data. /// /// Returns an iterator of compositions and a BTreeMap containing armor headers /// (None, if the data was unarmored) #[allow(clippy::type_complexity)] fn from_reader_many_buf<'a, R: BufRead + 'a>( mut input: R, ) -> Result<( Box> + 'a>, Option, )> { if !is_binary(&mut input)? { let (keys, headers) = Self::from_armor_many_buf(input)?; Ok((keys, Some(headers))) } else { Ok((Self::from_bytes_many(input), None)) } } } /// Process results from low level packet parser: /// /// - Skip Marker packets. /// - Pass through other packets. /// - Skip any `Error::Unsupported`, those were marked as "safe to ignore" by the low level parser. /// - Skip `Error::Incomplete` /// - Skip `Error::EllipticCurve` /// - Pass through other errors. pub(crate) fn filter_parsed_packet_results(p: Result) -> Option> { // FIXME: handle padding packets (skip) // FIXME: handle criticality of packets from 9580 (error, if unsupported) match &p { Ok(Packet::Marker(_m)) => { debug!("skipping marker packet"); None } Ok(_) => Some(p), Err(e) => { if let Error::Unsupported(e) = e { // "Error::Unsupported" signals parser errors that we can safely ignore // (e.g. packets with unsupported versions) warn!("skipping unsupported packet: {p:?}"); debug!("error: {e:?}"); return None; } if let Error::InvalidPacketContent(b) = &e { let err: &Error = b; // unbox if let Error::Unsupported(e) = err { // "Error::Unsupported" signals parser errors that we can safely ignore // (e.g. packets with unsupported versions) warn!("skipping unsupported packet: {p:?}"); debug!("error: {e:?}"); return None; } if let Error::EllipticCurve(e) = err { // this error happens in one SKS test key, presumably bad public key material. // ignoring the packet seems safe. warn!("skipping bad elliptic curve data: {p:?}"); debug!("error: {e:?}"); return None; } } if let Error::PacketIncomplete = e { // We ignore incomplete packets for now (some of these occur in the SKS dumps under `tests`) warn!("skipping incomplete packet: {p:?}"); return None; } // Pass through all other errors from the low level parser, they should be surfaced Some(Err(Error::Message(format!( "unexpected packet data: {e:?}" )))) } } } /// Check if the OpenPGP data in `input` seems to be ASCII-armored or binary (by looking at the /// highest bit of the first byte) pub(crate) fn is_binary(input: &mut R) -> Result { // Peek at the first byte in the reader let buf = input.fill_buf()?; if buf.is_empty() { bail!("empty input"); } // If the first bit of the first byte is set, we assume this is binary OpenPGP data, otherwise // we assume it is ASCII-armored. let binary = buf[0] & 0x80 != 0; Ok(binary) } pgp-0.15.0/src/composed/signature.rs000064400000000000000000000053431046102023000154510ustar 00000000000000use std::iter::Peekable; use crate::composed::Deserializable; use crate::errors::Result; use crate::packet::{Packet, Signature}; use crate::ser::Serialize; use crate::types::PublicKeyTrait; use crate::types::Tag; use crate::{armor, ArmorOptions}; /// Standalone signature as defined by the cleartext framework. #[derive(Debug, Clone, PartialEq, Eq)] pub struct StandaloneSignature { pub signature: Signature, } impl StandaloneSignature { pub fn new(signature: Signature) -> Self { StandaloneSignature { signature } } pub fn to_armored_writer( &self, writer: &mut impl std::io::Write, opts: ArmorOptions<'_>, ) -> Result<()> { armor::write( self, armor::BlockType::Signature, writer, opts.headers, opts.include_checksum, ) } pub fn to_armored_bytes(&self, opts: ArmorOptions<'_>) -> Result> { let mut buf = Vec::new(); self.to_armored_writer(&mut buf, opts)?; Ok(buf) } pub fn to_armored_string(&self, opts: ArmorOptions<'_>) -> Result { let res = String::from_utf8(self.to_armored_bytes(opts)?).map_err(|e| e.utf8_error())?; Ok(res) } /// Verify this signature. pub fn verify(&self, key: &impl PublicKeyTrait, content: &[u8]) -> Result<()> { self.signature.verify(key, content) } } impl Serialize for StandaloneSignature { fn to_writer(&self, writer: &mut W) -> Result<()> { crate::packet::write_packet(writer, &self.signature) } } impl Deserializable for StandaloneSignature { /// Parse a signature. fn from_packets<'a, I: Iterator> + 'a>( packets: std::iter::Peekable, ) -> Box> + 'a> { Box::new(SignatureParser { source: packets }) } fn matches_block_type(typ: armor::BlockType) -> bool { matches!(typ, armor::BlockType::Signature) } } pub struct SignatureParser>> { source: Peekable, } impl>> Iterator for SignatureParser { type Item = Result; fn next(&mut self) -> Option { next(self.source.by_ref()) } } fn next>>( packets: &mut Peekable, ) -> Option> { match packets.by_ref().next() { Some(Ok(packet)) => match packet.tag() { Tag::Signature => Some(packet.try_into().map(StandaloneSignature::new)), _ => Some(Err(format_err!("unexpected packet {:?}", packet.tag()))), }, Some(Err(e)) => Some(Err(e)), None => None, } } pgp-0.15.0/src/composed/signed_key/key_parser.rs000064400000000000000000000217551046102023000177420ustar 00000000000000use log::{debug, warn}; use crate::errors::{Error, Result}; use crate::packet::{self, Packet, Signature, SignatureType, UserAttribute, UserId}; use crate::types::{KeyVersion, PublicKeyTrait, SignedUser, SignedUserAttribute, Tag}; use crate::{SignedKeyDetails, SignedPublicSubKey, SignedSecretSubKey}; #[allow(clippy::complexity)] pub fn next( packets: &mut std::iter::Peekable, key_tag: Tag, parse_secrect_subkeys: bool, ) -> Option< Result<( IKT, SignedKeyDetails, Vec, Vec, )>, > where I: Sized + Iterator>, IKT: TryFrom + PublicKeyTrait, { let packets = packets.by_ref(); // Check if we are done packets.peek()?; // -- One Public-Key packet // ignore random other packets until we find something useful while let Some(packet) = packets.next_if(|p| p.as_ref().is_ok_and(|p| p.tag() != key_tag)) { match packet { Ok(p) => { warn!( "ignoring unexpected packet: expected {:?}, got {:?}", key_tag, p.tag() ); // FIXME: return error? } Err(e) => return Some(Err(e)), } } let next = match packets.next() { Some(Ok(n)) => n, Some(Err(e)) => return Some(Err(e)), None => return None, }; let primary_key: IKT = match next.try_into() { Ok(key) => key, Err(err) => { return Some(Err(err)); } }; debug!("primary key: {:?}", primary_key.key_id()); // -- Zero or more revocation signatures // -- followed by zero or more direct signatures in V4 keys debug!(" signatures"); let mut revocation_signatures = Vec::new(); let mut direct_signatures = Vec::new(); while let Some(packet) = packets.next_if(|p| p.as_ref().is_ok_and(|p| p.tag() == Tag::Signature)) { match packet { Ok(packet) => { debug!("parsing signature {:?}", packet.tag()); let sig: Signature = err_opt!(packet.try_into()); let typ = sig.typ(); if typ == SignatureType::KeyRevocation { revocation_signatures.push(sig); } else { if primary_key.version() != KeyVersion::V4 { // no direct signatures on V2|V3 keys warn!("unexpected signature: {:?}", typ); } direct_signatures.push(sig); } } Err(e) => return Some(Err(e)), } } // -- Zero or more User ID packets // -- Zero or more User Attribute packets debug!(" user"); let mut users = Vec::new(); let mut user_attributes = Vec::new(); while let Some(packet) = packets.next_if(|p| { p.as_ref().is_ok_and(|p| { debug!("peek {:?}", p.tag()); p.tag() == Tag::UserId || p.tag() == Tag::UserAttribute }) }) { let packet = match packet { Ok(packet) => packet, Err(err) => return Some(Err(err)), }; let tag = packet.tag(); debug!(" user data: {:?}", tag); match tag { Tag::UserId => { let id: UserId = err_opt!(packet.try_into()); // --- zero or more signature packets let mut sigs = Vec::new(); while let Some(res) = packets.next_if(|p| p.as_ref().is_ok_and(|p| p.tag() == Tag::Signature)) { let packet = match res { Ok(packet) => packet, Err(e) => return Some(Err(e)), }; let sig: Signature = err_opt!(packet.try_into()); sigs.push(sig); } users.push(SignedUser::new(id, sigs)); } Tag::UserAttribute => { let attr: UserAttribute = err_opt!(packet.try_into()); // --- zero or more signature packets let mut sigs = Vec::new(); while let Some(res) = packets.next_if(|p| p.as_ref().is_ok_and(|p| p.tag() == Tag::Signature)) { let packet = match res { Ok(packet) => packet, Err(e) => return Some(Err(e)), }; let sig: Signature = err_opt!(packet.try_into()); sigs.push(sig); } user_attributes.push(SignedUserAttribute::new(attr, sigs)); } _ => break, } } if users.is_empty() { warn!("missing user ids"); } // -- Zero or more Subkey packets let mut public_subkey_container = Vec::new(); let mut secret_subkey_container = Vec::new(); debug!(" subkeys"); while let Some(res) = packets.next_if(|p| { p.as_ref().is_ok_and(|p| { debug!(" peek {:?}", p.tag()); p.tag() == Tag::PublicSubkey || (parse_secrect_subkeys && p.tag() == Tag::SecretSubkey) }) }) { // -- V2/3 keys can not have sub keys if primary_key.version() == KeyVersion::V2 || primary_key.version() == KeyVersion::V3 { return Some(Err(format_err!("V2/3 keys can not have subkeys"))); } let packet = match res { Ok(packet) => packet, Err(e) => return Some(Err(e)), }; match packet.tag() { Tag::PublicSubkey => { let subkey: packet::PublicSubkey = err_opt!(packet.try_into()); let mut sigs = Vec::new(); while let Some(res) = packets.next_if(|packet| { packet.is_ok() && packet.as_ref().expect("just checked").tag() == Tag::Signature }) { match res { Ok(packet) => { let sig: Signature = err_opt!(packet.try_into()); sigs.push(sig); } Err(e) => return Some(Err(e)), } } public_subkey_container.push(SignedPublicSubKey::new(subkey, sigs)); } Tag::SecretSubkey => { if parse_secrect_subkeys { let subkey: packet::SecretSubkey = err_opt!(packet.try_into()); let mut sigs = Vec::new(); while let Some(res) = packets.next_if(|packet| { packet.is_ok() && packet.as_ref().expect("just checked").tag() == Tag::Signature }) { match res { Ok(packet) => { let sig: Signature = err_opt!(packet.try_into()); sigs.push(sig); } Err(e) => return Some(Err(e)), } } secret_subkey_container.push(SignedSecretSubKey::new(subkey, sigs)); } } _ => unreachable!(), } } // Does peeking forward yield an error? If so, we consider this key to be broken. // (This can happen e.g. when an unknown critical packet it encountered within a TPK/TSK) if let Some(Err(e)) = packets.next_if(|peek| peek.is_err()) { match e { // "Unsupported" errors are by definition "soft", these packets are safe to skip silently Error::Unsupported(_) => {} _ => { return Some(Err(format_err!( "error while parsing composed key: {:?}", e ))) } } } // TODO: consume any additional packets that aren't a primary key packet? // Every subkey for a version 6 primary key MUST be a version 6 subkey. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-10.1.1-5) if primary_key.version() == KeyVersion::V6 { for sub in &public_subkey_container { if sub.version() != KeyVersion::V6 { return Some(Err(crate::errors::Error::Message(format!( "Illegal public subkey {:?} in v6 key", sub.version() )))); } } for sub in &secret_subkey_container { if sub.version() != KeyVersion::V6 { return Some(Err(crate::errors::Error::Message(format!( "Illegal secret subkey {:?} in v6 key", sub.version() )))); } } } Some(Ok(( primary_key, SignedKeyDetails::new( revocation_signatures, direct_signatures, users, user_attributes, ), public_subkey_container, secret_subkey_container, ))) } pgp-0.15.0/src/composed/signed_key/mod.rs000064400000000000000000000102261046102023000163440ustar 00000000000000//! Signed Secret and Public Key //! //! Signed secret keys shall be used to sign and decrypt, whereas public keys //! can verify and encrypt. //! Note that technically secret keys also can by definition derive a public key //! and hence themselves perform verify and encrypt as a public key can. //! //! [Key generation] is handled separately. //! For signing directly with an RFC 9580 compliant internal hashing, see [signing and verifying based on packets]. //! //! [Key generation]: super::key //! [signing and verifying based on packets]: crate::packet //! //! # Sign and Verify Example //! //! ```rust //! # const DATA :&'static [u8] = b"Hello World"; //! # use pgp::composed::{self, KeyType, KeyDetails, SecretKey, SecretSubkey, key::SecretKeyParamsBuilder}; //! # use pgp::errors::Result; //! # use pgp::packet::{self, KeyFlags, UserAttribute, SignatureVersionSpecific, UserId}; //! # use pgp::crypto::{self, sym::SymmetricKeyAlgorithm, hash::HashAlgorithm, public_key::PublicKeyAlgorithm}; //! # use pgp::types::{self, PublicKeyTrait, SecretKeyTrait, CompressionAlgorithm}; //! # use rand::thread_rng; //! # use smallvec::*; //! # //! # let mut key_params = SecretKeyParamsBuilder::default(); //! # key_params //! # .key_type(KeyType::Rsa(2048)) //! # .can_certify(false) //! # .can_sign(true) //! # .primary_user_id("Me ".into()) //! # .preferred_symmetric_algorithms(smallvec![ //! # SymmetricKeyAlgorithm::AES256, //! # ]) //! # .preferred_hash_algorithms(smallvec![ //! # HashAlgorithm::SHA2_256, //! # ]) //! # .preferred_compression_algorithms(smallvec![ //! # CompressionAlgorithm::ZLIB, //! # ]); //! # let secret_key_params = key_params.build().expect("Must be able to create secret key params"); //! # let secret_key = secret_key_params.generate(thread_rng()).expect("Failed to generate a plain key."); //! # let passwd_fn = || String::new(); //! # let signed_secret_key = secret_key.sign(&mut thread_rng(), passwd_fn).expect("Must be able to sign its own metadata"); //! # let public_key = signed_secret_key.public_key(); //! let signing_key = signed_secret_key; //! let verification_key = public_key; //! //! use pgp::Signature; //! use chrono; //! //! let now = chrono::Utc::now(); //! //! let passwd_fn = || String::new(); //! //! // simulate a digest, make sure it is a compliant produce with RFC 9580 //! // i.e. depending on the version one needs a special suffix / prefix //! // and length encoding. The following is NOT compliant: //! use sha2::{Sha256, Digest}; //! let digest = { //! let mut hasher = Sha256::new(); //! hasher.update(DATA); //! hasher.finalize() //! }; //! let digest = digest.as_slice(); //! //! // creates the cryptographic core of the signature without any metadata //! let signature = signing_key //! .create_signature(passwd_fn, HashAlgorithm::SHA2_256, digest) //! .expect("Failed to crate signature"); //! //! // the signature can already be verified //! verification_key //! .verify_signature(HashAlgorithm::SHA2_256, digest, &signature) //! .expect("Failed to validate signature"); //! //! // wraps the signature in the appropriate package fmt ready to be serialized //! let signature = Signature::v4( //! types::Version::Old, //! packet::SignatureType::Binary, //! PublicKeyAlgorithm::RSA, //! HashAlgorithm::SHA2_256, //! [digest[0], digest[1]], //! signature, //! vec![ //! packet::Subpacket::regular(packet::SubpacketData::SignatureCreationTime(now)), //! packet::Subpacket::regular(packet::SubpacketData::Issuer(signing_key.key_id())), //! ], //! vec![], //! ); //! //! // sign and and write the package (the package written here is NOT RFC 9580 compliant) //! let mut signature_bytes = Vec::with_capacity(1024); //! //! packet::write_packet(&mut signature_bytes, &signature) //! .expect("Write must succeed"); //! //! //! let raw_signature = signature.signature; //! verification_key //! .verify_signature(HashAlgorithm::SHA2_256, digest, &raw_signature) //! .expect("Verify must succeed"); //! ``` mod key_parser; mod parse; mod public; mod secret; mod shared; pub use self::parse::*; pub use self::public::*; pub use self::secret::*; pub use self::shared::*; pgp-0.15.0/src/composed/signed_key/parse.rs000064400000000000000000000117101046102023000166760ustar 00000000000000use std::{io, iter}; use buffer_redux::BufReader; use crate::armor::{self, BlockType}; use crate::composed::signed_key::{ PublicOrSecret, SignedPublicKey, SignedPublicKeyParser, SignedSecretKey, SignedSecretKeyParser, }; use crate::errors::{Error, Result}; use crate::packet::{Packet, PacketParser}; use crate::types::Tag; /// Parses a list of secret and public keys, from either ASCII-armored or binary OpenPGP data. /// /// Returns an iterator of public or secret keys and a BTreeMap containing armor headers /// (None, if the data was unarmored) #[allow(clippy::type_complexity)] pub fn from_reader_many<'a, R: io::Read + 'a>( input: R, ) -> Result<( Box> + 'a>, Option, )> { from_reader_many_buf(BufReader::new(input)) } #[allow(clippy::type_complexity)] pub fn from_reader_many_buf<'a, R: io::BufRead + 'a>( mut input: R, ) -> Result<( Box> + 'a>, Option, )> { if !crate::composed::shared::is_binary(&mut input)? { let (keys, headers) = from_armor_many_buf(input)?; Ok((keys, Some(headers))) } else { Ok((from_bytes_many(input), None)) } } /// Parses a list of secret and public keys from ascii armored text. #[allow(clippy::type_complexity)] pub fn from_armor_many<'a, R: io::Read + 'a>( input: R, ) -> Result<( Box> + 'a>, armor::Headers, )> { from_armor_many_buf(BufReader::new(input)) } /// Parses a list of secret and public keys from ascii armored text. #[allow(clippy::type_complexity)] pub fn from_armor_many_buf<'a, R: io::BufRead + 'a>( input: R, ) -> Result<( Box> + 'a>, armor::Headers, )> { let mut dearmor = armor::Dearmor::new(input); dearmor.read_header()?; // Safe to unwrap, as read_header succeeded. let typ = dearmor .typ .ok_or_else(|| format_err!("dearmor failed to retrieve armor type"))?; // TODO: add typ information to the key possibly? match typ { // Standard PGP types BlockType::PublicKey | BlockType::PrivateKey | BlockType::File => { let headers = dearmor.headers.clone(); // FIXME: avoid clone // TODO: check that the result is what it actually said. Ok((from_bytes_many(dearmor), headers)) } BlockType::Message | BlockType::MultiPartMessage(_, _) | BlockType::Signature | BlockType::CleartextMessage => { bail!("unexpected block type: {}", typ) } BlockType::PublicKeyPKCS1(_) | BlockType::PublicKeyPKCS8 | BlockType::PublicKeyOpenssh | BlockType::PrivateKeyPKCS1(_) | BlockType::PrivateKeyPKCS8 | BlockType::PrivateKeyOpenssh => { unimplemented_err!("key format {}", typ); } } } /// Parses a list of secret and public keys from raw bytes. pub fn from_bytes_many<'a>( bytes: impl io::Read + 'a, ) -> Box> + 'a> { let packets = PacketParser::new(bytes) .filter_map(crate::composed::shared::filter_parsed_packet_results) .peekable(); Box::new(PubPrivIterator { inner: Some(packets), }) } pub struct PubPrivIterator>> { inner: Option>, } impl>> Iterator for PubPrivIterator { type Item = Result; fn next(&mut self) -> Option { match self.inner.take() { None => None, Some(mut packets) => match packets.peek() { Some(Ok(peeked_packet)) => { let (res, packets) = match peeked_packet.tag() { Tag::SecretKey => { let mut parser = SignedSecretKeyParser::from_packets(packets); let p: Option> = parser.next(); ( p.map(|key| key.map(PublicOrSecret::Secret)), parser.into_inner(), ) } Tag::PublicKey => { let mut parser = SignedPublicKeyParser::from_packets(packets); let p: Option> = parser.next(); ( p.map(|key| key.map(PublicOrSecret::Public)), parser.into_inner(), ) } _ => (None, packets), }; self.inner = Some(packets); res } Some(Err(e)) => Some(Err(Error::Message(e.to_string()))), None => None, }, } } } pgp-0.15.0/src/composed/signed_key/public.rs000064400000000000000000000242251046102023000170470ustar 00000000000000use std::io; use chrono::{DateTime, Utc}; use log::warn; use rand::{CryptoRng, Rng}; use crate::composed::key::{PublicKey, PublicSubkey}; use crate::composed::signed_key::SignedKeyDetails; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::Result; use crate::packet::{self, write_packet, Packet, SignatureType}; use crate::ser::Serialize; use crate::types::{ EskType, Fingerprint, KeyId, KeyVersion, PkeskBytes, PublicKeyTrait, PublicParams, SignatureBytes, Tag, }; use crate::{armor, ArmorOptions}; /// A Public OpenPGP key ("Transferable Public Key"), complete with self-signatures (and optionally /// third party signatures). This format can be used to transfer a public key to other OpenPGP users. /// /// An OpenPGP Transferable Public Key is also known as an OpenPGP certificate. #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedPublicKey { pub primary_key: packet::PublicKey, pub details: SignedKeyDetails, pub public_subkeys: Vec, } /// Parse transferable public keys from the given packets. /// Ref: pub struct SignedPublicKeyParser< I: Sized + Iterator>, > { inner: std::iter::Peekable, } impl>> SignedPublicKeyParser { pub fn into_inner(self) -> std::iter::Peekable { self.inner } pub fn from_packets(packets: std::iter::Peekable) -> Self { SignedPublicKeyParser { inner: packets } } } impl>> Iterator for SignedPublicKeyParser { type Item = Result; fn next(&mut self) -> Option { match super::key_parser::next::( &mut self.inner, Tag::PublicKey, false, ) { Some(Err(err)) => Some(Err(err)), None => None, Some(Ok((primary_key, details, public_subkeys, _))) => Some(Ok(SignedPublicKey::new( primary_key, details, public_subkeys, ))), } } } impl crate::composed::Deserializable for SignedPublicKey { /// Parse a transferable key from packets. /// Ref: fn from_packets<'a, I: Iterator> + 'a>( packets: std::iter::Peekable, ) -> Box> + 'a> { Box::new(SignedPublicKeyParser::from_packets(packets)) } fn matches_block_type(typ: armor::BlockType) -> bool { matches!(typ, armor::BlockType::PublicKey | armor::BlockType::File) } } impl SignedPublicKey { pub fn new( primary_key: packet::PublicKey, details: SignedKeyDetails, mut public_subkeys: Vec, ) -> Self { public_subkeys.retain(|key| { if key.signatures.is_empty() { warn!("ignoring unsigned {:?}", key.key); false } else { true } }); SignedPublicKey { primary_key, details, public_subkeys, } } /// Get the public key expiration as a date. pub fn expires_at(&self) -> Option> { let expiration = self.details.key_expiration_time()?; Some(*self.primary_key.created_at() + expiration) } fn verify_public_subkeys(&self) -> Result<()> { for subkey in &self.public_subkeys { subkey.verify(&self.primary_key)?; } Ok(()) } pub fn verify(&self) -> Result<()> { self.details.verify(&self.primary_key)?; self.verify_public_subkeys()?; Ok(()) } pub fn to_armored_writer( &self, writer: &mut impl io::Write, opts: ArmorOptions<'_>, ) -> Result<()> { armor::write( self, armor::BlockType::PublicKey, writer, opts.headers, opts.include_checksum, ) } pub fn to_armored_bytes(&self, opts: ArmorOptions<'_>) -> Result> { let mut buf = Vec::new(); self.to_armored_writer(&mut buf, opts)?; Ok(buf) } pub fn to_armored_string(&self, opts: ArmorOptions<'_>) -> Result { let res = String::from_utf8(self.to_armored_bytes(opts)?).map_err(|e| e.utf8_error())?; Ok(res) } pub fn as_unsigned(&self) -> PublicKey { PublicKey::new( self.primary_key.clone(), self.details.as_unsigned(), self.public_subkeys .iter() .map(SignedPublicSubKey::as_unsigned) .collect(), ) } } impl PublicKeyTrait for SignedPublicKey { fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.primary_key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.primary_key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { self.primary_key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.primary_key.public_params() } fn version(&self) -> KeyVersion { self.primary_key.version() } fn fingerprint(&self) -> Fingerprint { self.primary_key.fingerprint() } fn key_id(&self) -> KeyId { self.primary_key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.primary_key.algorithm() } fn created_at(&self) -> &chrono::DateTime { self.primary_key.created_at() } fn expiration(&self) -> Option { self.primary_key.expiration() } } impl Serialize for SignedPublicKey { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet(writer, &self.primary_key)?; self.details.to_writer(writer)?; for ps in &self.public_subkeys { ps.to_writer(writer)?; } Ok(()) } } /// Represents a Public PGP SubKey. #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedPublicSubKey { pub key: packet::PublicSubkey, pub signatures: Vec, } impl SignedPublicSubKey { pub fn new(key: packet::PublicSubkey, mut signatures: Vec) -> Self { signatures.retain(|sig| { if sig.typ() != SignatureType::SubkeyBinding && sig.typ() != SignatureType::SubkeyRevocation { warn!( "ignoring unexpected signature {:?} after Subkey packet", sig.typ() ); false } else { true } }); SignedPublicSubKey { key, signatures } } pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<()> { ensure!(!self.signatures.is_empty(), "missing subkey bindings"); for sig in &self.signatures { sig.verify_key_binding(key, &self.key)?; } Ok(()) } pub fn as_unsigned(&self) -> PublicSubkey { let keyflags = self .signatures .first() .expect("missing signatures") .key_flags(); PublicSubkey::new(self.key.clone(), keyflags) } } impl PublicKeyTrait for SignedPublicSubKey { fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { self.key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.key.public_params() } fn version(&self) -> KeyVersion { self.key.version() } /// Returns the fingerprint of the key. fn fingerprint(&self) -> Fingerprint { self.key.fingerprint() } /// Returns the Key ID of the key. fn key_id(&self) -> KeyId { self.key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.key.algorithm() } fn created_at(&self) -> &chrono::DateTime { self.key.created_at() } fn expiration(&self) -> Option { self.key.expiration() } } impl Serialize for SignedPublicSubKey { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet(writer, &self.key)?; for sig in &self.signatures { write_packet(writer, sig)?; } Ok(()) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; use crate::composed::shared::Deserializable; #[test] fn test_v6_annex_a_3() -> Result<()> { let _ = pretty_env_logger::try_init(); // A.3. Sample v6 Certificate (Transferable Public Key) let c = "-----BEGIN PGP PUBLIC KEY BLOCK----- xioGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laPCsQYf GwoAAABCBYJjh3/jAwsJBwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxy KwwfHifBilZwj2Ul7Ce62azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lw gyU2kCcUmKfvBXbAf6rhRYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaE QsiPlR4zxP/TP7mhfVEe7XWPxtnMUMtf15OyA51YBM4qBmOHf+MZAAAAIIaTJINn +eUBXbki+PSAld2nhJh/LVmFsS+60WyvXkQ1wpsGGBsKAAAALAWCY4d/4wKbDCIh BssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce62azJAAAAAAQBIKbpGG2dWTX8 j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDEM0g12vYxoWM8Y81W+bHBw805 I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUrk0mXubZvyl4GBg== -----END PGP PUBLIC KEY BLOCK-----"; let (spk, _) = SignedPublicKey::from_armor_single(io::Cursor::new(c))?; eprintln!("spk: {:#02x?}", spk); spk.verify()?; Ok(()) } } pgp-0.15.0/src/composed/signed_key/secret.rs000064400000000000000000000413151046102023000170550ustar 00000000000000use std::io; use chrono::{DateTime, Utc}; use log::warn; use rand::{CryptoRng, Rng}; use crate::composed::key::{PublicKey, PublicSubkey}; use crate::composed::signed_key::{SignedKeyDetails, SignedPublicSubKey}; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::Result; use crate::packet::{self, write_packet, Packet, SignatureType}; use crate::ser::Serialize; use crate::types::{ EskType, Fingerprint, KeyId, KeyVersion, PkeskBytes, PublicKeyTrait, PublicParams, SecretKeyRepr, SecretKeyTrait, SignatureBytes, Tag, }; use crate::{armor, ArmorOptions, SignedPublicKey}; /// Represents a secret signed PGP key. #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedSecretKey { pub primary_key: packet::SecretKey, pub details: SignedKeyDetails, pub public_subkeys: Vec, pub secret_subkeys: Vec, } /// Parse OpenPGP secret keys ("Transferable Secret Keys") from the given packets. /// Ref: pub struct SignedSecretKeyParser< I: Sized + Iterator>, > { inner: std::iter::Peekable, } impl>> SignedSecretKeyParser { pub fn into_inner(self) -> std::iter::Peekable { self.inner } pub fn from_packets(packets: std::iter::Peekable) -> Self { SignedSecretKeyParser { inner: packets } } } impl>> Iterator for SignedSecretKeyParser { type Item = Result; fn next(&mut self) -> Option { match super::key_parser::next::(&mut self.inner, Tag::SecretKey, true) { Some(Err(err)) => Some(Err(err)), None => None, Some(Ok((primary_key, details, public_subkeys, secret_subkeys))) => Some(Ok( SignedSecretKey::new(primary_key, details, public_subkeys, secret_subkeys), )), } } } impl crate::composed::Deserializable for SignedSecretKey { /// Parse a transferable key from packets. /// Ref: fn from_packets<'a, I: Iterator> + 'a>( packets: std::iter::Peekable, ) -> Box> + 'a> { Box::new(SignedSecretKeyParser::from_packets(packets)) } fn matches_block_type(typ: armor::BlockType) -> bool { matches!(typ, armor::BlockType::PrivateKey | armor::BlockType::File) } } impl SignedSecretKey { pub fn new( primary_key: packet::SecretKey, details: SignedKeyDetails, mut public_subkeys: Vec, mut secret_subkeys: Vec, ) -> Self { public_subkeys.retain(|key| { if key.signatures.is_empty() { warn!("ignoring unsigned {:?}", key.key); false } else { true } }); secret_subkeys.retain(|key| { if key.signatures.is_empty() { warn!("ignoring unsigned {:?}", key.key); false } else { true } }); SignedSecretKey { primary_key, details, public_subkeys, secret_subkeys, } } /// Get the secret key expiration as a date. pub fn expires_at(&self) -> Option> { let expiration = self.details.key_expiration_time()?; Some(*self.primary_key.created_at() + expiration) } fn verify_public_subkeys(&self) -> Result<()> { for subkey in &self.public_subkeys { subkey.verify(&self.primary_key)?; } Ok(()) } fn verify_secret_subkeys(&self) -> Result<()> { for subkey in &self.secret_subkeys { subkey.verify(&self.primary_key)?; } Ok(()) } pub fn verify(&self) -> Result<()> { self.details.verify(&self.primary_key)?; self.verify_public_subkeys()?; self.verify_secret_subkeys()?; Ok(()) } pub fn to_armored_writer( &self, writer: &mut impl io::Write, opts: ArmorOptions<'_>, ) -> Result<()> { armor::write( self, armor::BlockType::PrivateKey, writer, opts.headers, opts.include_checksum, ) } pub fn to_armored_bytes(&self, opts: ArmorOptions<'_>) -> Result> { let mut buf = Vec::new(); self.to_armored_writer(&mut buf, opts)?; Ok(buf) } pub fn to_armored_string(&self, opts: ArmorOptions<'_>) -> Result { let res = String::from_utf8(self.to_armored_bytes(opts)?).map_err(|e| e.utf8_error())?; Ok(res) } } impl Serialize for SignedSecretKey { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet(writer, &self.primary_key)?; self.details.to_writer(writer)?; for ps in &self.public_subkeys { ps.to_writer(writer)?; } for ps in &self.secret_subkeys { ps.to_writer(writer)?; } Ok(()) } } impl SecretKeyTrait for SignedSecretKey { type PublicKey = PublicKey; type Unlocked = SecretKeyRepr; fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result, { self.primary_key.unlock(pw, work) } fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String, { self.primary_key.create_signature(key_pw, hash, data) } fn public_key(&self) -> Self::PublicKey { let mut subkeys: Vec = self .public_subkeys .iter() .map(SignedPublicSubKey::as_unsigned) .collect(); let sec_subkeys = self.secret_subkeys.iter().map(SecretKeyTrait::public_key); subkeys.extend(sec_subkeys); PublicKey::new( self.primary_key.public_key(), self.details.as_unsigned(), subkeys, ) } } impl PublicKeyTrait for SignedSecretKey { fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.primary_key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.primary_key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { self.primary_key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.primary_key.public_params() } fn version(&self) -> KeyVersion { self.primary_key.version() } /// Returns the fingerprint of the associated primary key. fn fingerprint(&self) -> Fingerprint { self.primary_key.fingerprint() } /// Returns the Key ID of the associated primary key. fn key_id(&self) -> KeyId { self.primary_key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.primary_key.algorithm() } fn created_at(&self) -> &chrono::DateTime { self.primary_key.created_at() } fn expiration(&self) -> Option { self.primary_key.expiration() } } /// Represents a composed secret PGP SubKey. #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedSecretSubKey { pub key: packet::SecretSubkey, pub signatures: Vec, } impl SignedSecretSubKey { pub fn new(key: packet::SecretSubkey, mut signatures: Vec) -> Self { signatures.retain(|sig| { if sig.typ() != SignatureType::SubkeyBinding && sig.typ() != SignatureType::SubkeyRevocation { warn!( "ignoring unexpected signature {:?} after Subkey packet", sig.typ() ); false } else { true } }); SignedSecretSubKey { key, signatures } } pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<()> { ensure!(!self.signatures.is_empty(), "missing subkey bindings"); for sig in &self.signatures { sig.verify_key_binding(key, &self.key)?; } Ok(()) } } impl Serialize for SignedSecretSubKey { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet(writer, &self.key)?; for sig in &self.signatures { write_packet(writer, sig)?; } Ok(()) } } impl SecretKeyTrait for SignedSecretSubKey { type PublicKey = PublicSubkey; type Unlocked = SecretKeyRepr; fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result, { self.key.unlock(pw, work) } fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String, { self.key.create_signature(key_pw, hash, data) } fn public_key(&self) -> Self::PublicKey { let keyflags = self .signatures .first() .expect("invalid signed subkey") .key_flags(); PublicSubkey::new(self.key.public_key(), keyflags) } } impl PublicKeyTrait for SignedSecretSubKey { fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { self.key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.key.public_params() } fn version(&self) -> KeyVersion { self.key.version() } fn fingerprint(&self) -> Fingerprint { self.key.fingerprint() } fn key_id(&self) -> KeyId { self.key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.key.algorithm() } fn created_at(&self) -> &chrono::DateTime { self.key.created_at() } fn expiration(&self) -> Option { self.key.expiration() } } impl From for SignedPublicKey { fn from(value: SignedSecretKey) -> Self { let primary = value.primary_key.public_key(); let details = value.details; let mut subkeys = value.public_subkeys; value .secret_subkeys .into_iter() .for_each(|key| subkeys.push(key.into())); SignedPublicKey::new(primary, details, subkeys) } } impl From for SignedPublicSubKey { fn from(value: SignedSecretSubKey) -> Self { SignedPublicSubKey::new(value.key.public_key(), value.signatures) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use packet::LiteralData; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use super::*; use crate::types::S2kParams; use crate::{composed::shared::Deserializable, Message}; #[test] fn test_v6_annex_a_4() -> Result<()> { let _ = pretty_env_logger::try_init(); // A.4. Sample v6 Secret Key (Transferable Secret Key) let tsk = "-----BEGIN PGP PRIVATE KEY BLOCK----- xUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB exK+cH6NX1hs5hNhIB00TrJmosgv3mg1ditlsLfCsQYfGwoAAABCBYJjh3/jAwsJ BwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lwgyU2kCcUmKfvBXbAf6rh RYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaEQsiPlR4zxP/TP7mhfVEe 7XWPxtnMUMtf15OyA51YBMdLBmOHf+MZAAAAIIaTJINn+eUBXbki+PSAld2nhJh/ LVmFsS+60WyvXkQ1AE1gCk95TUR3XFeibg/u/tVY6a//1q0NWC1X+yui3O24wpsG GBsKAAAALAWCY4d/4wKbDCIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJAAAAAAQBIKbpGG2dWTX8j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDE M0g12vYxoWM8Y81W+bHBw805I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUr k0mXubZvyl4GBg== -----END PGP PRIVATE KEY BLOCK-----"; let (ssk, _) = SignedSecretKey::from_armor_single(io::Cursor::new(tsk))?; eprintln!("ssk: {:#02x?}", ssk); ssk.verify()?; let lit = LiteralData::from_bytes("".into(), "Hello world".as_bytes()); let msg = Message::Literal(lit); let pri = ssk.primary_key; let mut rng = ChaCha8Rng::seed_from_u64(0); let signed = msg.sign(&mut rng, &pri, String::default, HashAlgorithm::SHA2_256)?; signed.verify(&pri)?; let mut sink = vec![]; signed .to_armored_writer(&mut sink, ArmorOptions::default()) .expect("FIXME"); eprintln!("{}", String::from_utf8_lossy(&sink)); Ok(()) } // A.5. Sample locked v6 Secret Key (Transferable Secret Key) const ANNEX_A_5: &str = "-----BEGIN PGP PRIVATE KEY BLOCK----- xYIGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laP9JgkC FARdb9ccngltHraRe25uHuyuAQQVtKipJ0+r5jL4dacGWSAheCWPpITYiyfyIOPS 3gIDyg8f7strd1OB4+LZsUhcIjOMpVHgmiY/IutJkulneoBYwrEGHxsKAAAAQgWC Y4d/4wMLCQcFFQoOCAwCFgACmwMCHgkiIQbLGGxPBgmml+TVLfpscisMHx4nwYpW cI9lJewnutmsyQUnCQIHAgAAAACtKCAQPi19In7A5tfORHHbNr/JcIMlNpAnFJin 7wV2wH+q4UWFs7kDsBJ+xP2i8CMEWi7Ha8tPlXGpZR4UruETeh1mhELIj5UeM8T/ 0z+5oX1RHu11j8bZzFDLX9eTsgOdWATHggZjh3/jGQAAACCGkySDZ/nlAV25Ivj0 gJXdp4SYfy1ZhbEvutFsr15ENf0mCQIUBA5hhGgp2oaavg6mFUXcFMwBBBUuE8qf 9Ock+xwusd+GAglBr5LVyr/lup3xxQvHXFSjjA2haXfoN6xUGRdDEHI6+uevKjVR v5oAxgu7eJpaXNjCmwYYGwoAAAAsBYJjh3/jApsMIiEGyxhsTwYJppfk1S36bHIr DB8eJ8GKVnCPZSXsJ7rZrMkAAAAABAEgpukYbZ1ZNfyP5WMUzbUnSGpaUSD5t2Ki Nacp8DkBClZRa2c3AMQzSDXa9jGhYzxjzVb5scHDzTkjyRZWRdTq8U6L4da+/+Kt ruh8m7Xo2ehSSFyWRSuTSZe5tm/KXgYG -----END PGP PRIVATE KEY BLOCK-----"; const ANNEX_A_5_PASSPHRASE: &str = "correct horse battery staple"; #[test] #[ignore] // slow in debug mode (argon2) fn test_v6_annex_a_5() -> Result<()> { let _ = pretty_env_logger::try_init(); let (ssk, _) = SignedSecretKey::from_armor_single(io::Cursor::new(ANNEX_A_5))?; ssk.verify()?; let lit = LiteralData::from_bytes("".into(), "Hello world".as_bytes()); let mut rng = ChaCha8Rng::seed_from_u64(0); let msg = Message::Literal(lit).sign( &mut rng, &ssk.primary_key, || ANNEX_A_5_PASSPHRASE.to_string(), HashAlgorithm::SHA2_256, )?; msg.verify(&ssk.primary_key)?; Ok(()) } #[test] #[ignore] // slow in debug mode fn secret_key_protection_v6() -> Result<()> { let _ = pretty_env_logger::try_init(); let lit = LiteralData::from_bytes("".into(), "Hello world".as_bytes()); let mut rng = ChaCha8Rng::seed_from_u64(0); let (ssk, _) = SignedSecretKey::from_armor_single(io::Cursor::new(ANNEX_A_5))?; ssk.verify()?; // we will test unlock/lock on the primary key let mut pri = ssk.primary_key; // remove passphrase pri.remove_password(|| ANNEX_A_5_PASSPHRASE.to_string())?; // try signing without pw let msg = Message::Literal(lit.clone()).sign( &mut rng, &pri, String::default, HashAlgorithm::SHA2_256, )?; msg.verify(&pri)?; // set passphrase with default s2k pri.set_password(&mut rng, || ANNEX_A_5_PASSPHRASE.to_string())?; // try signing with pw let msg = Message::Literal(lit.clone()).sign( &mut rng, &pri, || ANNEX_A_5_PASSPHRASE.to_string(), HashAlgorithm::SHA2_256, )?; msg.verify(&pri)?; // remove passphrase pri.remove_password(|| ANNEX_A_5_PASSPHRASE.to_string())?; // set passphrase with Cfb s2k (default for KeyVersion::V4) pri.set_password_with_s2k( || ANNEX_A_5_PASSPHRASE.to_string(), S2kParams::new_default(&mut rng, KeyVersion::V4), )?; // try signing with pw let msg = Message::Literal(lit).sign( &mut rng, &pri, || ANNEX_A_5_PASSPHRASE.to_string(), HashAlgorithm::SHA2_256, )?; msg.verify(&pri)?; Ok(()) } } pgp-0.15.0/src/composed/signed_key/shared.rs000064400000000000000000000222601046102023000170340ustar 00000000000000use std::fmt; use std::io; use chrono::Duration; use log::warn; use smallvec::SmallVec; use crate::composed::key::KeyDetails; use crate::composed::signed_key::{SignedPublicKey, SignedSecretKey}; use crate::errors::Result; use crate::packet::KeyFlags; use crate::ser::Serialize; use crate::types::{PublicKeyTrait, SignedUser, SignedUserAttribute}; use crate::{packet, ArmorOptions}; /// Shared details between secret and public keys. #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedKeyDetails { pub revocation_signatures: Vec, pub direct_signatures: Vec, pub users: Vec, pub user_attributes: Vec, } impl SignedKeyDetails { pub fn new( revocation_signatures: Vec, direct_signatures: Vec, mut users: Vec, mut user_attributes: Vec, ) -> Self { users.retain(|user| { if user.signatures.is_empty() { warn!("ignoring unsigned {}", user.id); false } else { true } }); user_attributes.retain(|attr| { if attr.signatures.is_empty() { warn!("ignoring unsigned {}", attr.attr); false } else { true } }); SignedKeyDetails { revocation_signatures, direct_signatures, users, user_attributes, } } /// Get the key expiration time as a duration. /// /// This method finds the signature with the maximum /// `KeyExpirationTime` offset (which should only occur in /// self-signed signatures) and converts it into a duration. /// The function returns `None` if the key has an infinite /// validity. pub fn key_expiration_time(&self) -> Option { // Find the maximum key_expiration_time in all signatures of all user ids. self.users .iter() .flat_map(|user| &user.signatures) .filter_map(|sig| sig.key_expiration_time()) .max() .cloned() } fn verify_users(&self, key: &impl PublicKeyTrait) -> Result<()> { for user in &self.users { user.verify(key)?; } Ok(()) } fn verify_attributes(&self, key: &impl PublicKeyTrait) -> Result<()> { for attr in &self.user_attributes { attr.verify(key)?; } Ok(()) } fn verify_revocation_signatures(&self, key: &impl PublicKeyTrait) -> Result<()> { for sig in &self.revocation_signatures { sig.verify_key(key)?; } Ok(()) } fn verify_direct_signatures(&self, key: &impl PublicKeyTrait) -> Result<()> { for sig in &self.direct_signatures { sig.verify_key(key)?; } Ok(()) } pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<()> { self.verify_users(key)?; self.verify_attributes(key)?; self.verify_revocation_signatures(key)?; self.verify_direct_signatures(key)?; Ok(()) } pub fn as_unsigned(&self) -> KeyDetails { if let Some(primary_user) = self .users .iter() .find(|u| u.is_primary()) .map_or_else(|| self.users.first(), Some) { let primary_sig = primary_user .signatures .first() .expect("invalid primary user"); let keyflags = primary_sig.key_flags(); let preferred_symmetric_algorithms = SmallVec::from_slice(primary_sig.preferred_symmetric_algs()); let preferred_hash_algorithms = SmallVec::from_slice(primary_sig.preferred_hash_algs()); let preferred_compression_algorithms = SmallVec::from_slice(primary_sig.preferred_compression_algs()); let preferred_aead_algorithms = SmallVec::from_slice(primary_sig.preferred_aead_algs()); let revocation_key = primary_sig.revocation_key().cloned(); KeyDetails::new_direct( self.users.iter().map(|u| u.id.clone()).collect(), self.user_attributes .iter() .map(|a| a.attr.clone()) .collect(), keyflags, preferred_symmetric_algorithms, preferred_hash_algorithms, preferred_compression_algorithms, preferred_aead_algorithms, revocation_key, ) } else { // We don't have metadata via a primary user id, so we return a very bare KeyDetails object // TODO: we could check for information in a direct key signature and use that KeyDetails::new_direct( self.users.iter().map(|u| u.id.clone()).collect(), self.user_attributes .iter() .map(|a| a.attr.clone()) .collect(), KeyFlags::default(), vec![].into(), vec![].into(), vec![].into(), vec![].into(), None, ) } } } impl Serialize for SignedKeyDetails { fn to_writer(&self, writer: &mut W) -> Result<()> { for sig in &self.revocation_signatures { packet::write_packet(writer, sig)?; } for sig in &self.direct_signatures { packet::write_packet(writer, sig)?; } for user in &self.users { user.to_writer(writer)?; } for attr in &self.user_attributes { attr.to_writer(writer)?; } Ok(()) } } #[derive(Debug, PartialEq, Eq, Clone)] #[allow(clippy::large_enum_variant)] // FIXME pub enum PublicOrSecret { Public(SignedPublicKey), Secret(SignedSecretKey), } impl PublicOrSecret { pub fn verify(&self) -> Result<()> { match self { PublicOrSecret::Public(k) => k.verify(), PublicOrSecret::Secret(k) => k.verify(), } } pub fn to_armored_writer( &self, writer: &mut impl io::Write, opts: ArmorOptions<'_>, ) -> Result<()> { match self { PublicOrSecret::Public(k) => k.to_armored_writer(writer, opts), PublicOrSecret::Secret(k) => k.to_armored_writer(writer, opts), } } pub fn to_armored_bytes(&self, opts: ArmorOptions<'_>) -> Result> { match self { PublicOrSecret::Public(k) => k.to_armored_bytes(opts), PublicOrSecret::Secret(k) => k.to_armored_bytes(opts), } } pub fn to_armored_string(&self, opts: ArmorOptions<'_>) -> Result { match self { PublicOrSecret::Public(k) => k.to_armored_string(opts), PublicOrSecret::Secret(k) => k.to_armored_string(opts), } } /// Returns secret key. /// /// Panics if not a secret key. #[deprecated(note = "Can panic. Users should use TryFrom trait instead.")] pub fn into_secret(self) -> SignedSecretKey { self.try_into() .expect("Can not convert a public into a secret key") } /// Returns public key. /// /// Panics if not a public key. #[deprecated(note = "Can panic. Users should use TryFrom trait instead.")] pub fn into_public(self) -> SignedPublicKey { self.try_into() .expect("Can not convert a secret into a public key") } pub fn is_public(&self) -> bool { match self { PublicOrSecret::Secret(_) => false, PublicOrSecret::Public(_) => true, } } pub fn is_secret(&self) -> bool { match self { PublicOrSecret::Secret(_) => true, PublicOrSecret::Public(_) => false, } } } /// Error returned when trying to convert `PublicOrSecret` key /// into the wrong type. #[derive(Debug, Copy, Clone, PartialEq, Eq, thiserror::Error)] pub struct TryFromPublicOrSecretError; impl fmt::Display for TryFromPublicOrSecretError { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "Attempt to convert PublicOrSecret key to the wrong type") } } impl TryFrom for SignedPublicKey { type Error = TryFromPublicOrSecretError; fn try_from(public_or_secret: PublicOrSecret) -> Result { match public_or_secret { PublicOrSecret::Public(k) => Ok(k), PublicOrSecret::Secret(_) => Err(TryFromPublicOrSecretError), } } } impl TryFrom for SignedSecretKey { type Error = TryFromPublicOrSecretError; fn try_from(public_or_secret: PublicOrSecret) -> Result { match public_or_secret { PublicOrSecret::Public(_) => Err(TryFromPublicOrSecretError), PublicOrSecret::Secret(k) => Ok(k), } } } impl Serialize for PublicOrSecret { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { PublicOrSecret::Public(k) => k.to_writer(writer), PublicOrSecret::Secret(k) => k.to_writer(writer), } } } pgp-0.15.0/src/crypto/aead.rs000064400000000000000000000247471046102023000140620ustar 00000000000000use aes::{Aes128, Aes192, Aes256}; use aes_gcm::aead::consts::U12; use aes_gcm::{ aead::{AeadInPlace, KeyInit}, Aes128Gcm, Aes256Gcm, AesGcm, Key as GcmKey, Nonce as GcmNonce, Tag as GcmTag, }; use eax::{Eax, Key as EaxKey, Nonce as EaxNonce, Tag as EaxTag}; use generic_array::{ typenum::{U15, U16}, GenericArray, }; use num_enum::{FromPrimitive, IntoPrimitive}; use ocb3::{Nonce as Ocb3Nonce, Ocb3, Tag as OcbTag}; use super::sym::SymmetricKeyAlgorithm; use crate::errors::{Error, Result}; type Aes128Ocb3 = Ocb3; type Aes192Ocb3 = Ocb3; type Aes256Ocb3 = Ocb3; /// AES-GCM with a 192-bit key and 96-bit nonce. pub type Aes192Gcm = AesGcm; /// Available AEAD algorithms. #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum AeadAlgorithm { /// None None = 0, Eax = 1, Ocb = 2, Gcm = 3, Private100 = 100, Private101 = 101, Private102 = 102, Private103 = 103, Private104 = 104, Private105 = 105, Private106 = 106, Private107 = 107, Private108 = 108, Private109 = 109, Private110 = 110, #[num_enum(catch_all)] Other(u8), } impl AeadAlgorithm { /// Nonce size used for this AEAD algorithm. pub fn nonce_size(&self) -> usize { match self { Self::Eax => 16, Self::Ocb => 15, Self::Gcm => 12, _ => 0, } } /// Size of the IV. pub fn iv_size(&self) -> usize { match self { Self::Eax => 16, Self::Ocb => 15, Self::Gcm => 12, _ => 0, } } /// Size of the authentication tag. pub fn tag_size(&self) -> Option { match self { Self::Eax => Some(16), Self::Ocb => Some(16), Self::Gcm => Some(16), _ => None, } } /// Decrypt the provided data in place. pub fn decrypt_in_place( &self, sym_algorithm: &SymmetricKeyAlgorithm, key: &[u8], nonce: &[u8], associated_data: &[u8], auth_tag: &[u8], buffer: &mut [u8], ) -> Result<()> { match (sym_algorithm, self) { (SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Gcm) => { let key = GcmKey::::from_slice(&key[..16]); let cipher = Aes128Gcm::new(key); let nonce = GcmNonce::from_slice(nonce); let tag = GcmTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Gcm)?; } (SymmetricKeyAlgorithm::AES192, AeadAlgorithm::Gcm) => { let key = GcmKey::::from_slice(&key[..24]); let cipher = Aes192Gcm::new(key); let nonce = GcmNonce::from_slice(nonce); let tag = GcmTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Gcm)?; } (SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Gcm) => { let key = GcmKey::::from_slice(&key[..32]); let cipher = Aes256Gcm::new(key); let nonce = GcmNonce::from_slice(nonce); let tag = GcmTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Gcm)?; } (SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Eax) => { let key = EaxKey::::from_slice(&key[..16]); let cipher = Eax::::new(key); let nonce = EaxNonce::from_slice(nonce); let tag = EaxTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Eax)?; } (SymmetricKeyAlgorithm::AES192, AeadAlgorithm::Eax) => { let key = EaxKey::::from_slice(&key[..24]); let cipher = Eax::::new(key); let nonce = EaxNonce::from_slice(nonce); let tag = EaxTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Eax)?; } (SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Eax) => { let key = EaxKey::::from_slice(&key[..32]); let cipher = Eax::::new(key); let nonce = EaxNonce::from_slice(nonce); let tag = EaxTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Eax)?; } (SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Ocb) => { let key = GenericArray::from_slice(&key[..16]); let nonce = Ocb3Nonce::from_slice(nonce); let cipher = Aes128Ocb3::new(key); let tag = OcbTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Ocb)? } (SymmetricKeyAlgorithm::AES192, AeadAlgorithm::Ocb) => { let key = GenericArray::from_slice(&key[..24]); let nonce = Ocb3Nonce::from_slice(nonce); let cipher = Aes192Ocb3::new(key); let tag = OcbTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Ocb)? } (SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Ocb) => { let key = GenericArray::from_slice(&key[..32]); let nonce = Ocb3Nonce::from_slice(nonce); let cipher = Aes256Ocb3::new(key); let tag = OcbTag::from_slice(auth_tag); cipher .decrypt_in_place_detached(nonce, associated_data, buffer, tag) .map_err(|_| Error::Ocb)? } _ => unimplemented_err!("AEAD not supported: {:?}, {:?}", sym_algorithm, self), } Ok(()) } /// Encrypt the provided data in place. pub fn encrypt_in_place( &self, sym_algorithm: &SymmetricKeyAlgorithm, key: &[u8], nonce: &[u8], associated_data: &[u8], buffer: &mut [u8], ) -> Result> { let tag = match (sym_algorithm, self) { (SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Gcm) => { let key = GcmKey::::from_slice(&key[..16]); let cipher = Aes128Gcm::new(key); let nonce = GcmNonce::from_slice(nonce); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Gcm)? } (SymmetricKeyAlgorithm::AES192, AeadAlgorithm::Gcm) => { let key = GcmKey::::from_slice(&key[..24]); let cipher = Aes192Gcm::new(key); let nonce = GcmNonce::from_slice(nonce); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Gcm)? } (SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Gcm) => { let key = GcmKey::::from_slice(&key[..32]); let cipher = Aes256Gcm::new(key); let nonce = GcmNonce::from_slice(nonce); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Gcm)? } (SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Eax) => { let key = EaxKey::::from_slice(&key[..16]); let cipher = Eax::::new(key); let nonce = EaxNonce::from_slice(nonce); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Eax)? } (SymmetricKeyAlgorithm::AES192, AeadAlgorithm::Eax) => { let key = EaxKey::::from_slice(&key[..24]); let cipher = Eax::::new(key); let nonce = EaxNonce::from_slice(nonce); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Eax)? } (SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Eax) => { let key = EaxKey::::from_slice(&key[..32]); let cipher = Eax::::new(key); let nonce = EaxNonce::from_slice(nonce); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Eax)? } (SymmetricKeyAlgorithm::AES128, AeadAlgorithm::Ocb) => { let key = GenericArray::from_slice(&key[..16]); let nonce = Ocb3Nonce::from_slice(nonce); let cipher = Aes128Ocb3::new(key); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Ocb)? } (SymmetricKeyAlgorithm::AES192, AeadAlgorithm::Ocb) => { let key = GenericArray::from_slice(&key[..24]); let nonce = Ocb3Nonce::from_slice(nonce); let cipher = Aes192Ocb3::new(key); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Ocb)? } (SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Ocb) => { let key = GenericArray::from_slice(&key[..32]); let nonce = Ocb3Nonce::from_slice(nonce); let cipher = Aes256Ocb3::new(key); cipher .encrypt_in_place_detached(nonce, associated_data, buffer) .map_err(|_| Error::Ocb)? } _ => unimplemented_err!("AEAD not supported: {:?}, {:?}", sym_algorithm, self), }; Ok(tag.to_vec()) } } pgp-0.15.0/src/crypto/aes_kw.rs000064400000000000000000000100041046102023000144160ustar 00000000000000use generic_array::typenum::{U16, U24, U32}; use generic_array::GenericArray; use crate::errors::Result; /// AES Key Wrap /// As defined in RFC 3394. pub fn wrap(key: &[u8], data: &[u8]) -> Result> { ensure_eq!(data.len() % 8, 0, "data must be a multiple of 64bit"); let aes_size = key.len() * 8; let res = match aes_size { 128 => { let key = GenericArray::::from_slice(key); let kek = aes_kw::KekAes128::new(key); kek.wrap_vec(data)? } 192 => { let key = GenericArray::::from_slice(key); let kek = aes_kw::KekAes192::new(key); kek.wrap_vec(data)? } 256 => { let key = GenericArray::::from_slice(key); let kek = aes_kw::KekAes256::new(key); kek.wrap_vec(data)? } _ => bail!("invalid aes key size: {}", aes_size), }; Ok(res) } /// AES Key Unwrap /// As defined in RFC 3394. pub fn unwrap(key: &[u8], data: &[u8]) -> Result> { ensure_eq!(data.len() % 8, 0, "data must be a multiple of 64bit"); let aes_size = key.len() * 8; let res = match aes_size { 128 => { let key = GenericArray::::from_slice(key); let kek = aes_kw::KekAes128::new(key); kek.unwrap_vec(data)? } 192 => { let key = GenericArray::::from_slice(key); let kek = aes_kw::KekAes192::new(key); kek.unwrap_vec(data)? } 256 => { let key = GenericArray::::from_slice(key); let kek = aes_kw::KekAes256::new(key); kek.unwrap_vec(data)? } _ => bail!("invalid aes key size: {}", aes_size), }; Ok(res) } #[cfg(test)] mod tests { use super::*; macro_rules! test_aes_kw { ($name:ident, $kek:expr, $input:expr, $output:expr) => { #[test] fn $name() { let kek = hex::decode($kek).unwrap(); let input_bin = hex::decode($input).unwrap(); let output_bin = hex::decode($output).unwrap(); assert_eq!( hex::encode(wrap(&kek, &input_bin).unwrap()), $output.to_lowercase(), "failed wrap" ); assert_eq!( hex::encode(unwrap(&kek, &output_bin).unwrap()), $input.to_lowercase(), "failed unwrap" ); } }; } test_aes_kw!( wrap_unwrap_128_key_128_kek, "000102030405060708090A0B0C0D0E0F", "00112233445566778899AABBCCDDEEFF", "1FA68B0A8112B447AEF34BD8FB5A7B829D3E862371D2CFE5" ); test_aes_kw!( wrap_unwrap_128_key_192_kek, "000102030405060708090A0B0C0D0E0F1011121314151617", "00112233445566778899AABBCCDDEEFF", "96778B25AE6CA435F92B5B97C050AED2468AB8A17AD84E5D" ); test_aes_kw!( wrap_unwrap_128_key_256_kek, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "00112233445566778899AABBCCDDEEFF", "64E8C3F9CE0F5BA263E9777905818A2A93C8191E7D6E8AE7" ); test_aes_kw!( wrap_unwrap_192_key_192_kek, "000102030405060708090A0B0C0D0E0F1011121314151617", "00112233445566778899AABBCCDDEEFF0001020304050607", "031D33264E15D33268F24EC260743EDCE1C6C7DDEE725A936BA814915C6762D2" ); test_aes_kw!( wrap_unwrap_192_key_256_kek, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "00112233445566778899AABBCCDDEEFF0001020304050607", "A8F9BC1612C68B3FF6E6F4FBE30E71E4769C8B80A32CB8958CD5D17D6B254DA1" ); test_aes_kw!( wrap_unwrap_256_key_256_kek, "000102030405060708090A0B0C0D0E0F101112131415161718191A1B1C1D1E1F", "00112233445566778899AABBCCDDEEFF000102030405060708090A0B0C0D0E0F", "28C9F404C4B810F4CBCCB35CFB87F8263F5786E2D80ED326CBC7F0E71A99F43BFB988B9B7A02DD21" ); } pgp-0.15.0/src/crypto/checksum.rs000064400000000000000000000047621046102023000147650ustar 00000000000000use std::hash::Hasher; use std::io; use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; use crate::errors::Result; /// Two octet checksum: sum of all octets mod 65535. #[inline] pub fn simple(actual: &[u8], data: &[u8]) -> Result<()> { // Then a two-octet checksum is appended, which is equal to the // sum of the preceding session key octets, not including the algorithm // identifier, modulo 65536. let expected_checksum = calculate_simple(data); ensure_eq!( &actual[..2], &expected_checksum.to_be_bytes()[..], "invalid simple checksum" ); Ok(()) } #[inline] pub fn simple_to_writer(data: &[u8], writer: &mut W) -> io::Result<()> { let mut hasher = SimpleChecksum::default(); hasher.write(data); hasher.to_writer(writer) } #[inline] pub fn calculate_simple(data: &[u8]) -> u16 { let mut hasher = SimpleChecksum::default(); hasher.write(data); hasher.finish() as u16 } #[derive(Debug, Default)] pub struct SimpleChecksum(u16); impl SimpleChecksum { #[inline] pub fn to_writer(&self, writer: &mut W) -> io::Result<()> { writer.write_u16::(self.0) } #[inline] pub fn finalize(&self) -> [u8; 2] { let mut res = [0u8; 2]; BigEndian::write_u16(&mut res[..], self.0); res } } impl io::Write for SimpleChecksum { fn write(&mut self, buf: &[u8]) -> io::Result { Hasher::write(self, buf); Ok(buf.len()) } fn flush(&mut self) -> io::Result<()> { Ok(()) } } impl Hasher for SimpleChecksum { #[inline] fn write(&mut self, buf: &[u8]) { let new_sum = buf.iter().map(|v| u32::from(*v)).sum::(); self.0 = ((u32::from(self.0) + new_sum) & 0xffff) as u16; } #[inline] fn finish(&self) -> u64 { u64::from(self.0) } } /// SHA1 checksum, using sha1_checked, first 20 octets. /// /// Fails with `Error::HashCollision` if a SHA1 collision was detected. #[inline] pub fn calculate_sha1(data: I) -> Result<[u8; 20]> where T: AsRef<[u8]>, I: IntoIterator, { use sha1_checked::{CollisionResult, Digest, Sha1}; let mut digest = Sha1::new(); for chunk in data { digest.update(chunk.as_ref()); } match digest.try_finalize() { CollisionResult::Ok(sha1) => Ok(sha1.into()), CollisionResult::Collision(_) | CollisionResult::Mitigated(_) => { Err(crate::errors::Error::Sha1HashCollision) } } } pgp-0.15.0/src/crypto/dsa.rs000064400000000000000000000366501046102023000137330ustar 00000000000000use dsa::{Components, Signature, SigningKey, VerifyingKey}; use num_bigint::BigUint; use rand::{CryptoRng, Rng}; use signature::hazmat::PrehashVerifier; use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::crypto::hash::HashAlgorithm; use crate::crypto::Signer; use crate::errors::Result; use crate::types::{PlainSecretParams, PublicParams}; pub use dsa::KeySize; /// Secret key for DSA. #[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop, derive_more::Debug)] pub struct SecretKey { #[debug("..")] pub x: BigUint, } impl Signer for SecretKey { fn sign( &self, hash_algorithm: HashAlgorithm, digest: &[u8], pub_params: &PublicParams, ) -> Result>> { let PublicParams::DSA { p, q, g, y } = pub_params else { bail!("invalid public params"); }; let components = Components::from_components(p.into(), q.into(), g.into())?; let verifying_key = VerifyingKey::from_components(components, y.into())?; let signing_key = SigningKey::from_components(verifying_key, self.x.clone())?; let signature = match hash_algorithm { HashAlgorithm::MD5 => signing_key.sign_prehashed_rfc6979::(digest), // FIXME: Use sha1_checked once it implements BlockSizeUser // (See https://github.com/RustCrypto/hashes/pull/582) HashAlgorithm::SHA1 => signing_key.sign_prehashed_rfc6979::(digest), HashAlgorithm::RIPEMD160 => { signing_key.sign_prehashed_rfc6979::(digest) } HashAlgorithm::SHA2_256 => signing_key.sign_prehashed_rfc6979::(digest), HashAlgorithm::SHA2_384 => signing_key.sign_prehashed_rfc6979::(digest), HashAlgorithm::SHA2_512 => signing_key.sign_prehashed_rfc6979::(digest), HashAlgorithm::SHA2_224 => signing_key.sign_prehashed_rfc6979::(digest), HashAlgorithm::SHA3_256 => signing_key.sign_prehashed_rfc6979::(digest), HashAlgorithm::SHA3_512 => signing_key.sign_prehashed_rfc6979::(digest), _ => unimplemented_err!("hasher {:?}", hash_algorithm), }?; Ok(vec![ signature.r().to_bytes_be(), signature.s().to_bytes_be(), ]) } } /// Verify a DSA signature. pub fn verify( p: BigUint, q: BigUint, g: BigUint, y: BigUint, hashed: &[u8], r: BigUint, s: BigUint, ) -> Result<()> { let components = Components::from_components(p, q, g)?; let verifying_key = VerifyingKey::from_components(components, y)?; let signature = Signature::from_components(r, s)?; verifying_key.verify_prehash(hashed, &signature)?; Ok(()) } /// Generate a DSA KeyPair. pub fn generate_key( mut rng: R, key_size: KeySize, ) -> Result<(PublicParams, PlainSecretParams)> { let components = Components::generate(&mut rng, key_size); let signing_key = SigningKey::generate(&mut rng, components); let verifying_key = signing_key.verifying_key(); let p = verifying_key.components().p(); let q = verifying_key.components().q(); let g = verifying_key.components().g(); let y = verifying_key.y(); let x = signing_key.x(); let public_params = PublicParams::DSA { p: p.into(), q: q.into(), g: g.into(), y: y.into(), }; let secret_params = PlainSecretParams::DSA(x.into()); Ok((public_params, secret_params)) } #[cfg(test)] mod test { use super::*; use num_traits::Num; fn hex_num(s: &str) -> BigUint { BigUint::from_str_radix(s, 16).expect("invalid hex") } fn hash(hash_algorithm: HashAlgorithm, text: &str) -> Vec { hash_algorithm .digest(text.as_bytes()) .expect("unable to hash") } /// Test vectors from https://tools.ietf.org/html/rfc6979#appendix-A.2.1 #[test] fn test_dsa_1024() { let _ = pretty_env_logger::try_init(); let p = hex_num( "86F5CA03DCFEB225063FF830A0C769B9DD9D6153AD91D7CE27F787C43278B447\ E6533B86B18BED6E8A48B784A14C252C5BE0DBF60B86D6385BD2F12FB763ED88\ 73ABFD3F5BA2E0A8C0A59082EAC056935E529DAF7C610467899C77ADEDFC846C\ 881870B7B19B2B58F9BE0521A17002E3BDD6B86685EE90B3D9A1B02B782B1779", ); let q = hex_num("996F967F6C8E388D9E28D01E205FBA957A5698B1"); let g = hex_num( "07B0F92546150B62514BB771E2A0C0CE387F03BDA6C56B505209FF25FD3C133D\ 89BBCD97E904E09114D9A7DEFDEADFC9078EA544D2E401AEECC40BB9FBBF78FD\ 87995A10A1C27CB7789B594BA7EFB5C4326A9FE59A070E136DB77175464ADCA4\ 17BE5DCE2F40D10A46A3A3943F26AB7FD9C0398FF8C76EE0A56826A8A88F1DBD", ); let x = hex_num("411602CB19A6CCC34494D79D98EF1E7ED5AF25F7"); let y = hex_num( "5DF5E01DED31D0297E274E1691C192FE5868FEF9E19A84776454B100CF16F653\ 92195A38B90523E2542EE61871C0440CB87C322FC4B4D2EC5E1E7EC766E1BE8D\ 4CE935437DC11C3C8FD426338933EBFE739CB3465F4D3668C5E473508253B1E6\ 82F65CBDC4FAE93C2EA212390E54905A86E2223170B44EAA7DA5DD9FFCFB7F3B", ); let check = |hash_algorithm: HashAlgorithm, text: &str, _k: BigUint, r: BigUint, s: BigUint| { let hashed = hash(hash_algorithm, text); let key = SecretKey { x: x.clone() }; let params = PublicParams::DSA { p: p.clone().into(), q: q.clone().into(), g: g.clone().into(), y: y.clone().into(), }; let res = key .sign(hash_algorithm, &hashed, ¶ms) .expect("failed to sign"); let new_r = res[0].clone(); let new_s = res[1].clone(); assert_eq!((new_r, new_s), (r.to_bytes_be(), s.to_bytes_be())); verify(p.clone(), q.clone(), g.clone(), y.clone(), &hashed, r, s) .expect("failed to verify"); }; check( HashAlgorithm::SHA1, "sample", hex_num("7BDB6B0FF756E1BB5D53583EF979082F9AD5BD5B"), hex_num("2E1A0C2562B2912CAAF89186FB0F42001585DA55"), hex_num("29EFB6B0AFF2D7A68EB70CA313022253B9A88DF5"), ); check( HashAlgorithm::SHA2_224, "sample", hex_num("562097C06782D60C3037BA7BE104774344687649"), hex_num("4BC3B686AEA70145856814A6F1BB53346F02101E"), hex_num("410697B92295D994D21EDD2F4ADA85566F6F94C1"), ); check( HashAlgorithm::SHA2_256, "sample", hex_num("519BA0546D0C39202A7D34D7DFA5E760B318BCFB"), hex_num("81F2F5850BE5BC123C43F71A3033E9384611C545"), hex_num("4CDD914B65EB6C66A8AAAD27299BEE6B035F5E89"), ); check( HashAlgorithm::SHA2_384, "sample", hex_num("95897CD7BBB944AA932DBC579C1C09EB6FCFC595"), hex_num("07F2108557EE0E3921BC1774F1CA9B410B4CE65A"), hex_num("54DF70456C86FAC10FAB47C1949AB83F2C6F7595"), ); check( HashAlgorithm::SHA2_512, "sample", hex_num("09ECE7CA27D0F5A4DD4E556C9DF1D21D28104F8B"), hex_num("16C3491F9B8C3FBBDD5E7A7B667057F0D8EE8E1B"), hex_num("02C36A127A7B89EDBB72E4FFBC71DABC7D4FC69C"), ); check( HashAlgorithm::SHA1, "test", hex_num("5C842DF4F9E344EE09F056838B42C7A17F4A6433"), hex_num("42AB2052FD43E123F0607F115052A67DCD9C5C77"), hex_num("183916B0230D45B9931491D4C6B0BD2FB4AAF088"), ); check( HashAlgorithm::SHA2_224, "test", hex_num("4598B8EFC1A53BC8AECD58D1ABBB0C0C71E67297"), hex_num("6868E9964E36C1689F6037F91F28D5F2C30610F2"), hex_num("49CEC3ACDC83018C5BD2674ECAAD35B8CD22940F"), ); check( HashAlgorithm::SHA2_256, "test", hex_num("5A67592E8128E03A417B0484410FB72C0B630E1A"), hex_num("22518C127299B0F6FDC9872B282B9E70D0790812"), hex_num("6837EC18F150D55DE95B5E29BE7AF5D01E4FE160"), ); check( HashAlgorithm::SHA2_384, "test", hex_num("220156B761F6CA5E6C9F1B9CF9C24BE25F98CD89"), hex_num("854CF929B58D73C3CBFDC421E8D5430CD6DB5E66"), hex_num("91D0E0F53E22F898D158380676A871A157CDA622"), ); check( HashAlgorithm::SHA2_512, "test", hex_num("65D2C2EEB175E370F28C75BFCDC028D22C7DBE9C"), hex_num("8EA47E475BA8AC6F2D821DA3BD212D11A3DEB9A0"), hex_num("7C670C7AD72B6C050C109E1790008097125433E8"), ); } /// Test vectors from https://tools.ietf.org/html/rfc6979#appendix-A.2.2 #[test] fn test_dsa_2048() { let _ = pretty_env_logger::try_init(); let p = hex_num( "9DB6FB5951B66BB6FE1E140F1D2CE5502374161FD6538DF1648218642F0B5C48\ C8F7A41AADFA187324B87674FA1822B00F1ECF8136943D7C55757264E5A1A44F\ FE012E9936E00C1D3E9310B01C7D179805D3058B2A9F4BB6F9716BFE6117C6B5\ B3CC4D9BE341104AD4A80AD6C94E005F4B993E14F091EB51743BF33050C38DE2\ 35567E1B34C3D6A5C0CEAA1A0F368213C3D19843D0B4B09DCB9FC72D39C8DE41\ F1BF14D4BB4563CA28371621CAD3324B6A2D392145BEBFAC748805236F5CA2FE\ 92B871CD8F9C36D3292B5509CA8CAA77A2ADFC7BFD77DDA6F71125A7456FEA15\ 3E433256A2261C6A06ED3693797E7995FAD5AABBCFBE3EDA2741E375404AE25B", ); let q = hex_num("F2C3119374CE76C9356990B465374A17F23F9ED35089BD969F61C6DDE9998C1F"); let g = hex_num( "5C7FF6B06F8F143FE8288433493E4769C4D988ACE5BE25A0E24809670716C613\ D7B0CEE6932F8FAA7C44D2CB24523DA53FBE4F6EC3595892D1AA58C4328A06C4\ 6A15662E7EAA703A1DECF8BBB2D05DBE2EB956C142A338661D10461C0D135472\ 085057F3494309FFA73C611F78B32ADBB5740C361C9F35BE90997DB2014E2EF5\ AA61782F52ABEB8BD6432C4DD097BC5423B285DAFB60DC364E8161F4A2A35ACA\ 3A10B1C4D203CC76A470A33AFDCBDD92959859ABD8B56E1725252D78EAC66E71\ BA9AE3F1DD2487199874393CD4D832186800654760E1E34C09E4D155179F9EC0\ DC4473F996BDCE6EED1CABED8B6F116F7AD9CF505DF0F998E34AB27514B0FFE7", ); let x = hex_num("69C7548C21D0DFEA6B9A51C9EAD4E27C33D3B3F180316E5BCAB92C933F0E4DBC"); let y = hex_num( "667098C654426C78D7F8201EAC6C203EF030D43605032C2F1FA937E5237DBD94\ 9F34A0A2564FE126DC8B715C5141802CE0979C8246463C40E6B6BDAA2513FA61\ 1728716C2E4FD53BC95B89E69949D96512E873B9C8F8DFD499CC312882561ADE\ CB31F658E934C0C197F2C4D96B05CBAD67381E7B768891E4DA3843D24D94CDFB\ 5126E9B8BF21E8358EE0E0A30EF13FD6A664C0DCE3731F7FB49A4845A4FD8254\ 687972A2D382599C9BAC4E0ED7998193078913032558134976410B89D2C171D1\ 23AC35FD977219597AA7D15C1A9A428E59194F75C721EBCBCFAE44696A499AFA\ 74E04299F132026601638CB87AB79190D4A0986315DA8EEC6561C938996BEADF", ); let check = |hash_algorithm: HashAlgorithm, text: &str, _k: BigUint, r: BigUint, s: BigUint| { let hashed = hash(hash_algorithm, text); let key = SecretKey { x: x.clone() }; let params = PublicParams::DSA { p: p.clone().into(), q: q.clone().into(), g: g.clone().into(), y: y.clone().into(), }; let res = key .sign(hash_algorithm, &hashed, ¶ms) .expect("failed to sign"); let new_r = res[0].clone(); let new_s = res[1].clone(); assert_eq!((new_r, new_s), (r.to_bytes_be(), s.to_bytes_be())); verify(p.clone(), q.clone(), g.clone(), y.clone(), &hashed, r, s) .expect("failed to verify"); }; check( HashAlgorithm::SHA1, "sample", hex_num("888FA6F7738A41BDC9846466ABDB8174C0338250AE50CE955CA16230F9CBD53E"), hex_num("3A1B2DBD7489D6ED7E608FD036C83AF396E290DBD602408E8677DAABD6E7445A"), hex_num("D26FCBA19FA3E3058FFC02CA1596CDBB6E0D20CB37B06054F7E36DED0CDBBCCF"), ); check( HashAlgorithm::SHA2_224, "sample", hex_num("BC372967702082E1AA4FCE892209F71AE4AD25A6DFD869334E6F153BD0C4D806"), hex_num("DC9F4DEADA8D8FF588E98FED0AB690FFCE858DC8C79376450EB6B76C24537E2C"), hex_num("A65A9C3BC7BABE286B195D5DA68616DA8D47FA0097F36DD19F517327DC848CEC"), ); check( HashAlgorithm::SHA2_256, "sample", hex_num("8926A27C40484216F052F4427CFD5647338B7B3939BC6573AF4333569D597C52"), hex_num("EACE8BDBBE353C432A795D9EC556C6D021F7A03F42C36E9BC87E4AC7932CC809"), hex_num("7081E175455F9247B812B74583E9E94F9EA79BD640DC962533B0680793A38D53"), ); check( HashAlgorithm::SHA2_384, "sample", hex_num("C345D5AB3DA0A5BCB7EC8F8FB7A7E96069E03B206371EF7D83E39068EC564920"), hex_num("B2DA945E91858834FD9BF616EBAC151EDBC4B45D27D0DD4A7F6A22739F45C00B"), hex_num("19048B63D9FD6BCA1D9BAE3664E1BCB97F7276C306130969F63F38FA8319021B"), ); check( HashAlgorithm::SHA2_512, "sample", hex_num("5A12994431785485B3F5F067221517791B85A597B7A9436995C89ED0374668FC"), hex_num("2016ED092DC5FB669B8EFB3D1F31A91EECB199879BE0CF78F02BA062CB4C942E"), hex_num("D0C76F84B5F091E141572A639A4FB8C230807EEA7D55C8A154A224400AFF2351"), ); check( HashAlgorithm::SHA1, "test", hex_num("6EEA486F9D41A037B2C640BC5645694FF8FF4B98D066A25F76BE641CCB24BA4F"), hex_num("C18270A93CFC6063F57A4DFA86024F700D980E4CF4E2CB65A504397273D98EA0"), hex_num("414F22E5F31A8B6D33295C7539C1C1BA3A6160D7D68D50AC0D3A5BEAC2884FAA"), ); check( HashAlgorithm::SHA2_224, "test", hex_num("06BD4C05ED74719106223BE33F2D95DA6B3B541DAD7BFBD7AC508213B6DA6670"), hex_num("272ABA31572F6CC55E30BF616B7A265312018DD325BE031BE0CC82AA17870EA3"), hex_num("E9CC286A52CCE201586722D36D1E917EB96A4EBDB47932F9576AC645B3A60806"), ); check( HashAlgorithm::SHA2_256, "test", hex_num("1D6CE6DDA1C5D37307839CD03AB0A5CBB18E60D800937D67DFB4479AAC8DEAD7"), hex_num("8190012A1969F9957D56FCCAAD223186F423398D58EF5B3CEFD5A4146A4476F0"), hex_num("7452A53F7075D417B4B013B278D1BB8BBD21863F5E7B1CEE679CF2188E1AB19E"), ); check( HashAlgorithm::SHA2_384, "test", hex_num("206E61F73DBE1B2DC8BE736B22B079E9DACD974DB00EEBBC5B64CAD39CF9F91C"), hex_num("239E66DDBE8F8C230A3D071D601B6FFBDFB5901F94D444C6AF56F732BEB954BE"), hex_num("6BD737513D5E72FE85D1C750E0F73921FE299B945AAD1C802F15C26A43D34961"), ); check( HashAlgorithm::SHA2_512, "test", hex_num("AFF1651E4CD6036D57AA8B2A05CCF1A9D5A40166340ECBBDC55BE10B568AA0AA"), hex_num("89EC4BB1400ECCFF8E7D9AA515CD1DE7803F2DAFF09693EE7FD1353E90A68307"), hex_num("C9F0BDABCC0D880BB137A994CC7F3980CE91CC10FAF529FC46565B15CEA854E1"), ); } } pgp-0.15.0/src/crypto/ecc_curve.rs000064400000000000000000000221511046102023000151110ustar 00000000000000use const_oid::ObjectIdentifier; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; #[derive(Clone, Debug, Eq, PartialEq)] pub enum ECCCurve { Curve25519, Ed25519, P256, P384, P521, BrainpoolP256r1, BrainpoolP384r1, BrainpoolP512r1, Secp256k1, Unknown(ObjectIdentifier), } impl ECCCurve { /// Standard name pub fn name(&self) -> &str { match self { ECCCurve::Curve25519 => "Curve25519", ECCCurve::Ed25519 => "Ed25519", ECCCurve::P256 => "NIST P-256", ECCCurve::P384 => "NIST P-384", ECCCurve::P521 => "NIST P-521", ECCCurve::BrainpoolP256r1 => "brainpoolP256r1", ECCCurve::BrainpoolP384r1 => "brainpoolP384r1", ECCCurve::BrainpoolP512r1 => "brainpoolP512r1", ECCCurve::Secp256k1 => "secp256k1", ECCCurve::Unknown(_oid) => "unknown", } } /// IETF formatted OID pub fn oid_str(&self) -> String { match self { ECCCurve::Curve25519 => "1.3.6.1.4.1.3029.1.5.1".into(), ECCCurve::Ed25519 => "1.3.6.1.4.1.11591.15.1".into(), ECCCurve::P256 => "1.2.840.10045.3.1.7".into(), ECCCurve::P384 => "1.3.132.0.34".into(), ECCCurve::P521 => "1.3.132.0.35".into(), ECCCurve::BrainpoolP256r1 => "1.3.36.3.3.2.8.1.1.7".into(), ECCCurve::BrainpoolP384r1 => "1.3.36.3.3.2.8.1.1.11".into(), ECCCurve::BrainpoolP512r1 => "1.3.36.3.3.2.8.1.1.13".into(), ECCCurve::Secp256k1 => "1.3.132.0.10".into(), ECCCurve::Unknown(oid) => oid.to_string(), } } /// Nominal bit length of the curve pub fn nbits(&self) -> u16 { match self { ECCCurve::Curve25519 => 255, ECCCurve::Ed25519 => 255, ECCCurve::P256 => 256, ECCCurve::P384 => 384, ECCCurve::P521 => 521, ECCCurve::BrainpoolP256r1 => 256, ECCCurve::BrainpoolP384r1 => 384, ECCCurve::BrainpoolP512r1 => 512, ECCCurve::Secp256k1 => 256, ECCCurve::Unknown(_oid) => 0, // FIXME? } } /// Length of secret key in bytes pub const fn secret_key_length(&self) -> usize { match self { ECCCurve::Curve25519 => 32, ECCCurve::Ed25519 => 32, ECCCurve::P256 => 32, ECCCurve::P384 => 48, ECCCurve::P521 => 66, ECCCurve::BrainpoolP256r1 => 32, ECCCurve::BrainpoolP384r1 => 48, ECCCurve::BrainpoolP512r1 => 64, ECCCurve::Secp256k1 => 32, ECCCurve::Unknown(_oid) => 0, // FIXME? } } /// Alternative name of the curve pub fn alias(&self) -> Option<&str> { match self { ECCCurve::Curve25519 => Some("cv25519"), ECCCurve::Ed25519 => Some("ed25519"), ECCCurve::P256 => Some("nistp256"), ECCCurve::P384 => Some("nistp384"), ECCCurve::P521 => Some("nistp521"), ECCCurve::BrainpoolP256r1 => None, ECCCurve::BrainpoolP384r1 => None, ECCCurve::BrainpoolP512r1 => None, ECCCurve::Secp256k1 => None, ECCCurve::Unknown(_oid) => None, } } /// Required algo, or None for ECDSA/ECDH pub fn pubkey_algo(&self) -> Option { match self { ECCCurve::Curve25519 => Some(PublicKeyAlgorithm::ECDH), ECCCurve::Ed25519 => Some(PublicKeyAlgorithm::EdDSALegacy), ECCCurve::P256 => None, ECCCurve::P384 => None, ECCCurve::P521 => None, ECCCurve::BrainpoolP256r1 => None, ECCCurve::BrainpoolP384r1 => None, ECCCurve::BrainpoolP512r1 => None, ECCCurve::Secp256k1 => None, ECCCurve::Unknown(_oid) => None, } } /// Default hash algorithm for this curve pub fn hash_algo(&self) -> crate::errors::Result { match self { ECCCurve::Curve25519 | ECCCurve::Ed25519 | ECCCurve::P256 | ECCCurve::BrainpoolP256r1 | ECCCurve::Secp256k1 => Ok(HashAlgorithm::SHA2_256), ECCCurve::P384 | ECCCurve::BrainpoolP384r1 => Ok(HashAlgorithm::SHA2_384), ECCCurve::P521 | ECCCurve::BrainpoolP512r1 => Ok(HashAlgorithm::SHA2_512), ECCCurve::Unknown(_oid) => { unsupported_err!("no default hash_algo for curve {:?}", self.to_string()) } } } /// Default symmetric encryption algorithm for this curve pub fn sym_algo(&self) -> crate::errors::Result { match self { ECCCurve::Curve25519 | ECCCurve::Ed25519 | ECCCurve::P256 | ECCCurve::BrainpoolP256r1 | ECCCurve::Secp256k1 => Ok(SymmetricKeyAlgorithm::AES128), ECCCurve::P384 | ECCCurve::BrainpoolP384r1 => Ok(SymmetricKeyAlgorithm::AES192), ECCCurve::P521 | ECCCurve::BrainpoolP512r1 => Ok(SymmetricKeyAlgorithm::AES256), ECCCurve::Unknown(_oid) => { unsupported_err!("no default sym_algo for curve {:?}", self.to_string()) } } } pub fn oid(&self) -> Vec { // the OID String is turned into bytes // with the first two numbers combined let mut id: Vec = self .oid_str() .split('.') // safe as we hard coded these .map(|v| v.parse::().expect("bad oid string")) .collect(); // combine the first two let first = id.remove(0) * 40 + id.remove(0); id.insert(0, first); id.iter() .flat_map(|ident| asn1_der_object_id_val_enc(*ident)) .collect() } } /// Get the right curve given an oid. pub fn ecc_curve_from_oid(oid: &[u8]) -> Option { if ECCCurve::Curve25519.oid().as_slice() == oid { return Some(ECCCurve::Curve25519); } if ECCCurve::Ed25519.oid().as_slice() == oid { return Some(ECCCurve::Ed25519); } if ECCCurve::P256.oid().as_slice() == oid { return Some(ECCCurve::P256); } if ECCCurve::P384.oid().as_slice() == oid { return Some(ECCCurve::P384); } if ECCCurve::P521.oid().as_slice() == oid { return Some(ECCCurve::P521); } if ECCCurve::BrainpoolP256r1.oid().as_slice() == oid { return Some(ECCCurve::BrainpoolP256r1); } if ECCCurve::BrainpoolP384r1.oid().as_slice() == oid { return Some(ECCCurve::BrainpoolP384r1); } if ECCCurve::BrainpoolP512r1.oid().as_slice() == oid { return Some(ECCCurve::BrainpoolP512r1); } if ECCCurve::Secp256k1.oid().as_slice() == oid { return Some(ECCCurve::Secp256k1); } if let Ok(oid) = ObjectIdentifier::from_bytes(oid) { Some(ECCCurve::Unknown(oid)) } else { None } } fn asn1_der_object_id_val_enc(val: u32) -> Vec { let mut val = val; let mut acc = vec![(val & 0x7f) as u8]; val >>= 7; while val > 0 { acc.insert(0, (0x80 | (val & 0x7f)) as u8); val >>= 7; } acc } impl std::fmt::Display for ECCCurve { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { write!(f, "{}", self.name()) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; #[test] fn test_ecc_curve_to_oid() { assert_eq!( ECCCurve::P256.oid(), vec![0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07] ); assert_eq!(ECCCurve::P384.oid(), vec![0x2B, 0x81, 0x04, 0x00, 0x22]); assert_eq!(ECCCurve::P521.oid(), vec![0x2B, 0x81, 0x04, 0x00, 0x23]); assert_eq!( ECCCurve::Ed25519.oid(), vec![0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01] ); assert_eq!( ECCCurve::Curve25519.oid(), vec![0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01] ); assert_eq!( ECCCurve::Secp256k1.oid(), vec![0x2B, 0x81, 0x04, 0x00, 0x0A] ); } #[test] fn test_ecc_curve_from_oid() { let one = vec![0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07]; assert_eq!(ecc_curve_from_oid(one.as_slice()).unwrap(), ECCCurve::P256); assert_eq!( ecc_curve_from_oid(vec![1, 2, 3].as_slice()), Some(ECCCurve::Unknown( ObjectIdentifier::from_bytes(&[1, 2, 3]).unwrap() )) ); } #[test] fn test_unknown_ecc_curve() { // brainpoolP160r1 (an OID we don't handle explicitly in ECCCurve) const OID: &[u8] = &[0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x01]; let bp_p160r1 = ecc_curve_from_oid(OID).unwrap(); assert_eq!(bp_p160r1.oid_str(), "1.3.36.3.3.2.8.1.1.1"); } #[test] fn test_asn1_der_object_id_val_enc() { assert_eq!(asn1_der_object_id_val_enc(840), vec![0x86, 0x48]); assert_eq!(asn1_der_object_id_val_enc(113_549), vec![0x86, 0xf7, 0x0d]); } } pgp-0.15.0/src/crypto/ecdh.rs000064400000000000000000000522111046102023000140560ustar 00000000000000use log::debug; use rand::{CryptoRng, Rng}; use x25519_dalek::{PublicKey, StaticSecret}; use zeroize::{Zeroize, ZeroizeOnDrop, Zeroizing}; use super::hash::HashAlgorithm; use crate::crypto::{ aes_kw, ecc_curve::ECCCurve, public_key::PublicKeyAlgorithm, sym::SymmetricKeyAlgorithm, Decryptor, KeyParams, }; use crate::errors::{Error, Result}; use crate::types::{EcdhPublicParams, Mpi, PkeskBytes, PlainSecretParams, PublicParams}; /// 20 octets representing "Anonymous Sender ". const ANON_SENDER: [u8; 20] = [ 0x41, 0x6E, 0x6F, 0x6E, 0x79, 0x6D, 0x6F, 0x75, 0x73, 0x20, 0x53, 0x65, 0x6E, 0x64, 0x65, 0x72, 0x20, 0x20, 0x20, 0x20, ]; /// Secret key for ECDH #[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop, derive_more::Debug)] pub enum SecretKey { /// ECDH with Curve25519 Curve25519 { /// The secret point. #[debug("..")] secret: [u8; ECCCurve::Curve25519.secret_key_length()], hash: HashAlgorithm, alg_sym: SymmetricKeyAlgorithm, }, /// ECDH with Nist P256 P256 { /// The secret point. #[debug("..")] secret: [u8; ECCCurve::P256.secret_key_length()], hash: HashAlgorithm, alg_sym: SymmetricKeyAlgorithm, }, /// ECDH with Nist P384 P384 { /// The secret point. #[debug("..")] secret: [u8; ECCCurve::P384.secret_key_length()], hash: HashAlgorithm, alg_sym: SymmetricKeyAlgorithm, }, /// ECDH with Nist P521 P521 { /// The secret point. #[debug("..")] secret: [u8; ECCCurve::P521.secret_key_length()], hash: HashAlgorithm, alg_sym: SymmetricKeyAlgorithm, }, } impl KeyParams for SecretKey { type KeyParams = (ECCCurve, SymmetricKeyAlgorithm, HashAlgorithm); fn key_params(&self) -> Self::KeyParams { match self { SecretKey::Curve25519 { hash, alg_sym, .. } => (ECCCurve::Curve25519, *alg_sym, *hash), SecretKey::P256 { hash, alg_sym, .. } => (ECCCurve::P256, *alg_sym, *hash), SecretKey::P384 { hash, alg_sym, .. } => (ECCCurve::P384, *alg_sym, *hash), SecretKey::P521 { hash, alg_sym, .. } => (ECCCurve::P521, *alg_sym, *hash), } } } pub struct EncryptionFields<'a> { pub public_point: &'a Mpi, /// Encrypted and wrapped value, derived from the session key pub encrypted_session_key: &'a [u8], /// NOTE: The fingerprint isn't part of the "Algorithm-Specific Fields", but it is needed for session key derivation pub fingerprint: &'a [u8], } impl Decryptor for SecretKey { type EncryptionFields<'a> = EncryptionFields<'a>; fn decrypt(&self, data: Self::EncryptionFields<'_>) -> Result> { debug!("ECDH decrypt"); let encrypted_key_len: usize = data.encrypted_session_key.len(); let (curve, alg_sym, hash) = self.key_params(); let shared_secret = match self { SecretKey::Curve25519 { secret, .. } => { ensure_eq!( secret.len(), curve.secret_key_length(), "invalid secret point" ); ensure_eq!(data.public_point.len(), 33, "invalid public point"); // prefix "0x40" + 32 bytes = 33 bytes let their_public = { // public part of the ephemeral key (removes 0x40 prefix) let ephemeral_public_key = &data.public_point.as_bytes()[1..]; // create montgomery point let mut ephemeral_public_key_arr = [0u8; 32]; ephemeral_public_key_arr[..].copy_from_slice(ephemeral_public_key); x25519_dalek::PublicKey::from(ephemeral_public_key_arr) }; let our_secret = { // private key of the recipient. let private_key = &secret[..]; // create scalar and reverse to little endian // https://www.rfc-editor.org/rfc/rfc9580.html#name-curve25519legacy-ecdh-secre let mut private_key_le = private_key.iter().rev().cloned().collect::>(); let mut private_key_arr = [0u8; 32]; private_key_arr[..].copy_from_slice(&private_key_le); private_key_le.zeroize(); StaticSecret::from(private_key_arr) }; // derive shared secret let shared_secret = our_secret.diffie_hellman(&their_public); shared_secret.to_bytes().to_vec() } SecretKey::P256 { secret, .. } => derive_shared_secret_decryption::( data.public_point, secret, &curve, 65, )?, SecretKey::P384 { secret, .. } => derive_shared_secret_decryption::( data.public_point, secret, &curve, 97, )?, SecretKey::P521 { secret, .. } => derive_shared_secret_decryption::( data.public_point, secret, &curve, 133, )?, }; // obtain the session key from the shared secret derive_session_key( &shared_secret, data.encrypted_session_key, encrypted_key_len, &(curve, alg_sym, hash), data.fingerprint, ) } } /// Derive a shared secret in decryption, for a Rust Crypto curve fn derive_shared_secret_decryption( public_point: &Mpi, secret: &[u8], curve: &ECCCurve, pub_bytes: usize, ) -> Result> where C: elliptic_curve::CurveArithmetic, elliptic_curve::FieldBytesSize: elliptic_curve::sec1::ModulusSize, elliptic_curve::AffinePoint: elliptic_curve::sec1::FromEncodedPoint + elliptic_curve::sec1::ToEncodedPoint, { ensure_eq!( secret.len(), curve.secret_key_length(), "invalid secret point" ); ensure_eq!(public_point.len(), pub_bytes, "invalid public point"); let ephemeral_public_key = elliptic_curve::PublicKey::::from_sec1_bytes(public_point.as_bytes())?; let our_secret = elliptic_curve::SecretKey::::from_bytes(secret.into())?; // derive shared secret let shared_secret = elliptic_curve::ecdh::diffie_hellman( our_secret.to_nonzero_scalar(), ephemeral_public_key.as_affine(), ); Ok(shared_secret.raw_secret_bytes().to_vec()) } /// Obtain the OpenPGP session key for a DH shared secret. /// /// This helper function performs the key derivation and unwrapping steps /// described in pub fn derive_session_key( shared_secret: &[u8], encrypted_session_key: &[u8], encrypted_key_len: usize, key_params: &::KeyParams, fingerprint: &[u8], ) -> Result> { let (curve, alg_sym, hash) = key_params; let param = build_ecdh_param(&curve.oid(), *alg_sym, *hash, fingerprint); // Perform key derivation let z = kdf(*hash, shared_secret, alg_sym.key_size(), ¶m)?; // Perform AES Key Unwrap let mut encrypted_session_key_vec = vec![0; encrypted_key_len]; encrypted_session_key_vec[(encrypted_key_len - encrypted_session_key.len())..] .copy_from_slice(encrypted_session_key); let mut decrypted_key_padded = aes_kw::unwrap(&z, &encrypted_session_key_vec)?; // PKCS5-style unpadding (PKCS5 is PKCS7 with a blocksize of 8). // // RFC 9580 describes the padding: // a) "Then, the above values are padded to an 8-octet granularity using the method described in [RFC8018]." // b) "For example, assuming that an AES algorithm is used for the session key, the sender MAY // use 21, 13, and 5 octets of padding for AES-128, AES-192, and AES-256, respectively, to // provide the same number of octets, 40 total, as an input to the key wrapping method." // // So while the padding ensures that the length of the padded message is a multiple of 8, the // padding may exceed 8 bytes in size. { let len = decrypted_key_padded.len(); let block_size = 8; ensure!(len % block_size == 0, "invalid key length {}", len); ensure!(!decrypted_key_padded.is_empty(), "empty key is not valid"); // The last byte should contain the padding symbol, which is also the padding length let pad = decrypted_key_padded.last().expect("is not empty"); // Padding length seems to exceed size of the padded message if *pad as usize > len { return Err(Error::UnpadError); } // Expected length of the unpadded message let unpadded_len = len - *pad as usize; // All bytes that constitute the padding must have the value of `pad` if decrypted_key_padded[unpadded_len..] .iter() .any(|byte| byte != pad) { return Err(Error::UnpadError); } decrypted_key_padded.truncate(unpadded_len); } // the key is now unpadded let decrypted_key = decrypted_key_padded; ensure!(!decrypted_key.is_empty(), "empty unpadded key is not valid"); Ok(decrypted_key) } /// Generate an ECDH KeyPair. pub fn generate_key( mut rng: R, curve: &ECCCurve, ) -> Result<(PublicParams, PlainSecretParams)> { match curve { ECCCurve::Curve25519 => { let mut secret_key_bytes = Zeroizing::new([0u8; ECCCurve::Curve25519.secret_key_length()]); rng.fill_bytes(&mut *secret_key_bytes); let secret = StaticSecret::from(*secret_key_bytes); let public = PublicKey::from(&secret); // public key let p_raw = public.to_bytes(); let mut p = Vec::with_capacity(33); p.push(0x40); p.extend_from_slice(&p_raw); // secret key // Clamp, as `to_bytes` does not clamp. let q_raw = curve25519_dalek::scalar::clamp_integer(secret.to_bytes()); // Big Endian let q = q_raw.into_iter().rev().collect::>(); let curve = ECCCurve::Curve25519; let hash = curve.hash_algo()?; let alg_sym = curve.sym_algo()?; Ok(( PublicParams::ECDH(EcdhPublicParams::Known { curve: ECCCurve::Curve25519, p: Mpi::from_raw(p), hash, alg_sym, }), PlainSecretParams::ECDH(Mpi::from_raw(q)), )) } ECCCurve::P256 => keygen::(rng, curve), ECCCurve::P384 => keygen::(rng, curve), ECCCurve::P521 => keygen::(rng, curve), _ => unsupported_err!("curve {:?} for ECDH", curve), } } /// Generate an ECDH key based on a Rust Crypto curve fn keygen( mut rng: R, curve: &ECCCurve, ) -> Result<(PublicParams, PlainSecretParams)> where C: elliptic_curve::CurveArithmetic + elliptic_curve::point::PointCompression, elliptic_curve::FieldBytesSize: elliptic_curve::sec1::ModulusSize, elliptic_curve::AffinePoint: elliptic_curve::sec1::FromEncodedPoint + elliptic_curve::sec1::ToEncodedPoint, { let secret = elliptic_curve::SecretKey::::random(&mut rng); let public = secret.public_key(); Ok(( PublicParams::ECDH(EcdhPublicParams::Known { curve: curve.clone(), p: Mpi::from_slice(public.to_sec1_bytes().as_ref()), hash: curve.hash_algo()?, alg_sym: curve.sym_algo()?, }), PlainSecretParams::ECDH(Mpi::from_slice(secret.to_bytes().as_slice())), )) } /// Build param for ECDH algorithm (as defined in RFC 9580) /// pub fn build_ecdh_param( oid: &[u8], alg_sym: SymmetricKeyAlgorithm, hash: HashAlgorithm, fingerprint: &[u8], ) -> Vec { let kdf_params = vec![ 0x03, // length of the following fields 0x01, // reserved for future extensions hash.into(), u8::from(alg_sym), ]; let oid_len = [oid.len() as u8]; let pkalgo = [u8::from(PublicKeyAlgorithm::ECDH)]; let values: Vec<&[u8]> = vec![ &oid_len, oid, &pkalgo, &kdf_params, &ANON_SENDER[..], fingerprint, ]; values.concat() } /// Key Derivation Function for ECDH (as defined in RFC 9580). /// pub fn kdf(hash: HashAlgorithm, x: &[u8], length: usize, param: &[u8]) -> Result> { let prefix = vec![0, 0, 0, 1]; let values: Vec<&[u8]> = vec![&prefix, x, param]; let data = values.concat(); let mut digest = hash.digest(&data)?; digest.truncate(length); Ok(digest) } /// PKCS5-style padding, with a block-size of 8. /// However, the padding may exceed the length of one block, to obfuscate key size. fn pad(plain: &[u8]) -> Vec { let len = plain.len(); // We produce "short padding" (between 1 and 8 bytes) let remainder = len % 8; // (e.g. 3 for len==19) let padded_len = len + 8 - remainder; // (e.g. "8 + 8 - 0 => 16", or "19 + 8 - 3 => 24") debug_assert!(padded_len % 8 == 0, "Unexpected padded_len {}", padded_len); // The value we'll use for padding (must not be zero, and fit into a u8) let padding = padded_len - len; debug_assert!( padding > 0 && u8::try_from(padding).is_ok(), "Unexpected padding value {}", padding ); let padding = padding as u8; // Extend length of plain_padded, fill with `padding` value let mut plain_padded = plain.to_vec(); plain_padded.resize(padded_len, padding); plain_padded } /// ECDH encryption. pub fn encrypt( mut rng: R, curve: &ECCCurve, alg_sym: SymmetricKeyAlgorithm, hash: HashAlgorithm, fingerprint: &[u8], q: &[u8], plain: &[u8], ) -> Result { debug!("ECDH encrypt"); // Implementations MUST NOT use MD5, SHA-1, or RIPEMD-160 as a hash function in an ECDH KDF. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.5-3) ensure!( hash != HashAlgorithm::MD5 && hash != HashAlgorithm::SHA1 && hash != HashAlgorithm::RIPEMD160, "{:?} is not a legal hash function for ECDH KDF", hash ); // Maximum length for `plain`: // - padding increases the length (at least) to a length of the next multiple of 8. // - aes keywrap adds another 8 bytes // - the maximum length value this function can return is u8 (limited to 255) const MAX_SIZE: usize = 239; ensure!( plain.len() <= MAX_SIZE, "unable to encrypt larger than {} bytes", MAX_SIZE ); let (encoded_public, shared_secret) = match curve { ECCCurve::Curve25519 => { ensure_eq!(q.len(), 33, "invalid public key"); let their_public = { // public part of the ephemeral key (removes 0x40 prefix) let public_key = &q[1..]; // create montgomery point let mut public_key_arr = [0u8; 32]; public_key_arr[..].copy_from_slice(public_key); x25519_dalek::PublicKey::from(public_key_arr) }; let mut our_secret_key_bytes = Zeroizing::new([0u8; ECCCurve::Curve25519.secret_key_length()]); rng.fill_bytes(&mut *our_secret_key_bytes); let our_secret = StaticSecret::from(*our_secret_key_bytes); // derive shared secret let shared_secret = our_secret.diffie_hellman(&their_public); // Encode public point: prefix with 0x40 let mut encoded_public = Vec::with_capacity(33); encoded_public.push(0x40); encoded_public.extend(x25519_dalek::PublicKey::from(&our_secret).as_bytes().iter()); (encoded_public, shared_secret.as_bytes().to_vec()) } ECCCurve::P256 => derive_shared_secret_encryption::(rng, q)?, ECCCurve::P384 => derive_shared_secret_encryption::(rng, q)?, ECCCurve::P521 => derive_shared_secret_encryption::(rng, q)?, _ => unsupported_err!("curve {:?} for ECDH", curve), }; let param = build_ecdh_param(&curve.oid(), alg_sym, hash, fingerprint); // Perform key derivation let z = kdf(hash, &shared_secret, alg_sym.key_size(), ¶m)?; // Pad plaintext let plain_padded = pad(plain); // Perform AES Key Wrap let encrypted_session_key = aes_kw::wrap(&z, &plain_padded)?; Ok(PkeskBytes::Ecdh { public_point: Mpi::from_slice(&encoded_public), encrypted_session_key, }) } /// Derive a shared secret in encryption, for a Rust Crypto curve. /// Returns a pair of `(our_public key, shared_secret)`. fn derive_shared_secret_encryption( mut rng: R, q: &[u8], ) -> Result<(Vec, Vec)> where C: elliptic_curve::CurveArithmetic + elliptic_curve::point::PointCompression, elliptic_curve::FieldBytesSize: elliptic_curve::sec1::ModulusSize, elliptic_curve::AffinePoint: elliptic_curve::sec1::FromEncodedPoint + elliptic_curve::sec1::ToEncodedPoint, { let their_public = elliptic_curve::PublicKey::::from_sec1_bytes(q)?; let our_secret = elliptic_curve::ecdh::EphemeralSecret::::random(&mut rng); // derive shared secret let shared_secret = our_secret.diffie_hellman(&their_public); // encode our public key let our_public = elliptic_curve::PublicKey::::from(&our_secret); let our_public = elliptic_curve::sec1::EncodedPoint::::from(our_public); Ok(( our_public.as_bytes().to_vec(), shared_secret.raw_secret_bytes().to_vec(), )) } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use std::fs; use rand::{RngCore, SeedableRng}; use rand_chacha::ChaChaRng; use super::*; use crate::types::SecretKeyRepr; use crate::{Deserializable, Message, SignedSecretKey}; #[test] #[ignore] fn test_encrypt_decrypt() { for curve in [ ECCCurve::Curve25519, ECCCurve::P256, ECCCurve::P384, ECCCurve::P521, ] { let mut rng = ChaChaRng::from_seed([0u8; 32]); let (pkey, skey) = generate_key(&mut rng, &curve).unwrap(); for text_size in 1..=239 { for _i in 0..10 { let mut fingerprint = vec![0u8; 20]; rng.fill_bytes(&mut fingerprint); let mut plain = vec![0u8; text_size]; rng.fill_bytes(&mut plain); let values = match pkey { PublicParams::ECDH(EcdhPublicParams::Known { ref curve, ref p, hash, alg_sym, }) => encrypt( &mut rng, curve, alg_sym, hash, &fingerprint, p.as_bytes(), &plain[..], ) .unwrap(), _ => panic!("invalid key generated"), }; let decrypted = match (skey.as_ref().as_repr(&pkey).unwrap(), values) { ( SecretKeyRepr::ECDH(ref skey), PkeskBytes::Ecdh { public_point, encrypted_session_key, }, ) => skey .decrypt(EncryptionFields { public_point: &public_point, encrypted_session_key: &encrypted_session_key, fingerprint: &fingerprint, }) .unwrap(), _ => panic!("invalid key generated"), }; assert_eq!(&plain[..], &decrypted[..]); } } } } #[test] fn test_decrypt_padding() { let (decrypt_key, _headers) = SignedSecretKey::from_armor_single( fs::File::open("./tests/unit-tests/padding/alice.key").unwrap(), ) .expect("failed to read decryption key"); for msg_file in [ "./tests/unit-tests/padding/msg-short-padding.pgp", "./tests/unit-tests/padding/msg-long-padding.pgp", ] { let (message, _headers) = Message::from_armor_single(fs::File::open(msg_file).unwrap()) .expect("failed to parse message"); let (msg, _ids) = message .decrypt(String::default, &[&decrypt_key]) .expect("failed to init decryption"); let data = msg.get_literal().unwrap().data(); assert_eq!(data, "hello\n".as_bytes()); } } } pgp-0.15.0/src/crypto/ecdsa.rs000064400000000000000000000245261046102023000142420ustar 00000000000000use ecdsa::SigningKey; use elliptic_curve::sec1::ToEncodedPoint; use p521::NistP521; use rand::{CryptoRng, Rng}; use signature::hazmat::{PrehashSigner, PrehashVerifier}; use zeroize::ZeroizeOnDrop; use crate::crypto::ecc_curve::ECCCurve; use crate::crypto::hash::HashAlgorithm; use crate::crypto::Signer; use crate::errors::Result; use crate::types::EcdsaPublicParams; use crate::types::{Mpi, PlainSecretParams, PublicParams}; #[derive(Clone, PartialEq, Eq, ZeroizeOnDrop, derive_more::Debug)] pub enum SecretKey { P256(#[debug("..")] p256::SecretKey), P384(#[debug("..")] p384::SecretKey), P521(#[debug("..")] p521::SecretKey), Secp256k1(#[debug("..")] k256::SecretKey), Unsupported { /// The secret point. #[debug("..")] x: Mpi, #[zeroize(skip)] curve: ECCCurve, }, } impl Signer for SecretKey { fn sign( &self, hash: HashAlgorithm, digest: &[u8], pub_params: &PublicParams, ) -> Result>> { ensure!( matches!(pub_params, PublicParams::ECDSA(..)), "invalid public params" ); if let Some(field_size) = self.secret_key_length() { // We require that the signing key length is matched by the hash digest length, // see https://www.rfc-editor.org/rfc/rfc9580.html#section-5.2.3.2-5 let field_size = match field_size { 66 => 64, // nist p521 is treated as though it were 512 bit-sized s => s, }; ensure!( digest.len() >= field_size, "Hash digest size ({:?}) must at least match key size ({:?})", hash, self ); } let (r, s) = match self { Self::P256(secret_key) => { let secret = p256::ecdsa::SigningKey::from(secret_key); let signature: p256::ecdsa::Signature = secret.sign_prehash(digest)?; let (r, s) = signature.split_bytes(); (r.to_vec(), s.to_vec()) } Self::P384(secret_key) => { let secret = p384::ecdsa::SigningKey::from(secret_key); let signature: p384::ecdsa::Signature = secret.sign_prehash(digest)?; let (r, s) = signature.split_bytes(); (r.to_vec(), s.to_vec()) } Self::P521(secret_key) => { let secret: SigningKey = secret_key.into(); let signing_key = p521::ecdsa::SigningKey::from(secret); let signature: p521::ecdsa::Signature = signing_key.sign_prehash(digest)?; let (r, s) = signature.split_bytes(); (r.to_vec(), s.to_vec()) } Self::Secp256k1(secret_key) => { let secret = k256::ecdsa::SigningKey::from(secret_key); let signature: k256::ecdsa::Signature = secret.sign_prehash(digest)?; let (r, s) = signature.split_bytes(); (r.to_vec(), s.to_vec()) } Self::Unsupported { curve, .. } => { unsupported_err!("curve {:?} for ECDSA", curve) } }; Ok(vec![r, s]) } } impl SecretKey { pub(crate) fn secret_key_length(&self) -> Option { match self { Self::P256 { .. } => Some(32), Self::P384 { .. } => Some(48), Self::P521 { .. } => Some(66), Self::Secp256k1 { .. } => Some(32), Self::Unsupported { .. } => None, } } } /// Generate an ECDSA KeyPair. pub fn generate_key( mut rng: R, curve: &ECCCurve, ) -> Result<(PublicParams, PlainSecretParams)> { match curve { ECCCurve::P256 => { let secret = p256::SecretKey::random(&mut rng); let public = secret.public_key(); let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::P256 { key: public, p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) } ECCCurve::P384 => { let secret = p384::SecretKey::random(&mut rng); let public = secret.public_key(); let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::P384 { key: public, p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) } ECCCurve::P521 => { let secret = p521::SecretKey::random(&mut rng); let public = secret.public_key(); let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::P521 { key: public, p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) } ECCCurve::Secp256k1 => { let secret = k256::SecretKey::random(&mut rng); let public = secret.public_key(); let secret = Mpi::from_slice(secret.to_bytes().as_slice()); Ok(( PublicParams::ECDSA(EcdsaPublicParams::Secp256k1 { key: public, p: Mpi::from_slice(public.to_encoded_point(false).as_bytes()), }), PlainSecretParams::ECDSA(secret), )) } _ => unsupported_err!("curve {:?} for ECDSA", curve), } } /// Verify an ECDSA signature. pub fn verify( p: &EcdsaPublicParams, hash: HashAlgorithm, hashed: &[u8], sig: &[Mpi], ) -> Result<()> { // NOTE: the `None` case will run into an `unsupported_err`, below, so it's ok not to consider it here if let Some(field_size) = p.secret_key_length() { // Error out for size mismatches that would get rejected in ecdsa::hazmat::bits2field ensure!( hashed.len() >= field_size / 2, "Hash algorithm {:?} cannot be combined with key {:?}", hash, p ); // RFC 9580: // An ECDSA signature MUST use a hash algorithm with a digest size of at least the curve's "fsize" value [..]" // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-5.2.3.2-5) let min_hash_len = match field_size { // "[..] except in the case of NIST P-521, for which at least a 512-bit hash algorithm MUST be used" 521 => 512, f => f, }; let Some(digest_size) = hash.digest_size() else { bail!("ECDSA signature: invalid hash algorithm: {:?}", hash); }; ensure!( digest_size * 8 >= min_hash_len, "ECDSA signature: hash algorithm {:?} is too weak for key {:?}", hash, p ); } match p { EcdsaPublicParams::P256 { key, .. } => { const FLEN: usize = 32; ensure_eq!(sig.len(), 2); let r = sig[0].as_bytes(); let s = sig[1].as_bytes(); ensure!(r.len() <= FLEN, "invalid R (len)"); ensure!(s.len() <= FLEN, "invalid S (len)"); let mut sig_bytes = [0u8; 2 * FLEN]; // add padding if the values were encoded short sig_bytes[(FLEN - r.len())..FLEN].copy_from_slice(r); sig_bytes[FLEN + (FLEN - s.len())..].copy_from_slice(s); let sig = p256::ecdsa::Signature::try_from(&sig_bytes[..])?; let pk = p256::ecdsa::VerifyingKey::from_affine(key.as_affine().to_owned())?; pk.verify_prehash(hashed, &sig)?; Ok(()) } EcdsaPublicParams::P384 { key, .. } => { const FLEN: usize = 48; ensure_eq!(sig.len(), 2); let r = sig[0].as_bytes(); let s = sig[1].as_bytes(); ensure!(r.len() <= FLEN, "invalid R (len)"); ensure!(s.len() <= FLEN, "invalid S (len)"); let mut sig_bytes = [0u8; 2 * FLEN]; // add padding if the values were encoded short sig_bytes[(FLEN - r.len())..FLEN].copy_from_slice(r); sig_bytes[FLEN + (FLEN - s.len())..].copy_from_slice(s); let pk = p384::ecdsa::VerifyingKey::from_affine(key.as_affine().to_owned())?; let sig = p384::ecdsa::Signature::try_from(&sig_bytes[..])?; pk.verify_prehash(hashed, &sig)?; Ok(()) } EcdsaPublicParams::P521 { key, .. } => { const FLEN: usize = 66; ensure_eq!(sig.len(), 2); let r = sig[0].as_bytes(); let s = sig[1].as_bytes(); ensure!(r.len() <= FLEN, "invalid R (len)"); ensure!(s.len() <= FLEN, "invalid S (len)"); let mut sig_bytes = [0u8; 2 * FLEN]; // add padding if the values were encoded short sig_bytes[(FLEN - r.len())..FLEN].copy_from_slice(r); sig_bytes[FLEN + (FLEN - s.len())..].copy_from_slice(s); let pk = p521::ecdsa::VerifyingKey::from_affine(key.as_affine().to_owned())?; let sig = p521::ecdsa::Signature::try_from(&sig_bytes[..])?; pk.verify_prehash(hashed, &sig)?; Ok(()) } EcdsaPublicParams::Secp256k1 { key, .. } => { const FLEN: usize = 32; ensure_eq!(sig.len(), 2); let r = sig[0].as_bytes(); let s = sig[1].as_bytes(); ensure!(r.len() <= FLEN, "invalid R (len)"); ensure!(s.len() <= FLEN, "invalid S (len)"); let mut sig_bytes = [0u8; 2 * FLEN]; // add padding if the values were encoded short sig_bytes[(FLEN - r.len())..FLEN].copy_from_slice(r); sig_bytes[FLEN + (FLEN - s.len())..].copy_from_slice(s); let pk = k256::ecdsa::VerifyingKey::from_affine(key.as_affine().to_owned())?; let sig = k256::ecdsa::Signature::try_from(&sig_bytes[..])?; pk.verify_prehash(hashed, &sig)?; Ok(()) } EcdsaPublicParams::Unsupported { curve, .. } => { unsupported_err!("curve {:?} for ECDSA", curve.to_string()) } } } pgp-0.15.0/src/crypto/eddsa.rs000064400000000000000000000114151046102023000142340ustar 00000000000000//! EdDSA for OpenPGP. //! //! OpenPGP RFC 9580 specifies use of Ed25519 and Ed448. //! //! Use of Ed25519 is defined with two different framings (using different key types) in RFC 9580: //! - The new key format is called `Ed25519`. It can be used both with v4 and v6 keys. //! - The old key format has been renamed `EdDSALegacy`. It may only be used with v4 keys. //! //! Note: The two variants `Ed25519` and `EdDSALegacy` use the same cryptographic mechanism, //! and are interchangeable in terms of the low-level cryptographic primitives. //! However, at the OpenPGP layer their representation in the key material differs. //! This implicitly yields differing OpenPGP fingerprints, so the two OpenPGP key variants cannot //! be used interchangeably. use rand::{CryptoRng, Rng}; use signature::{Signer as _, Verifier}; use zeroize::{Zeroize, ZeroizeOnDrop, Zeroizing}; use crate::crypto::ecc_curve::ECCCurve; use crate::crypto::hash::HashAlgorithm; use crate::crypto::Signer; use crate::errors::Result; use crate::types::{Mpi, PlainSecretParams, PublicParams}; /// Specifies which OpenPGP framing (e.g. `Ed25519` vs. `EdDSALegacy`) is used, and also chooses /// between curve Ed25519 and Ed448 (TODO: not yet implemented) pub enum Mode { /// EdDSALegacy (with curve Ed25519). May only be used with v4 keys. /// /// Ref EdDSALegacy, /// Ed25519 as defined in RFC 9580 /// /// Ref Ed25519, } /// Secret key for EdDSA with Curve25519, the only combination we currently support. #[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop, derive_more::Debug)] pub struct SecretKey { /// The secret point. #[debug("..")] pub secret: [u8; 32], #[debug("{}", hex::encode(oid))] pub oid: Vec, } impl Signer for SecretKey { fn sign( &self, _hash: HashAlgorithm, digest: &[u8], pub_params: &PublicParams, ) -> Result>> { let curve = match pub_params { PublicParams::EdDSALegacy { curve, q } => { ensure_eq!(q.len(), 33, "invalid Q (len)"); ensure_eq!(q[0], 0x40, "invalid Q (prefix)"); curve } PublicParams::Ed25519 { .. } => &ECCCurve::Ed25519, _ => bail!("invalid public params"), }; if curve != &ECCCurve::Ed25519 { unsupported_err!("curve {:?} for EdDSA", curve.to_string()); } let key = ed25519_dalek::SigningKey::from_bytes(&self.secret); let signature = key.sign(digest); let bytes = signature.to_bytes(); let r = bytes[..32].to_vec(); let s = bytes[32..].to_vec(); Ok(vec![r, s]) } } /// Generate an EdDSA KeyPair. /// /// `mode` picks between supported EdDSA key formats and curves pub fn generate_key( mut rng: R, mode: Mode, ) -> (PublicParams, PlainSecretParams) { let mut bytes = Zeroizing::new([0u8; ed25519_dalek::SECRET_KEY_LENGTH]); rng.fill_bytes(&mut *bytes); let secret = ed25519_dalek::SigningKey::from_bytes(&bytes); drop(bytes); // we're done with this slice, zeroize it let public = ed25519_dalek::VerifyingKey::from(&secret); match mode { Mode::EdDSALegacy => { // public key let mut q = Vec::with_capacity(33); q.push(0x40); q.extend_from_slice(&public.to_bytes()); // secret key let p = Mpi::from_slice(&secret.to_bytes()); ( PublicParams::EdDSALegacy { curve: ECCCurve::Ed25519, q: Mpi::from_raw(q), }, PlainSecretParams::EdDSALegacy(p), ) } Mode::Ed25519 => ( PublicParams::Ed25519 { public: public.to_bytes(), }, PlainSecretParams::Ed25519(secret.to_bytes()), ), } } /// Verify an EdDSA signature. pub fn verify( curve: &ECCCurve, public: &[u8], hash: HashAlgorithm, hashed: &[u8], sig_bytes: &[u8], ) -> Result<()> { match *curve { ECCCurve::Ed25519 => { let Some(digest_size) = hash.digest_size() else { bail!("EdDSA signature: invalid hash algorithm: {:?}", hash); }; ensure!( digest_size * 8 >= 256, "EdDSA signature: hash algorithm {:?} is too weak for Ed25519", hash, ); let pk: ed25519_dalek::VerifyingKey = public.try_into()?; let sig = sig_bytes.try_into()?; Ok(pk.verify(hashed, &sig)?) } _ => unsupported_err!("curve {:?} for EdDSA", curve.to_string()), } } pgp-0.15.0/src/crypto/hash.rs000064400000000000000000000163321046102023000141020ustar 00000000000000use std::{fmt::Display, str::FromStr}; use digest::Digest; use md5::Md5; use num_enum::{FromPrimitive, IntoPrimitive}; use ripemd::Ripemd160; use sha1_checked::{CollisionResult, Sha1}; use crate::errors::{Error, Result}; /// Available hash algorithms. /// Ref: #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive, IntoPrimitive, Hash)] #[repr(u8)] pub enum HashAlgorithm { None = 0, MD5 = 1, SHA1 = 2, RIPEMD160 = 3, SHA2_256 = 8, SHA2_384 = 9, SHA2_512 = 10, SHA2_224 = 11, SHA3_256 = 12, SHA3_512 = 14, /// Do not use, just for compatibility with GnuPG. Private10 = 110, #[num_enum(catch_all)] Other(u8), } impl Default for HashAlgorithm { fn default() -> Self { Self::SHA2_256 } } impl HashAlgorithm { /// V6 signature salt size /// pub const fn salt_len(&self) -> Option { match self { Self::SHA2_224 => Some(16), Self::SHA2_256 => Some(16), Self::SHA2_384 => Some(24), Self::SHA2_512 => Some(32), Self::SHA3_256 => Some(16), Self::SHA3_512 => Some(32), _ => None, } } } impl FromStr for HashAlgorithm { type Err = Error; fn from_str(s: &str) -> std::result::Result { match s { "None" => Ok(Self::None), "MD5" => Ok(Self::MD5), "SHA1" => Ok(Self::SHA1), "RIPEMD160" => Ok(Self::RIPEMD160), "SHA256" => Ok(Self::SHA2_256), "SHA384" => Ok(Self::SHA2_384), "SHA512" => Ok(Self::SHA2_512), "SHA224" => Ok(Self::SHA2_224), "SHA3-256" => Ok(Self::SHA3_256), "SHA3-512" => Ok(Self::SHA3_512), "Private10" => Ok(Self::Private10), _ => bail!("unknown hash"), } } } impl Display for HashAlgorithm { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { let s = match self { Self::MD5 => "MD5", Self::SHA1 => "SHA1", Self::RIPEMD160 => "RIPEMD160", Self::SHA2_256 => "SHA256", Self::SHA2_384 => "SHA384", Self::SHA2_512 => "SHA512", Self::SHA2_224 => "SHA224", Self::SHA3_256 => "SHA3-256", Self::SHA3_512 => "SHA3-512", Self::Private10 => "Private10", Self::Other(v) => return write!(f, "Other({})", v), Self::None => "None", }; write!(f, "{}", s) } } impl zeroize::DefaultIsZeroes for HashAlgorithm {} /// Trait to work around the fact that the `Digest` trait from rustcrypto can not /// be used as `Box`. pub trait Hasher: std::io::Write { /// Update the hash with the given value. fn update(&mut self, _: &[u8]); /// Finalize the hash and return the result. fn finish(self: Box) -> Vec; /// Finalize into the provided buffer. Truncates to the length of `out`. fn finish_reset_into(&mut self, out: &mut [u8]); } macro_rules! derive_hasher { ($name:ident, $struct:path) => { #[derive(Clone, Default)] pub struct $name { inner: $struct, } impl Hasher for $name { fn update(&mut self, data: &[u8]) { self.inner.update(data); } fn finish(self: Box) -> Vec { self.inner.finalize().as_slice().to_vec() } fn finish_reset_into(&mut self, out: &mut [u8]) { let res = self.inner.finalize_reset(); out.copy_from_slice(&res.as_slice()[..out.len()]); } } impl std::io::Write for $name { fn write(&mut self, buf: &[u8]) -> std::io::Result { self.update(buf); Ok(buf.len()) } fn flush(&mut self) -> std::io::Result<()> { Ok(()) } } }; } derive_hasher!(Md5Hasher, Md5); derive_hasher!(Sha1Hasher, Sha1); derive_hasher!(Ripemd160Hasher, Ripemd160); derive_hasher!(Sha2_256Hasher, sha2::Sha256); derive_hasher!(Sha2_384Hasher, sha2::Sha384); derive_hasher!(Sha2_512Hasher, sha2::Sha512); derive_hasher!(Sha2_224Hasher, sha2::Sha224); derive_hasher!(Sha3_256Hasher, sha3::Sha3_256); derive_hasher!(Sha3_512Hasher, sha3::Sha3_512); impl HashAlgorithm { /// Create a new hasher. pub fn new_hasher(self) -> Result> { match self { HashAlgorithm::MD5 => Ok(Box::::default()), HashAlgorithm::SHA1 => Ok(Box::::default()), HashAlgorithm::RIPEMD160 => Ok(Box::::default()), HashAlgorithm::SHA2_256 => Ok(Box::::default()), HashAlgorithm::SHA2_384 => Ok(Box::::default()), HashAlgorithm::SHA2_512 => Ok(Box::::default()), HashAlgorithm::SHA2_224 => Ok(Box::::default()), HashAlgorithm::SHA3_256 => Ok(Box::::default()), HashAlgorithm::SHA3_512 => Ok(Box::::default()), _ => unimplemented_err!("hasher {:?}", self), } } /// Calculate the digest of the given input data. pub fn digest(self, data: &[u8]) -> Result> { Ok(match self { HashAlgorithm::MD5 => Md5::digest(data).to_vec(), HashAlgorithm::SHA1 => match Sha1::try_digest(data) { CollisionResult::Ok(output) => output.to_vec(), CollisionResult::Collision(_) | CollisionResult::Mitigated(_) => { return Err(Error::Sha1HashCollision) } }, HashAlgorithm::RIPEMD160 => Ripemd160::digest(data).to_vec(), HashAlgorithm::SHA2_256 => sha2::Sha256::digest(data).to_vec(), HashAlgorithm::SHA2_384 => sha2::Sha384::digest(data).to_vec(), HashAlgorithm::SHA2_512 => sha2::Sha512::digest(data).to_vec(), HashAlgorithm::SHA2_224 => sha2::Sha224::digest(data).to_vec(), HashAlgorithm::SHA3_256 => sha3::Sha3_256::digest(data).to_vec(), HashAlgorithm::SHA3_512 => sha3::Sha3_512::digest(data).to_vec(), HashAlgorithm::Private10 => unsupported_err!("Private10 should not be used"), _ => unimplemented_err!("hasher: {:?}", self), }) } /// Returns the expected digest size for the given algorithm. pub fn digest_size(self) -> Option { let size = match self { HashAlgorithm::MD5 => Md5::output_size(), HashAlgorithm::SHA1 => Sha1::output_size(), HashAlgorithm::RIPEMD160 => Ripemd160::output_size(), HashAlgorithm::SHA2_256 => sha2::Sha256::output_size(), HashAlgorithm::SHA2_384 => sha2::Sha384::output_size(), HashAlgorithm::SHA2_512 => sha2::Sha512::output_size(), HashAlgorithm::SHA2_224 => sha2::Sha224::output_size(), HashAlgorithm::SHA3_256 => sha3::Sha3_256::output_size(), HashAlgorithm::SHA3_512 => sha3::Sha3_512::output_size(), _ => return None, }; Some(size) } } pgp-0.15.0/src/crypto/mod.rs000064400000000000000000000014441046102023000137340ustar 00000000000000//! # Cryptography module use self::hash::HashAlgorithm; use crate::types::PublicParams; pub mod aead; pub mod aes_kw; pub mod checksum; pub mod dsa; pub mod ecc_curve; pub mod ecdh; pub mod ecdsa; pub mod eddsa; pub mod hash; pub mod public_key; pub mod rsa; pub mod sym; pub mod x25519; #[cfg(feature = "unstable-curve448")] pub mod x448; pub trait Decryptor { type EncryptionFields<'a>; fn decrypt(&self, data: Self::EncryptionFields<'_>) -> crate::errors::Result>; } pub trait Signer { // TODO: make pub_params type safe fn sign( &self, hash: HashAlgorithm, digest: &[u8], pub_params: &PublicParams, ) -> crate::errors::Result>>; } pub trait KeyParams { type KeyParams; fn key_params(&self) -> Self::KeyParams; } pgp-0.15.0/src/crypto/pkcs5.rs000064400000000000000000000000011046102023000141660ustar 00000000000000 pgp-0.15.0/src/crypto/public_key.rs000064400000000000000000000024651046102023000153070ustar 00000000000000use num_enum::{FromPrimitive, IntoPrimitive}; #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum PublicKeyAlgorithm { /// RSA (Encrypt and Sign) RSA = 1, /// DEPRECATED: RSA (Encrypt-Only) RSAEncrypt = 2, /// DEPRECATED: RSA (Sign-Only) RSASign = 3, /// Elgamal (Sign-Only) ElgamalSign = 16, /// DSA (Digital Signature Algorithm) DSA = 17, /// Elliptic Curve: RFC 9580 [formerly in RFC 6637] ECDH = 18, /// ECDSA: RFC 9580 [formerly in RFC 6637] ECDSA = 19, /// DEPRECATED: Elgamal (Encrypt and Sign) Elgamal = 20, /// Reserved for Diffie-Hellman (X9.42, as defined for IETF-S/MIME) DiffieHellman = 21, /// EdDSA legacy format [deprecated in RFC 9580, superseded by Ed25519 (27)] EdDSALegacy = 22, /// X25519 [RFC 9580] X25519 = 25, /// X448 [RFC 9580] X448 = 26, /// Ed25519 [RFC 9580] Ed25519 = 27, /// Ed448 [RFC 9580] Ed448 = 28, /// Private experimental range (from OpenPGP) Private100 = 100, Private101 = 101, Private102 = 102, Private103 = 103, Private104 = 104, Private105 = 105, Private106 = 106, Private107 = 107, Private108 = 108, Private109 = 109, Private110 = 110, #[num_enum(catch_all)] Unknown(u8), } pgp-0.15.0/src/crypto/rsa.rs000064400000000000000000000145541046102023000137500ustar 00000000000000use std::ops::Deref; use digest::{const_oid::AssociatedOid, Digest}; use md5::Md5; use num_bigint::traits::ModInverse; use num_bigint::BigUint; use rand::{CryptoRng, Rng}; use ripemd::Ripemd160; use rsa::pkcs1v15::{Pkcs1v15Encrypt, Signature as RsaSignature, SigningKey, VerifyingKey}; use rsa::{ traits::{PrivateKeyParts, PublicKeyParts}, RsaPrivateKey, RsaPublicKey, }; use sha1_checked::Sha1; // not used for hashing, just as a source of the OID use sha2::{Sha224, Sha256, Sha384, Sha512}; use sha3::{Sha3_256, Sha3_512}; use signature::hazmat::{PrehashSigner, PrehashVerifier}; use signature::SignatureEncoding; use zeroize::ZeroizeOnDrop; use crate::crypto::{hash::HashAlgorithm, Decryptor, KeyParams, Signer}; use crate::errors::Result; use crate::types::{Mpi, PkeskBytes, PlainSecretParams, PublicParams}; const MAX_KEY_SIZE: usize = 16384; /// Private Key for RSA. #[derive(derive_more::Debug, ZeroizeOnDrop)] pub struct PrivateKey(#[debug("..")] RsaPrivateKey); impl Deref for PrivateKey { type Target = RsaPrivateKey; fn deref(&self) -> &Self::Target { &self.0 } } impl KeyParams for PrivateKey { type KeyParams = (); #[allow(clippy::unused_unit)] fn key_params(&self) -> Self::KeyParams { () } } impl Decryptor for PrivateKey { type EncryptionFields<'a> = &'a Mpi; /// RSA decryption using PKCS1v15 padding. fn decrypt(&self, mpi: Self::EncryptionFields<'_>) -> Result> { let m = self.0.decrypt(Pkcs1v15Encrypt, mpi.as_bytes())?; Ok(m) } } impl Signer for PrivateKey { /// Sign using RSA, with PKCS1v15 padding. fn sign( &self, hash: HashAlgorithm, digest: &[u8], pub_params: &PublicParams, ) -> Result>> { ensure!( matches!(pub_params, PublicParams::RSA { .. }), "invalid public params" ); let sig = match hash { HashAlgorithm::None => return Err(format_err!("none")), HashAlgorithm::MD5 => sign_int::(self.0.clone(), digest), HashAlgorithm::RIPEMD160 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA1 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA2_224 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA2_256 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA2_384 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA2_512 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA3_256 => sign_int::(self.0.clone(), digest), HashAlgorithm::SHA3_512 => sign_int::(self.0.clone(), digest), HashAlgorithm::Private10 => unsupported_err!("Private10 should not be used"), HashAlgorithm::Other(o) => unsupported_err!("Hash algorithm {} is unsupported", o), }?; Ok(vec![sig.to_vec()]) } } impl From for PrivateKey { fn from(key: RsaPrivateKey) -> Self { Self(key) } } /// RSA encryption using PKCS1v15 padding. pub fn encrypt( mut rng: R, n: &[u8], e: &[u8], plaintext: &[u8], ) -> Result { let key = RsaPublicKey::new_with_max_size( BigUint::from_bytes_be(n), BigUint::from_bytes_be(e), MAX_KEY_SIZE, )?; let data = key.encrypt(&mut rng, Pkcs1v15Encrypt, plaintext)?; Ok(PkeskBytes::Rsa { mpi: Mpi::from_slice(&data[..]), }) } /// Generate an RSA KeyPair. pub fn generate_key( mut rng: R, bit_size: usize, ) -> Result<(PublicParams, PlainSecretParams)> { let key = RsaPrivateKey::new(&mut rng, bit_size)?; let p = &key.primes()[0]; let q = &key.primes()[1]; let u = p .clone() .mod_inverse(q) .expect("invalid prime") .to_biguint() .expect("invalid prime"); Ok(( PublicParams::RSA { n: key.n().into(), e: key.e().into(), }, PlainSecretParams::RSA { d: key.d().into(), p: p.into(), q: q.into(), u: u.into(), }, )) } fn verify_int(key: RsaPublicKey, hashed: &[u8], signature: &RsaSignature) -> Result<()> where D: Digest + AssociatedOid, { VerifyingKey::::new(key) .verify_prehash(hashed, signature) .map_err(Into::into) } fn sign_int(key: RsaPrivateKey, digest: &[u8]) -> Result where D: Digest + AssociatedOid, { SigningKey::::new(key) .sign_prehash(digest) .map_err(Into::into) } /// Verify a RSA, PKCS1v15 padded signature. pub fn verify( n: &[u8], e: &[u8], hash: HashAlgorithm, hashed: &[u8], signature: &[u8], ) -> Result<()> { let key = RsaPublicKey::new_with_max_size( BigUint::from_bytes_be(n), BigUint::from_bytes_be(e), MAX_KEY_SIZE, )?; let signature = if signature.len() < key.size() { // RSA short signatures are allowed by PGP, but not by the RSA crate. // So we pad out the signature if we encounter a short one. let mut signature_padded = vec![0u8; key.size()]; let diff = key.size() - signature.len(); signature_padded[diff..].copy_from_slice(signature); RsaSignature::try_from(&signature_padded[..])? } else { RsaSignature::try_from(signature)? }; match hash { HashAlgorithm::None => Err(format_err!("none")), HashAlgorithm::MD5 => verify_int::(key, hashed, &signature), HashAlgorithm::RIPEMD160 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA1 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA2_224 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA2_256 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA2_384 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA2_512 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA3_256 => verify_int::(key, hashed, &signature), HashAlgorithm::SHA3_512 => verify_int::(key, hashed, &signature), HashAlgorithm::Private10 => unsupported_err!("Private10 should not be used"), HashAlgorithm::Other(o) => unsupported_err!("Hash algorithm {} is unsupported", o), } .map_err(Into::into) } pgp-0.15.0/src/crypto/sym.rs000064400000000000000000000556441046102023000140000ustar 00000000000000use aes::{Aes128, Aes192, Aes256}; use blowfish::Blowfish; use camellia::{Camellia128, Camellia192, Camellia256}; use cast5::Cast5; use cfb_mode::cipher::{AsyncStreamCipher, KeyIvInit}; use cfb_mode::{BufDecryptor, BufEncryptor, Decryptor, Encryptor}; use des::TdesEde3; use idea::Idea; use log::debug; use num_enum::{FromPrimitive, IntoPrimitive}; use rand::{CryptoRng, Rng}; use twofish::Twofish; use zeroize::Zeroizing; use crate::errors::{Error, Result}; macro_rules! decrypt { ($mode:ident, $key:expr, $iv:expr, $prefix:expr, $data:expr, $bs:expr, $resync:expr) => {{ let mut mode = BufDecryptor::<$mode>::new_from_slices($key, $iv)?; mode.decrypt($prefix); // We do not do use "quick check" here. // See the "Security Considerations" section // in // and the paper // for details. if $resync { unsupported_err!("CFB resync is disabled"); } else { mode.decrypt($data); } }}; } macro_rules! encrypt { ($mode:ident, $key:expr, $iv:expr, $prefix:expr, $data:expr, $bs:expr, $resync:expr) => {{ let mut mode = BufEncryptor::<$mode>::new_from_slices($key, $iv)?; mode.encrypt($prefix); if $resync { unsupported_err!("CFB resync is disabled"); } else { mode.encrypt($data); } }}; } macro_rules! decrypt_regular { ($mode:ident, $key:expr, $iv:expr, $ciphertext:expr) => {{ let mode = Decryptor::<$mode>::new_from_slices($key, $iv)?; mode.decrypt($ciphertext); }}; } macro_rules! encrypt_regular { ($mode:ident, $key:expr, $iv:expr, $plaintext:expr) => {{ let mode = Encryptor::<$mode>::new_from_slices($key, $iv)?; mode.encrypt($plaintext); }}; } /// Available symmetric key algorithms. /// Ref: #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum SymmetricKeyAlgorithm { /// Plaintext or unencrypted data Plaintext = 0, /// IDEA IDEA = 1, /// Triple-DES TripleDES = 2, /// CAST5 CAST5 = 3, /// Blowfish Blowfish = 4, // 5 & 6 are reserved for DES/SK /// AES with 128-bit key AES128 = 7, /// AES with 192-bit key AES192 = 8, /// AES with 256-bit key AES256 = 9, /// Twofish with 256-bit key Twofish = 10, /// [Camellia](https://tools.ietf.org/html/rfc5581#section-3) with 128-bit key Camellia128 = 11, /// [Camellia](https://tools.ietf.org/html/rfc5581#section-3) with 192-bit key Camellia192 = 12, /// [Camellia](https://tools.ietf.org/html/rfc5581#section-3) with 256-bit key Camellia256 = 13, Private10 = 110, #[num_enum(catch_all)] Other(u8), } impl Default for SymmetricKeyAlgorithm { fn default() -> Self { Self::AES128 } } impl zeroize::DefaultIsZeroes for SymmetricKeyAlgorithm {} impl SymmetricKeyAlgorithm { /// The size of a single block in bytes. /// Based on pub fn block_size(self) -> usize { match self { SymmetricKeyAlgorithm::Plaintext => 0, SymmetricKeyAlgorithm::IDEA => 8, SymmetricKeyAlgorithm::TripleDES => 8, SymmetricKeyAlgorithm::CAST5 => 8, SymmetricKeyAlgorithm::Blowfish => 8, SymmetricKeyAlgorithm::AES128 => 16, SymmetricKeyAlgorithm::AES192 => 16, SymmetricKeyAlgorithm::AES256 => 16, SymmetricKeyAlgorithm::Twofish => 16, SymmetricKeyAlgorithm::Camellia128 => 16, SymmetricKeyAlgorithm::Camellia192 => 16, SymmetricKeyAlgorithm::Camellia256 => 16, SymmetricKeyAlgorithm::Private10 | SymmetricKeyAlgorithm::Other(_) => 0, } } /// The size of a single block in bytes. /// Based on pub const fn key_size(self) -> usize { match self { SymmetricKeyAlgorithm::Plaintext => 0, SymmetricKeyAlgorithm::IDEA => 16, SymmetricKeyAlgorithm::TripleDES => 24, SymmetricKeyAlgorithm::CAST5 => 16, // TODO: Validate this is the right key size. SymmetricKeyAlgorithm::Blowfish => 16, //56, SymmetricKeyAlgorithm::AES128 => 16, SymmetricKeyAlgorithm::AES192 => 24, SymmetricKeyAlgorithm::AES256 => 32, SymmetricKeyAlgorithm::Twofish => 32, SymmetricKeyAlgorithm::Camellia128 => 16, SymmetricKeyAlgorithm::Camellia192 => 24, SymmetricKeyAlgorithm::Camellia256 => 32, SymmetricKeyAlgorithm::Private10 | SymmetricKeyAlgorithm::Other(_) => 0, } } /// Decrypt the data using CFB mode, without padding. Overwrites the input. /// Uses an IV of all zeroes, as specified in the openpgp cfb mode. Does /// resynchronization. pub fn decrypt<'a>(self, key: &[u8], ciphertext: &'a mut [u8]) -> Result<&'a [u8]> { debug!("unprotected decrypt"); let iv_vec = vec![0u8; self.block_size()]; Ok(self.decrypt_with_iv(key, &iv_vec, ciphertext, true)?.1) } /// Decrypt the data using CFB mode, without padding. Overwrites the input. /// Uses an IV of all zeroes, as specified in the openpgp cfb mode. /// Does not do resynchronization. pub fn decrypt_protected<'a>(self, key: &[u8], ciphertext: &'a mut [u8]) -> Result<&'a [u8]> { #[inline] fn calculate_sha1_unchecked(data: I) -> [u8; 20] where T: AsRef<[u8]>, I: IntoIterator, { use sha1::{Digest, Sha1}; let mut digest = Sha1::new(); for chunk in data { digest.update(chunk.as_ref()); } digest.finalize().into() } debug!("protected decrypt"); let iv_vec = vec![0u8; self.block_size()]; let (prefix, res) = self.decrypt_with_iv(key, &iv_vec, ciphertext, false)?; // MDC is 1 byte packet tag, 1 byte length prefix and 20 bytes SHA1 hash. const MDC_LEN: usize = 22; let (data, mdc) = res.split_at(res.len() - MDC_LEN); // We use regular sha1 for MDC, not sha1_checked. Collisions are not currently a concern with MDC. let sha1 = calculate_sha1_unchecked([prefix, data, &mdc[0..2]]); if mdc[0] != 0xD3 || // Invalid MDC tag mdc[1] != 0x14 || // Invalid MDC length mdc[2..] != sha1[..] { Err(Error::MdcError) } else { Ok(data) } } /// Decrypt the data using CFB mode, without padding. Overwrites the input. /// /// OpenPGP CFB mode uses an initialization vector (IV) of all zeros, and /// prefixes the plaintext with BS+2 octets of random data, such that /// octets BS+1 and BS+2 match octets BS-1 and BS. It does a CFB /// resynchronization after encrypting those BS+2 octets. /// /// Thus, for an algorithm that has a block size of 8 octets (64 bits), /// the IV is 10 octets long and octets 7 and 8 of the IV are the same as /// octets 9 and 10. For an algorithm with a block size of 16 octets /// (128 bits), the IV is 18 octets long, and octets 17 and 18 replicate /// octets 15 and 16. Those extra two octets are an easy check for a /// correct key. #[allow(clippy::complexity)] pub fn decrypt_with_iv<'a>( self, key: &[u8], iv_vec: &[u8], ciphertext: &'a mut [u8], resync: bool, ) -> Result<(&'a [u8], &'a [u8])> { let bs = self.block_size(); ensure!(bs + 2 < ciphertext.len(), "invalid ciphertext"); let (encrypted_prefix, encrypted_data) = ciphertext.split_at_mut(bs + 2); { match self { SymmetricKeyAlgorithm::Plaintext => { bail!("'Plaintext' is not a legal cipher for encrypted data") } SymmetricKeyAlgorithm::IDEA => decrypt!( Idea, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::TripleDES => { decrypt!( TdesEde3, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ); } SymmetricKeyAlgorithm::CAST5 => decrypt!( Cast5, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::Blowfish => decrypt!( Blowfish, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::AES128 => decrypt!( Aes128, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::AES192 => decrypt!( Aes192, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::AES256 => decrypt!( Aes256, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::Twofish => decrypt!( Twofish, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::Camellia128 => decrypt!( Camellia128, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::Camellia192 => decrypt!( Camellia192, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::Camellia256 => decrypt!( Camellia256, key, iv_vec, encrypted_prefix, encrypted_data, bs, resync ), SymmetricKeyAlgorithm::Private10 | SymmetricKeyAlgorithm::Other(_) => { unimplemented_err!("SymmetricKeyAlgorithm {} is unsupported", u8::from(self)) } } } Ok((encrypted_prefix, encrypted_data)) } /// Decrypt the data using CFB mode, without padding. Overwrites the input. /// This is regular CFB, not OpenPgP CFB. pub fn decrypt_with_iv_regular( self, key: &[u8], iv_vec: &[u8], ciphertext: &mut [u8], ) -> Result<()> { match self { SymmetricKeyAlgorithm::Plaintext => { bail!("'Plaintext' is not a legal cipher for encrypted data") } SymmetricKeyAlgorithm::IDEA => { decrypt_regular!(Idea, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::TripleDES => { decrypt_regular!(TdesEde3, key, iv_vec, ciphertext); } SymmetricKeyAlgorithm::CAST5 => decrypt_regular!(Cast5, key, iv_vec, ciphertext), SymmetricKeyAlgorithm::Blowfish => { decrypt_regular!(Blowfish, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::AES128 => { decrypt_regular!(Aes128, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::AES192 => { decrypt_regular!(Aes192, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::AES256 => { decrypt_regular!(Aes256, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::Twofish => { decrypt_regular!(Twofish, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::Camellia128 => { decrypt_regular!(Camellia128, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::Camellia192 => { decrypt_regular!(Camellia192, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::Camellia256 => { decrypt_regular!(Camellia256, key, iv_vec, ciphertext) } SymmetricKeyAlgorithm::Private10 | SymmetricKeyAlgorithm::Other(_) => { unimplemented_err!("SymmetricKeyAlgorithm {} is unsupported", u8::from(self)) } } Ok(()) } /// Encrypt the data using CFB mode, without padding. Overwrites the input. /// Uses an IV of all zeroes, as specified in the openpgp cfb mode. pub fn encrypt( self, mut rng: R, key: &[u8], plaintext: &[u8], ) -> Result> { debug!("encrypt unprotected"); let iv_vec = vec![0u8; self.block_size()]; let bs = self.block_size(); let prefix_len = bs + 2; let plaintext_len = plaintext.len(); let mut ciphertext = vec![0u8; prefix_len + plaintext_len]; // prefix rng.fill_bytes(&mut ciphertext[..bs]); // add quick check ciphertext[bs] = ciphertext[bs - 2]; ciphertext[bs + 1] = ciphertext[bs - 1]; // plaintext ciphertext[prefix_len..].copy_from_slice(plaintext); self.encrypt_with_iv(key, &iv_vec, &mut ciphertext, true)?; Ok(ciphertext) } pub fn encrypt_protected( self, mut rng: R, key: &[u8], plaintext: &[u8], ) -> Result> { // We use regular sha1 for MDC, not sha1_checked. Collisions are not currently a concern with MDC. use sha1::{Digest, Sha1}; debug!("protected encrypt"); // MDC is 1 byte packet tag, 1 byte length prefix and 20 bytes SHA1 hash. let mdc_len = 22; let bs = self.block_size(); let prefix_len = bs + 2; let plaintext_len = plaintext.len(); let mut ciphertext = vec![0u8; prefix_len + plaintext_len + mdc_len]; // prefix rng.fill_bytes(&mut ciphertext[..bs]); // add quick check ciphertext[bs] = ciphertext[bs - 2]; ciphertext[bs + 1] = ciphertext[bs - 1]; // plaintext ciphertext[prefix_len..(prefix_len + plaintext_len)].copy_from_slice(plaintext); // mdc header ciphertext[prefix_len + plaintext_len] = 0xD3; ciphertext[prefix_len + plaintext_len + 1] = 0x14; // mdc body let checksum = &Sha1::digest(&ciphertext[..(prefix_len + plaintext_len + 2)])[..20]; ciphertext[(prefix_len + plaintext_len + 2)..].copy_from_slice(checksum); // IV is all zeroes let iv_vec = vec![0u8; self.block_size()]; self.encrypt_with_iv(key, &iv_vec, &mut ciphertext, false)?; Ok(ciphertext) } /// Encrypt the data using CFB mode, without padding. Overwrites the input. /// /// OpenPGP CFB mode uses an initialization vector (IV) of all zeros, and /// prefixes the plaintext with BS+2 octets of random data, such that /// octets BS+1 and BS+2 match octets BS-1 and BS. It does a CFB /// resynchronization after encrypting those BS+2 octets. #[allow(clippy::cognitive_complexity)] // FIXME pub fn encrypt_with_iv( self, key: &[u8], iv_vec: &[u8], ciphertext: &mut [u8], resync: bool, ) -> Result<()> { let bs = self.block_size(); let (prefix, data) = ciphertext.split_at_mut(bs + 2); { match self { SymmetricKeyAlgorithm::Plaintext => { bail!("'Plaintext' is not a legal cipher for encrypted data") } SymmetricKeyAlgorithm::IDEA => { encrypt!(Idea, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::TripleDES => { encrypt!(TdesEde3, key, iv_vec, prefix, data, bs, resync); } SymmetricKeyAlgorithm::CAST5 => { encrypt!(Cast5, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::Blowfish => { encrypt!(Blowfish, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::AES128 => { encrypt!(Aes128, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::AES192 => { encrypt!(Aes192, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::AES256 => { encrypt!(Aes256, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::Twofish => { encrypt!(Twofish, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::Camellia128 => { encrypt!(Camellia128, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::Camellia192 => { encrypt!(Camellia192, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::Camellia256 => { encrypt!(Camellia256, key, iv_vec, prefix, data, bs, resync) } SymmetricKeyAlgorithm::Private10 | SymmetricKeyAlgorithm::Other(_) => { bail!("SymmetricKeyAlgorithm {} is unsupported", u8::from(self)) } } } Ok(()) } /// Encrypt the data using CFB mode, without padding. Overwrites the input. pub fn encrypt_with_iv_regular( self, key: &[u8], iv_vec: &[u8], plaintext: &mut [u8], ) -> Result<()> { // TODO: actual cfb mode used in pgp match self { SymmetricKeyAlgorithm::Plaintext => { bail!("'Plaintext' is not a legal cipher for encrypted data") } SymmetricKeyAlgorithm::IDEA => encrypt_regular!(Idea, key, iv_vec, plaintext), SymmetricKeyAlgorithm::TripleDES => { encrypt_regular!(TdesEde3, key, iv_vec, plaintext); } SymmetricKeyAlgorithm::CAST5 => encrypt_regular!(Cast5, key, iv_vec, plaintext), SymmetricKeyAlgorithm::Blowfish => { encrypt_regular!(Blowfish, key, iv_vec, plaintext) } SymmetricKeyAlgorithm::AES128 => encrypt_regular!(Aes128, key, iv_vec, plaintext), SymmetricKeyAlgorithm::AES192 => encrypt_regular!(Aes192, key, iv_vec, plaintext), SymmetricKeyAlgorithm::AES256 => encrypt_regular!(Aes256, key, iv_vec, plaintext), SymmetricKeyAlgorithm::Twofish => encrypt_regular!(Twofish, key, iv_vec, plaintext), SymmetricKeyAlgorithm::Camellia128 => { encrypt_regular!(Camellia128, key, iv_vec, plaintext) } SymmetricKeyAlgorithm::Camellia192 => { encrypt_regular!(Camellia192, key, iv_vec, plaintext) } SymmetricKeyAlgorithm::Camellia256 => { encrypt_regular!(Camellia256, key, iv_vec, plaintext) } SymmetricKeyAlgorithm::Private10 | SymmetricKeyAlgorithm::Other(_) => { unimplemented_err!("SymmetricKeyAlgorithm {} is unsupported", u8::from(self)) } } Ok(()) } /// Generate a new session key. pub fn new_session_key(self, mut rng: R) -> Zeroizing> { let mut session_key = Zeroizing::new(vec![0u8; self.key_size()]); rng.fill_bytes(&mut session_key); session_key } } #[cfg(test)] mod tests { use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use super::*; macro_rules! roundtrip { ($name:ident, $alg:path) => { #[test] fn $name() { let mut rng = ChaCha8Rng::seed_from_u64(0); // Protected for i in 1..1024 { let data = (0..i).map(|_| rng.gen()).collect::>(); let key = (0..$alg.key_size()).map(|_| rng.gen()).collect::>(); let mut ciphertext = $alg.encrypt_protected(&mut rng, &key, &data).unwrap(); assert_ne!(data, ciphertext); let plaintext = $alg.decrypt_protected(&key, &mut ciphertext).unwrap(); assert_eq!(data, plaintext); } // Unprotected // resync is not implemented yet // { // let data = vec![2u8; 256]; // let key = vec![1u8; $alg.key_size()]; // let mut ciphertext = $alg.encrypt(&key, &data).unwrap(); // assert_ne!(data, ciphertext); // let plaintext = $alg.decrypt(&key, &mut ciphertext).unwrap(); // assert_eq!(data, plaintext); // } } }; } roundtrip!(roundtrip_aes128, SymmetricKeyAlgorithm::AES128); roundtrip!(roundtrip_aes192, SymmetricKeyAlgorithm::AES192); roundtrip!(roundtrip_aes256, SymmetricKeyAlgorithm::AES256); roundtrip!(roundtrip_tripledes, SymmetricKeyAlgorithm::TripleDES); roundtrip!(roundtrip_blowfish, SymmetricKeyAlgorithm::Blowfish); roundtrip!(roundtrip_twofish, SymmetricKeyAlgorithm::Twofish); roundtrip!(roundtrip_cast5, SymmetricKeyAlgorithm::CAST5); roundtrip!(roundtrip_idea, SymmetricKeyAlgorithm::IDEA); roundtrip!(roundtrip_camellia128, SymmetricKeyAlgorithm::Camellia128); roundtrip!(roundtrip_camellia192, SymmetricKeyAlgorithm::Camellia192); roundtrip!(roundtrip_camellia256, SymmetricKeyAlgorithm::Camellia256); #[test] pub fn decrypt_without_enough_ciphertext() { let key: [u8; 0] = []; let mut cipher_text: [u8; 0] = []; assert!(SymmetricKeyAlgorithm::AES128 .decrypt(&key, &mut cipher_text) .is_err()); } } pgp-0.15.0/src/crypto/x25519.rs000064400000000000000000000215371046102023000140370ustar 00000000000000use hkdf::Hkdf; use log::debug; use rand::{CryptoRng, Rng}; use sha2::Sha256; use x25519_dalek::{PublicKey, StaticSecret}; use zeroize::{Zeroize, ZeroizeOnDrop, Zeroizing}; use crate::crypto::{aes_kw, Decryptor, KeyParams}; use crate::errors::Result; use crate::types::{PlainSecretParams, PublicParams}; /// Secret key for X25519 #[derive(Clone, derive_more::Debug, PartialEq, Eq, Zeroize, ZeroizeOnDrop)] pub struct SecretKey { #[debug("..")] pub(crate) secret: [u8; 32], } impl KeyParams for SecretKey { type KeyParams = (); fn key_params(&self) {} } pub struct EncryptionFields<'a> { /// Ephemeral X25519 public key (32 bytes) pub ephemeral_public_point: [u8; 32], /// Recipient public key (32 bytes) pub recipient_public: [u8; 32], /// Encrypted and wrapped session key pub encrypted_session_key: &'a [u8], } impl Decryptor for SecretKey { type EncryptionFields<'a> = EncryptionFields<'a>; fn decrypt(&self, data: Self::EncryptionFields<'_>) -> Result> { debug!("X25519 decrypt"); let shared_secret = { // create montgomery point let their_public = x25519_dalek::PublicKey::from(data.ephemeral_public_point); // private key of the recipient. let our_secret = StaticSecret::from(self.secret); // derive shared secret let shared_secret = our_secret.diffie_hellman(&their_public); shared_secret.to_bytes() }; // obtain the session key from the shared secret derive_session_key( data.ephemeral_public_point, data.recipient_public, shared_secret, data.encrypted_session_key, ) } } /// Obtain the decrypted OpenPGP session key /// /// This helper function performs the steps described in /// pub fn derive_session_key( ephemeral: [u8; 32], recipient_public: [u8; 32], shared_secret: [u8; 32], encrypted_session_key: &[u8], ) -> Result> { let okm = hkdf(&ephemeral, &recipient_public, &shared_secret)?; let decrypted_key = aes_kw::unwrap(&okm, encrypted_session_key)?; ensure!(!decrypted_key.is_empty(), "empty key is not valid"); Ok(decrypted_key) } /// Generate an X25519 KeyPair. pub fn generate_key(mut rng: R) -> (PublicParams, PlainSecretParams) { let mut secret_key_bytes = Zeroizing::new([0u8; 32]); rng.fill_bytes(&mut *secret_key_bytes); let secret = StaticSecret::from(*secret_key_bytes); let public = PublicKey::from(&secret).to_bytes(); // secret key // FIXME: is clamping needed here? let q_raw = curve25519_dalek::scalar::clamp_integer(secret.to_bytes()); ( PublicParams::X25519 { public }, PlainSecretParams::X25519(q_raw), ) } /// HKDF for X25519 /// pub fn hkdf( ephemeral: &[u8; 32], recipient_public: &[u8; 32], shared_secret: &[u8; 32], ) -> Result<[u8; 16]> { const INFO: &[u8] = b"OpenPGP X25519"; // The input of HKDF is the concatenation of the following three values: // 32 octets of the ephemeral X25519 public key from this packet. // 32 octets of the recipient public key material. // 32 octets of the shared secret. let mut input = vec![]; input.extend_from_slice(ephemeral); input.extend_from_slice(recipient_public); input.extend_from_slice(shared_secret); // HKDF with SHA256, an info parameter of "OpenPGP X25519" and no salt. let hk = Hkdf::::new(None, &input); let mut okm = [0u8; 16]; hk.expand(INFO, &mut okm) .expect("16 is a valid length for Sha256 to output"); Ok(okm) } /// X25519 encryption. /// /// Returns (ephemeral, encrypted session key) pub fn encrypt( mut rng: R, recipient_public: [u8; 32], plain: &[u8], ) -> Result<([u8; 32], Vec)> { debug!("X25519 encrypt"); // Maximum length for `plain` - FIXME: what should the maximum be, here? const MAX_SIZE: usize = 255; ensure!( plain.len() <= MAX_SIZE, "unable to encrypt larger than {} bytes", MAX_SIZE ); let (ephemeral_public, shared_secret) = { // create montgomery point let their_public = x25519_dalek::PublicKey::from(recipient_public); let mut ephemeral_secret_key_bytes = Zeroizing::new([0u8; 32]); rng.fill_bytes(&mut *ephemeral_secret_key_bytes); let our_secret = StaticSecret::from(*ephemeral_secret_key_bytes); // derive shared secret let shared_secret = our_secret.diffie_hellman(&their_public); // Encode public point let ephemeral_public = x25519_dalek::PublicKey::from(&our_secret); (ephemeral_public, shared_secret) }; // hkdf key derivation let okm = hkdf( ephemeral_public.as_bytes(), &recipient_public, shared_secret.as_bytes(), )?; // Perform AES Key Wrap let wrapped = aes_kw::wrap(&okm, plain)?; Ok((ephemeral_public.to_bytes(), wrapped)) } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use std::ops::Deref; use rand::{RngCore, SeedableRng}; use rand_chacha::ChaChaRng; use super::*; use crate::types::SecretKeyRepr; #[test] fn x25519_hkdf() { // A.8.2. X25519 encryption/decryption of the session key // Ephemeral key: let ephemeral_key = "87cf18d5f1b53f817cce5a004cf393cc8958bddc065f25f84af509b17dd36764"; let ephemeral_key: [u8; 32] = hex::decode(ephemeral_key).unwrap().try_into().unwrap(); // This ephemeral key is derived from the following ephemeral secret key material, which is never placed on the wire: let _ephemeral_secret = "af1e43c0d123efe893a7d4d390f3a761e3fac33dfc7f3edaa830c9011352c779"; // Public key from target certificate (see Appendix A.3): let public_key = "8693248367f9e5015db922f8f48095dda784987f2d5985b12fbad16caf5e4435"; let public_key: [u8; 32] = hex::decode(public_key).unwrap().try_into().unwrap(); // The corresponding long-lived X25519 private key material (see Appendix A.4): let long_lived_private = "4d600a4f794d44775c57a26e0feefed558e9afffd6ad0d582d57fb2ba2dcedb8"; let long_lived_private: [u8; 32] = hex::decode(long_lived_private).unwrap().try_into().unwrap(); // Shared point: let shared_point = "67e30e69cdc7bab2a2680d78aca46a2f8b6e2ae44d398bdc6f92c5ad4a492514"; let shared_point: [u8; 32] = hex::decode(shared_point).unwrap().try_into().unwrap(); // HKDF output: let hkdf = "f66dadcff64592239b254539b64ff607"; let hkdf: [u8; 16] = hex::decode(hkdf).unwrap().try_into().unwrap(); // Decrypted session key: let decrypted = "dd708f6fa1ed65114d68d2343e7c2f1d"; let decrypted: [u8; 16] = hex::decode(decrypted).unwrap().try_into().unwrap(); let esk = "dea355437956617901e06957fbca8a6a47a5b5153e8d3ab7"; let esk = hex::decode(esk).unwrap(); // --- // test hkdf helper let okm = super::hkdf(&ephemeral_key, &public_key, &shared_point).unwrap(); assert_eq!(okm, hkdf); let decrypted_key = aes_kw::unwrap(&okm, &esk).unwrap(); assert_eq!(decrypted_key, decrypted); // test SecretKey::decrypt let sk = SecretKey { secret: long_lived_private, }; let decrypted2 = sk .decrypt(EncryptionFields { ephemeral_public_point: ephemeral_key, recipient_public: public_key, encrypted_session_key: &esk, }) .unwrap(); assert_eq!(decrypted_key, decrypted2); } #[test] fn test_encrypt_decrypt() { let mut rng = ChaChaRng::from_seed([0u8; 32]); let (pkey, skey) = generate_key(&mut rng); let PublicParams::X25519 { public } = pkey else { panic!("invalid key generated") }; let SecretKeyRepr::X25519(ref secret) = skey.as_ref().as_repr(&pkey).unwrap() else { panic!("invalid key generated") }; for text_size in (8..=248).step_by(8) { for _i in 0..10 { let mut fingerprint = vec![0u8; 20]; rng.fill_bytes(&mut fingerprint); let mut plain = vec![0u8; text_size]; rng.fill_bytes(&mut plain); let (ephemeral, enc_sk) = encrypt(&mut rng, public, &plain[..]).unwrap(); let data = EncryptionFields { ephemeral_public_point: ephemeral, recipient_public: public, encrypted_session_key: enc_sk.deref(), }; let decrypted = secret.decrypt(data).unwrap(); assert_eq!(&plain[..], &decrypted[..]); } } } } pgp-0.15.0/src/crypto/x448.rs000064400000000000000000000153711046102023000136700ustar 00000000000000use hkdf::Hkdf; use log::debug; use rand::{CryptoRng, Rng}; use sha2::Sha512; use zeroize::{Zeroize, ZeroizeOnDrop, Zeroizing}; use crate::crypto::{aes_kw, Decryptor, KeyParams}; use crate::errors::Result; use crate::types::{PlainSecretParams, PublicParams}; /// Secret key for X448 #[derive(Clone, derive_more::Debug, PartialEq, Eq, Zeroize, ZeroizeOnDrop)] pub struct SecretKey { #[debug("..")] pub(crate) secret: [u8; 56], } impl KeyParams for SecretKey { type KeyParams = (); fn key_params(&self) {} } pub struct EncryptionFields<'a> { /// Ephemeral X448 public key (56 bytes) pub ephemeral_public_point: [u8; 56], /// Recipient public key (56 bytes) pub recipient_public: [u8; 56], /// Encrypted and wrapped session key pub encrypted_session_key: &'a [u8], } impl Decryptor for SecretKey { type EncryptionFields<'a> = EncryptionFields<'a>; fn decrypt(&self, data: Self::EncryptionFields<'_>) -> Result> { debug!("X448 decrypt"); let shared_secret = { // create montgomery point let Some(their_public) = x448::PublicKey::from_bytes(&data.ephemeral_public_point) else { bail!("x448: invalid public key"); }; // private key of the recipient. let our_secret = x448::Secret::from(self.secret); // derive shared secret (None for low order points) let Some(shared_secret) = our_secret.as_diffie_hellman(&their_public) else { bail!("x448 Secret::as_diffie_hellman returned None"); }; *shared_secret.as_bytes() }; // obtain the session key from the shared secret derive_session_key( data.ephemeral_public_point, data.recipient_public, shared_secret, data.encrypted_session_key, ) } } /// Obtain the decrypted OpenPGP session key /// /// This helper function performs the steps described in /// pub fn derive_session_key( ephemeral: [u8; 56], recipient_public: [u8; 56], shared_secret: [u8; 56], encrypted_session_key: &[u8], ) -> Result> { let okm = hkdf(&ephemeral, &recipient_public, &shared_secret)?; let decrypted_key = aes_kw::unwrap(&okm, encrypted_session_key)?; ensure!(!decrypted_key.is_empty(), "empty key is not valid"); Ok(decrypted_key) } /// Generate an X448 KeyPair. pub fn generate_key(mut rng: R) -> (PublicParams, PlainSecretParams) { let mut secret_key_bytes = Zeroizing::new([0u8; 56]); rng.fill_bytes(&mut *secret_key_bytes); let secret = x448::Secret::from(*secret_key_bytes); // does clamping let public = *x448::PublicKey::from(&secret).as_bytes(); ( PublicParams::X448 { public }, PlainSecretParams::X448(*secret.as_bytes()), ) } /// HKDF for X448 /// pub fn hkdf( ephemeral: &[u8; 56], recipient_public: &[u8; 56], shared_secret: &[u8; 56], ) -> Result<[u8; 32]> { // TODO: maybe share/DRY this code with the analogous x25519 implementation? const INFO: &[u8] = b"OpenPGP X448"; // The input of HKDF is the concatenation of the following three values: // 56 octets of the ephemeral X448 public key from this packet. // 56 octets of the recipient public key material. // 56 octets of the shared secret. let mut input = vec![]; input.extend_from_slice(ephemeral); input.extend_from_slice(recipient_public); input.extend_from_slice(shared_secret); // HKDF with SHA512, an info parameter of "OpenPGP X448" and no salt. let hk = Hkdf::::new(None, &input); let mut okm = [0u8; 32]; hk.expand(INFO, &mut okm) .expect("32 is a valid length for Sha512 to output"); Ok(okm) } /// X448 encryption. /// /// Returns (ephemeral, encrypted session key) pub fn encrypt( mut rng: R, recipient_public: [u8; 56], plain: &[u8], ) -> Result<([u8; 56], Vec)> { debug!("X448 encrypt"); // Maximum length for `plain` - FIXME: what should the maximum be, here? const MAX_SIZE: usize = 255; ensure!( plain.len() <= MAX_SIZE, "unable to encrypt larger than {} bytes", MAX_SIZE ); let (ephemeral_public, shared_secret) = { // create montgomery point let Some(their_public) = x448::PublicKey::from_bytes(&recipient_public) else { bail!("x448: invalid public key"); }; let mut ephemeral_secret_key_bytes = Zeroizing::new([0u8; 56]); rng.fill_bytes(&mut *ephemeral_secret_key_bytes); let our_secret = x448::Secret::from(*ephemeral_secret_key_bytes); // derive shared secret (None for low order points) let Some(shared_secret) = our_secret.as_diffie_hellman(&their_public) else { bail!("x448 Secret::as_diffie_hellman returned None"); }; // Encode public point let ephemeral_public = x448::PublicKey::from(&our_secret); (ephemeral_public, shared_secret) }; // hkdf key derivation let okm = hkdf( ephemeral_public.as_bytes(), &recipient_public, shared_secret.as_bytes(), )?; // Perform AES Key Wrap let wrapped = aes_kw::wrap(&okm, plain)?; Ok((*ephemeral_public.as_bytes(), wrapped)) } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use std::ops::Deref; use rand::{RngCore, SeedableRng}; use rand_chacha::ChaChaRng; use super::*; use crate::types::SecretKeyRepr; #[test] fn test_encrypt_decrypt() { let mut rng = ChaChaRng::from_seed([0u8; 32]); let (pkey, skey) = generate_key(&mut rng); let PublicParams::X448 { public } = pkey else { panic!("invalid key generated") }; let SecretKeyRepr::X448(ref secret) = skey.as_ref().as_repr(&pkey).unwrap() else { panic!("invalid key generated") }; for text_size in (8..=248).step_by(8) { for _i in 0..10 { let mut fingerprint = vec![0u8; 20]; rng.fill_bytes(&mut fingerprint); let mut plain = vec![0u8; text_size]; rng.fill_bytes(&mut plain); let (ephemeral, enc_sk) = encrypt(&mut rng, public, &plain[..]).unwrap(); let data = EncryptionFields { ephemeral_public_point: ephemeral, recipient_public: public, encrypted_session_key: enc_sk.deref(), }; let decrypted = secret.decrypt(data).unwrap(); assert_eq!(&plain[..], &decrypted[..]); } } } } pgp-0.15.0/src/errors.rs000064400000000000000000000206001046102023000131440ustar 00000000000000use std::num::TryFromIntError; use ed25519_dalek::SignatureError; use nom::{ error::{FromExternalError, ParseError}, ErrorConvert, }; pub type Result = ::std::result::Result; // custom nom error types pub const MPI_TOO_LONG: u32 = 1000; /// Error types #[derive(Debug, thiserror::Error)] pub enum Error { #[error("failed to parse {0:?}")] ParsingError(nom::error::ErrorKind), #[error("invalid input")] InvalidInput, #[error("incomplete input: {0:?}")] Incomplete(nom::Needed), #[error("invalid armor wrappers")] InvalidArmorWrappers, #[error("invalid crc24 checksum")] InvalidChecksum, #[error("failed to decode base64 {0:?}")] Base64DecodeError(#[from] base64::DecodeError), #[error("requested data size is larger than the packet body")] RequestedSizeTooLarge, #[error("no matching packet found")] NoMatchingPacket, #[error("more than one matching packet was found")] TooManyPackets, #[error("rsa error: {0:?}")] RSAError(rsa::errors::Error), #[error("elliptic error: {0:?}")] EllipticCurve(#[from] elliptic_curve::Error), #[error("io error: {0:?}")] IOError(#[from] std::io::Error), #[error("missing packets")] MissingPackets, #[error("invalid key length")] InvalidKeyLength, #[error("block mode error")] BlockMode, #[error("missing key")] MissingKey, #[error("cfb: invalid key iv length")] CfbInvalidKeyIvLength, #[error("Not yet implemented: {0:?}")] Unimplemented(String), #[error("Unsupported: {0:?}")] Unsupported(String), // Signals packet versions and parameters we don't support, but can safely ignore #[error("{0:?}")] Message(String), #[error("Invalid Packet {0:?}")] PacketError(nom::error::ErrorKind), #[error("Incomplete Packet")] PacketIncomplete, #[error("Unpadding failed")] UnpadError, #[error("Padding failed")] PadError, #[error("Utf8 {0:?}")] Utf8Error(#[from] std::str::Utf8Error), #[error("ParseInt {0:?}")] ParseIntError(#[from] std::num::ParseIntError), #[error("Invalid Packet Content {0:?}")] InvalidPacketContent(Box), #[error("Signature {0:?}")] SignatureError(#[from] SignatureError), #[error("Modification Detection Code error")] MdcError, #[error("Invalid size conversion {0}")] TryFromInt(#[from] TryFromIntError), #[error("GCM")] Gcm, #[error("EAX")] Eax, #[error("OCB")] Ocb, #[error("SHA1 hash collision detected")] Sha1HashCollision, #[error("AES Key Wrap error {0}")] AesKek(#[from] aes_kw::Error), } impl Error { pub fn as_code(&self) -> u32 { match self { Error::ParsingError(_) => 0, Error::InvalidInput => 1, Error::Incomplete(_) => 2, Error::InvalidArmorWrappers => 3, Error::InvalidChecksum => 4, Error::Base64DecodeError(_) => 5, Error::RequestedSizeTooLarge => 6, Error::NoMatchingPacket => 7, Error::TooManyPackets => 8, Error::RSAError(_) => 9, Error::IOError { .. } => 10, Error::MissingPackets => 11, Error::InvalidKeyLength => 12, Error::BlockMode => 13, Error::MissingKey => 14, Error::CfbInvalidKeyIvLength => 15, Error::Unimplemented(_) => 16, Error::Unsupported(_) => 17, Error::Message(_) => 18, Error::PacketError(_) => 19, Error::PacketIncomplete => 20, Error::UnpadError => 21, Error::PadError => 22, Error::Utf8Error(_) => 23, Error::ParseIntError(_) => 24, Error::InvalidPacketContent(_) => 25, Error::SignatureError(_) => 26, Error::MdcError => 27, Error::TryFromInt(_) => 28, Error::EllipticCurve(_) => 29, Error::Gcm => 30, Error::Eax => 31, Error::Ocb => 32, Error::Sha1HashCollision => 33, Error::AesKek(_) => 34, } } } pub(crate) type IResult = nom::IResult; impl From> for Error { fn from(err: nom::error::Error) -> Self { Self::PacketError(err.code) } } impl ParseError for Error { fn from_error_kind(_input: I, kind: nom::error::ErrorKind) -> Self { Self::ParsingError(kind) } fn append(_input: I, _kind: nom::error::ErrorKind, other: Self) -> Self { other } } impl FromExternalError for Error { fn from_external_error(input: I, kind: nom::error::ErrorKind, e: E) -> Self { nom::error::Error::from_external_error(input, kind, e).into() } } impl From for nom::Err { fn from(err: Error) -> Self { Self::Error(err) } } impl ErrorConvert for Error { fn convert(self) -> Self { self } } impl From> for Error { fn from(err: nom::Err) -> Self { match err { nom::Err::Incomplete(err) => Self::Incomplete(err), nom::Err::Error(err) | nom::Err::Failure(err) => err, } } } impl From>> for Error { fn from(err: nom::Err>) -> Error { match err { nom::Err::Incomplete(err) => Self::Incomplete(err), nom::Err::Error(err) | nom::Err::Failure(err) => Self::ParsingError(err.code), } } } impl From for Error { fn from(err: rsa::errors::Error) -> Error { Error::RSAError(err) } } impl From for Error { fn from(_: cipher::InvalidLength) -> Error { Error::CfbInvalidKeyIvLength } } impl From for Error { fn from(_: block_padding::UnpadError) -> Error { Error::UnpadError } } impl From for Error { fn from(err: String) -> Error { Error::Message(err) } } impl From for Error { fn from(err: derive_builder::UninitializedFieldError) -> Error { Error::Message(err.to_string()) } } #[macro_export] macro_rules! unimplemented_err { ($e:expr) => { return Err($crate::errors::Error::Unimplemented($e.to_string())) }; ($fmt:expr, $($arg:tt)+) => { return Err($crate::errors::Error::Unimplemented(format!($fmt, $($arg)+))) }; } #[macro_export] macro_rules! unsupported_err { ($e:expr) => { return Err($crate::errors::Error::Unsupported($e.to_string())) }; ($fmt:expr, $($arg:tt)+) => { return Err($crate::errors::Error::Unsupported(format!($fmt, $($arg)+))) }; } #[macro_export] macro_rules! bail { ($e:expr) => { return Err($crate::errors::Error::Message($e.to_string())) }; ($fmt:expr, $($arg:tt)+) => { return Err($crate::errors::Error::Message(format!($fmt, $($arg)+))) }; } #[macro_export] macro_rules! format_err { ($e:expr) => { $crate::errors::Error::Message($e.to_string()) }; ($fmt:expr, $($arg:tt)+) => { $crate::errors::Error::Message(format!($fmt, $($arg)+)) }; } #[macro_export(local_inner_macros)] macro_rules! ensure { ($cond:expr, $e:expr) => { if !($cond) { bail!($e); } }; ($cond:expr, $fmt:expr, $($arg:tt)+) => { if !($cond) { bail!($fmt, $($arg)+); } }; } #[macro_export] macro_rules! ensure_eq { ($left:expr, $right:expr) => ({ match (&$left, &$right) { (left_val, right_val) => { if !(*left_val == *right_val) { bail!(r#"assertion failed: `(left == right)` left: `{:?}`, right: `{:?}`"#, left_val, right_val) } } } }); ($left:expr, $right:expr,) => ({ ensure_eq!($left, $right) }); ($left:expr, $right:expr, $($arg:tt)+) => ({ match (&($left), &($right)) { (left_val, right_val) => { if !(*left_val == *right_val) { bail!(r#"assertion failed: `(left == right)` left: `{:?}`, right: `{:?}`: {}"#, left_val, right_val, format_args!($($arg)+)) } } } }); } #[macro_export] macro_rules! err_opt { ($e:expr) => { match $e { Ok(v) => v, Err(err) => return Some(Err(err)), } }; } pgp-0.15.0/src/lib.rs000064400000000000000000000026461046102023000124100ustar 00000000000000//! # rPGP //! //! rPGP is an OpenPGP implementation. //! //! Usage examples are available under the respective modules: //! [Key generation], [signing and verifying with external hashing], [packet based signing and verifying]. //! //! [Key generation]: crate::composed::key //! [signing and verifying with external hashing]: crate::composed::signed_key //! [packet based signing and verifying]: crate::packet #![forbid(unsafe_code)] #![deny( clippy::all, clippy::style, clippy::perf, clippy::complexity, clippy::correctness, clippy::unwrap_used, rust_2018_idioms )] #![allow( clippy::missing_const_for_fn, clippy::use_self, clippy::needless_borrows_for_generic_args, clippy::type_complexity, clippy::incompatible_msrv )] #[cfg(test)] #[macro_use] extern crate pretty_assertions; // public so it can be used in doc test #[macro_use] pub mod util; #[macro_use] pub mod errors; pub mod armor; pub mod base64_decoder; pub mod base64_reader; pub mod composed; pub mod crypto; pub mod line_writer; pub mod normalize_lines; pub mod packet; pub mod ser; pub mod types; // reexports for easier use #[allow(unused_imports)] pub use self::composed::key::*; pub use self::composed::*; pub use self::packet::Signature; /// The version of this crate. pub const VERSION: &str = env!("CARGO_PKG_VERSION"); /// Default maximum size that gets buffered. pub const MAX_BUFFER_SIZE: usize = 1024 * 1024 * 1024; pgp-0.15.0/src/line_writer.rs000064400000000000000000000403131046102023000141560ustar 00000000000000//! # Line writer module use std::io; use generic_array::typenum::{Sum, Unsigned, U2}; use generic_array::{ArrayLength, GenericArray}; const CRLF: [u8; 2] = [b'\r', b'\n']; const CR: [u8; 1] = [b'\r']; const LF: [u8; 1] = [b'\n']; #[derive(Clone, Copy, PartialEq, Eq)] #[repr(u8)] pub enum LineBreak { Crlf, Lf, Cr, } impl AsRef<[u8]> for LineBreak { fn as_ref(&self) -> &[u8] { match self { LineBreak::Crlf => &CRLF[..], LineBreak::Lf => &LF[..], LineBreak::Cr => &CR[..], } } } /// A `Write` implementation that splits any written bytes into the given length lines. /// /// /// # Panics /// /// Calling `write()` after `finish()` is invalid and will panic. pub struct LineWriter<'a, W, N> where W: io::Write, N: Unsigned + ArrayLength, N: std::ops::Add, Sum: ArrayLength, { /// Which kind of line break to insert. line_break: LineBreak, /// Where encoded data is written to. w: &'a mut W, /// Holds a partial chunk, if any, after the last `write()`, so that we may then fill the chunk /// with the next `write()`, write it, then proceed with the rest of the input normally. extra: GenericArray, /// How much of `extra` is occupied, in `[0, N]`. extra_len: usize, buffer: GenericArray>, /// True iff partial last chunk has been written. finished: bool, /// panic safety: don't write again in destructor if writer panicked while we were writing to it panicked: bool, } impl<'a, W, N> LineWriter<'a, W, N> where W: 'a + io::Write, N: Unsigned + ArrayLength, N: std::ops::Add, Sum: ArrayLength, { /// Creates a new encoder around an existing writer. pub fn new(w: &'a mut W, line_break: LineBreak) -> Self { LineWriter { line_break, w, extra: Default::default(), buffer: Default::default(), extra_len: 0, finished: false, panicked: false, } } /// Write all remaining buffered data. /// /// Once this succeeds, no further writes can be performed. /// /// # Errors /// /// Assuming the wrapped writer obeys the `Write` contract, if this returns `Err`, no data was /// written, and `finish()` may be retried if appropriate for the type of error, etc. pub fn finish(&mut self) -> io::Result<()> { if self.finished { return Ok(()); }; if self.extra_len > 0 { self.panicked = true; self.w.write_all(&self.extra[..self.extra_len])?; self.w.write_all(self.line_break.as_ref())?; self.panicked = false; // write succeeded, do not write the encoding of extra again if finish() is retried self.extra_len = 0; } self.finished = true; Ok(()) } } impl<'a, W, N> io::Write for LineWriter<'a, W, N> where W: 'a + io::Write, N: Unsigned + ArrayLength, N: std::ops::Add, Sum: ArrayLength, { fn write(&mut self, input: &[u8]) -> io::Result { if self.finished { panic!("Cannot write more after calling finish()"); } if input.is_empty() { return Ok(0); } // The contract of `Write::write` places some constraints on this implementation: // - a call to `write()` represents at most one call to a wrapped `Write`, so we can't // iterate over the input and encode multiple chunks. // - Errors mean that "no bytes were written to this writer", so we need to reset the // internal state to what it was before the error occurred let sl = N::to_usize(); let line_break = self.line_break.as_ref(); let orig_extra_len = self.extra_len; // process leftover stuff from last write if self.extra_len + input.len() < sl { // still not enough self.extra_len += input.len(); self.extra[orig_extra_len..self.extra_len].copy_from_slice(input); Ok(input.len()) } else { let mut buffer_pos = 0; let mut input_pos = 0; if self.extra_len > 0 { let copied = ::std::cmp::min(orig_extra_len, self.buffer.len()); self.buffer[buffer_pos..buffer_pos + copied].copy_from_slice(&self.extra[..copied]); self.extra_len -= copied; buffer_pos += copied; } if buffer_pos < sl { let missing = ::std::cmp::min(sl - buffer_pos, input.len() - input_pos); self.buffer[buffer_pos..buffer_pos + missing] .copy_from_slice(&input[input_pos..input_pos + missing]); buffer_pos += missing; input_pos += missing; } // still not enough if buffer_pos < sl { return Ok(input_pos); } // insert line break self.buffer[buffer_pos..buffer_pos + line_break.len()].copy_from_slice(line_break); buffer_pos += line_break.len(); self.panicked = true; let r = self.w.write_all(&self.buffer[..buffer_pos]); self.panicked = false; match r { Ok(_) => Ok(input_pos), Err(err) => { // in case we filled and encoded `extra`, reset extra_len self.extra_len = orig_extra_len; Err(err) } } } } /// Because this is usually treated as OK to call multiple times, it will *not* flush any /// incomplete chunks of input or write padding. fn flush(&mut self) -> io::Result<()> { self.w.flush() } } impl<'a, W, N> Drop for LineWriter<'a, W, N> where W: 'a + io::Write, N: Unsigned + ArrayLength, N: std::ops::Add, Sum: ArrayLength, { fn drop(&mut self) { if !self.panicked { // like `BufWriter`, ignore errors during drop let _ = self.finish(); } } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; use crate::util::write_all; use base64::engine::general_purpose; use generic_array::typenum::{self, U10}; use std::io::Write; #[test] fn simple_writes() { let mut buf = Vec::new(); { let mut w = LineWriter::<_, U10>::new(&mut buf, LineBreak::Crlf); // short write assert_eq!(w.write(&[0, 1, 2, 3]).unwrap(), 4); assert_eq!(w.write(&[4, 5, 6, 7]).unwrap(), 4); assert_eq!(w.write(&[8, 9, 10, 11]).unwrap(), 2); assert_eq!(w.write(&[10, 11]).unwrap(), 2); // writer dropped, should flush now } assert_eq!( &buf[..], &[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, b'\r', b'\n', 10, 11, b'\r', b'\n'][..] ); } macro_rules! test_len { ( $name:ident, $len:ty ) => { #[test] fn $name() { use rand::{Rng, SeedableRng}; use rand_xorshift::XorShiftRng; let rng = &mut XorShiftRng::from_seed([ 0x3, 0x8, 0x3, 0xe, 0x3, 0x8, 0x3, 0xe, 0x3, 0x8, 0x3, 0xe, 0x3, 0x8, 0x3, 0xe, ]); let mut buf = Vec::new(); let mut list = Vec::new(); { let mut w = LineWriter::<_, $len>::new(&mut buf, LineBreak::Crlf); for i in 0..100 { let data = (0..i).map(|_| rng.gen()).collect::>(); w.write_all(&data).unwrap(); list.extend(&data); } } let len = <$len as typenum::Unsigned>::to_usize(); let mut expected: Vec = list.chunks(len).fold(Vec::new(), |mut acc, line| { acc.extend(line); if line.len() == len { acc.push(b'\r'); acc.push(b'\n'); } acc }); if expected.len() % len != 0 { expected.push(b'\r'); expected.push(b'\n'); } assert_eq!(&buf[..], &expected[..]); } }; } test_len!(test_break_line_len_1, typenum::U1); test_len!(test_break_line_len_2, typenum::U2); test_len!(test_break_line_len_10, typenum::U10); test_len!(test_break_line_len_74, typenum::U74); test_len!(test_break_line_len_100, typenum::U100); // test_len!(test_break_line_len_256, typenum::U256); #[test] fn test_key_roundtrip() { let content = hex::decode("99010d04583c17af010800b9552ff9f4dae0e66c3ec0402793fbe2d02188f8ae6b1939b202bbb2fda892e2461f5098843eafc965809e350f464db24de4cf858afd5b870eb17847e5e05002fc0d14a37f5fbd448b247d95fbc953dc6c57b7c291631f0cbe8b6fa0a886d4346f827c11875aa26d7ebe86d25a84fc070d5894b85cf465e10f5a20b0ba830e10b9a24ecb845596d0b2fd3c07008ecc873733cb3add3b7030251ef8c061a9f46312eebf1adee68ae1865455c1f7a6a8d8ef6ed47b11edc523815429e89c062e02088a38f2d7aeccb3e7ca65eb6a03db73bb50b5480b4d622aa6014a2a186d581234bba00a6800a9870fe2c608c50f83977a6e1c3e3721e30c015624462fde41b70011010001b43554657374204b65792028646f206e6f742075736529203c61757468656e7469636174652d6f6e6c79406578616d706c652e6f72673e89014e041301080038162104927ef377fd1a1b6f795e40c02a87917d8ffba49f0502583c17af021b01050b09080702061508090a0b020416020301021e01021780000a09102a87917d8ffba49f7ecc07fd1556649c309608d638dbe448477e9fab69751acf0a7ccb17acd5ed7d83ed2ea8a83fc7f3d8b1342e8b9d4ac64c2d5ca0a273c6d190317485075dc15d52a3eb133b387c4c91e3169e392c6e8b643fbbafbd6e2ede8a5618cd53515a4bb2c764eb4506448cc5cc9ee25c5a9b466d15acfe2a5151904759f2e5dae74b97ed134482fb8678b4eb15421dbc04e6ccdc2e8cb3cef228c065400d716a786ee7b72eee44d64d003f9958c1f6274beca599544958bbcf55728330c8dd4e3648c26656a9d19880ac07740b23c36ce27c565cedb3f1f85e48572b3fe2c0718dd6e898272c2cefcaea20c675a67787f3af5881dc4d87732fecaf4720439c2dbac79046199396b9010d04583c17d9010800b4a71b058ac8aa1ddc453ab2663331c38f7645542815ac189a9af56d0e07a615469d3e08849650e03026d49259423cf00d089931cd700fd3a6e940bf83c81406e142a4b0a86f00738c7e1a9ff1b709f6bccc6cf900d0113a8e62e53d63be0a05105755b9efc6a4098c362c73fb422d40187d8e2382e88624d72caffceb13cec8fa0079c7d17883a46a1336471ab5be8cbb555c5d330d7fadb43318fa73b584edac312fa3302886bb5d04a05da3be2676c1fb94b3cf5c19d598659c3a7728ebab95f71721b662ac46aa9910726fe576d438f789c5ce2448f54546f254da814bcae1c35ee44b171e870ffa6403167a10e68573bdf155549274b431ff8e2418b6270011010001890136041801080020162104927ef377fd1a1b6f795e40c02a87917d8ffba49f0502583c17d9021b20000a09102a87917d8ffba49fac6b07ff7928f1c4082501da2517d94ad3bd2e566320ab81853ea27746a24f5058f010515260b5e48802e73065c34a639f3ea090e1cf8f5b0ba6161282cf83175430fcc7a9a2f59f87944c0831a0a7724ad24ee4393a0c0effabe4873e3639c80c6775909d67cd54cf236cd3fdbd7d6fae83de1cb15a3c6cbd28930cd19fe19422087b22bf6bdd335a54f950c7d1a2a35045b63f8a261d9a9bdfebd23d3e86c655ba3feda8594ee98f5b08e218eced3577aea39514680555c4c40160aa76c37c22976b07cd87d37d851233287ea14171e17973585ddb2f3b1a7d169eb8ad61e7e26ebc87229af539cd666d9f484ea62217a593a826fbccf6be43e19453e545f66e543c3f").unwrap(); // sanit check, ensure the base64 encoding works as expected { let mut buf = Vec::new(); { let mut enc = base64::write::EncoderWriter::new(&mut buf, &general_purpose::STANDARD); enc.write_all(&content).unwrap(); } assert_eq!( ::std::str::from_utf8(&buf).unwrap(), "mQENBFg8F68BCAC5VS/59Nrg5mw+wEAnk/vi0CGI+K5rGTmyAruy/aiS4kYfUJiE\ Pq/JZYCeNQ9GTbJN5M+Fiv1bhw6xeEfl4FAC/A0Uo39fvUSLJH2V+8lT3GxXt8KR\ Yx8MvotvoKiG1DRvgnwRh1qibX6+htJahPwHDViUuFz0ZeEPWiCwuoMOELmiTsuE\ VZbQsv08BwCOzIc3M8s63TtwMCUe+MBhqfRjEu6/Gt7miuGGVFXB96ao2O9u1HsR\ 7cUjgVQp6JwGLgIIijjy167Ms+fKZetqA9tzu1C1SAtNYiqmAUoqGG1YEjS7oApo\ AKmHD+LGCMUPg5d6bhw+NyHjDAFWJEYv3kG3ABEBAAG0NVRlc3QgS2V5IChkbyBu\ b3QgdXNlKSA8YXV0aGVudGljYXRlLW9ubHlAZXhhbXBsZS5vcmc+iQFOBBMBCAA4\ FiEEkn7zd/0aG295XkDAKoeRfY/7pJ8FAlg8F68CGwEFCwkIBwIGFQgJCgsCBBYC\ AwECHgECF4AACgkQKoeRfY/7pJ9+zAf9FVZknDCWCNY42+RIR36fq2l1Gs8KfMsX\ rNXtfYPtLqioP8fz2LE0LoudSsZMLVygonPG0ZAxdIUHXcFdUqPrEzs4fEyR4xae\ OSxui2Q/u6+9bi7eilYYzVNRWkuyx2TrRQZEjMXMnuJcWptGbRWs/ipRUZBHWfLl\ 2udLl+0TRIL7hni06xVCHbwE5szcLoyzzvIowGVADXFqeG7nty7uRNZNAD+ZWMH2\ J0vspZlUSVi7z1VygzDI3U42SMJmVqnRmICsB3QLI8Ns4nxWXO2z8fheSFcrP+LA\ cY3W6JgnLCzvyuogxnWmd4fzr1iB3E2Hcy/sr0cgQ5wtuseQRhmTlrkBDQRYPBfZ\ AQgAtKcbBYrIqh3cRTqyZjMxw492RVQoFawYmpr1bQ4HphVGnT4IhJZQ4DAm1JJZ\ QjzwDQiZMc1wD9Om6UC/g8gUBuFCpLCobwBzjH4an/G3Cfa8zGz5ANAROo5i5T1j\ vgoFEFdVue/GpAmMNixz+0ItQBh9jiOC6IYk1yyv/OsTzsj6AHnH0XiDpGoTNkca\ tb6Mu1VcXTMNf620Mxj6c7WE7awxL6MwKIa7XQSgXaO+JnbB+5Szz1wZ1ZhlnDp3\ KOurlfcXIbZirEaqmRByb+V21Dj3icXOJEj1RUbyVNqBS8rhw17kSxcehw/6ZAMW\ ehDmhXO98VVUknS0Mf+OJBi2JwARAQABiQE2BBgBCAAgFiEEkn7zd/0aG295XkDA\ KoeRfY/7pJ8FAlg8F9kCGyAACgkQKoeRfY/7pJ+sawf/eSjxxAglAdolF9lK070u\ VmMgq4GFPqJ3RqJPUFjwEFFSYLXkiALnMGXDSmOfPqCQ4c+PWwumFhKCz4MXVDD8\ x6mi9Z+HlEwIMaCnckrSTuQ5OgwO/6vkhz42OcgMZ3WQnWfNVM8jbNP9vX1vroPe\ HLFaPGy9KJMM0Z/hlCIIeyK/a90zWlT5UMfRoqNQRbY/iiYdmpvf69I9PobGVbo/\ 7ahZTumPWwjiGOztNXeuo5UUaAVVxMQBYKp2w3wil2sHzYfTfYUSMyh+oUFx4Xlz\ WF3bLzsafRaeuK1h5+JuvIcimvU5zWZtn0hOpiIXpZOoJvvM9r5D4ZRT5UX2blQ8\ Pw==", ); } let mut buf = Vec::new(); { let mut line_wrapper = LineWriter::<_, typenum::U64>::new(&mut buf, LineBreak::Lf); let mut enc = base64::write::EncoderWriter::new(&mut line_wrapper, &general_purpose::STANDARD); write_all(&mut enc, &content).unwrap(); } assert_eq!( ::std::str::from_utf8(&buf).unwrap(), "mQENBFg8F68BCAC5VS/59Nrg5mw+wEAnk/vi0CGI+K5rGTmyAruy/aiS4kYfUJiE\n\ Pq/JZYCeNQ9GTbJN5M+Fiv1bhw6xeEfl4FAC/A0Uo39fvUSLJH2V+8lT3GxXt8KR\n\ Yx8MvotvoKiG1DRvgnwRh1qibX6+htJahPwHDViUuFz0ZeEPWiCwuoMOELmiTsuE\n\ VZbQsv08BwCOzIc3M8s63TtwMCUe+MBhqfRjEu6/Gt7miuGGVFXB96ao2O9u1HsR\n\ 7cUjgVQp6JwGLgIIijjy167Ms+fKZetqA9tzu1C1SAtNYiqmAUoqGG1YEjS7oApo\n\ AKmHD+LGCMUPg5d6bhw+NyHjDAFWJEYv3kG3ABEBAAG0NVRlc3QgS2V5IChkbyBu\n\ b3QgdXNlKSA8YXV0aGVudGljYXRlLW9ubHlAZXhhbXBsZS5vcmc+iQFOBBMBCAA4\n\ FiEEkn7zd/0aG295XkDAKoeRfY/7pJ8FAlg8F68CGwEFCwkIBwIGFQgJCgsCBBYC\n\ AwECHgECF4AACgkQKoeRfY/7pJ9+zAf9FVZknDCWCNY42+RIR36fq2l1Gs8KfMsX\n\ rNXtfYPtLqioP8fz2LE0LoudSsZMLVygonPG0ZAxdIUHXcFdUqPrEzs4fEyR4xae\n\ OSxui2Q/u6+9bi7eilYYzVNRWkuyx2TrRQZEjMXMnuJcWptGbRWs/ipRUZBHWfLl\n\ 2udLl+0TRIL7hni06xVCHbwE5szcLoyzzvIowGVADXFqeG7nty7uRNZNAD+ZWMH2\n\ J0vspZlUSVi7z1VygzDI3U42SMJmVqnRmICsB3QLI8Ns4nxWXO2z8fheSFcrP+LA\n\ cY3W6JgnLCzvyuogxnWmd4fzr1iB3E2Hcy/sr0cgQ5wtuseQRhmTlrkBDQRYPBfZ\n\ AQgAtKcbBYrIqh3cRTqyZjMxw492RVQoFawYmpr1bQ4HphVGnT4IhJZQ4DAm1JJZ\n\ QjzwDQiZMc1wD9Om6UC/g8gUBuFCpLCobwBzjH4an/G3Cfa8zGz5ANAROo5i5T1j\n\ vgoFEFdVue/GpAmMNixz+0ItQBh9jiOC6IYk1yyv/OsTzsj6AHnH0XiDpGoTNkca\n\ tb6Mu1VcXTMNf620Mxj6c7WE7awxL6MwKIa7XQSgXaO+JnbB+5Szz1wZ1ZhlnDp3\n\ KOurlfcXIbZirEaqmRByb+V21Dj3icXOJEj1RUbyVNqBS8rhw17kSxcehw/6ZAMW\n\ ehDmhXO98VVUknS0Mf+OJBi2JwARAQABiQE2BBgBCAAgFiEEkn7zd/0aG295XkDA\n\ KoeRfY/7pJ8FAlg8F9kCGyAACgkQKoeRfY/7pJ+sawf/eSjxxAglAdolF9lK070u\n\ VmMgq4GFPqJ3RqJPUFjwEFFSYLXkiALnMGXDSmOfPqCQ4c+PWwumFhKCz4MXVDD8\n\ x6mi9Z+HlEwIMaCnckrSTuQ5OgwO/6vkhz42OcgMZ3WQnWfNVM8jbNP9vX1vroPe\n\ HLFaPGy9KJMM0Z/hlCIIeyK/a90zWlT5UMfRoqNQRbY/iiYdmpvf69I9PobGVbo/\n\ 7ahZTumPWwjiGOztNXeuo5UUaAVVxMQBYKp2w3wil2sHzYfTfYUSMyh+oUFx4Xlz\n\ WF3bLzsafRaeuK1h5+JuvIcimvU5zWZtn0hOpiIXpZOoJvvM9r5D4ZRT5UX2blQ8\n\ Pw==\n" ); } } pgp-0.15.0/src/normalize_lines.rs000064400000000000000000000115321046102023000150260ustar 00000000000000//! # Line ending normalization module //! //! This crate provides a `normalize` method that takes an u8 iterator and returns //! a new one with newlines normalized to a single style. //! //! Based on . use std::iter::Peekable; use crate::line_writer::LineBreak; /// This struct wraps an u8 iterator to normalize line endings. pub struct Normalized where I: Iterator, { line_break: LineBreak, iter: Peekable, prev_was_cr: bool, } impl> Normalized { /// Take a u8 iterator and return similar iterator with normalized line endings /// /// # Example /// ``` /// use std::iter::FromIterator; /// /// use pgp::line_writer::LineBreak; /// use pgp::normalize_lines::Normalized; /// /// let input = "This is a string \n with \r some \n\r\n random newlines\r\r\n\n"; /// assert_eq!( /// &String::from_utf8(Normalized::new(input.bytes(), LineBreak::Lf).collect()).unwrap(), /// "This is a string \n with \n some \n\n random newlines\n\n\n" /// ); /// ``` pub fn new(iter: I, line_break: LineBreak) -> Normalized { Normalized { iter: iter.peekable(), prev_was_cr: false, line_break, } } } impl> Iterator for Normalized { type Item = u8; fn next(&mut self) -> Option { match self.iter.peek() { Some(b'\n') => { match self.line_break { LineBreak::Lf => { if self.prev_was_cr { // we already inserted a \n let _ = self.iter.next(); } self.iter.next() } LineBreak::Cr => { // skip \n let _ = self.iter.next(); if self.prev_was_cr { self.prev_was_cr = false; self.next() } else { Some(b'\r') } } LineBreak::Crlf => { if self.prev_was_cr { self.prev_was_cr = false; self.iter.next() } else { self.prev_was_cr = true; Some(b'\r') } } } } Some(b'\r') => match self.line_break { LineBreak::Lf => { self.prev_was_cr = true; let _ = self.iter.next(); Some(b'\n') } LineBreak::Cr => { self.prev_was_cr = true; self.iter.next() } LineBreak::Crlf => { if self.prev_was_cr { self.prev_was_cr = false; Some(b'\n') } else { self.prev_was_cr = true; self.iter.next() } } }, _ => match self.line_break { LineBreak::Lf | LineBreak::Cr => { self.prev_was_cr = false; self.iter.next() } LineBreak::Crlf => { let res = if self.prev_was_cr { Some(b'\n') } else { self.iter.next() }; self.prev_was_cr = false; res } }, } } } // tests #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; #[test] fn normalized_lf() { let input = "This is a string \n with \r some \n\r\n random newlines\r\r\n\n"; assert_eq!( &String::from_utf8(Normalized::new(input.bytes(), LineBreak::Lf).collect()).unwrap(), "This is a string \n with \n some \n\n random newlines\n\n\n" ); } #[test] fn normalized_cr() { let input = "This is a string \n with \r some \n\r\n random newlines\r\r\n\n"; assert_eq!( &String::from_utf8(Normalized::new(input.bytes(), LineBreak::Cr).collect()).unwrap(), "This is a string \r with \r some \r\r random newlines\r\r\r" ); } #[test] fn normalized_crlf() { let input = "This is a string \n with \r some \n\r\n random newlines\r\r\n\n"; assert_eq!( &String::from_utf8(Normalized::new(input.bytes(), LineBreak::Crlf).collect()).unwrap(), "This is a string \r\n with \r\n some \r\n\r\n random newlines\r\n\r\n\r\n" ); } } pgp-0.15.0/src/packet/compressed_data.rs000064400000000000000000000057131046102023000162440ustar 00000000000000use std::io::{self, Read}; use byteorder::WriteBytesExt; use flate2::read::{DeflateDecoder, ZlibDecoder}; use crate::errors::Result; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{CompressionAlgorithm, Tag, Version}; #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub struct CompressedData { packet_version: Version, compression_algorithm: CompressionAlgorithm, #[debug("{}", hex::encode(compressed_data))] compressed_data: Vec, } pub enum Decompressor { Uncompressed(R), Zip(DeflateDecoder), Zlib(ZlibDecoder), Bzip2, } impl Read for Decompressor<&[u8]> { fn read(&mut self, into: &mut [u8]) -> io::Result { match self { Decompressor::Uncompressed(ref mut c) => c.read(into), Decompressor::Zip(ref mut c) => c.read(into), Decompressor::Zlib(ref mut c) => c.read(into), Decompressor::Bzip2 => unimplemented!("bzip2"), } } } impl CompressedData { /// Parses a `CompressedData` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { ensure!(input.len() > 1, "input too short"); let alg = CompressionAlgorithm::from(input[0]); Ok(CompressedData { packet_version, compression_algorithm: alg, compressed_data: input[1..].to_vec(), }) } pub fn from_compressed(alg: CompressionAlgorithm, data: Vec) -> Self { CompressedData { packet_version: Default::default(), compression_algorithm: alg, compressed_data: data, } } pub fn decompress(&self) -> Result> { match self.compression_algorithm { CompressionAlgorithm::Uncompressed => { Ok(Decompressor::Uncompressed(&self.compressed_data[..])) } CompressionAlgorithm::ZIP => Ok(Decompressor::Zip(DeflateDecoder::new( &self.compressed_data[..], ))), CompressionAlgorithm::ZLIB => Ok(Decompressor::Zlib(ZlibDecoder::new( &self.compressed_data[..], ))), CompressionAlgorithm::BZip2 => unimplemented_err!("BZip2"), CompressionAlgorithm::Private10 | CompressionAlgorithm::Other(_) => unsupported_err!( "CompressionAlgorithm {} is unsupported", u8::from(self.compression_algorithm) ), } } pub fn compressed_data(&self) -> &[u8] { &self.compressed_data } } impl Serialize for CompressedData { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_u8(self.compression_algorithm.into())?; writer.write_all(&self.compressed_data)?; Ok(()) } } impl PacketTrait for CompressedData { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::CompressedData } } pgp-0.15.0/src/packet/key/public.rs000064400000000000000000000602101046102023000151460ustar 00000000000000use aes_gcm::aead::rand_core::CryptoRng; use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; use md5::Md5; use rand::Rng; use sha1_checked::{Digest, Sha1}; use crate::types::EcdhPublicParams; use crate::{ crypto::{self, ecc_curve::ECCCurve, hash::HashAlgorithm, public_key::PublicKeyAlgorithm}, errors::Result, packet::{Signature, SignatureConfig, SignatureType, Subpacket, SubpacketData}, types::{ EskType, Fingerprint, KeyId, KeyVersion, Mpi, PkeskBytes, PublicKeyTrait, PublicParams, SecretKeyTrait, SignatureBytes, Tag, Version, }, }; #[derive(Debug, PartialEq, Eq, Clone)] pub struct PublicKey(PubKeyInner); #[derive(Debug, PartialEq, Eq, Clone)] pub struct PublicSubkey(PubKeyInner); impl PublicKey { /// Create a new `PublicKey` packet from underlying parameters. pub fn new( packet_version: Version, version: KeyVersion, algorithm: PublicKeyAlgorithm, created_at: chrono::DateTime, expiration: Option, public_params: PublicParams, ) -> Result { let inner = PubKeyInner::new( packet_version, version, algorithm, created_at, expiration, public_params, )?; Ok(Self(inner)) } /// Parses a `PublicKeyKey` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let inner = PubKeyInner::from_slice(packet_version, input)?; Ok(Self(inner)) } pub fn sign( &self, rng: R, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where F: FnOnce() -> String, { self.0.sign(rng, key, key_pw, SignatureType::KeyBinding) } } impl PublicSubkey { /// Create a new `PublicSubkey` packet from underlying parameters. pub fn new( packet_version: Version, version: KeyVersion, algorithm: PublicKeyAlgorithm, created_at: chrono::DateTime, expiration: Option, public_params: PublicParams, ) -> Result { let inner = PubKeyInner::new( packet_version, version, algorithm, created_at, expiration, public_params, )?; Ok(Self(inner)) } /// Parses a `PublicSubkey` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let inner = PubKeyInner::from_slice(packet_version, input)?; Ok(Self(inner)) } pub fn sign( &self, rng: R, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where F: FnOnce() -> String, { self.0.sign(rng, key, key_pw, SignatureType::SubkeyBinding) } } #[derive(Debug, PartialEq, Eq, Clone)] struct PubKeyInner { packet_version: Version, version: KeyVersion, algorithm: PublicKeyAlgorithm, created_at: chrono::DateTime, expiration: Option, public_params: PublicParams, } impl PubKeyInner { fn new( packet_version: Version, version: KeyVersion, algorithm: PublicKeyAlgorithm, created_at: chrono::DateTime, expiration: Option, public_params: PublicParams, ) -> Result { // None of the ECC methods described in this document are allowed with deprecated version 3 keys. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-11-2) if (version == KeyVersion::V2 || version == KeyVersion::V3) && !(algorithm == PublicKeyAlgorithm::RSA || algorithm == PublicKeyAlgorithm::RSAEncrypt || algorithm == PublicKeyAlgorithm::RSASign) { // It's sufficient to throw a "soft" Error::Unsupported unsupported_err!( "Invalid algorithm {:?} for key version: {:?}", algorithm, version, ); } // "Ed25519Legacy and Curve25519Legacy are used only in version 4 keys [..]. // Implementations MUST NOT accept [..] version 6 key material using the deprecated OIDs." // // See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.2-6 if version != KeyVersion::V4 { if matches!( public_params, PublicParams::ECDH(EcdhPublicParams::Known { curve: ECCCurve::Curve25519, .. }) ) { bail!( "ECDH over Curve25519 is illegal for key version {}", u8::from(version) ); } if matches!(public_params, PublicParams::EdDSALegacy { .. }) { bail!( "EdDSALegacy is illegal for key version {}", u8::from(version) ); } } Ok(Self { packet_version, version, algorithm, created_at, expiration, public_params, }) } fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, details) = crate::packet::public_key_parser::parse(input)?; let (version, algorithm, created_at, expiration, public_params) = details; Self::new( packet_version, version, algorithm, created_at, expiration, public_params, ) } fn to_writer_v2_v3(&self, writer: &mut W) -> Result<()> { use crate::ser::Serialize; writer.write_u32::(self.created_at.timestamp().try_into()?)?; writer.write_u16::( self.expiration .expect("old key versions have an expiration"), )?; writer.write_u8(self.algorithm.into())?; self.public_params.to_writer(writer)?; Ok(()) } fn to_writer_v4_v6(&self, writer: &mut W) -> Result<()> { use crate::ser::Serialize; writer.write_u32::(self.created_at.timestamp().try_into()?)?; writer.write_u8(self.algorithm.into())?; let mut public_params = vec![]; self.public_params.to_writer(&mut public_params)?; if self.version == KeyVersion::V6 { writer.write_u32::(public_params.len().try_into()?)?; } writer.write_all(&public_params)?; Ok(()) } fn sign( &self, mut rng: R, key: &impl SecretKeyTrait, key_pw: F, sig_type: SignatureType, ) -> Result where F: FnOnce() -> String, { use chrono::SubsecRound; let mut config = match key.version() { KeyVersion::V4 => SignatureConfig::v4(sig_type, key.algorithm(), key.hash_alg()), KeyVersion::V6 => { SignatureConfig::v6(&mut rng, sig_type, key.algorithm(), key.hash_alg())? } v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = vec![Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), ))]; config.unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(key.key_id()))]; config.sign_key(key, key_pw, &self) } } impl crate::ser::Serialize for PublicKey { fn to_writer(&self, writer: &mut W) -> Result<()> { crate::ser::Serialize::to_writer(&self.0, writer) } } impl crate::ser::Serialize for PublicSubkey { fn to_writer(&self, writer: &mut W) -> Result<()> { crate::ser::Serialize::to_writer(&self.0, writer) } } impl crate::ser::Serialize for PubKeyInner { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_u8(self.version.into())?; match self.version { KeyVersion::V2 | KeyVersion::V3 => self.to_writer_v2_v3(writer), KeyVersion::V4 | KeyVersion::V6 => self.to_writer_v4_v6(writer), KeyVersion::V5 => unimplemented_err!("V5 keys"), KeyVersion::Other(v) => { unimplemented_err!("Unsupported key version {}", v) } } } } impl crate::packet::PacketTrait for PublicKey { fn packet_version(&self) -> Version { self.0.packet_version } fn tag(&self) -> Tag { Tag::PublicKey } } impl crate::packet::PacketTrait for PublicSubkey { fn packet_version(&self) -> Version { self.0.packet_version } fn tag(&self) -> Tag { Tag::PublicSubkey } } impl PublicKeyTrait for PubKeyInner { fn version(&self) -> KeyVersion { self.version } fn fingerprint(&self) -> Fingerprint { use crate::ser::Serialize; match self.version { KeyVersion::V2 | KeyVersion::V3 => { let mut h = Md5::new(); self.public_params .to_writer(&mut h) .expect("write to hasher"); let digest = h.finalize(); if self.version == KeyVersion::V2 { Fingerprint::V2(digest.into()) } else { Fingerprint::V3(digest.into()) } } KeyVersion::V4 => { // A one-octet version number (4). let mut packet = vec![4, 0, 0, 0, 0]; // A four-octet number denoting the time that the key was created. BigEndian::write_u32(&mut packet[1..5], self.created_at.timestamp() as u32); // A one-octet number denoting the public-key algorithm of this key. packet.push(self.algorithm.into()); self.public_params .to_writer(&mut packet) .expect("write to vec"); let mut h = Sha1::new(); h.update([0x99]); h.write_u16::(packet.len() as u16) .expect("write to hasher"); h.update(&packet); let digest = h.finalize(); Fingerprint::V4(digest.into()) } KeyVersion::V5 => unimplemented!("V5 keys"), KeyVersion::V6 => { // Serialize public parameters let mut pp: Vec = vec![]; self.public_params .to_writer(&mut pp) .expect("serialize to Vec"); // A v6 fingerprint is the 256-bit SHA2-256 hash of: let mut h = sha2::Sha256::new(); // a.1) 0x9B (1 octet) h.update(&[0x9B]); // a.2) four-octet scalar octet count of (b)-(f) let total_len: u32 = 1 + 4 + 1 + 4 + pp.len() as u32; h.write_u32::(total_len) .expect("write to hasher"); // b) version number = 6 (1 octet); h.update(&[0x06]); // c) timestamp of key creation (4 octets); h.write_u32::(self.created_at.timestamp() as u32) .expect("write to hasher"); // d) algorithm (1 octet); h.update(&[self.algorithm.into()]); // e) four-octet scalar octet count for the following key material; h.write_u32::(pp.len() as u32) .expect("write to hasher"); // f) algorithm-specific fields. h.update(&pp); let digest = h.finalize(); Fingerprint::V6(digest.into()) } KeyVersion::Other(v) => unimplemented!("Unsupported key version {}", v), } } fn key_id(&self) -> KeyId { match self.version { KeyVersion::V2 | KeyVersion::V3 => match &self.public_params { PublicParams::RSA { n, .. } => { let offset = n.len() - 8; KeyId::from_slice(&n.as_bytes()[offset..]).expect("fixed size slice") } _ => panic!("invalid key constructed: {:?}", &self.public_params), }, KeyVersion::V4 => { // Lower 64 bits let f = self.fingerprint(); let offset = f.len() - 8; KeyId::from_slice(&f.as_bytes()[offset..]).expect("fixed size slice") } KeyVersion::V5 => unimplemented!("V5 keys"), KeyVersion::V6 => { // High 64 bits let f = self.fingerprint(); KeyId::from_slice(&f.as_bytes()[0..8]).expect("fixed size slice") } KeyVersion::Other(v) => unimplemented!("Unsupported key version {}", v), } } fn algorithm(&self) -> PublicKeyAlgorithm { self.algorithm } fn verify_signature( &self, hash: HashAlgorithm, hashed: &[u8], sig: &SignatureBytes, ) -> Result<()> { match self.public_params { PublicParams::RSA { ref n, ref e } => { let sig: &[Mpi] = sig.try_into()?; ensure_eq!(sig.len(), 1, "invalid signature"); crypto::rsa::verify(n.as_bytes(), e.as_bytes(), hash, hashed, sig[0].as_bytes()) } PublicParams::EdDSALegacy { ref curve, ref q } => { let sig: &[Mpi] = sig.try_into()?; ensure_eq!(sig.len(), 2); let r = sig[0].as_bytes(); let s = sig[1].as_bytes(); ensure!(r.len() < 33, "invalid R (len)"); ensure!(s.len() < 33, "invalid S (len)"); ensure_eq!(q.len(), 33, "invalid Q (len)"); ensure_eq!(q[0], 0x40, "invalid Q (prefix)"); let public = &q[1..]; let mut sig_bytes = vec![0u8; 64]; // add padding if the values were encoded short sig_bytes[(32 - r.len())..32].copy_from_slice(r); sig_bytes[32 + (32 - s.len())..].copy_from_slice(s); crypto::eddsa::verify(curve, public, hash, hashed, &sig_bytes) } PublicParams::Ed25519 { ref public } => crypto::eddsa::verify( &crypto::ecc_curve::ECCCurve::Ed25519, public, hash, hashed, sig.try_into()?, ), PublicParams::X25519 { .. } => { bail!("X25519 can not be used for verify operations"); } #[cfg(feature = "unstable-curve448")] PublicParams::X448 { .. } => { bail!("X448 can not be used for verify operations"); } PublicParams::ECDSA(ref params) => { let sig: &[Mpi] = sig.try_into()?; crypto::ecdsa::verify(params, hash, hashed, sig) } PublicParams::ECDH(EcdhPublicParams::Known { ref curve, ref hash, ref alg_sym, .. }) => { bail!( "ECDH ({:?} {:?} {:?}) can not be used for verify operations", curve, hash, alg_sym ); } PublicParams::ECDH(EcdhPublicParams::Unsupported { ref curve, .. }) => { bail!( "ECDH (unsupported: {:?}) can not be used for verify operations", curve, ); } PublicParams::Elgamal { .. } => { unimplemented_err!("verify Elgamal"); } PublicParams::DSA { ref p, ref q, ref g, ref y, } => { let sig: &[Mpi] = sig.try_into()?; ensure_eq!(sig.len(), 2, "invalid signature"); crypto::dsa::verify( p.into(), q.into(), g.into(), y.into(), hashed, sig[0].clone().into(), sig[1].clone().into(), ) } PublicParams::Unknown { .. } => { unimplemented_err!("PublicParams::Unknown can not be used for verify operations"); } } } fn encrypt( &self, mut rng: R, plain: &[u8], typ: EskType, ) -> Result { match self.public_params { PublicParams::RSA { ref n, ref e } => { crypto::rsa::encrypt(rng, n.as_bytes(), e.as_bytes(), plain) } PublicParams::EdDSALegacy { .. } => bail!("EdDSALegacy is only used for signing"), PublicParams::Ed25519 { .. } => bail!("Ed25519 is only used for signing"), PublicParams::ECDSA { .. } => bail!("ECDSA is only used for signing"), PublicParams::ECDH(EcdhPublicParams::Known { ref curve, hash, alg_sym, ref p, }) => { if self.version() == KeyVersion::V6 { // An implementation MUST NOT encrypt any message to a version 6 ECDH key over a // listed curve that announces a different KDF or KEK parameter. // // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-11.5.1-2) if curve.hash_algo()? != hash || curve.sym_algo()? != alg_sym { bail!("Unsupported KDF/KEK parameters for {:?} and KeyVersion::V6: {:?}, {:?}",curve, hash, alg_sym); } } crypto::ecdh::encrypt( rng, curve, alg_sym, hash, self.fingerprint().as_bytes(), p.as_bytes(), plain, ) } PublicParams::ECDH(EcdhPublicParams::Unsupported { ref curve, .. }) => { unsupported_err!("ECDH over curve {:?} is unsupported", curve) } PublicParams::X25519 { ref public } => { let (sym_alg, plain) = match typ { EskType::V6 => (None, plain), EskType::V3_4 => { ensure!(!plain.is_empty(), "plain may not be empty"); ( Some(plain[0].into()), // byte 0 is the symmetric algorithm &plain[1..], // strip symmetric algorithm ) } }; let (ephemeral, session_key) = crypto::x25519::encrypt(&mut rng, *public, plain)?; Ok(PkeskBytes::X25519 { ephemeral, session_key, sym_alg, }) } #[cfg(feature = "unstable-curve448")] PublicParams::X448 { ref public } => { let (sym_alg, plain) = match typ { EskType::V6 => (None, plain), EskType::V3_4 => { ensure!(!plain.is_empty(), "plain may not be empty"); ( Some(plain[0].into()), // byte 0 is the symmetric algorithm &plain[1..], // strip symmetric algorithm ) } }; let (ephemeral, session_key) = crypto::x448::encrypt(&mut rng, *public, plain)?; Ok(PkeskBytes::X448 { ephemeral, session_key, sym_alg, }) } PublicParams::Elgamal { .. } => unimplemented_err!("encryption with Elgamal"), PublicParams::DSA { .. } => bail!("DSA is only used for signing"), PublicParams::Unknown { .. } => bail!("Unknown algorithm"), } } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> Result<()> { use crate::ser::Serialize; let mut key_buf = Vec::new(); self.to_writer(&mut key_buf)?; // old style packet header for the key match self.version() { KeyVersion::V2 | KeyVersion::V3 | KeyVersion::V4 => { // When a v4 signature is made over a key, the hash data starts with the octet 0x99, // followed by a two-octet length of the key, and then the body of the key packet. writer.write_u8(0x99)?; writer.write_u16::(key_buf.len().try_into()?)?; } KeyVersion::V6 => { // When a v6 signature is made over a key, the hash data starts with the salt // [NOTE: the salt is hashed in packet/signature/config.rs], // then octet 0x9B, followed by a four-octet length of the key, // and then the body of the key packet. writer.write_u8(0x9b)?; writer.write_u32::(key_buf.len().try_into()?)?; } v => unimplemented_err!("key version {:?}", v), } writer.write_all(&key_buf)?; Ok(()) } fn public_params(&self) -> &PublicParams { &self.public_params } fn created_at(&self) -> &chrono::DateTime { &self.created_at } fn expiration(&self) -> Option { self.expiration } } impl PublicKeyTrait for PublicKey { fn verify_signature( &self, hash: HashAlgorithm, hashed: &[u8], sig: &SignatureBytes, ) -> Result<()> { PublicKeyTrait::verify_signature(&self.0, hash, hashed, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { PublicKeyTrait::encrypt(&self.0, rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> Result<()> { PublicKeyTrait::serialize_for_hashing(&self.0, writer) } fn public_params(&self) -> &PublicParams { PublicKeyTrait::public_params(&self.0) } fn version(&self) -> KeyVersion { PublicKeyTrait::version(&self.0) } fn fingerprint(&self) -> Fingerprint { PublicKeyTrait::fingerprint(&self.0) } fn key_id(&self) -> KeyId { PublicKeyTrait::key_id(&self.0) } fn algorithm(&self) -> PublicKeyAlgorithm { PublicKeyTrait::algorithm(&self.0) } fn created_at(&self) -> &chrono::DateTime { PublicKeyTrait::created_at(&self.0) } fn expiration(&self) -> Option { PublicKeyTrait::expiration(&self.0) } } impl PublicKeyTrait for PublicSubkey { fn verify_signature( &self, hash: HashAlgorithm, hashed: &[u8], sig: &SignatureBytes, ) -> Result<()> { PublicKeyTrait::verify_signature(&self.0, hash, hashed, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { PublicKeyTrait::encrypt(&self.0, rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> Result<()> { PublicKeyTrait::serialize_for_hashing(&self.0, writer) } fn public_params(&self) -> &PublicParams { PublicKeyTrait::public_params(&self.0) } fn version(&self) -> KeyVersion { PublicKeyTrait::version(&self.0) } fn fingerprint(&self) -> Fingerprint { PublicKeyTrait::fingerprint(&self.0) } fn key_id(&self) -> KeyId { PublicKeyTrait::key_id(&self.0) } fn algorithm(&self) -> PublicKeyAlgorithm { PublicKeyTrait::algorithm(&self.0) } fn created_at(&self) -> &chrono::DateTime { PublicKeyTrait::created_at(&self.0) } fn expiration(&self) -> Option { PublicKeyTrait::expiration(&self.0) } } pgp-0.15.0/src/packet/key/secret.rs000064400000000000000000000537671046102023000152000ustar 00000000000000use aes_gcm::aead::rand_core::CryptoRng; use log::debug; use rand::Rng; use zeroize::Zeroize; use crate::{ crypto::{hash::HashAlgorithm, public_key::PublicKeyAlgorithm}, errors::Result, packet::{ PacketTrait, PublicKey, PublicSubkey, Signature, SignatureConfig, SignatureType, Subpacket, SubpacketData, }, types::{ EskType, Fingerprint, KeyId, KeyVersion, Mpi, PkeskBytes, PublicKeyTrait, PublicParams, SecretKeyRepr, SecretKeyTrait, SecretParams, SignatureBytes, Tag, Version, }, }; #[derive(Debug, PartialEq, Eq, Clone, zeroize::Zeroize, zeroize::ZeroizeOnDrop)] pub struct SecretKey(SecretKeyInner); #[derive(Debug, PartialEq, Eq, Clone, zeroize::Zeroize, zeroize::ZeroizeOnDrop)] pub struct SecretSubkey(SecretKeyInner); #[derive(Debug, PartialEq, Eq, Clone)] struct SecretKeyInner { details: D, secret_params: SecretParams, tag: Tag, } impl zeroize::Zeroize for SecretKeyInner { fn zeroize(&mut self) { // details are not zeroed as they are public knowledge. self.secret_params.zeroize(); } } impl Drop for SecretKeyInner { fn drop(&mut self) { self.zeroize() } } impl SecretKeyInner { fn remove_password

(&mut self, password: P) -> Result<()> where P: FnOnce() -> String, { if let SecretParams::Encrypted(enc) = &self.secret_params { let unlocked = enc.unlock(password, &self.details, Some(self.tag))?; self.secret_params = SecretParams::Plain(unlocked); } Ok(()) } fn set_password(&mut self, rng: R, password: P) -> Result<()> where R: rand::Rng + rand::CryptoRng, P: FnOnce() -> String, { let s2k = crate::types::S2kParams::new_default(rng, self.version()); Self::set_password_with_s2k(self, password, s2k) } fn set_password_with_s2k

( &mut self, password: P, s2k_params: crate::types::S2kParams, ) -> Result<()> where P: FnOnce() -> String, { let plain = match &self.secret_params { SecretParams::Plain(plain) => plain, SecretParams::Encrypted(_) => { bail!("Secret Key packet must be unlocked") } }; self.secret_params = SecretParams::Encrypted(plain.clone().encrypt( &password(), s2k_params, &self.details, Some(self.tag), )?); Ok(()) } } impl SecretKey { pub fn new(details: PublicKey, secret_params: SecretParams) -> Self { Self(SecretKeyInner { details, secret_params, tag: Tag::SecretKey, }) } /// Parses a `SecretKey` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, details) = crate::packet::secret_key_parser::parse(input)?; let (version, algorithm, created_at, expiration, public_params, secret_params) = details; Ok(Self(SecretKeyInner { details: PublicKey::new( packet_version, version, algorithm, created_at, expiration, public_params, )?, secret_params, tag: Tag::SecretKey, })) } pub fn secret_params(&self) -> &SecretParams { self.0.secret_params() } /// Checks if we should expect a SHA1 checksum in the encrypted part. pub fn has_sha1_checksum(&self) -> bool { self.0.has_sha1_checksum() } pub fn sign( &self, mut rng: R, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where F: FnOnce() -> String, { self.0 .sign(&mut rng, key, key_pw, SignatureType::KeyBinding) } } impl SecretSubkey { pub fn new(details: PublicSubkey, secret_params: SecretParams) -> Self { Self(SecretKeyInner { details, secret_params, tag: Tag::SecretSubkey, }) } /// Parses a `SecretSubkey` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, details) = crate::packet::secret_key_parser::parse(input)?; let (version, algorithm, created_at, expiration, public_params, secret_params) = details; Ok(Self(SecretKeyInner { details: PublicSubkey::new( packet_version, version, algorithm, created_at, expiration, public_params, )?, secret_params, tag: Tag::SecretSubkey, })) } pub fn secret_params(&self) -> &SecretParams { self.0.secret_params() } /// Checks if we should expect a SHA1 checksum in the encrypted part. pub fn has_sha1_checksum(&self) -> bool { self.0.has_sha1_checksum() } pub fn sign( &self, mut rng: R, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where F: FnOnce() -> String, { self.0 .sign(&mut rng, key, key_pw, SignatureType::SubkeyBinding) } } impl SecretKeyInner { fn secret_params(&self) -> &SecretParams { &self.secret_params } fn has_sha1_checksum(&self) -> bool { self.secret_params.string_to_key_id() == 254 } fn sign( &self, mut rng: R, key: &impl SecretKeyTrait, key_pw: F, sig_typ: SignatureType, ) -> Result where F: FnOnce() -> String, { use chrono::SubsecRound; let mut config = match key.version() { KeyVersion::V4 => SignatureConfig::v4(sig_typ, key.algorithm(), key.hash_alg()), KeyVersion::V6 => { SignatureConfig::v6(&mut rng, sig_typ, key.algorithm(), key.hash_alg())? } v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = vec![Subpacket::regular(SubpacketData::SignatureCreationTime( chrono::Utc::now().trunc_subsecs(0), ))]; config.unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(key.key_id()))]; config.sign_key(key, key_pw, &self) } } impl SecretKeyTrait for SecretKeyInner { type PublicKey = D; type Unlocked = SecretKeyRepr; fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result, { let decrypted = match self.secret_params { SecretParams::Plain(ref k) => k.as_ref().as_repr(self.public_params()), SecretParams::Encrypted(ref k) => { let plain = k.unlock(pw, &self.details, Some(self.tag))?; plain.as_ref().as_repr(self.public_params()) } }?; work(&decrypted) } fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String, { use crate::crypto::Signer; let mut signature: Option = None; self.unlock(key_pw, |priv_key| { debug!("unlocked key"); let sig = match *priv_key { SecretKeyRepr::RSA(ref priv_key) => priv_key.sign(hash, data, self.public_params()), SecretKeyRepr::ECDSA(ref priv_key) => { priv_key.sign(hash, data, self.public_params()) } SecretKeyRepr::DSA(ref priv_key) => priv_key.sign(hash, data, self.public_params()), SecretKeyRepr::ECDH(_) => { bail!("ECDH can not be used for signing operations") } SecretKeyRepr::X25519(_) => { bail!("X25519 can not be used for signing operations") } #[cfg(feature = "unstable-curve448")] SecretKeyRepr::X448(_) => { bail!("X448 can not be used for signing operations") } SecretKeyRepr::EdDSA(ref priv_key) => { priv_key.sign(hash, data, self.public_params()) } }?; match self.public_params() { PublicParams::Ed25519 { .. } => { // native format ensure_eq!(sig.len(), 2, "expect two signature parts"); let mut native = sig[0].clone(); native.extend_from_slice(&sig[1]); ensure_eq!(native.len(), 64, "expect 64 byte signature"); signature = Some(SignatureBytes::Native(native)); } _ => { // MPI format: // strip leading zeros, to match parse results from MPIs let mpis = sig .iter() .map(|v| Mpi::from_slice(&v[..])) .collect::>(); signature = Some(SignatureBytes::Mpis(mpis)); } } Ok(()) })?; signature.ok_or_else(|| unreachable!()) } fn public_key(&self) -> D { self.details.clone() } } impl SecretKeyTrait for SecretKey { type PublicKey = PublicKey; type Unlocked = SecretKeyRepr; fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result, { SecretKeyTrait::unlock(&self.0, pw, work) } fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String, { SecretKeyTrait::create_signature(&self.0, key_pw, hash, data) } fn public_key(&self) -> PublicKey { SecretKeyTrait::public_key(&self.0) } } impl SecretKeyTrait for SecretSubkey { type PublicKey = PublicSubkey; type Unlocked = SecretKeyRepr; fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result, { SecretKeyTrait::unlock(&self.0, pw, work) } fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String, { SecretKeyTrait::create_signature(&self.0, key_pw, hash, data) } fn public_key(&self) -> PublicSubkey { SecretKeyTrait::public_key(&self.0) } } impl crate::ser::Serialize for SecretKeyInner { fn to_writer(&self, writer: &mut W) -> Result<()> { // writes version and public part crate::ser::Serialize::to_writer(&self.details, writer)?; self.secret_params.to_writer(writer, self.version())?; Ok(()) } } impl crate::ser::Serialize for SecretKey { fn to_writer(&self, writer: &mut W) -> Result<()> { crate::ser::Serialize::to_writer(&self.0, writer) } } impl crate::ser::Serialize for SecretSubkey { fn to_writer(&self, writer: &mut W) -> Result<()> { crate::ser::Serialize::to_writer(&self.0, writer) } } impl PacketTrait for SecretKey { fn packet_version(&self) -> Version { self.0.details.packet_version() } fn tag(&self) -> Tag { Tag::SecretKey } } impl PacketTrait for SecretSubkey { fn packet_version(&self) -> Version { self.0.details.packet_version() } fn tag(&self) -> Tag { Tag::SecretSubkey } } impl PublicKeyTrait for SecretKey { fn verify_signature( &self, hash: HashAlgorithm, hashed: &[u8], sig: &SignatureBytes, ) -> Result<()> { PublicKeyTrait::verify_signature(&self.0, hash, hashed, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { PublicKeyTrait::encrypt(&self.0, rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> Result<()> { PublicKeyTrait::serialize_for_hashing(&self.0, writer) } fn public_params(&self) -> &PublicParams { PublicKeyTrait::public_params(&self.0) } fn version(&self) -> KeyVersion { PublicKeyTrait::version(&self.0) } fn fingerprint(&self) -> Fingerprint { PublicKeyTrait::fingerprint(&self.0) } fn key_id(&self) -> KeyId { PublicKeyTrait::key_id(&self.0) } fn algorithm(&self) -> PublicKeyAlgorithm { PublicKeyTrait::algorithm(&self.0) } fn created_at(&self) -> &chrono::DateTime { PublicKeyTrait::created_at(&self.0) } fn expiration(&self) -> Option { PublicKeyTrait::expiration(&self.0) } } impl PublicKeyTrait for SecretSubkey { fn verify_signature( &self, hash: HashAlgorithm, hashed: &[u8], sig: &SignatureBytes, ) -> Result<()> { PublicKeyTrait::verify_signature(&self.0, hash, hashed, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { PublicKeyTrait::encrypt(&self.0, rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> Result<()> { PublicKeyTrait::serialize_for_hashing(&self.0, writer) } fn public_params(&self) -> &PublicParams { PublicKeyTrait::public_params(&self.0) } fn version(&self) -> KeyVersion { PublicKeyTrait::version(&self.0) } fn fingerprint(&self) -> Fingerprint { PublicKeyTrait::fingerprint(&self.0) } fn key_id(&self) -> KeyId { PublicKeyTrait::key_id(&self.0) } fn algorithm(&self) -> PublicKeyAlgorithm { PublicKeyTrait::algorithm(&self.0) } fn created_at(&self) -> &chrono::DateTime { PublicKeyTrait::created_at(&self.0) } fn expiration(&self) -> Option { PublicKeyTrait::expiration(&self.0) } } impl PublicKeyTrait for SecretKeyInner { fn verify_signature( &self, hash: HashAlgorithm, hashed: &[u8], sig: &SignatureBytes, ) -> Result<()> { self.details.verify_signature(hash, hashed, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { self.details.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> Result<()> { self.details.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.details.public_params() } fn version(&self) -> KeyVersion { self.details.version() } fn fingerprint(&self) -> Fingerprint { self.details.fingerprint() } fn key_id(&self) -> KeyId { self.details.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.details.algorithm() } fn created_at(&self) -> &chrono::DateTime { self.details.created_at() } fn expiration(&self) -> Option { self.details.expiration() } } impl SecretKey { /// Remove the password protection of the private key material in this secret key packet. /// This permanently "unlocks" the secret key material. /// /// If the Secret Key material in the packet is not locked, it is left unchanged. /// /// The current locking password for this key must be provided in `password`. pub fn remove_password

(&mut self, password: P) -> Result<()> where P: FnOnce() -> String, { self.0.remove_password(password) } /// Set a `password` that "locks" the private key material in this Secret Key packet. /// /// This function uses the default S2K locking mechanism for the key version: /// /// - for V6 keys: `Aead` with `Argon2` derivation, /// - for V4 keys: `Cfb` with iterated and salted derivation of the password. /// /// To change the password on a locked Secret Key packet, it needs to be unlocked /// using [Self::remove_password] before calling this function. pub fn set_password(&mut self, rng: R, password: P) -> Result<()> where R: rand::Rng + rand::CryptoRng, P: FnOnce() -> String, { self.0.set_password(rng, password) } /// Set a `password` that "locks" the private key material in this Secret Key packet /// using the mechanisms specified in `s2k_params`. /// /// To change the password on a locked Secret Key packet, it needs to be unlocked /// using [Self::remove_password] before calling this function. pub fn set_password_with_s2k

( &mut self, password: P, s2k_params: crate::types::S2kParams, ) -> Result<()> where P: FnOnce() -> String, { self.0.set_password_with_s2k(password, s2k_params) } } impl SecretSubkey { /// Remove the password protection of the private key material in this secret key packet. /// This permanently "unlocks" the secret key material. /// /// If the Secret Key material in the packet is not locked, it is left unchanged. /// /// The current locking password for this key must be provided in `password`. pub fn remove_password

(&mut self, password: P) -> Result<()> where P: FnOnce() -> String, { self.0.remove_password(password) } /// Set a `password` that "locks" the private key material in this Secret Key packet. /// /// This function uses the default S2K locking mechanism /// (`Cfb` with iterated and salted derivation of the password). /// /// To change the password on a locked Secret Key packet, it needs to be unlocked /// using [Self::remove_password] before calling this function. pub fn set_password(&mut self, rng: R, password: P) -> Result<()> where R: rand::Rng + rand::CryptoRng, P: FnOnce() -> String, { self.0.set_password(rng, password) } /// Set a `password` that "locks" the private key material in this Secret Key packet /// using the mechanisms specified in `s2k_params`. /// /// To change the password on a locked Secret Key packet, it needs to be unlocked /// using [Self::remove_password] before calling this function. pub fn set_password_with_s2k

( &mut self, password: P, s2k_params: crate::types::S2kParams, ) -> Result<()> where P: FnOnce() -> String, { self.0.set_password_with_s2k(password, s2k_params) } } #[cfg(test)] #[allow(clippy::unwrap_used)] mod tests { use chrono::{SubsecRound, Utc}; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use crate::crypto::hash::HashAlgorithm; use crate::packet::{PublicKey, SecretKey}; use crate::types::{KeyVersion, S2kParams, SecretKeyTrait, Version}; #[test] #[ignore] // slow in debug mode (argon2) fn secret_key_protection_v4() { const DATA: &[u8] = &[0x23, 0x05]; let key_type = crate::KeyType::EdDSALegacy; let mut rng = ChaCha8Rng::seed_from_u64(0); let (public_params, secret_params) = key_type.generate(&mut rng).unwrap(); let mut alice_sec = SecretKey::new( PublicKey::new( Version::New, KeyVersion::V4, key_type.to_alg(), Utc::now().trunc_subsecs(0), None, public_params, ) .unwrap(), secret_params, ); alice_sec .set_password_with_s2k( || "password".to_string(), crate::types::S2kParams::new_default(&mut rng, KeyVersion::V4), ) .unwrap(); // signing with a wrong password should fail assert!(alice_sec .create_signature(|| "wrong".to_string(), HashAlgorithm::default(), DATA) .is_err()); // signing with the right password should succeed assert!(alice_sec .create_signature(|| "password".to_string(), HashAlgorithm::default(), DATA) .is_ok()); // remove the password protection alice_sec .remove_password(|| "password".to_string()) .unwrap(); // signing without a password should succeed now assert!(alice_sec .create_signature(String::default, HashAlgorithm::default(), DATA) .is_ok()); // set different password protection alice_sec .set_password(&mut rng, || "foo".to_string()) .unwrap(); // signing without a password should fail now assert!(alice_sec .create_signature(String::default, HashAlgorithm::default(), DATA) .is_err()); // signing with the right password should succeed assert!(alice_sec .create_signature(|| "foo".to_string(), HashAlgorithm::default(), DATA) .is_ok()); // remove the password protection again alice_sec.remove_password(|| "foo".to_string()).unwrap(); // set password protection with v6 s2k defaults (AEAD+Argon2) alice_sec .set_password_with_s2k( || "bar".to_string(), S2kParams::new_default(&mut rng, KeyVersion::V6), ) .unwrap(); // signing with the right password should succeed assert!(alice_sec .create_signature(|| "bar".to_string(), HashAlgorithm::default(), DATA) .is_ok()); } } pgp-0.15.0/src/packet/key.rs000064400000000000000000000001731046102023000136720ustar 00000000000000mod public; mod secret; pub use self::public::{PublicKey, PublicSubkey}; pub use self::secret::{SecretKey, SecretSubkey}; pgp-0.15.0/src/packet/literal_data.rs000064400000000000000000000117551046102023000155370ustar 00000000000000use std::io; use bstr::{BStr, BString}; use byteorder::{BigEndian, WriteBytesExt}; use chrono::{DateTime, SubsecRound, TimeZone, Utc}; use nom::combinator::{map, map_opt, map_res, rest}; use nom::multi::length_data; use nom::number::streaming::{be_u32, be_u8}; use nom::sequence::tuple; use nom::IResult; use num_enum::{FromPrimitive, IntoPrimitive}; use crate::errors::Result; use crate::line_writer::LineBreak; use crate::normalize_lines::Normalized; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// Literal Data Packet /// #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub struct LiteralData { packet_version: Version, mode: DataMode, /// The filename, may contain non utf-8 bytes file_name: BString, created: DateTime, /// Raw data, stored normalized to CRLF line endings, to make signing and verification /// simpler. #[debug("{}", hex::encode(data))] data: Vec, } #[derive(Debug, Copy, Clone, FromPrimitive, IntoPrimitive, PartialEq, Eq)] #[repr(u8)] pub enum DataMode { Binary = b'b', Text = b't', Utf8 = b'u', Mime = b'm', #[num_enum(catch_all)] Other(u8), } impl LiteralData { /// Creates a literal data packet from the given string. Normalizes line endings. pub fn from_str(file_name: impl Into, raw_data: &str) -> Self { let data = Normalized::new(raw_data.bytes(), LineBreak::Crlf).collect(); LiteralData { packet_version: Version::New, mode: DataMode::Utf8, file_name: file_name.into(), created: Utc::now().trunc_subsecs(0), data, } } /// Creates a literal data packet from the given bytes. pub fn from_bytes(file_name: &BStr, data: &[u8]) -> Self { LiteralData { packet_version: Version::New, mode: DataMode::Binary, file_name: file_name.to_owned(), created: Utc::now().trunc_subsecs(0), data: data.to_owned(), } } /// Parses a `LiteralData` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, pk) = parse(packet_version)(input)?; Ok(pk) } pub fn is_binary(&self) -> bool { matches!(self.mode, DataMode::Binary) } pub fn data(&self) -> &[u8] { &self.data } #[inline] /// Extracts data in to raw data pub fn into_bytes(self) -> Vec { self.data } #[inline] /// Extracts data as string, returning raw bytes as Err if not valid utf-8 string pub fn try_into_string(self) -> Result> { match self.mode { DataMode::Binary => Err(self.data), _ => match String::from_utf8(self.data) { Ok(data) => Ok(data), Err(error) => Err(error.into_bytes()), }, } } /// Convert the data to a UTF-8 string, if appropriate for the type. /// Returns `None` if `mode` is `Binary`, or the data is not valid UTF-8. pub fn to_string(&self) -> Option { match self.mode { DataMode::Binary => None, _ => std::str::from_utf8(&self.data).map(str::to_owned).ok(), } } } impl AsRef<[u8]> for LiteralData { #[inline] fn as_ref(&self) -> &[u8] { &self.data } } impl Serialize for LiteralData { fn to_writer(&self, writer: &mut W) -> Result<()> { let name = &self.file_name; writer.write_u8(self.mode.into())?; writer.write_u8(name.len().try_into()?)?; writer.write_all(name)?; writer.write_u32::(self.created.timestamp().try_into()?)?; // Line endings are stored internally normalized, so we do not need to worry // about changing them here. writer.write_all(&self.data)?; Ok(()) } } fn parse(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], LiteralData> { move |i: &[u8]| { map( tuple(( map_res(be_u8, DataMode::try_from), map(length_data(be_u8), BStr::new::<[u8]>), map_opt(be_u32, |v| Utc.timestamp_opt(i64::from(v), 0).single()), rest, )), |(mode, name, created, data)| LiteralData { packet_version, mode, created, file_name: name.to_owned(), data: data.to_vec(), }, )(i) } } impl PacketTrait for LiteralData { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::LiteralData } } #[test] fn test_utf8_literal() { #![allow(clippy::unwrap_used)] let slogan = "ไธ€้—จ่ต‹ไบˆๆฏไธชไบบๆž„ๅปบๅฏ้ ไธ”้ซ˜ๆ•ˆ่ฝฏไปถ่ƒฝๅŠ›็š„่ฏญ่จ€ใ€‚"; let literal = LiteralData::from_str("", slogan); assert!(String::from_utf8(literal.data).unwrap() == slogan); } pgp-0.15.0/src/packet/many.rs000064400000000000000000000417131046102023000140530ustar 00000000000000use std::io::{BufRead, Read}; use buffer_redux::policy::MinBuffered; use buffer_redux::BufReader; use crate::errors::{Error, Result}; use crate::packet::packet_sum::Packet; use crate::packet::single; use crate::types::{PacketLength, Tag}; use crate::MAX_BUFFER_SIZE; const DEFAULT_CAPACITY: usize = 1024 * 16; const READER_POLICY: MinBuffered = MinBuffered(1024); pub struct PacketParser { reader: BufReader, /// Remember if we are done. done: bool, } impl PacketParser { pub fn new(inner: R) -> Self { PacketParser { reader: BufReader::with_capacity(DEFAULT_CAPACITY, inner).set_policy(READER_POLICY), done: false, } } } impl Iterator for PacketParser { type Item = Result; fn next(&mut self) -> Option { if self.done { return None; } let buf = match self.reader.fill_buf() { Ok(buf) => buf, Err(err) => { self.done = true; return Some(Err(err.into())); } }; // No more data to read if buf.is_empty() { self.done = true; return None; } let buf_len = buf.len(); let (version, tag, packet_length) = match single::parser(buf) { Ok((rest, v)) => { let rest_len = rest.len(); let read = buf_len - rest_len; self.reader.consume(read); v } Err(nom::Err::Incomplete(_)) => { // If incomplete, we are not getting a full header, // minimum input size is checked above. self.done = true; return Some(Err(Error::PacketIncomplete)); } Err(err) => { self.done = true; return Some(Err(err.into())); } }; match packet_length { PacketLength::Indeterminate => { let mut body = Vec::new(); let mut buf = [0u8; 1024]; loop { // limited read_to_end match self.reader.read(&mut buf) { Ok(0) => { break; } Ok(r) => { body.extend_from_slice(&buf[..r]); if body.len() >= MAX_BUFFER_SIZE { self.done = true; return Some(Err(format_err!("Indeterminate packet too large"))); } } Err(err) => { self.done = true; return Some(Err(err.into())); } } } match single::body_parser(version, tag, &body) { Ok(packet) => Some(Ok(packet)), Err(err) => { self.done = true; Some(Err(err)) } } } PacketLength::Fixed(len) => { let res = if len <= self.reader.policy().0 { // small enough to reuse our internal buffer self.reader.make_room(); let body = match self.reader.fill_buf() { Ok(body) => body, Err(err) => { self.done = true; return Some(Err(err.into())); } }; if body.len() < len { return Some(Err(format_err!("invalid length encountered"))); } let res = single::body_parser(version, tag, &body[..len]); self.reader.consume(len); res } else { if len > MAX_BUFFER_SIZE { return Some(Err(format_err!("Fixed packet too large"))); } let mut buffer = vec![0u8; len]; if let Err(err) = self.reader.read_exact(&mut buffer) { self.done = true; return Some(Err(err.into())); }; single::body_parser(version, tag, &buffer) }; match res { Ok(p) => Some(Ok(p)), Err(Error::Incomplete(_)) => { // not bailing, we are just skipping incomplete bodies Some(Err(Error::PacketIncomplete)) } Err(err) => Some(Err(err)), } } PacketLength::Partial(len) => { // https://www.rfc-editor.org/rfc/rfc9580.html#name-partial-body-lengths // "An implementation MAY use Partial Body Lengths for data packets, be // they literal, compressed, or encrypted [...] // Partial Body Lengths MUST NOT be used for any other packet types" if !matches!( tag, Tag::LiteralData | Tag::CompressedData | Tag::SymEncryptedData | Tag::SymEncryptedProtectedData ) { self.done = true; return Some(Err(format_err!( "Partial body length is not allowed for packet type {:?}", tag ))); } // https://www.rfc-editor.org/rfc/rfc9580.html#section-4.2.1.4-5 // "The first partial length MUST be at least 512 octets long." if len < 512 { self.done = true; return Some(Err(format_err!( "Illegal first partial body length {} (shorter than 512 bytes)", len, ))); } // NOTE: len can be at most 1GiB per partial block, so with the current // MAX_BUFFER_SIZE setting, this comparison will never trigger. // // With a configurable/smaller limit, it could, though. // // (NOTE: we're rejecting "== MAX_BUFFER_SIZE" here as well, since this partial // must be followed by more data to form a legal packet.) if len >= MAX_BUFFER_SIZE { return Some(Err(format_err!("First partial of packet is too large"))); } let mut body = vec![0u8; len]; if let Err(err) = self.reader.read_exact(&mut body) { self.done = true; return Some(Err(err.into())); }; // Read n partials + 1 final fixed loop { self.reader.make_room(); let buf = match self.reader.fill_buf() { Ok(buf) => buf, Err(err) => { self.done = true; return Some(Err(err.into())); } }; match single::read_packet_len(buf) { Ok((rest, PacketLength::Partial(len))) => { let read = buf.len() - rest.len(); self.reader.consume(read); if let Err(err) = read_fixed(&mut self.reader, len, &mut body) { self.done = true; return Some(Err(err)); } } Ok((rest, PacketLength::Fixed(len))) => { let read = buf.len() - rest.len(); self.reader.consume(read); if let Err(err) = read_fixed(&mut self.reader, len, &mut body) { self.done = true; return Some(Err(err)); } break; } Ok((_, PacketLength::Indeterminate)) => { self.done = true; return Some(Err(Error::InvalidInput)); } Err(err) => { self.done = true; return Some(Err(err.into())); } } } match single::body_parser(version, tag, &body) { Ok(res) => Some(Ok(res)), Err(Error::Incomplete(_)) => { // not bailing, we are just skipping incomplete bodies Some(Err(Error::PacketIncomplete)) } Err(err) => { self.done = true; Some(Err(err)) } } } } } } fn read_fixed( reader: &mut BufReader, len: usize, out: &mut Vec, ) -> Result<()> { let out_len = out.len(); if out_len + len > MAX_BUFFER_SIZE { return Err(format_err!("Packet too large")); } out.resize(out_len + len, 0u8); reader.read_exact(&mut out[out_len..])?; Ok(()) } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use std::fs::File; use std::io::{BufReader, Seek, SeekFrom}; use std::path::Path; use regex::Regex; use super::*; use crate::ser::Serialize; #[test] #[ignore] fn test_packet_roundtrip_0001() { packet_roundtrip( "0001", vec![ (556, 6 + 2224), (805, 6 + 95), (806, 6 + 6495), (1027, 6 + 6246), (1074, 2490), (1331, 838), (1898, 6420), (1935, 3583), ], ) } #[test] #[ignore] fn test_packet_roundtrip_0002() { packet_roundtrip( "0002", vec![ (82, 199), // invalid hash alg 06 (85, 196), // invalid hash alg 06 (836, 3136), // non canonical length encoding (1200, 2772), // non canonical length encoding (1268, 1223), // non canonical length encoding (1670, 3419), // non canonical length encoding ], ) } #[test] #[ignore] fn test_packet_roundtrip_0009() { packet_roundtrip( "0009", vec![ (37, 3960), // non canonical length encoding (39, 3960), // non canonical length encoding (258, 75), // non canonical length encoding (260, 78), // non canonical length encoding (1053, 3181), // non canonical length encoding (1473, 5196), // non canonical length encoding (1895, 4243), // non canonical length encoding ], ) } fn packet_roundtrip(dump: &str, skips: Vec<(usize, i64)>) { let _ = pretty_env_logger::try_init(); let path = format!("./tests/tests/sks-dump/{dump}.pgp"); let p = Path::new(&path); let file = File::open(p).unwrap(); let mut bytes = File::open(p).unwrap(); let packets = PacketParser::new(file); for (i, packet) in packets.take(2000).enumerate() { // packets we need to skip, because we can not roundtrip them for some reason if let Some((_, size)) = skips.iter().find(|(j, _)| *j == i) { bytes.seek(SeekFrom::Current(*size)).unwrap(); continue; } let packet = packet.expect("invalid packet"); let mut buf = Vec::new(); packet .to_writer(&mut buf) .expect("failed to serialize packet"); let mut expected_buf = vec![0u8; buf.len()]; assert_eq!(bytes.read(&mut expected_buf).unwrap(), buf.len()); // println!("\n-- packet: {} expected size: {}", i, expected_buf.len()); if buf != expected_buf { assert_eq!(hex::encode(buf), hex::encode(expected_buf)); } } } #[test] #[ignore] fn test_many_parser() { let _ = pretty_env_logger::try_init(); let p = Path::new("./tests/tests/sks-dump/0000.pgp"); let file = File::open(p).unwrap(); // list of expected tags // this file is built by // `gpg --list-packets tests/tests/sks-dump/0000.pgp` let fixture = File::open("./tests/tests/sks-dump/0000_parsed.txt").unwrap(); let re = Regex::new(r"^#\soff=(\d+)\sctb=[[:alpha:]\d]+\stag=(\d+)\s.*").unwrap(); let expected_tags = BufReader::new(fixture) .lines() .filter(|line| line.as_ref().unwrap().starts_with("# off")) .map(|line| { let (offset, tag) = { let cap = re.captures(line.as_ref().unwrap()).unwrap(); (cap[1].to_string(), cap[2].to_string()) }; (offset, tag, line) }) .filter(|(offset, _, _)| { // skip certain packages we are not (yet) parsing offset != "1193538" && // invalid mpi offset != "5053086" && // invalid mpi offset != "9758352" && // TODO: unclear why this sig fails to parse offset != "9797527" && // TODO: unclear why this sig fails to parse offset != "24798372" && // TODO: unclear why this public sub key fails to parse offset != "24810682" && // bad attribute size offset != "38544535" // bad attribute size }); let actual_tags = PacketParser::new(file).filter(|p| p.is_ok()); for ((_offset, tag, e), packet) in expected_tags.zip(actual_tags) { let e = e.as_ref().unwrap(); let packet = packet.unwrap(); // println!("\n-- checking: {:?} {}", packet.tag(), e); let tag: Tag = u8::into(tag.parse().unwrap()); assert_eq!(tag, packet.tag(), "mismatch in packet {:?} ({})", p, e); } } #[test] fn incomplete_packet_parser() { let _ = pretty_env_logger::try_init(); let bytes: [u8; 1] = [0x97]; let parser = PacketParser::new(&bytes[..]); let mut packets = parser.filter_map(|p| { // for now we are skipping any packets that we failed to parse match p { Ok(pp) => Some(pp), Err(err) => { log::warn!("skipping packet: {:?}", err); None } } }); assert!(packets.next().is_none()); } #[test] fn test_partial_length_encoding() { let _ = pretty_env_logger::try_init(); use crate::{Deserializable, Message}; const TEXT: &str = "Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.\n"; for msg_file in [ // Literal Data Packet with two octet length encoding "./tests/unit-tests/partial-body-length/literal.packet-two-octet-length.asc", // Literal Data Packet with first partial length of 512 bytes, followed by a part with five octet length encoding "./tests/unit-tests/partial-body-length/literal.packet-partial.512.asc", ] { let (message, _headers) = Message::from_armor_single(File::open(msg_file).unwrap()) .expect("failed to parse message"); let Message::Literal(data) = &message else { panic!("expected Literal") }; assert_eq!(data.data(), TEXT.as_bytes()); } // Literal Data Packet with illegal first partial length of 256 bytes let res = Message::from_armor_single( File::open("./tests/unit-tests/partial-body-length/literal.packet-partial.256.asc") .unwrap(), ); assert!(res.is_err()); } } pgp-0.15.0/src/packet/marker.rs000064400000000000000000000020231046102023000143570ustar 00000000000000use std::io; use crate::errors::Result; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// PGP as UTF-8 octets. const PGP: [u8; 3] = [0x50, 0x47, 0x50]; /// Marker Packet /// #[derive(Debug, Clone, PartialEq, Eq)] pub struct Marker { packet_version: Version, } impl Marker { /// Parses a `Marker` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { ensure_eq!(input, &PGP[..], "invalid input"); Ok(Marker { packet_version }) } pub fn packet_version(&self) -> Version { self.packet_version } } impl Serialize for Marker { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_all(&PGP[..])?; Ok(()) } } impl PacketTrait for Marker { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::Marker } } pgp-0.15.0/src/packet/mod.rs000064400000000000000000000073531046102023000136700ustar 00000000000000//! # Packet module //! //! Handles everything in relationship to packets. //! //! [Key generation] is handled separately as well as //! [signing and verifying with external hashing] applied. //! //! [Key generation]: super::composed::key //! [signing and verifying with external hashing]: super::composed::signed_key //! //! ```rust //! # const DATA :&'static [u8] = b"Hello World"; //! # use rand::thread_rng; //! # use pgp::composed::{self, KeyType, KeyDetails, SecretKey, SecretSubkey, key::SecretKeyParamsBuilder}; //! # use pgp::errors::Result; //! # use pgp::packet::{self, KeyFlags, UserAttribute, SignatureVersionSpecific, UserId}; //! use pgp::crypto::{self, sym::SymmetricKeyAlgorithm, hash::HashAlgorithm, public_key::PublicKeyAlgorithm}; //! use pgp::types::{self, PublicKeyTrait, SecretKeyTrait, CompressionAlgorithm}; //! use smallvec::*; //! # //! # let mut key_params = SecretKeyParamsBuilder::default(); //! # key_params //! # .key_type(KeyType::Rsa(2048)) //! # .can_certify(false) //! # .can_sign(true) //! # .primary_user_id("Me ".into()) //! # .preferred_symmetric_algorithms(smallvec![ //! # SymmetricKeyAlgorithm::AES256, //! # ]) //! # .preferred_hash_algorithms(smallvec![ //! # HashAlgorithm::SHA2_256, //! # ]) //! # .preferred_compression_algorithms(smallvec![ //! # CompressionAlgorithm::ZLIB, //! # ]); //! # let secret_key_params = key_params.build().expect("Must be able to create secret key params"); //! # let secret_key = secret_key_params.generate(thread_rng()).expect("Failed to generate a plain key."); //! # let passwd_fn = || String::new(); //! # let signed_secret_key = secret_key.sign(&mut thread_rng(), passwd_fn).expect("Must be able to sign its own metadata"); //! # let public_key = signed_secret_key.public_key(); //! use pgp::packet::{Signature, SignatureConfig}; //! //! let signing_key = signed_secret_key; //! let verification_key = public_key; //! //! //! let passwd_fn = || String::new(); //! //! let now = chrono::Utc::now(); //! //! let mut sig_cfg = SignatureConfig::v4(packet::SignatureType::Binary, PublicKeyAlgorithm::RSA, HashAlgorithm::SHA2_256); //! sig_cfg.hashed_subpackets = vec![ //! packet::Subpacket::regular(packet::SubpacketData::SignatureCreationTime(now)), //! packet::Subpacket::regular(packet::SubpacketData::Issuer(signing_key.key_id())), //! ]; //! //! let signature_packet = sig_cfg //! .sign(&signing_key, passwd_fn, DATA) //! .expect("Should sign"); //! //! let mut signature_bytes = Vec::with_capacity(1024); //! packet::write_packet(&mut signature_bytes, &signature_packet).expect("Write must succeed"); //! //! signature_packet //! .verify(&verification_key, DATA) //! .expect("Failed to validate signature"); //! ``` mod many; mod packet_sum; mod single; mod compressed_data; mod key; mod literal_data; mod marker; mod mod_detection_code; mod one_pass_signature; mod padding; mod public_key_encrypted_session_key; mod signature; mod sym_encrypted_data; mod sym_encrypted_protected_data; mod sym_key_encrypted_session_key; mod trust; mod user_attribute; mod user_id; mod public_key_parser; mod secret_key_parser; pub use self::compressed_data::*; pub use self::key::*; pub use self::literal_data::*; pub use self::many::*; pub use self::marker::*; pub use self::mod_detection_code::*; pub use self::one_pass_signature::*; pub use self::packet_sum::*; pub use self::padding::*; pub use self::public_key_encrypted_session_key::*; pub use self::signature::*; pub use self::sym_encrypted_data::*; pub use self::sym_encrypted_protected_data::Data; pub use self::sym_encrypted_protected_data::*; pub use self::sym_key_encrypted_session_key::*; pub use self::trust::*; pub use self::user_attribute::*; pub use self::user_id::*; pgp-0.15.0/src/packet/mod_detection_code.rs000064400000000000000000000033351046102023000167140ustar 00000000000000use std::io; use crate::errors::Result; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// Modification Detection Code Packet /// /// /// Also see : /// /// "Modification Detection Code" or "MDC" was originally described as a distinct packet /// (Packet Type ID 19), and its corresponding flag in the Features signature subpacket /// (Section 5.2.3.32) was known as "Modification Detection". /// It is now described as an intrinsic part of v1 SEIPD (Section 5.13.1), and the same /// corresponding flag is known as "Version 1 Symmetrically Encrypted and Integrity Protected /// Data packet". #[derive(derive_more::Debug, Clone, PartialEq, Eq)] pub struct ModDetectionCode { packet_version: Version, /// 20 byte SHA1 hash of the preceding plaintext data. #[debug("{}", hex::encode(hash))] hash: [u8; 20], } impl ModDetectionCode { /// Parses a `ModDetectionCode` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { ensure_eq!(input.len(), 20, "invalid input len"); let mut hash = [0u8; 20]; hash.copy_from_slice(input); Ok(ModDetectionCode { packet_version, hash, }) } } impl Serialize for ModDetectionCode { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_all(&self.hash[..])?; Ok(()) } } impl PacketTrait for ModDetectionCode { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::ModDetectionCode } } pgp-0.15.0/src/packet/one_pass_signature.rs000064400000000000000000000144461046102023000170020ustar 00000000000000use std::io; use byteorder::WriteBytesExt; use nom::bytes::streaming::take; use nom::combinator::{map, map_res}; use nom::number::streaming::be_u8; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::{IResult, Result}; use crate::packet::signature::SignatureType; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{KeyId, Tag, Version}; /// One-Pass Signature Packet /// /// /// A One-Pass Signature Packet acts as a companion to a Signature Packet. In modern OpenPGP /// messages, Ops and Signatures occur in pairs, bracketing the message payload. /// /// The Ops packet contains all the information that a recipient needs to calculate the hash /// digest for the signature. This enables the recipient to process the message in "one pass", /// calculating the hash digest based on the Ops Packet (which occurs before the message payload), /// and validating the cryptographic signature in the Signature Packet (which occurs after the /// message payload) after hashing is completed. #[derive(derive_more::Debug, Clone, PartialEq, Eq)] pub struct OnePassSignature { pub packet_version: Version, pub typ: SignatureType, pub hash_algorithm: HashAlgorithm, pub pub_algorithm: PublicKeyAlgorithm, pub last: u8, pub version_specific: OpsVersionSpecific, } /// Version-specific elements of a One-Pass Signature Packet: /// /// - A v3 OPS contains the `key_id` of the signer. /// - A v6 OPS contains the v6 `fingerprint` of the signer, and the `salt` used in the corresponding /// signature packet. #[derive(derive_more::Debug, Clone, PartialEq, Eq)] pub enum OpsVersionSpecific { V3 { key_id: KeyId, }, V6 { salt: Vec, fingerprint: [u8; 32], }, } impl OnePassSignature { pub fn version(&self) -> u8 { match self.version_specific { OpsVersionSpecific::V3 { .. } => 3, OpsVersionSpecific::V6 { .. } => 6, } } } impl OnePassSignature { /// Parses a `OnePassSignature` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, pk) = parse(packet_version)(input)?; Ok(pk) } /// Constructor for a v3 one pass signature packet. /// /// RFC 4880-era OpenPGP uses v3 one pass signature packets (NOTE: there is no v4 OPS) /// /// "When generating a one-pass signature, the OPS packet version MUST correspond to the /// version of the associated Signature packet, except for the historical accident that version /// 4 keys use a version 3 One-Pass Signature packet (there is no version 4 OPS)." /// /// pub fn v3( typ: SignatureType, hash_algorithm: HashAlgorithm, pub_algorithm: PublicKeyAlgorithm, key_id: KeyId, ) -> Self { OnePassSignature { packet_version: Default::default(), typ, hash_algorithm, pub_algorithm, last: 1, version_specific: OpsVersionSpecific::V3 { key_id }, } } /// Constructor for a v6 one pass signature packet. /// /// Version 6 OpenPGP signatures must be combined with v6 one pass signature packets. /// /// pub fn v6( typ: SignatureType, hash_algorithm: HashAlgorithm, pub_algorithm: PublicKeyAlgorithm, salt: Vec, fingerprint: [u8; 32], ) -> Self { OnePassSignature { packet_version: Default::default(), typ, hash_algorithm, pub_algorithm, last: 1, version_specific: OpsVersionSpecific::V6 { salt, fingerprint }, } } } fn parse(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], OnePassSignature> { move |i: &[u8]| { let (i, version) = be_u8(i)?; let (i, typ) = map_res(be_u8, SignatureType::try_from)(i)?; let (i, hash_algorithm) = map(be_u8, HashAlgorithm::from)(i)?; let (i, pub_algorithm) = map(be_u8, PublicKeyAlgorithm::from)(i)?; let (i, version_specific) = match version { 3 => { let (i, key_id) = map_res(take(8usize), KeyId::from_slice)(i)?; (i, OpsVersionSpecific::V3 { key_id }) } 6 => { let (i, salt_len) = be_u8(i)?; let (i, salt) = map(take(salt_len), |salt: &[u8]| salt.to_vec())(i)?; let (i, fingerprint) = map_res(take(32usize), TryInto::try_into)(i)?; (i, OpsVersionSpecific::V6 { salt, fingerprint }) } _ => { return Err(nom::Err::Error(crate::errors::Error::Unsupported(format!( "Unsupported one pass signature packet version {version}", )))) } }; let (i, last) = be_u8(i)?; let ops = OnePassSignature { packet_version, typ, hash_algorithm, pub_algorithm, last, version_specific, }; Ok((i, ops)) } } impl Serialize for OnePassSignature { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_u8(self.version())?; writer.write_u8(self.typ.into())?; writer.write_u8(self.hash_algorithm.into())?; writer.write_u8(self.pub_algorithm.into())?; // salt, if v6 if let OpsVersionSpecific::V6 { salt, .. } = &self.version_specific { writer.write_u8(salt.len().try_into()?)?; writer.write_all(salt)?; } match &self.version_specific { OpsVersionSpecific::V3 { key_id } => { writer.write_all(key_id.as_ref())?; } OpsVersionSpecific::V6 { fingerprint, .. } => { writer.write_all(fingerprint.as_ref())?; } } writer.write_u8(self.last)?; Ok(()) } } impl PacketTrait for OnePassSignature { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::OnePassSignature } } pgp-0.15.0/src/packet/packet_sum.rs000064400000000000000000000143641046102023000152440ustar 00000000000000use std::io; use log::debug; use crate::errors::Result; use crate::packet::{ CompressedData, LiteralData, Marker, ModDetectionCode, OnePassSignature, Padding, PublicKey, PublicKeyEncryptedSessionKey, PublicSubkey, SecretKey, SecretSubkey, Signature, SymEncryptedData, SymEncryptedProtectedData, SymKeyEncryptedSessionKey, Trust, UserAttribute, UserId, }; use crate::ser::Serialize; use crate::types::{Tag, Version}; #[derive(Debug)] #[allow(clippy::large_enum_variant)] // TODO: fix me pub enum Packet { CompressedData(CompressedData), PublicKey(PublicKey), PublicSubkey(PublicSubkey), SecretKey(SecretKey), SecretSubkey(SecretSubkey), LiteralData(LiteralData), Marker(Marker), ModDetectionCode(ModDetectionCode), OnePassSignature(OnePassSignature), PublicKeyEncryptedSessionKey(PublicKeyEncryptedSessionKey), Signature(Signature), SymEncryptedData(SymEncryptedData), SymEncryptedProtectedData(SymEncryptedProtectedData), SymKeyEncryptedSessionKey(SymKeyEncryptedSessionKey), Trust(Trust), UserAttribute(UserAttribute), UserId(UserId), Padding(Padding), } impl Packet { /// Returns the tag for this packet type. pub fn tag(&self) -> Tag { match self { Packet::CompressedData(_) => Tag::CompressedData, Packet::PublicKey(_) => Tag::PublicKey, Packet::PublicSubkey(_) => Tag::PublicSubkey, Packet::SecretKey(_) => Tag::SecretKey, Packet::SecretSubkey(_) => Tag::SecretSubkey, Packet::LiteralData(_) => Tag::LiteralData, Packet::Marker(_) => Tag::Marker, Packet::ModDetectionCode(_) => Tag::ModDetectionCode, Packet::OnePassSignature(_) => Tag::OnePassSignature, Packet::PublicKeyEncryptedSessionKey(_) => Tag::PublicKeyEncryptedSessionKey, Packet::Signature(_) => Tag::Signature, Packet::SymEncryptedData(_) => Tag::SymEncryptedData, Packet::SymEncryptedProtectedData(_) => Tag::SymEncryptedProtectedData, Packet::SymKeyEncryptedSessionKey(_) => Tag::SymKeyEncryptedSessionKey, Packet::Trust(_) => Tag::Trust, Packet::UserAttribute(_) => Tag::UserAttribute, Packet::UserId(_) => Tag::UserId, Packet::Padding(_) => Tag::Padding, } } pub fn packet_version(&self) -> Version { match self { Packet::CompressedData(p) => p.packet_version(), Packet::PublicKey(p) => p.packet_version(), Packet::PublicSubkey(p) => p.packet_version(), Packet::SecretKey(p) => p.packet_version(), Packet::SecretSubkey(p) => p.packet_version(), Packet::LiteralData(p) => p.packet_version(), Packet::Marker(p) => p.packet_version(), Packet::ModDetectionCode(p) => p.packet_version(), Packet::OnePassSignature(p) => p.packet_version(), Packet::PublicKeyEncryptedSessionKey(p) => p.packet_version(), Packet::Signature(p) => p.packet_version(), Packet::SymEncryptedData(p) => p.packet_version(), Packet::SymEncryptedProtectedData(p) => p.packet_version(), Packet::SymKeyEncryptedSessionKey(p) => p.packet_version(), Packet::Trust(p) => p.packet_version(), Packet::UserAttribute(p) => p.packet_version(), Packet::UserId(p) => p.packet_version(), Packet::Padding(p) => p.packet_version(), } } } impl_try_from_into!( Packet, CompressedData => CompressedData, PublicKey => PublicKey, PublicSubkey => PublicSubkey, SecretKey => SecretKey, SecretSubkey => SecretSubkey, LiteralData => LiteralData, Marker => Marker, ModDetectionCode => ModDetectionCode, OnePassSignature => OnePassSignature, PublicKeyEncryptedSessionKey => PublicKeyEncryptedSessionKey, Signature => Signature, SymEncryptedData => SymEncryptedData, SymEncryptedProtectedData => SymEncryptedProtectedData, SymKeyEncryptedSessionKey => SymKeyEncryptedSessionKey, Trust => Trust, UserAttribute => UserAttribute, UserId => UserId, Padding => Padding ); // TODO: move to its own file impl Serialize for Packet { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { Packet::CompressedData(p) => write_packet(writer, &p), Packet::PublicKey(p) => write_packet(writer, &p), Packet::PublicSubkey(p) => write_packet(writer, &p), Packet::SecretKey(p) => write_packet(writer, &p), Packet::SecretSubkey(p) => write_packet(writer, &p), Packet::LiteralData(p) => write_packet(writer, &p), Packet::Marker(p) => write_packet(writer, &p), Packet::ModDetectionCode(p) => write_packet(writer, &p), Packet::OnePassSignature(p) => write_packet(writer, &p), Packet::PublicKeyEncryptedSessionKey(p) => write_packet(writer, &p), Packet::Signature(p) => write_packet(writer, &p), Packet::SymEncryptedData(p) => write_packet(writer, &p), Packet::SymEncryptedProtectedData(p) => write_packet(writer, &p), Packet::SymKeyEncryptedSessionKey(p) => write_packet(writer, &p), Packet::Trust(p) => write_packet(writer, &p), Packet::UserAttribute(p) => write_packet(writer, &p), Packet::UserId(p) => write_packet(writer, &p), Packet::Padding(p) => write_packet(writer, &p), } } } pub trait PacketTrait: Serialize { fn packet_version(&self) -> Version; fn tag(&self) -> Tag; } impl<'a, T: 'a + PacketTrait> PacketTrait for &'a T { fn packet_version(&self) -> Version { (*self).packet_version() } fn tag(&self) -> Tag { (*self).tag() } } pub fn write_packet(writer: &mut impl io::Write, packet: &impl PacketTrait) -> Result<()> { let packet_version = packet.packet_version(); let mut buf = Vec::new(); packet.to_writer(&mut buf)?; debug!( "write_packet {:?} {:?} (len: {})", &packet_version, packet.tag(), buf.len() ); // header packet_version.write_header(writer, packet.tag().into(), buf.len())?; // the actual packet body writer.write_all(&buf)?; Ok(()) } pgp-0.15.0/src/packet/padding.rs000064400000000000000000000053601046102023000145130ustar 00000000000000use std::io; use rand::{CryptoRng, RngCore}; use crate::errors::Result; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// Padding Packet /// /// #[derive(derive_more::Debug, Clone, PartialEq, Eq)] pub struct Padding { packet_version: Version, /// Random data. #[debug("{}", hex::encode(data))] data: Vec, } impl Padding { /// Parses a `Padding` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { Ok(Padding { packet_version, data: input.to_vec(), }) } /// Create a new padding packet of `size` in bytes. pub fn new(mut rng: R, packet_version: Version, size: usize) -> Self { let mut data = vec![0u8; size]; rng.fill_bytes(&mut data); Padding { packet_version, data, } } pub fn packet_version(&self) -> Version { self.packet_version } } impl Serialize for Padding { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_all(&self.data)?; Ok(()) } } impl PacketTrait for Padding { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::Padding } } #[cfg(test)] mod tests { use rand::SeedableRng; use rand_chacha::ChaCha20Rng; use super::super::single; use super::*; use crate::packet::Packet; use crate::types::PacketLength; #[test] fn test_padding_roundtrip() { let packet_raw = hex::decode("d50ec5a293072991628147d72c8f86b7").expect("valid hex"); let (rest, (version, tag, plen)) = single::parser(&packet_raw).expect("parse"); let PacketLength::Fixed(len) = plen else { panic!("invalid parse result"); }; assert_eq!(rest.len(), len); let full_packet = single::body_parser(version, tag, &rest[..len]).expect("body parse"); let Packet::Padding(ref packet) = full_packet else { panic!("invalid packet: {:?}", full_packet); }; assert_eq!( packet.data, hex::decode("c5a293072991628147d72c8f86b7").expect("valid hex") ); // encode let encoded = full_packet.to_bytes().expect("encode"); assert_eq!(encoded, packet_raw); } #[test] fn test_padding_new() { let mut rng = ChaCha20Rng::seed_from_u64(1); let packet = Padding::new(&mut rng, Version::New, 20); assert_eq!(packet.data.len(), 20); let encoded = packet.to_bytes().expect("encode"); assert_eq!(encoded, packet.data); } } pgp-0.15.0/src/packet/public_key_encrypted_session_key.rs000064400000000000000000000505751046102023000217330ustar 00000000000000use std::io; use byteorder::WriteBytesExt; use nom::bytes::streaming::take; use nom::combinator::{map, map_res}; use nom::number::streaming::be_u8; use nom::sequence::pair; use rand::{CryptoRng, Rng}; use zeroize::Zeroizing; use crate::crypto::checksum; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{IResult, Result}; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{ mpi, EskType, Fingerprint, KeyId, KeyVersion, PkeskBytes, PkeskVersion, PublicKeyTrait, PublicParams, Tag, Version, }; /// Public Key Encrypted Session Key Packet (PKESK) /// /// /// A PKESK contains an encrypted session key that has been encrypted to a specific public key. /// PKESK are used in combination with a symmetric encryption container: /// /// - V3 PKESK are used in combination with [version 1 Symmetrically Encrypted and Integrity /// Protected Data Packets](https://www.rfc-editor.org/rfc/rfc9580.html#name-version-1-symmetrically-enc). /// - V6 PKESK are used in combination with [version 2 Symmetrically Encrypted and Integrity /// Protected Data Packets](https://www.rfc-editor.org/rfc/rfc9580.html#name-version-2-symmetrically-enc). #[derive(Debug, Clone, PartialEq, Eq)] pub enum PublicKeyEncryptedSessionKey { V3 { packet_version: Version, id: KeyId, pk_algo: PublicKeyAlgorithm, values: PkeskBytes, }, V6 { packet_version: Version, fingerprint: Option, pk_algo: PublicKeyAlgorithm, values: PkeskBytes, }, Other { packet_version: Version, version: u8, }, } impl PublicKeyEncryptedSessionKey { /// Parses a `PublicKeyEncryptedSessionKey` packet from the given slice. pub fn from_slice(version: Version, input: &[u8]) -> Result { let (_, pk) = parse(version)(input)?; Ok(pk) } /// Prepare the session key data for encryption in a PKESK. /// /// See fn prepare_session_key_for_encryption( alg: Option, // set for pkesk v3 sk: &[u8], pp: &PublicParams, ) -> Zeroizing> { let mut data = Zeroizing::new(Vec::with_capacity(1 + sk.len() + 2)); // max required capacity (for v3 and not-x22519/449) // Prefix session key with symmetric key algorithm (for v3 PKESK) if let Some(alg) = alg { data.push(u8::from(alg)); } // Add the raw session key data data.extend_from_slice(sk); // Appended a checksum of the session key (except for X25519 and X448) match pp { PublicParams::X25519 { .. } => {} #[cfg(feature = "unstable-curve448")] PublicParams::X448 { .. } => {} _ => data.extend_from_slice(&checksum::calculate_simple(sk).to_be_bytes()), } data } /// Encrypts the given session key to `pkey` as a v3 pkesk. pub fn from_session_key_v3( rng: R, session_key: &[u8], alg: SymmetricKeyAlgorithm, pkey: &impl PublicKeyTrait, ) -> Result { // the symmetric key algorithm, the session key, and a checksum (for some algorithms) let data = Self::prepare_session_key_for_encryption(Some(alg), session_key, pkey.public_params()); let values = pkey.encrypt(rng, &data, EskType::V3_4)?; Ok(PublicKeyEncryptedSessionKey::V3 { packet_version: Default::default(), id: pkey.key_id(), pk_algo: pkey.algorithm(), values, }) } /// Encrypts the given session key to `pkey` as a v6 pkesk. pub fn from_session_key_v6( rng: R, session_key: &[u8], pkey: &impl PublicKeyTrait, ) -> Result { // "An implementation MUST NOT generate ElGamal v6 PKESK packets." // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-5.1.4-6) if pkey.algorithm() == PublicKeyAlgorithm::Elgamal { bail!("ElGamal is not a legal encryption mechanism for v6 PKESK"); } // the session key, and a checksum (for some algorithms) let data = Self::prepare_session_key_for_encryption(None, session_key, pkey.public_params()); let values = pkey.encrypt(rng, &data, EskType::V6)?; Ok(PublicKeyEncryptedSessionKey::V6 { packet_version: Default::default(), fingerprint: Some(pkey.fingerprint()), pk_algo: pkey.algorithm(), values, }) } /// Check if a Key matches with this PKESK's target /// - for v3: is PKESK key id the wildcard, or does it match the key id of `pkey`? /// - for v6: is PKESK fingerprint the wildcard (represented as `None`), or does it match the fingerprint of `pkey`? pub fn match_identity(&self, pkey: &impl PublicKeyTrait) -> bool { match self { Self::V3 { id, .. } => id.is_wildcard() || (id == &pkey.key_id()), Self::V6 { fingerprint, .. } => { if let Some(fingerprint) = fingerprint { fingerprint == &pkey.fingerprint() } else { true // wildcard always matches } } _ => false, } } /// The Key ID in this PKESK. Only available for v3 PKESK (the function returns an Error for v6 PKESK). /// /// The Key ID may consist of all Zero-Bytes (if the PKESK was created for an anonymous recipient). /// /// See pub fn id(&self) -> Result<&KeyId> { match self { Self::V3 { id, .. } => Ok(id), _ => bail!("KeyID is only available for V3 PKESK"), } } /// The Fingerprint in this PKESK. Only available for v6 PKESK (the function returns an Error for v3 PKESK). /// /// Additionally, the Fingerprint may be `None` (if the PKESK was created for an anonymous recipient). /// /// See pub fn fingerprint(&self) -> Result> { match self { Self::V6 { fingerprint, .. } => Ok(fingerprint.as_ref()), _ => bail!("Fingerprint is only available for V6 PKESK"), } } /// The raw encrypted session key data inside this PKESK. /// This data is algorithm specific. /// /// See /// and the following sections. pub fn values(&self) -> Result<&PkeskBytes> { match self { Self::V3 { values, .. } | Self::V6 { values, .. } => Ok(values), Self::Other { version, .. } => bail!("Unsupported PKESK version {}", version), } } /// The public key algorithm used in this PKESK. /// /// An error is returned for unsupported PKESK versions (any version except "3" and "6"). pub fn algorithm(&self) -> Result { match self { Self::V3 { pk_algo, .. } | Self::V6 { pk_algo, .. } => Ok(*pk_algo), _ => bail!("PublicKeyAlgorithm unknown for {:?}", self), } } /// The version of this PKESK (currently "3" and "6" are expected values) pub fn version(&self) -> PkeskVersion { match self { Self::V3 { .. } => PkeskVersion::V3, Self::V6 { .. } => PkeskVersion::V6, Self::Other { version, .. } => PkeskVersion::Other(*version), } } } fn parse_esk<'i>( alg: &PublicKeyAlgorithm, i: &'i [u8], version: u8, ) -> IResult<&'i [u8], PkeskBytes> { match alg { PublicKeyAlgorithm::RSA | PublicKeyAlgorithm::RSASign | PublicKeyAlgorithm::RSAEncrypt => { map(mpi, |v| PkeskBytes::Rsa { mpi: v.to_owned() })(i) } PublicKeyAlgorithm::Elgamal | PublicKeyAlgorithm::ElgamalSign => { map(pair(mpi, mpi), |(first, second)| PkeskBytes::Elgamal { first: first.to_owned(), second: second.to_owned(), })(i) } PublicKeyAlgorithm::ECDSA | PublicKeyAlgorithm::DSA | PublicKeyAlgorithm::DiffieHellman => { Ok((i, PkeskBytes::Other)) } PublicKeyAlgorithm::ECDH => { let (i, a) = mpi(i)?; let (i, blen) = be_u8(i)?; let (i, b) = take(blen)(i)?; Ok(( i, PkeskBytes::Ecdh { public_point: a.to_owned(), encrypted_session_key: b.into(), }, )) } PublicKeyAlgorithm::X25519 => { // 32 octets representing an ephemeral X25519 public key. let (i, ephemeral_public) = nom::bytes::complete::take(32u8)(i)?; // A one-octet size of the following fields. let (i, len) = be_u8(i)?; if len == 0 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } // The one-octet algorithm identifier, if it was passed (in the case of a v3 PKESK packet). let (i, sym_alg) = if version == 3 { map(be_u8, SymmetricKeyAlgorithm::from)(i).map(|(i, alg)| (i, Some(alg)))? } else { (i, None) }; let skey_len = if version == 3 { len - 1 } else { len }; // The encrypted session key. let (i, esk) = nom::bytes::complete::take(skey_len)(i)?; Ok(( i, PkeskBytes::X25519 { ephemeral: ephemeral_public.try_into().expect("32"), sym_alg, session_key: esk.to_vec(), }, )) } #[cfg(feature = "unstable-curve448")] PublicKeyAlgorithm::X448 => { // 56 octets representing an ephemeral X448 public key. let (i, ephemeral_public) = nom::bytes::complete::take(56u8)(i)?; // A one-octet size of the following fields. let (i, len) = be_u8(i)?; if len == 0 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } // The one-octet algorithm identifier, if it was passed (in the case of a v3 PKESK packet). let (i, sym_alg) = if version == 3 { map(be_u8, SymmetricKeyAlgorithm::from)(i).map(|(i, alg)| (i, Some(alg)))? } else { (i, None) }; let skey_len = if version == 3 { len - 1 } else { len }; // The encrypted session key. let (i, esk) = nom::bytes::complete::take(skey_len)(i)?; Ok(( i, PkeskBytes::X448 { ephemeral: ephemeral_public.try_into().expect("56"), sym_alg, session_key: esk.to_vec(), }, )) } PublicKeyAlgorithm::Unknown(_) => Ok((i, PkeskBytes::Other)), // we don't know the format of this data _ => Err(nom::Err::Error(crate::errors::Error::ParsingError( nom::error::ErrorKind::Switch, ))), } } /// Parses a Public-Key Encrypted Session Key Packets. fn parse( packet_version: Version, ) -> impl Fn(&[u8]) -> IResult<&[u8], PublicKeyEncryptedSessionKey> { move |i: &[u8]| { // version, 3 and 6 are allowed let (i, version) = be_u8(i)?; if version == 3 { // the key id this maps to let (i, id) = map_res(take(8u8), KeyId::from_slice)(i)?; // the public key algorithm let (i, pk_algo) = map(be_u8, PublicKeyAlgorithm::from)(i)?; // key algorithm specific data let (i, values) = parse_esk(&pk_algo, i, version)?; Ok(( i, PublicKeyEncryptedSessionKey::V3 { packet_version, id, pk_algo, values, }, )) } else if version == 6 { // A one-octet size of the following two fields. This size may be zero, // if the key version number field and the fingerprint field are omitted // for an "anonymous recipient" (see Section 5.1.8). let (i, len) = be_u8(i)?; let (i, fingerprint) = match len { 0 => (i, None), _ => { // A one octet key version number. let (i, v) = map(be_u8, KeyVersion::from)(i)?; // The fingerprint of the public key or subkey to which the session key is encrypted. // Note that the length N of the fingerprint for a version 4 key is 20 octets; // for a version 6 key N is 32. let (i, fp) = nom::bytes::complete::take(len - 1)(i)?; let fp = Fingerprint::new(v, fp)?; (i, Some(fp)) } }; // A one-octet number giving the public-key algorithm used. let (i, pk_algo) = map(be_u8, PublicKeyAlgorithm::from)(i)?; // A series of values comprising the encrypted session key. This is algorithm-specific and described below. let (i, values) = parse_esk(&pk_algo, i, version)?; Ok(( i, PublicKeyEncryptedSessionKey::V6 { packet_version, fingerprint, pk_algo, values, }, )) } else { Ok(( i, PublicKeyEncryptedSessionKey::Other { packet_version, version, }, )) } } } impl Serialize for PublicKeyEncryptedSessionKey { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_u8(self.version().into())?; match self { PublicKeyEncryptedSessionKey::V3 { id, .. } => writer.write_all(id.as_ref())?, PublicKeyEncryptedSessionKey::V6 { fingerprint, .. } => { // A one-octet size of the following two fields. // This size may be zero, if the key version number field and the fingerprint field // are omitted for an "anonymous recipient" (see Section 5.1.8). match fingerprint { Some(fingerprint) => { let len = fingerprint.len() + 1; writer.write_u8(len.try_into()?)?; // A one octet key version number. match fingerprint.version() { Some(version) => writer.write_u8(version.into())?, None => { bail!("Fingerprint without version information {:?}", fingerprint) } } // The fingerprint of the public key or subkey to which the session key is encrypted. // Note that the length N of the fingerprint for a version 4 key is 20 octets; // for a version 6 key N is 32. writer.write_all(fingerprint.as_bytes())?; } _ => writer.write_u8(0)?, } } PublicKeyEncryptedSessionKey::Other { .. } => todo!(), } let algorithm = self.algorithm()?; writer.write_u8(algorithm.into())?; match (algorithm, self.values()?) { ( PublicKeyAlgorithm::RSA | PublicKeyAlgorithm::RSASign | PublicKeyAlgorithm::RSAEncrypt, PkeskBytes::Rsa { mpi }, ) => { mpi.to_writer(writer)?; } ( PublicKeyAlgorithm::Elgamal | PublicKeyAlgorithm::ElgamalSign, PkeskBytes::Elgamal { first, second }, ) => { first.to_writer(writer)?; second.to_writer(writer)?; } ( PublicKeyAlgorithm::ECDH, PkeskBytes::Ecdh { public_point, encrypted_session_key, }, ) => { public_point.to_writer(writer)?; // length of session key as one octet writer.write_u8(encrypted_session_key.len().try_into()?)?; writer.write_all(encrypted_session_key)?; } ( PublicKeyAlgorithm::X25519, PkeskBytes::X25519 { ephemeral, sym_alg, session_key, }, ) => { writer.write_all(ephemeral)?; // Unlike the other public-key algorithms, in the case of a v3 PKESK packet, // the symmetric algorithm ID is not encrypted [for X25519]. // // https://www.rfc-editor.org/rfc/rfc9580.html#name-algorithm-specific-fields-for- if let Some(sym_alg) = sym_alg { ensure!( matches!(self, PublicKeyEncryptedSessionKey::V3 { .. }), "Inconsistent: X25519 SymmetricKeyAlgorithm is set for {:?} PKESK", self.version() ); // len: algo octet + session_key len writer.write_u8((session_key.len() + 1).try_into()?)?; writer.write_u8((*sym_alg).into())?; } else { ensure!( matches!(self, PublicKeyEncryptedSessionKey::V6 { .. }), "Inconsistent: X25519 SymmetricKeyAlgorithm is unset for {:?} PKESK", self.version() ); // len: esk len writer.write_u8(session_key.len().try_into()?)?; // For v6 PKESK, sym_alg is None, and the algorithm is not written here } writer.write_all(session_key)?; // encrypted session key } #[cfg(feature = "unstable-curve448")] ( PublicKeyAlgorithm::X448, PkeskBytes::X448 { ephemeral, sym_alg, session_key, }, ) => { writer.write_all(ephemeral)?; // Unlike the other public-key algorithms, in the case of a v3 PKESK packet, // the symmetric algorithm ID is not encrypted [for X448]. // // https://www.rfc-editor.org/rfc/rfc9580.html#name-algorithm-specific-fields-for-x if let Some(sym_alg) = sym_alg { ensure!( matches!(self, PublicKeyEncryptedSessionKey::V3 { .. }), "Inconsistent: X448 SymmetricKeyAlgorithm is set for {:?} PKESK", self.version() ); // len: algo + esk len writer.write_u8((session_key.len() + 1).try_into()?)?; writer.write_u8((*sym_alg).into())?; } else { ensure!( matches!(self, PublicKeyEncryptedSessionKey::V6 { .. }), "Inconsistent: X448 SymmetricKeyAlgorithm is unset for {:?} PKESK", self.version() ); // len: algo octet + session_key len writer.write_u8(session_key.len().try_into()?)?; // For v6 PKESK, sym_alg is None, and the algorithm is not written here } writer.write_all(session_key)?; // encrypted session key } (alg, _) => { bail!("failed to write EskBytes for {:?}", alg); } } Ok(()) } } impl PacketTrait for PublicKeyEncryptedSessionKey { fn packet_version(&self) -> Version { match self { Self::V3 { packet_version, .. } | Self::V6 { packet_version, .. } | Self::Other { packet_version, .. } => *packet_version, } } fn tag(&self) -> Tag { Tag::PublicKeyEncryptedSessionKey } } pgp-0.15.0/src/packet/public_key_parser.rs000064400000000000000000000243041046102023000166060ustar 00000000000000use chrono::{DateTime, TimeZone, Utc}; use nom::bytes::streaming::{tag, take}; use nom::combinator::{map, map_opt, map_res}; use nom::multi::length_data; use nom::number::streaming::{be_u16, be_u32, be_u8}; use nom::sequence::{pair, tuple}; use crate::crypto::ecc_curve::{ecc_curve_from_oid, ECCCurve}; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::IResult; use crate::types::{ mpi, EcdhPublicParams, EcdsaPublicParams, KeyVersion, Mpi, MpiRef, PublicParams, }; #[inline] fn to_owned(mref: MpiRef<'_>) -> Mpi { mref.to_owned() } /// Ref: fn ecdsa(i: &[u8]) -> IResult<&[u8], PublicParams> { let (i, curve) = map_opt( // a one-octet size of the following field length_data(be_u8), // octets representing a curve OID ecc_curve_from_oid, )(i)?; // MPI of an EC point representing a public key let (i, p) = mpi(i)?; Ok(( i, PublicParams::ECDSA(EcdsaPublicParams::try_from_mpi(p, curve)?), )) } /// fn eddsa_legacy(i: &[u8]) -> IResult<&[u8], PublicParams> { let (i, curve) = map_opt( // a one-octet size of the following field length_data(be_u8), // octets representing a curve OID ecc_curve_from_oid, )(i)?; // MPI of an EC point representing a public key let (i, q) = mpi(i)?; Ok(( i, PublicParams::EdDSALegacy { curve, q: q.to_owned(), }, )) } /// https://www.rfc-editor.org/rfc/rfc9580.html#name-algorithm-specific-part-for-ed2 fn ed25519(i: &[u8]) -> IResult<&[u8], PublicParams> { // 32 bytes of public key let (i, p) = nom::bytes::complete::take(32u8)(i)?; Ok(( i, PublicParams::Ed25519 { public: p.try_into().expect("we took 32 bytes"), }, )) } /// fn x25519(i: &[u8]) -> IResult<&[u8], PublicParams> { // 32 bytes of public key let (i, p) = nom::bytes::complete::take(32u8)(i)?; Ok(( i, PublicParams::X25519 { public: p.try_into().expect("we took 32 bytes"), }, )) } /// #[cfg(feature = "unstable-curve448")] fn x448(i: &[u8]) -> IResult<&[u8], PublicParams> { // 56 bytes of public key let (i, p) = nom::bytes::complete::take(56u8)(i)?; Ok(( i, PublicParams::X448 { public: p.try_into().expect("we took 56 bytes"), }, )) } /// Ref: fn ecdh(i: &[u8]) -> IResult<&[u8], PublicParams> { // a one-octet size of the following field // octets representing a curve OID let (i, curve) = map_opt(length_data(be_u8), ecc_curve_from_oid)(i)?; match curve { ECCCurve::Curve25519 | ECCCurve::P256 | ECCCurve::P384 | ECCCurve::P521 => { // MPI of an EC point representing a public key let (i, mpi) = mpi(i)?; // a one-octet size of the following fields let (i, _len2) = be_u8(i)?; // a one-octet value 01, reserved for future extensions let (i, _tag) = tag(&[1][..])(i)?; // a one-octet hash function ID used with a KDF let (i, hash) = map(be_u8, HashAlgorithm::from)(i)?; // a one-octet algorithm ID for the symmetric algorithm used to wrap // the symmetric key used for the message encryption let (i, alg_sym) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; Ok(( i, PublicParams::ECDH(EcdhPublicParams::Known { curve, p: mpi.to_owned(), hash, alg_sym, }), )) } _ => Ok(( i, PublicParams::ECDH(EcdhPublicParams::Unsupported { curve, opaque: vec![], }), )), } } fn elgamal(i: &[u8]) -> IResult<&[u8], PublicParams> { map( tuple(( // MPI of Elgamal prime p map(mpi, to_owned), // MPI of Elgamal group generator g map(mpi, to_owned), // MPI of Elgamal public key value y (= g**x mod p where x is secret) map(mpi, to_owned), )), |(p, g, y)| PublicParams::Elgamal { p, g, y }, )(i) } fn dsa(i: &[u8]) -> IResult<&[u8], PublicParams> { map( tuple(( map(mpi, to_owned), map(mpi, to_owned), map(mpi, to_owned), map(mpi, to_owned), )), |(p, q, g, y)| PublicParams::DSA { p, q, g, y }, )(i) } fn rsa(i: &[u8]) -> IResult<&[u8], PublicParams> { map(pair(map(mpi, to_owned), map(mpi, to_owned)), |(n, e)| { PublicParams::RSA { n, e } })(i) } fn unknown(i: &[u8], len: Option) -> IResult<&[u8], PublicParams> { if let Some(pub_len) = len { let (i, data) = take(pub_len)(i)?; Ok(( i, PublicParams::Unknown { data: data.to_vec(), }, )) } else { // we don't know how many bytes to consume Ok((i, PublicParams::Unknown { data: vec![] })) } } /// Parse the fields of a public key. pub fn parse_pub_fields( typ: PublicKeyAlgorithm, len: Option, ) -> impl Fn(&[u8]) -> IResult<&[u8], PublicParams> { move |i: &[u8]| match typ { PublicKeyAlgorithm::RSA | PublicKeyAlgorithm::RSAEncrypt | PublicKeyAlgorithm::RSASign => { rsa(i) } PublicKeyAlgorithm::DSA => dsa(i), PublicKeyAlgorithm::ECDSA => ecdsa(i), PublicKeyAlgorithm::ECDH => ecdh(i), PublicKeyAlgorithm::Elgamal | PublicKeyAlgorithm::ElgamalSign => elgamal(i), PublicKeyAlgorithm::EdDSALegacy => eddsa_legacy(i), PublicKeyAlgorithm::Ed25519 => ed25519(i), PublicKeyAlgorithm::X25519 => x25519(i), PublicKeyAlgorithm::Ed448 => unknown(i, len), // FIXME: implement later #[cfg(feature = "unstable-curve448")] PublicKeyAlgorithm::X448 => x448(i), #[cfg(not(feature = "unstable-curve448"))] PublicKeyAlgorithm::X448 => unknown(i, len), PublicKeyAlgorithm::DiffieHellman | PublicKeyAlgorithm::Private100 | PublicKeyAlgorithm::Private101 | PublicKeyAlgorithm::Private102 | PublicKeyAlgorithm::Private103 | PublicKeyAlgorithm::Private104 | PublicKeyAlgorithm::Private105 | PublicKeyAlgorithm::Private106 | PublicKeyAlgorithm::Private107 | PublicKeyAlgorithm::Private108 | PublicKeyAlgorithm::Private109 | PublicKeyAlgorithm::Private110 | PublicKeyAlgorithm::Unknown(_) => unknown(i, len), } } fn public_key_parser_v4_v6( key_ver: &KeyVersion, ) -> impl Fn( &[u8], ) -> IResult< &[u8], ( KeyVersion, PublicKeyAlgorithm, DateTime, Option, PublicParams, ), > + '_ { |i: &[u8]| { let (i, created_at) = map_opt(be_u32, |v| Utc.timestamp_opt(i64::from(v), 0).single())(i)?; let (i, alg) = map(be_u8, PublicKeyAlgorithm::from)(i)?; let (i, pub_len) = if *key_ver == KeyVersion::V6 { // "scalar octet count for the following public key material" let (i, len) = be_u32(i)?; if len == 0 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } (i, Some(len as usize)) } else { (i, None) }; // If we got a pub_len, we expect to consume this amount of data, and have `expected_rest` // left after `parse_pub_fields` let expected_rest = match pub_len { Some(len) => { if i.len() < len { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } Some(i.len() - len) } None => None, }; let (i, params) = parse_pub_fields(alg, pub_len)(i)?; // consistency check for pub_len, if available if let Some(expected_rest) = expected_rest { if expected_rest != i.len() { return Err(nom::Err::Error(crate::errors::Error::Message(format!( "Inconsistent pub_len in secret key packet {}", pub_len.expect("if expected_rest is Some, pub_len is Some") )))); } } Ok((i, (*key_ver, alg, created_at, None, params))) } } fn public_key_parser_v2_v3( key_ver: &KeyVersion, ) -> impl Fn( &[u8], ) -> IResult< &[u8], ( KeyVersion, PublicKeyAlgorithm, DateTime, Option, PublicParams, ), > + '_ { |i: &[u8]| { let (i, created_at) = map_opt(be_u32, |v| Utc.timestamp_opt(i64::from(v), 0).single())(i)?; let (i, exp) = be_u16(i)?; let (i, alg) = map(be_u8, PublicKeyAlgorithm::from)(i)?; let (i, params) = parse_pub_fields(alg, None)(i)?; Ok((i, (*key_ver, alg, created_at, Some(exp), params))) } } /// Parse a public key packet (Tag 6) /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-public-key-packet-type-id-6 #[allow(clippy::type_complexity)] pub(crate) fn parse( i: &[u8], ) -> IResult< &[u8], ( KeyVersion, PublicKeyAlgorithm, DateTime, Option, PublicParams, ), > { let (i, key_ver) = map(be_u8, KeyVersion::from)(i)?; let (i, key) = match &key_ver { &KeyVersion::V2 | &KeyVersion::V3 => public_key_parser_v2_v3(&key_ver)(i)?, &KeyVersion::V4 | &KeyVersion::V6 => public_key_parser_v4_v6(&key_ver)(i)?, KeyVersion::V5 | KeyVersion::Other(_) => { return Err(nom::Err::Error(crate::errors::Error::Unsupported(format!( "Unsupported key version {}", u8::from(key_ver) )))) } }; Ok((i, key)) } pgp-0.15.0/src/packet/secret_key_parser.rs000064400000000000000000000075001046102023000166140ustar 00000000000000use chrono::{DateTime, TimeZone, Utc}; use nom::combinator::{map, map_opt, map_res, rest}; use nom::number::streaming::{be_u16, be_u32, be_u8}; use nom::sequence::tuple; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::{Error, IResult}; use crate::packet::public_key_parser::parse_pub_fields; use crate::types::{KeyVersion, PublicParams, SecretParams}; /// Parse the whole private key, both public and private fields. fn parse_pub_priv_fields( key_ver: KeyVersion, typ: PublicKeyAlgorithm, pub_len: Option, ) -> impl Fn(&[u8]) -> IResult<&[u8], (PublicParams, SecretParams)> { move |i| { map_res( tuple((parse_pub_fields(typ, pub_len), rest)), |(pub_params, v)| { if let Some(pub_len) = pub_len { // if we received a public key material length (from a v6 secret key packet), // make sure that we consumed the expected number of bytes if i.len() - v.len() != pub_len { return Err(Error::Message(format!( "Inconsistent pub_len in secret key packet {}", pub_len ))); } } let secret_params = SecretParams::from_slice(v, key_ver, typ, &pub_params)?; Ok::<_, Error>((pub_params, secret_params)) }, )(i) } } fn private_key_parser_v4_v6( key_ver: &KeyVersion, ) -> impl Fn( &[u8], ) -> IResult< &[u8], ( KeyVersion, PublicKeyAlgorithm, DateTime, Option, PublicParams, SecretParams, ), > + '_ { |i: &[u8]| { let (i, created_at) = map_opt(be_u32, |v| Utc.timestamp_opt(i64::from(v), 0).single())(i)?; let (i, alg) = map(be_u8, PublicKeyAlgorithm::from)(i)?; let (i, pub_len) = if *key_ver == KeyVersion::V6 { // "scalar octet count for the following public key material" -> pass on for checking let (i, pub_len) = be_u32(i)?; (i, Some(pub_len as usize)) } else { (i, None) }; let (i, params) = parse_pub_priv_fields(*key_ver, alg, pub_len)(i)?; Ok((i, (*key_ver, alg, created_at, None, params.0, params.1))) } } fn private_key_parser_v2_v3( key_ver: &KeyVersion, ) -> impl Fn( &[u8], ) -> IResult< &[u8], ( KeyVersion, PublicKeyAlgorithm, DateTime, Option, PublicParams, SecretParams, ), > + '_ { |i: &[u8]| { let (i, created_at) = map_opt(be_u32, |v| Utc.timestamp_opt(i64::from(v), 0).single())(i)?; let (i, exp) = be_u16(i)?; let (i, alg) = map(be_u8, PublicKeyAlgorithm::from)(i)?; let (i, params) = parse_pub_priv_fields(*key_ver, alg, None)(i)?; Ok(( i, (*key_ver, alg, created_at, Some(exp), params.0, params.1), )) } } /// Parse a secret key packet (Tag 5) /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-secret-key-packet-formats #[allow(clippy::type_complexity)] pub(crate) fn parse( i: &[u8], ) -> IResult< &[u8], ( KeyVersion, PublicKeyAlgorithm, DateTime, Option, PublicParams, SecretParams, ), > { let (i, key_ver) = map(be_u8, KeyVersion::from)(i)?; let (i, key) = match &key_ver { &KeyVersion::V2 | &KeyVersion::V3 => private_key_parser_v2_v3(&key_ver)(i)?, &KeyVersion::V4 | KeyVersion::V6 => private_key_parser_v4_v6(&key_ver)(i)?, KeyVersion::V5 | KeyVersion::Other(_) => { return Err(nom::Err::Error(Error::Unsupported(format!( "Unsupported key version {}", u8::from(key_ver) )))) } }; Ok((i, key)) } pgp-0.15.0/src/packet/signature/config.rs000064400000000000000000000534721046102023000163620ustar 00000000000000use std::io::Read; use byteorder::{BigEndian, ByteOrder}; use chrono::{DateTime, Utc}; use log::debug; use rand::{CryptoRng, Rng}; use crate::crypto::hash::{HashAlgorithm, Hasher}; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::Result; use crate::packet::{ Signature, SignatureType, SignatureVersion, Subpacket, SubpacketData, SubpacketType, }; use crate::ser::Serialize; use crate::types::{Fingerprint, KeyId, KeyVersion, PublicKeyTrait, SecretKeyTrait, Tag}; #[derive(Clone, PartialEq, Eq, Debug)] pub struct SignatureConfig { pub typ: SignatureType, pub pub_alg: PublicKeyAlgorithm, pub hash_alg: HashAlgorithm, pub unhashed_subpackets: Vec, pub hashed_subpackets: Vec, pub version_specific: SignatureVersionSpecific, } #[derive(Clone, PartialEq, Eq, Debug)] pub enum SignatureVersionSpecific { V2 { created: DateTime, issuer: KeyId, }, V3 { created: DateTime, issuer: KeyId, }, V4, V6 { salt: Vec, }, } impl From<&SignatureVersionSpecific> for SignatureVersion { fn from(value: &SignatureVersionSpecific) -> Self { match value { SignatureVersionSpecific::V2 { .. } => SignatureVersion::V2, SignatureVersionSpecific::V3 { .. } => SignatureVersion::V3, SignatureVersionSpecific::V4 => SignatureVersion::V4, SignatureVersionSpecific::V6 { .. } => SignatureVersion::V6, } } } impl SignatureConfig { /// Constructor for a v2 SignatureConfig (which represents the data of a v2 OpenPGP signature packet) /// /// OpenPGP v2 Signatures are historical and not used anymore. pub fn v2( typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, created: DateTime, issuer: KeyId, ) -> Self { Self { typ, pub_alg, hash_alg, hashed_subpackets: Vec::new(), unhashed_subpackets: Vec::new(), version_specific: SignatureVersionSpecific::V2 { created, issuer }, } } /// Constructor for a v3 SignatureConfig (which represents the data of a v3 OpenPGP signature packet) /// /// OpenPGP v3 Signatures are historical and not used anymore. pub fn v3( typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, created: DateTime, issuer: KeyId, ) -> Self { Self { typ, pub_alg, hash_alg, hashed_subpackets: Vec::new(), unhashed_subpackets: Vec::new(), version_specific: SignatureVersionSpecific::V3 { created, issuer }, } } /// Constructor for a v4 SignatureConfig (which represents the data of a v4 OpenPGP signature packet) /// /// OpenPGP v4 signatures were first specified in RFC 2440, and are commonly produced by /// OpenPGP v4 keys. pub fn v4(typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm) -> Self { Self { typ, pub_alg, hash_alg, unhashed_subpackets: vec![], hashed_subpackets: vec![], version_specific: SignatureVersionSpecific::V4, } } /// Generate v6 signature salt with the appropriate length for `hash_alg` /// https://www.rfc-editor.org/rfc/rfc9580.html#name-hash-algorithms fn v6_salt_for(mut rng: R, hash_alg: HashAlgorithm) -> Result> { let Some(salt_len) = hash_alg.salt_len() else { bail!("Unknown v6 signature salt length for hash algorithm {hash_alg:?}"); }; let mut salt = vec![0; salt_len]; rng.fill_bytes(&mut salt); Ok(salt) } /// Constructor for a v6 SignatureConfig (which represents the data of a v6 OpenPGP signature packet). /// Generates a new salt via `rng`. /// /// OpenPGP v6 signatures are specified in RFC 9580, they are produced by OpenPGP v6 keys. pub fn v6( rng: R, typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, ) -> Result { Ok(Self::v6_with_salt( typ, pub_alg, hash_alg, Self::v6_salt_for(rng, hash_alg)?, )) } /// Constructor for a v6 SignatureConfig (which represents the data of a v6 OpenPGP signature packet). /// /// OpenPGP v6 signatures are specified in RFC 9580, they are produced by OpenPGP v6 keys. pub fn v6_with_salt( typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, salt: Vec, ) -> Self { Self { typ, pub_alg, hash_alg, unhashed_subpackets: Vec::new(), hashed_subpackets: Vec::new(), version_specific: SignatureVersionSpecific::V6 { salt }, } } pub fn version(&self) -> SignatureVersion { (&self.version_specific).into() } /// Sign the given data. pub fn sign(self, key: &impl SecretKeyTrait, key_pw: F, data: R) -> Result where F: FnOnce() -> String, R: Read, { ensure!( (self.version() == SignatureVersion::V4 && key.version() == KeyVersion::V4) || (self.version() == SignatureVersion::V6 && key.version() == KeyVersion::V6), "signature version {:?} not allowed for signer key version {:?}", self.version(), key.version() ); let mut hasher = self.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.version_specific { hasher.update(salt.as_ref()) } self.hash_data_to_sign(&mut *hasher, data)?; let len = self.hash_signature_data(&mut hasher)?; hasher.update(&self.trailer(len)?); let hash = &hasher.finish()[..]; let signed_hash_value = [hash[0], hash[1]]; let signature = key.create_signature(key_pw, self.hash_alg, hash)?; Ok(Signature::from_config(self, signed_hash_value, signature)) } /// Create a certification self-signature. pub fn sign_certification( self, key: &impl SecretKeyTrait, key_pw: F, tag: Tag, id: &impl Serialize, ) -> Result where F: FnOnce() -> String, { self.sign_certification_third_party(key, key_pw, key, tag, id) } /// Create a certification third-party signature. pub fn sign_certification_third_party( self, signer: &impl SecretKeyTrait, signer_pw: F, signee: &impl PublicKeyTrait, tag: Tag, id: &impl Serialize, ) -> Result where F: FnOnce() -> String, { ensure!( (self.version() == SignatureVersion::V4 && signer.version() == KeyVersion::V4) || (self.version() == SignatureVersion::V6 && signer.version() == KeyVersion::V6), "signature version {:?} not allowed for signer key version {:?}", self.version(), signer.version() ); ensure!( self.is_certification(), "can not sign non certification as certification" ); debug!("signing certification {:#?}", self.typ); let mut hasher = self.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.version_specific { hasher.update(salt.as_ref()) } signee.serialize_for_hashing(&mut hasher)?; let mut packet_buf = Vec::new(); id.to_writer(&mut packet_buf)?; match self.version() { SignatureVersion::V2 | SignatureVersion::V3 => { // Nothing to do } SignatureVersion::V4 | SignatureVersion::V6 => { let prefix = match tag { Tag::UserId => 0xB4, Tag::UserAttribute => 0xD1, _ => bail!("invalid tag for certification signature: {:?}", tag), }; let mut prefix_buf = [prefix, 0u8, 0u8, 0u8, 0u8]; BigEndian::write_u32(&mut prefix_buf[1..], packet_buf.len().try_into()?); // prefixes hasher.update(&prefix_buf); } SignatureVersion::V5 => { bail!("v5 signature unsupported sign tps") } SignatureVersion::Other(version) => { bail!("unsupported signature version {}", version) } } // the packet content hasher.update(&packet_buf); let len = self.hash_signature_data(&mut hasher)?; hasher.update(&self.trailer(len)?); let hash = &hasher.finish()[..]; let signed_hash_value = [hash[0], hash[1]]; let signature = signer.create_signature(signer_pw, self.hash_alg, hash)?; Ok(Signature::from_config(self, signed_hash_value, signature)) } /// Sign a key binding. pub fn sign_key_binding( self, signing_key: &impl SecretKeyTrait, key_pw: F, key: &impl PublicKeyTrait, ) -> Result where F: FnOnce() -> String, { ensure!( (self.version() == SignatureVersion::V4 && signing_key.version() == KeyVersion::V4) || (self.version() == SignatureVersion::V6 && signing_key.version() == KeyVersion::V6), "signature version {:?} not allowed for signer key version {:?}", self.version(), signing_key.version() ); debug!( "signing key binding: {:#?} - {:#?} - {:#?}", self, signing_key, key ); let mut hasher = self.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.version_specific { hasher.update(salt.as_ref()) } // Signing Key signing_key.serialize_for_hashing(&mut hasher)?; // Key being bound key.serialize_for_hashing(&mut hasher)?; let len = self.hash_signature_data(&mut hasher)?; hasher.update(&self.trailer(len)?); let hash = &hasher.finish()[..]; let signed_hash_value = [hash[0], hash[1]]; let signature = signing_key.create_signature(key_pw, self.hash_alg, hash)?; Ok(Signature::from_config(self, signed_hash_value, signature)) } /// Signs a direct key signature or a revocation. pub fn sign_key( self, signing_key: &impl SecretKeyTrait, key_pw: F, key: &impl PublicKeyTrait, ) -> Result where F: FnOnce() -> String, { ensure!( (self.version() == SignatureVersion::V4 && signing_key.version() == KeyVersion::V4) || (self.version() == SignatureVersion::V6 && signing_key.version() == KeyVersion::V6), "signature version {:?} not allowed for signer key version {:?}", self.version(), signing_key.version() ); debug!("signing key (revocation): {:#?} - {:#?}", self, key); let mut hasher = self.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.version_specific { hasher.update(salt.as_ref()) } key.serialize_for_hashing(&mut hasher)?; let len = self.hash_signature_data(&mut hasher)?; hasher.update(&self.trailer(len)?); let hash = &hasher.finish()[..]; let signed_hash_value = [hash[0], hash[1]]; let signature = signing_key.create_signature(key_pw, self.hash_alg, hash)?; Ok(Signature::from_config(self, signed_hash_value, signature)) } /// Returns what kind of signature this is. pub fn typ(&self) -> SignatureType { self.typ } /// Calculate the serialized version of this packet, but only the part relevant for hashing. pub fn hash_signature_data(&self, hasher: &mut dyn std::io::Write) -> Result { match self.version() { SignatureVersion::V2 | SignatureVersion::V3 => { let created = { if let SignatureVersionSpecific::V2 { created, .. } | SignatureVersionSpecific::V3 { created, .. } = self.version_specific { created } else { bail!("must exist for a v2/3 signature") } }; let mut buf = [0u8; 5]; buf[0] = self.typ.into(); BigEndian::write_u32(&mut buf[1..], created.timestamp().try_into()?); hasher.write_all(&buf)?; // no trailer Ok(0) } SignatureVersion::V4 | SignatureVersion::V6 => { // TODO: reduce duplication with serialization code let mut res = vec![ // the signature version self.version().into(), // the signature type self.typ.into(), // the public-key algorithm self.pub_alg.into(), // the hash algorithm self.hash_alg.into(), ]; // hashed subpackets let mut hashed_subpackets = Vec::new(); for packet in &self.hashed_subpackets { debug!("hashing {:#?}", packet); // If a subpacket is encountered that is marked critical but is unknown to the // evaluating implementation, the evaluator SHOULD consider the signature to be // in error. // // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-5.2.3.7-6) if packet.is_critical && matches!(packet.typ(), SubpacketType::Other(_)) { // "[..] The purpose of the critical bit is to allow the signer to tell an // evaluator that it would prefer a new, unknown feature to generate an // error rather than being ignored." // // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-5.2.3.7-8:) bail!("Unknown critical subpacket {:?}", packet); } // If the version octet does not match the signature version, the receiving // implementation MUST treat it as a malformed signature // // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-5.2.3.35-3) if let SubpacketData::IssuerFingerprint(fp) = &packet.data { match (self.version(), fp.version()) { (SignatureVersion::V6, Some(KeyVersion::V6)) => {}, (SignatureVersion::V4, Some(KeyVersion::V4)) => {}, _ => bail!("IntendedRecipientFingerprint {:?} doesn't match signature version {:?}", fp, self.version()) } } packet.to_writer(&mut hashed_subpackets)?; } // append hashed area length, as u16 for v4, and u32 for v6 if self.version() == SignatureVersion::V4 { res.extend(u16::try_from(hashed_subpackets.len())?.to_be_bytes()); } else if self.version() == SignatureVersion::V6 { res.extend(u32::try_from(hashed_subpackets.len())?.to_be_bytes()); } res.extend(hashed_subpackets); hasher.write_all(&res)?; Ok(res.len()) } SignatureVersion::V5 => { bail!("v5 signature unsupported hash data") } SignatureVersion::Other(version) => { bail!("unsupported signature version {}", version) } } } pub fn hash_data_to_sign(&self, hasher: &mut dyn Hasher, mut data: R) -> Result where R: Read, { match self.typ { SignatureType::Text | // assumes that the passed in text was already valid utf8 and normalized SignatureType::Binary => { Ok(std::io::copy(&mut data, hasher)? as usize) } SignatureType::Timestamp | SignatureType::Standalone => { let mut val = [0u8;1]; data.read_exact(&mut val[..])?; hasher.update(&val[..]); Ok(1) } SignatureType::CertGeneric | SignatureType::CertPersona | SignatureType::CertCasual | SignatureType::CertPositive | SignatureType::CertRevocation => { unimplemented_err!("{:?}", self.typ); } SignatureType::SubkeyBinding | SignatureType::SubkeyRevocation | SignatureType::KeyBinding | SignatureType::Key => { unimplemented_err!("{:?}", self.typ); } SignatureType::KeyRevocation => unimplemented_err!("KeyRevocation"), SignatureType::ThirdParty => unimplemented_err!("signing ThirdParty"), SignatureType::Other(id) => unimplemented_err!("Other ({})", id), } } pub fn trailer(&self, len: usize) -> Result> { match self.version() { SignatureVersion::V2 | SignatureVersion::V3 => { // Nothing to do Ok(Vec::new()) } SignatureVersion::V4 | SignatureVersion::V6 => { let mut trailer = vec![self.version().into(), 0xFF, 0, 0, 0, 0]; BigEndian::write_u32(&mut trailer[2..], len.try_into()?); Ok(trailer) } SignatureVersion::V5 => { bail!("v5 signature unsupported") } SignatureVersion::Other(version) => { bail!("unsupported signature version {}", version) } } } /// Returns an iterator of all subpackets in the signature: all subpackets in the hashed area /// followed by all subpackets in the unhashed area. #[deprecated( note = "Usually only hashed_subpackets should be used. unhashed_subpackets are only safe and useful to access in rare circumstances. When they are needed, unhashed_subpackets should be explicitly called." )] pub fn subpackets(&self) -> impl Iterator { self.hashed_subpackets().chain(self.unhashed_subpackets()) } /// Returns an iterator over the hashed subpackets of this signature. pub fn hashed_subpackets(&self) -> impl Iterator { self.hashed_subpackets.iter() } /// Returns an iterator over the unhashed subpackets of this signature. pub fn unhashed_subpackets(&self) -> impl Iterator { self.unhashed_subpackets.iter() } /// Returns if the signature is a certification or not. pub fn is_certification(&self) -> bool { matches!( self.typ, SignatureType::CertGeneric | SignatureType::CertPersona | SignatureType::CertCasual | SignatureType::CertPositive | SignatureType::CertRevocation ) } /// Signature Creation Time. /// /// The time the signature was made. /// MUST be present in the hashed area. /// /// /// /// Returns the first Signature Creation Time subpacket, only from the hashed area. pub fn created(&self) -> Option<&DateTime> { if let SignatureVersionSpecific::V2 { created, .. } | SignatureVersionSpecific::V3 { created, .. } = &self.version_specific { return Some(created); } self.hashed_subpackets().find_map(|p| match p.data { SubpacketData::SignatureCreationTime(ref d) => Some(d), _ => None, }) } /// Issuer Key ID. /// /// The OpenPGP Key ID of the key issuing the signature. /// /// /// /// Returns Issuer subpacket data from both the hashed and unhashed area. pub fn issuer(&self) -> Vec<&KeyId> { // legacy v2/v3 signatures have an explicit "issuer" field if let SignatureVersionSpecific::V2 { issuer, .. } | SignatureVersionSpecific::V3 { issuer, .. } = &self.version_specific { return vec![issuer]; } // v4+ signatures use subpackets // // We consider data from both the hashed and unhashed area here, because the issuer Key ID // only acts as a hint. The signature will be cryptographically checked using the purported // issuer's key material. An attacker cannot successfully claim an issuer Key ID that they // can't produce a cryptographically valid signature for. self.hashed_subpackets() .chain(self.unhashed_subpackets()) .filter_map(|sp| match sp.data { SubpacketData::Issuer(ref id) => Some(id), _ => None, }) .collect() } /// Issuer Fingerprint. /// /// The OpenPGP Key fingerprint of the key issuing the signature. /// /// /// /// Returns Issuer Fingerprint subpacket data from both the hashed and unhashed area. pub fn issuer_fingerprint(&self) -> Vec<&Fingerprint> { self.hashed_subpackets() .chain(self.unhashed_subpackets()) .filter_map(|sp| match &sp.data { SubpacketData::IssuerFingerprint(fp) => Some(fp), _ => None, }) .collect() } } pgp-0.15.0/src/packet/signature/de.rs000064400000000000000000000572031046102023000155010ustar 00000000000000use std::str; use bstr::BString; use chrono::{DateTime, Duration, TimeZone, Utc}; use log::{debug, warn}; use nom::bytes::streaming::{tag, take}; use nom::combinator::{complete, map, map_opt, map_parser, map_res, rest}; use nom::multi::{fold_many_m_n, length_data, many0}; use nom::number::streaming::{be_u16, be_u32, be_u8}; use nom::sequence::{pair, tuple}; use smallvec::SmallVec; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{IResult, Result}; use crate::packet::signature::types::*; use crate::types::{ mpi, CompressionAlgorithm, Fingerprint, KeyId, KeyVersion, Mpi, MpiRef, RevocationKey, RevocationKeyClass, SignatureBytes, Version, }; use crate::util::{clone_into_array, packet_length}; impl Signature { /// Parses a `Signature` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, pk) = parse(packet_version)(input)?; Ok(pk) } } /// Convert an epoch timestamp to a `DateTime` fn dt_from_timestamp(ts: u32) -> Option> { DateTime::from_timestamp(i64::from(ts), 0) } /// Convert a u32 to a `Duration` fn duration_from_timestamp(ts: u32) -> Option { Duration::try_seconds(i64::from(ts)) } /// Parse a Signature Creation Time subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-signature-creation-time fn signature_creation_time(i: &[u8]) -> IResult<&[u8], SubpacketData> { map_opt( // 4-octet time field be_u32, |date| dt_from_timestamp(date).map(SubpacketData::SignatureCreationTime), )(i) } /// Parse an Issuer Key ID subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-issuer-key-id fn issuer(i: &[u8]) -> IResult<&[u8], SubpacketData> { map( map_res(complete(take(8u8)), KeyId::from_slice), SubpacketData::Issuer, )(i) } /// Parse a Key Expiration Time subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-key-expiration-time fn key_expiration(i: &[u8]) -> IResult<&[u8], SubpacketData> { map_opt( // 4-octet time field be_u32, |date| duration_from_timestamp(date).map(SubpacketData::KeyExpirationTime), )(i) } /// Parse a Preferred Symmetric Ciphers for v1 SEIPD subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#preferred-v1-seipd fn pref_sym_alg(body: &[u8]) -> IResult<&[u8], SubpacketData> { let list: SmallVec<[SymmetricKeyAlgorithm; 8]> = body .iter() .map(|v| Ok(SymmetricKeyAlgorithm::from(*v))) .collect::>()?; Ok((&b""[..], SubpacketData::PreferredSymmetricAlgorithms(list))) } /// Parse a Preferred AEAD Ciphersuites subpacket (for SEIPD v2) /// /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-preferred-aead-ciphersuites fn pref_aead_alg(body: &[u8]) -> IResult<&[u8], SubpacketData> { if body.len() % 2 != 0 { return Err(nom::Err::Error(crate::errors::Error::Message(format!( "Illegal preferred aead subpacket len {} must be a multiple of 2", body.len(), )))); } let list: SmallVec<[(SymmetricKeyAlgorithm, AeadAlgorithm); 4]> = body .chunks(2) .map(|v| (SymmetricKeyAlgorithm::from(v[0]), AeadAlgorithm::from(v[1]))) .collect(); Ok((&b""[..], SubpacketData::PreferredAeadAlgorithms(list))) } /// Parse a Preferred Hash Algorithms subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-preferred-hash-algorithms fn pref_hash_alg(body: &[u8]) -> IResult<&[u8], SubpacketData> { let list: SmallVec<[HashAlgorithm; 8]> = body .iter() .map(|v| Ok(HashAlgorithm::from(*v))) .collect::>()?; Ok((&b""[..], SubpacketData::PreferredHashAlgorithms(list))) } /// Parse a Preferred Compression Algorithms subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-preferred-compression-algor fn pref_com_alg(body: &[u8]) -> IResult<&[u8], SubpacketData> { let list: SmallVec<[CompressionAlgorithm; 8]> = body .iter() .map(|v| Ok(CompressionAlgorithm::from(*v))) .collect::>()?; Ok(( &b""[..], SubpacketData::PreferredCompressionAlgorithms(list), )) } /// Parse a Signature Expiration Time subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-signature-expiration-time fn signature_expiration_time(i: &[u8]) -> IResult<&[u8], SubpacketData> { map_opt( // 4-octet time field be_u32, |date| duration_from_timestamp(date).map(SubpacketData::SignatureExpirationTime), )(i) } /// Parse an Exportable Certification subpacket. /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-exportable-certification fn exportable_certification(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(complete(be_u8), |v| { SubpacketData::ExportableCertification(v == 1) })(i) } /// Parse a Revocable subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-revocable fn revocable(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(complete(be_u8), |v| SubpacketData::Revocable(v == 1))(i) } /// Parse a Trust Signature subpacket. /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-trust-signature fn trust_signature(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(pair(be_u8, be_u8), |(depth, value)| { SubpacketData::TrustSignature(depth, value) })(i) } /// Parse a Regular Expression subpacket. /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-regular-expression fn regular_expression(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(map(rest, BString::from), SubpacketData::RegularExpression)(i) } /// Parse a Revocation Key subpacket (Deprecated) /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-revocation-key-deprecated fn revocation_key(i: &[u8]) -> IResult<&[u8], SubpacketData> { map( tuple(( map_res(be_u8, RevocationKeyClass::try_from), map(be_u8, PublicKeyAlgorithm::from), // TODO: V5 Keys have 32 octets here take(20u8), )), |(class, algorithm, fp)| { SubpacketData::RevocationKey(RevocationKey::new(class, algorithm, fp)) }, )(i) } /// Parse a Notation Data subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-notation-data fn notation_data(i: &[u8]) -> IResult<&[u8], SubpacketData> { // Flags let (i, readable) = map(be_u8, |v| v == 0x80)(i)?; let (i, _) = tag(&[0, 0, 0])(i)?; let (i, name_len) = be_u16(i)?; let (i, value_len) = be_u16(i)?; let (i, name) = map(take(name_len), BString::from)(i)?; let (i, value) = map(take(value_len), BString::from)(i)?; Ok(( i, SubpacketData::Notation(Notation { readable, name, value, }), )) } /// Parse a Key Server Preferences subpacket /// https://www.rfc-editor.org/rfc/rfc9580.html#name-key-server-preferences fn key_server_prefs(body: &[u8]) -> IResult<&[u8], SubpacketData> { Ok(( &b""[..], SubpacketData::KeyServerPreferences(SmallVec::from_slice(body)), )) } /// Parse a Preferred Key Server subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-preferred-key-server fn preferred_key_server(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(map_res(rest, str::from_utf8), |body| { SubpacketData::PreferredKeyServer(body.to_string()) })(i) } /// Parse a Primary User ID subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-primary-user-id fn primary_userid(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(be_u8, |a| SubpacketData::IsPrimary(a == 1))(i) } /// Parse a Policy URI subpacket. /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-policy-uri fn policy_uri(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(map_res(rest, str::from_utf8), |body| { SubpacketData::PolicyURI(body.to_owned()) })(i) } /// Parse a Key Flags subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-key-flags fn key_flags(body: &[u8]) -> IResult<&[u8], SubpacketData> { Ok(( &b""[..], SubpacketData::KeyFlags(SmallVec::from_slice(body)), )) } /// Parse a Signer's User ID subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-key-flags fn signers_userid(i: &[u8]) -> IResult<&[u8], SubpacketData> { Ok((&[], SubpacketData::SignersUserID(BString::from(i)))) } /// Parse a Reason for Revocation subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-key-flags fn rev_reason(i: &[u8]) -> IResult<&[u8], SubpacketData> { map( pair(map(be_u8, RevocationCode::from), map(rest, BString::from)), |(code, reason)| SubpacketData::RevocationReason(code, reason), )(i) } /// Parse a Features subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-features fn features(body: &[u8]) -> IResult<&[u8], SubpacketData> { Ok(( &b""[..], SubpacketData::Features(SmallVec::from_slice(body)), )) } /// Parse a Signature Target subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-signature-target fn sig_target(i: &[u8]) -> IResult<&[u8], SubpacketData> { map( tuple(( map(be_u8, PublicKeyAlgorithm::from), map(be_u8, HashAlgorithm::from), rest, )), |(pub_alg, hash_alg, hash): (_, _, &[u8])| { SubpacketData::SignatureTarget(pub_alg, hash_alg, hash.to_vec()) }, )(i) } /// Parse an Embedded Signature subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-embedded-signature fn embedded_sig(i: &[u8]) -> IResult<&[u8], SubpacketData> { map(parse(Version::New), |sig| { SubpacketData::EmbeddedSignature(Box::new(sig)) })(i) } /// Parse an Issuer Fingerprint subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-issuer-fingerprint fn issuer_fingerprint(i: &[u8]) -> IResult<&[u8], SubpacketData> { let (i, version) = map(be_u8, KeyVersion::from)(i)?; // This subpacket is only used for v4 and newer fingerprints if version != KeyVersion::V4 && version != KeyVersion::V5 && version != KeyVersion::V6 { return Err(invalid_key_version(version)); } if let Some(fingerprint_len) = version.fingerprint_len() { let (i, fingerprint) = take(fingerprint_len)(i)?; let fp = Fingerprint::new(version, fingerprint)?; Ok((i, SubpacketData::IssuerFingerprint(fp))) } else { Err(invalid_key_version(version)) } } /// Parse a preferred encryption modes subpacket (non-RFC subpacket for GnuPG "OCB" mode) fn preferred_encryption_modes(body: &[u8]) -> IResult<&[u8], SubpacketData> { let list: SmallVec<[AeadAlgorithm; 2]> = body.iter().map(|v| AeadAlgorithm::from(*v)).collect(); Ok((&b""[..], SubpacketData::PreferredEncryptionModes(list))) } /// Parse an Intended Recipient Fingerprint subpacket /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-intended-recipient-fingerpr fn intended_recipient_fingerprint(i: &[u8]) -> IResult<&[u8], SubpacketData> { let (i, version) = map(be_u8, KeyVersion::from)(i)?; // This subpacket is only used for v4 and newer fingerprints if version != KeyVersion::V4 && version != KeyVersion::V5 && version != KeyVersion::V6 { return Err(invalid_key_version(version)); } if let Some(fingerprint_len) = version.fingerprint_len() { let (i, fingerprint) = take(fingerprint_len)(i)?; let fp = Fingerprint::new(version, fingerprint)?; Ok((i, SubpacketData::IntendedRecipientFingerprint(fp))) } else { Err(invalid_key_version(version)) } } fn subpacket(typ: SubpacketType, is_critical: bool, body: &[u8]) -> IResult<&[u8], Subpacket> { use self::SubpacketType::*; debug!("parsing subpacket: {:?} {}", typ, hex::encode(body)); let res = match typ { SignatureCreationTime => signature_creation_time(body), SignatureExpirationTime => signature_expiration_time(body), ExportableCertification => exportable_certification(body), TrustSignature => trust_signature(body), RegularExpression => regular_expression(body), Revocable => revocable(body), KeyExpirationTime => key_expiration(body), PreferredSymmetricAlgorithms => pref_sym_alg(body), RevocationKey => revocation_key(body), Issuer => issuer(body), Notation => notation_data(body), PreferredHashAlgorithms => pref_hash_alg(body), PreferredCompressionAlgorithms => pref_com_alg(body), KeyServerPreferences => key_server_prefs(body), PreferredKeyServer => preferred_key_server(body), PrimaryUserId => primary_userid(body), PolicyURI => policy_uri(body), KeyFlags => key_flags(body), SignersUserID => signers_userid(body), RevocationReason => rev_reason(body), Features => features(body), SignatureTarget => sig_target(body), EmbeddedSignature => embedded_sig(body), IssuerFingerprint => issuer_fingerprint(body), PreferredEncryptionModes => preferred_encryption_modes(body), IntendedRecipientFingerprint => intended_recipient_fingerprint(body), PreferredAead => pref_aead_alg(body), Experimental(n) => Ok(( body, SubpacketData::Experimental(n, SmallVec::from_slice(body)), )), Other(n) => Ok((body, SubpacketData::Other(n, body.to_vec()))), }; let res = res.map(|(body, data)| (body, Subpacket { is_critical, data })); if res.is_err() { warn!("invalid subpacket: {:?} {:?}", typ, res); } res } fn subpackets<'a>(i: &'a [u8]) -> IResult<&'a [u8], Vec> { many0(complete(|i: &'a [u8]| { // the subpacket length (1, 2, or 5 octets) let (i, len) = packet_length(i)?; if len == 0 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } // the subpacket type (1 octet) let (i, typ) = map(be_u8, SubpacketType::from_u8)(i)?; map_parser(take(len - 1), move |b| subpacket(typ.0, typ.1, b))(i) }))(i) } fn actual_signature( typ: &PublicKeyAlgorithm, ) -> impl Fn(&[u8]) -> IResult<&[u8], SignatureBytes> + '_ { move |i: &[u8]| match typ { &PublicKeyAlgorithm::RSA | &PublicKeyAlgorithm::RSASign => { map(mpi, |v| vec![v.to_owned()].into())(i) } &PublicKeyAlgorithm::DSA | &PublicKeyAlgorithm::ECDSA | &PublicKeyAlgorithm::EdDSALegacy => fold_many_m_n( 2, 2, mpi, Vec::new, |mut acc: Vec, item: MpiRef<'_>| { acc.push(item.to_owned()); acc }, )(i) .map(|(i, sig)| (i, sig.into())), &PublicKeyAlgorithm::Ed25519 => { let (i, sig) = nom::bytes::complete::take(64u8)(i)?; Ok((i, SignatureBytes::Native(sig.to_vec()))) } &PublicKeyAlgorithm::Private100 | &PublicKeyAlgorithm::Private101 | &PublicKeyAlgorithm::Private102 | &PublicKeyAlgorithm::Private103 | &PublicKeyAlgorithm::Private104 | &PublicKeyAlgorithm::Private105 | &PublicKeyAlgorithm::Private106 | &PublicKeyAlgorithm::Private107 | &PublicKeyAlgorithm::Private108 | &PublicKeyAlgorithm::Private109 | &PublicKeyAlgorithm::Private110 => map(mpi, |v| vec![v.to_owned()].into())(i), _ => Ok((i, SignatureBytes::Native(vec![]))), // don't assume format, could be non-MPI } } /// Parse a v2 or v3 signature packet /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-version-3-signature-packet- fn v3_parser( packet_version: Version, version: SignatureVersion, ) -> impl Fn(&[u8]) -> IResult<&[u8], Signature> { move |i: &[u8]| { let (i, (_tag, typ, created, issuer, pub_alg, hash_alg, ls_hash)) = tuple(( // One-octet length of following hashed material. MUST be 5. tag(&[5]), // One-octet signature type. map_res(be_u8, SignatureType::try_from), // Four-octet creation time. map_opt(be_u32, |v| Utc.timestamp_opt(i64::from(v), 0).single()), // Eight-octet Key ID of signer. map_res(take(8usize), KeyId::from_slice), // One-octet public-key algorithm. map(be_u8, PublicKeyAlgorithm::from), // One-octet hash algorithm. map(be_u8, HashAlgorithm::from), // Two-octet field holding left 16 bits of signed hash value. take(2usize), ))(i)?; // The SignatureBytes comprising the signature. let (i, sig) = actual_signature(&pub_alg)(i)?; match version { SignatureVersion::V2 => Ok((i, { Signature::v2( packet_version, typ, pub_alg, hash_alg, created, issuer, clone_into_array(ls_hash), sig, ) })), SignatureVersion::V3 => Ok((i, { Signature::v3( packet_version, typ, pub_alg, hash_alg, created, issuer, clone_into_array(ls_hash), sig, ) })), _ => Err(nom::Err::Error(crate::errors::Error::Message( "must only be called for V2/V3".to_string(), ))), } } } /// Parse a v4 signature packet /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-versions-4-and-6-signature- fn v4_parser( packet_version: Version, version: SignatureVersion, ) -> impl Fn(&[u8]) -> IResult<&[u8], Signature> { move |i: &[u8]| { let (i, (typ, pub_alg, hash_alg, hsub, usub, ls_hash)) = tuple(( // One-octet signature type. map_res(be_u8, SignatureType::try_from), // One-octet public-key algorithm. map(be_u8, PublicKeyAlgorithm::from), // One-octet hash algorithm. map(be_u8, HashAlgorithm::from), // Two-octet scalar octet count for following hashed subpacket data. // Hashed subpacket data set (zero or more subpackets). map_parser(length_data(be_u16), subpackets), // Two-octet scalar octet count for the following unhashed subpacket data. // Unhashed subpacket data set (zero or more subpackets). map_parser(length_data(be_u16), subpackets), // Two-octet field holding the left 16 bits of the signed hash value. take(2usize), ))(i)?; // The SignatureBytes comprising the signature. let (i, sig) = actual_signature(&pub_alg)(i)?; if version != SignatureVersion::V4 { return Err(nom::Err::Error(crate::errors::Error::Message(format!( "Unsupported version {:?}", version )))); } Ok(( i, Signature::v4( packet_version, typ, pub_alg, hash_alg, clone_into_array(ls_hash), sig, hsub, usub, ), )) } } /// Parse a v6 signature packet /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-versions-4-and-6-signature- fn v6_parser(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], Signature> { move |i: &[u8]| { let (i, (typ, pub_alg, hash_alg, hsub, usub, ls_hash)) = tuple(( // One-octet signature type. map_res(be_u8, SignatureType::try_from), // One-octet public-key algorithm. map(be_u8, PublicKeyAlgorithm::from), // One-octet hash algorithm. map(be_u8, HashAlgorithm::from), // Four-octet scalar octet count for following hashed subpacket data. // Hashed subpacket data set (zero or more subpackets). map_parser(length_data(be_u32), subpackets), // Four-octet scalar octet count for the following unhashed subpacket data. // Unhashed subpacket data set (zero or more subpackets). map_parser(length_data(be_u32), subpackets), // Two-octet field holding the left 16 bits of the signed hash value. take(2usize), ))(i)?; // A variable-length field containing: // A one-octet salt size. The value MUST match the value defined for the hash algorithm as specified in Table 23. // The salt; a random value of the specified size. let (i, len) = be_u8(i)?; let (i, salt) = take(len)(i)?; if hash_alg.salt_len() != Some(salt.len()) { return Err(nom::Err::Error(crate::errors::Error::Message(format!( "Illegal salt length {} found for {:?}", salt.len(), hash_alg )))); } // The SignatureBytes comprising the signature. let (i, sig) = actual_signature(&pub_alg)(i)?; Ok(( i, Signature::v6( packet_version, typ, pub_alg, hash_alg, clone_into_array(ls_hash), sig, hsub, usub, salt.to_vec(), ), )) } } fn invalid_sig_version(version: SignatureVersion) -> nom::Err { nom::Err::Error(crate::errors::Error::Unsupported(format!( "invalid signature version {version:?}" ))) } fn invalid_key_version(version: KeyVersion) -> nom::Err { nom::Err::Error(crate::errors::Error::Unsupported(format!( "invalid key version {version:?}" ))) } /// Parse a signature packet (Tag 2) /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-signature-packet-type-id-2 fn parse(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], Signature> { move |i: &[u8]| { let (i, version) = map(be_u8, SignatureVersion::from)(i)?; let (i, signature) = match &version { &SignatureVersion::V2 | &SignatureVersion::V3 => v3_parser(packet_version, version)(i), &SignatureVersion::V4 | &SignatureVersion::V5 => v4_parser(packet_version, version)(i), &SignatureVersion::V6 => v6_parser(packet_version)(i), _ => Err(invalid_sig_version(version)), }?; Ok((i, signature)) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; use crate::{Deserializable, StandaloneSignature}; #[test] fn test_subpacket_pref_sym_alg() { let input = vec![9, 8, 7, 3, 2]; let (_, res) = pref_sym_alg(input.as_slice()).unwrap(); assert_eq!( res, SubpacketData::PreferredSymmetricAlgorithms( input .iter() .map(|i| SymmetricKeyAlgorithm::from(*i)) .collect() ) ); } #[test] fn test_unknown_revocation_code() { let revocation = "-----BEGIN PGP SIGNATURE----- wsASBCAWCgCEBYJlrwiYCRACvMqAWdPpHUcUAAAAAAAeACBzYWx0QG5vdGF0aW9u cy5zZXF1b2lhLXBncC5vcmfPfjVZJ9PXSt4854s05WU+Tj5QZwuhA5+LEHEUborP PxQdQnJldm9jYXRpb24gbWVzc2FnZRYhBKfuT6/w5BLl1XTGUgK8yoBZ0+kdAABi lQEAkpvZ3A2RGtRdCne/dOZtqoX7oCCZKCPyfZS9I9roc5oBAOj4aklEBejYuTKF SW+kj0jFDKC2xb/o8hbkTpwPtsoI =0ajX -----END PGP SIGNATURE-----"; let (sig, _) = StandaloneSignature::from_armor_single(revocation.as_bytes()).unwrap(); let rc = sig.signature.revocation_reason_code(); assert!(rc.is_some()); assert!(matches!(rc.unwrap(), RevocationCode::Other(0x42))); } } pgp-0.15.0/src/packet/signature/mod.rs000064400000000000000000000001521046102023000156570ustar 00000000000000pub mod config; pub mod de; pub mod ser; pub mod types; pub use self::config::*; pub use self::types::*; pgp-0.15.0/src/packet/signature/ser.rs000064400000000000000000000407111046102023000156760ustar 00000000000000use std::io; use byteorder::{BigEndian, WriteBytesExt}; use chrono::Duration; use crate::errors::Result; use crate::packet::signature::types::*; use crate::packet::signature::SignatureConfig; use crate::packet::SignatureVersionSpecific; use crate::ser::Serialize; use crate::util::write_packet_length; impl Serialize for Signature { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_u8(self.config.version().into())?; match self.config.version() { SignatureVersion::V2 | SignatureVersion::V3 => self.to_writer_v3(writer), SignatureVersion::V4 | SignatureVersion::V6 => self.to_writer_v4_v6(writer), SignatureVersion::V5 => { bail!("v5 signature unsupported writer") } SignatureVersion::Other(version) => bail!("Unsupported signature version {}", version), } } } impl Subpacket { /// Convert expiration time "Duration" data to OpenPGP u32 format. /// Use u32:MAX on overflow. fn duration_to_u32(d: &Duration) -> u32 { u32::try_from(d.num_seconds()).unwrap_or(u32::MAX) } fn body_to_writer(&self, writer: &mut impl io::Write) -> Result<()> { match &self.data { SubpacketData::SignatureCreationTime(t) => { writer.write_u32::(t.timestamp().try_into()?)?; } SubpacketData::SignatureExpirationTime(d) => { writer.write_u32::(Self::duration_to_u32(d))?; } SubpacketData::KeyExpirationTime(d) => { writer.write_u32::(Self::duration_to_u32(d))?; } SubpacketData::Issuer(id) => { writer.write_all(id.as_ref())?; } SubpacketData::PreferredSymmetricAlgorithms(algs) => { writer.write_all(&algs.iter().map(|&alg| u8::from(alg)).collect::>())?; } SubpacketData::PreferredHashAlgorithms(algs) => { writer.write_all(&algs.iter().map(|&alg| alg.into()).collect::>())?; } SubpacketData::PreferredCompressionAlgorithms(algs) => { writer.write_all(&algs.iter().map(|&alg| u8::from(alg)).collect::>())?; } SubpacketData::KeyServerPreferences(prefs) => { writer.write_all(prefs)?; } SubpacketData::KeyFlags(flags) => { writer.write_all(flags)?; } SubpacketData::Features(features) => { writer.write_all(features)?; } SubpacketData::RevocationReason(code, reason) => { writer.write_u8((*code).into())?; writer.write_all(reason)?; } SubpacketData::IsPrimary(is_primary) => { writer.write_u8((*is_primary).into())?; } SubpacketData::Revocable(is_revocable) => { writer.write_u8((*is_revocable).into())?; } SubpacketData::EmbeddedSignature(inner_sig) => { (*inner_sig).to_writer(writer)?; } SubpacketData::PreferredKeyServer(server) => { writer.write_all(server.as_bytes())?; } SubpacketData::Notation(notation) => { let is_readable = if notation.readable { 0x80 } else { 0 }; writer.write_all(&[is_readable, 0, 0, 0])?; writer.write_u16::(notation.name.len().try_into()?)?; writer.write_u16::(notation.value.len().try_into()?)?; writer.write_all(¬ation.name)?; writer.write_all(¬ation.value)?; } SubpacketData::RevocationKey(rev_key) => { writer.write_u8(rev_key.class as u8)?; writer.write_u8(rev_key.algorithm.into())?; writer.write_all(&rev_key.fingerprint[..])?; } SubpacketData::SignersUserID(body) => { writer.write_all(body.as_ref())?; } SubpacketData::PolicyURI(uri) => { writer.write_all(uri.as_bytes())?; } SubpacketData::TrustSignature(depth, value) => { writer.write_u8(*depth)?; writer.write_u8(*value)?; } SubpacketData::RegularExpression(regexp) => { writer.write_all(regexp)?; } SubpacketData::ExportableCertification(is_exportable) => { writer.write_u8((*is_exportable).into())?; } SubpacketData::IssuerFingerprint(fp) => { if let Some(version) = fp.version() { writer.write_u8(version.into())?; writer.write_all(fp.as_bytes())?; } else { bail!("IssuerFingerprint: needs versioned fingerprint") } } SubpacketData::PreferredEncryptionModes(algs) => { writer.write_all(&algs.iter().map(|&alg| alg.into()).collect::>())?; } SubpacketData::IntendedRecipientFingerprint(fp) => { if let Some(version) = fp.version() { writer.write_u8(version.into())?; writer.write_all(fp.as_bytes())?; } else { bail!("IntendedRecipientFingerprint: needs versioned fingerprint") } } SubpacketData::PreferredAeadAlgorithms(algs) => { writer.write_all( &algs .iter() .flat_map(|&(sym_alg, aead)| [sym_alg.into(), aead.into()]) .collect::>(), )?; } SubpacketData::Experimental(_, body) => { writer.write_all(body)?; } SubpacketData::Other(_, body) => { writer.write_all(body)?; } SubpacketData::SignatureTarget(pub_alg, hash_alg, hash) => { writer.write_u8((*pub_alg).into())?; writer.write_u8((*hash_alg).into())?; writer.write_all(hash)?; } } Ok(()) } fn body_len(&self) -> Result { let len = match &self.data { SubpacketData::SignatureCreationTime(_) => 4, SubpacketData::SignatureExpirationTime(_) => 4, SubpacketData::KeyExpirationTime(_) => 4, SubpacketData::Issuer(_) => 8, SubpacketData::PreferredSymmetricAlgorithms(algs) => algs.len(), SubpacketData::PreferredHashAlgorithms(algs) => algs.len(), SubpacketData::PreferredCompressionAlgorithms(algs) => algs.len(), SubpacketData::KeyServerPreferences(prefs) => prefs.len(), SubpacketData::KeyFlags(flags) => flags.len(), SubpacketData::Features(features) => features.len(), SubpacketData::RevocationReason(_, reason) => { // 1 byte for revocation code + n for the reason 1 + reason.len() } SubpacketData::IsPrimary(_) => 1, SubpacketData::Revocable(_) => 1, SubpacketData::EmbeddedSignature(sig) => { // TODO: find a more efficient way of doing this, if this gets expensive let mut buf = Vec::new(); (*sig).to_writer(&mut buf)?; buf.len() } SubpacketData::PreferredKeyServer(server) => server.chars().count(), SubpacketData::Notation(n) => { // 4 for the flags, 2 for the name length, 2 for the value length, m for the name, n for the value 4 + 2 + 2 + n.name.len() + n.value.len() } SubpacketData::RevocationKey(_) => 22, SubpacketData::SignersUserID(body) => { let bytes: &[u8] = body.as_ref(); bytes.len() } SubpacketData::PolicyURI(uri) => uri.len(), SubpacketData::TrustSignature(_, _) => 2, SubpacketData::RegularExpression(regexp) => regexp.len(), SubpacketData::ExportableCertification(_) => 1, SubpacketData::IssuerFingerprint(fp) => 1 + fp.len(), SubpacketData::PreferredEncryptionModes(algs) => algs.len(), SubpacketData::IntendedRecipientFingerprint(fp) => 1 + fp.len(), SubpacketData::PreferredAeadAlgorithms(algs) => algs.len() * 2, SubpacketData::Experimental(_, body) => body.len(), SubpacketData::Other(_, body) => body.len(), SubpacketData::SignatureTarget(_, _, hash) => 2 + hash.len(), }; Ok(len) } pub fn typ(&self) -> SubpacketType { match &self.data { SubpacketData::SignatureCreationTime(_) => SubpacketType::SignatureCreationTime, SubpacketData::SignatureExpirationTime(_) => SubpacketType::SignatureExpirationTime, SubpacketData::KeyExpirationTime(_) => SubpacketType::KeyExpirationTime, SubpacketData::Issuer(_) => SubpacketType::Issuer, SubpacketData::PreferredSymmetricAlgorithms(_) => { SubpacketType::PreferredSymmetricAlgorithms } SubpacketData::PreferredHashAlgorithms(_) => SubpacketType::PreferredHashAlgorithms, SubpacketData::PreferredCompressionAlgorithms(_) => { SubpacketType::PreferredCompressionAlgorithms } SubpacketData::KeyServerPreferences(_) => SubpacketType::KeyServerPreferences, SubpacketData::KeyFlags(_) => SubpacketType::KeyFlags, SubpacketData::Features(_) => SubpacketType::Features, SubpacketData::RevocationReason(_, _) => SubpacketType::RevocationReason, SubpacketData::IsPrimary(_) => SubpacketType::PrimaryUserId, SubpacketData::Revocable(_) => SubpacketType::Revocable, SubpacketData::EmbeddedSignature(_) => SubpacketType::EmbeddedSignature, SubpacketData::PreferredKeyServer(_) => SubpacketType::PreferredKeyServer, SubpacketData::Notation(_) => SubpacketType::Notation, SubpacketData::RevocationKey(_) => SubpacketType::RevocationKey, SubpacketData::SignersUserID(_) => SubpacketType::SignersUserID, SubpacketData::PolicyURI(_) => SubpacketType::PolicyURI, SubpacketData::TrustSignature(_, _) => SubpacketType::TrustSignature, SubpacketData::RegularExpression(_) => SubpacketType::RegularExpression, SubpacketData::ExportableCertification(_) => SubpacketType::ExportableCertification, SubpacketData::IssuerFingerprint(_) => SubpacketType::IssuerFingerprint, SubpacketData::PreferredEncryptionModes(_) => SubpacketType::PreferredEncryptionModes, SubpacketData::IntendedRecipientFingerprint(_) => { SubpacketType::IntendedRecipientFingerprint } SubpacketData::PreferredAeadAlgorithms(_) => SubpacketType::PreferredAead, SubpacketData::Experimental(n, _) => SubpacketType::Experimental(*n), SubpacketData::Other(n, _) => SubpacketType::Other(*n), SubpacketData::SignatureTarget(_, _, _) => SubpacketType::SignatureTarget, } } } impl Serialize for Subpacket { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet_length(1 + self.body_len()?, writer)?; writer.write_u8(self.typ().as_u8(self.is_critical))?; self.body_to_writer(writer)?; Ok(()) } } impl SignatureConfig { /// Serializes a v2 or v3 signature. fn to_writer_v3(&self, writer: &mut W) -> Result<()> { writer.write_u8(0x05)?; // 1-octet length of the following hashed material; it MUST be 5 writer.write_u8(self.typ.into())?; // type if let SignatureVersionSpecific::V2 { created, issuer } | SignatureVersionSpecific::V3 { created, issuer } = &self.version_specific { writer.write_u32::(created.timestamp().try_into()?)?; writer.write_all(issuer.as_ref())?; } else { bail!("expecting SignatureVersionSpecific::V3 for a v2/v3 signature") } writer.write_u8(self.pub_alg.into())?; // public algorithm writer.write_u8(self.hash_alg.into())?; // hash algorithm Ok(()) } /// Serializes a v4 or v6 signature. fn to_writer_v4_v6(&self, writer: &mut W) -> Result<()> { writer.write_u8(self.typ.into())?; // type writer.write_u8(self.pub_alg.into())?; // public algorithm writer.write_u8(self.hash_alg.into())?; // hash algorithm // hashed subpackets let mut hashed_subpackets = Vec::new(); for packet in &self.hashed_subpackets { packet.to_writer(&mut hashed_subpackets)?; } match self.version() { SignatureVersion::V4 => { writer.write_u16::(hashed_subpackets.len().try_into()?)? } SignatureVersion::V6 => { writer.write_u32::(hashed_subpackets.len().try_into()?)? } v => unimplemented_err!("signature version {:?}", v), } writer.write_all(&hashed_subpackets)?; // unhashed subpackets let mut unhashed_subpackets = Vec::new(); for packet in &self.unhashed_subpackets { packet.to_writer(&mut unhashed_subpackets)?; } match self.version() { SignatureVersion::V4 => { writer.write_u16::(unhashed_subpackets.len().try_into()?)? } SignatureVersion::V6 => { writer.write_u32::(unhashed_subpackets.len().try_into()?)? } v => unimplemented_err!("signature version {:?}", v), } writer.write_all(&unhashed_subpackets)?; Ok(()) } } impl Signature { /// Serializes a v2 or v3 signature. fn to_writer_v3(&self, writer: &mut W) -> Result<()> { self.config.to_writer_v3(writer)?; // signed hash value writer.write_all(&self.signed_hash_value)?; // the actual cryptographic signature self.signature.to_writer(writer)?; Ok(()) } /// Serializes a v4 or v6 signature. fn to_writer_v4_v6(&self, writer: &mut W) -> Result<()> { self.config.to_writer_v4_v6(writer)?; // signed hash value writer.write_all(&self.signed_hash_value)?; // salt, if v6 if let SignatureVersionSpecific::V6 { salt } = &self.config.version_specific { writer.write_u8(salt.len().try_into()?)?; writer.write_all(salt)?; } // the actual cryptographic signature self.signature.to_writer(writer)?; Ok(()) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use std::fs::File; use std::io::Read; use std::path::Path; use super::*; use crate::packet::{Packet, PacketParser}; fn test_roundtrip(name: &str) { let f = File::open(Path::new("./tests/openpgp/samplemsgs").join(name)).unwrap(); let packets: Vec = PacketParser::new(f).collect::>().unwrap(); let mut serialized = Vec::new(); for p in &packets { if let Packet::Signature(_) = p { p.to_writer(&mut serialized).unwrap(); } else { panic!("unexpected packet: {p:?}"); }; } let bytes = { let mut f = File::open(Path::new("./tests/openpgp/samplemsgs").join(name)).unwrap(); let mut bytes = Vec::new(); f.read_to_end(&mut bytes).unwrap(); bytes }; assert_eq!(bytes, serialized, "failed to roundtrip"); } #[test] fn packet_signature_roundtrip_openpgp_sig_1_key_1() { test_roundtrip("sig-1-key-1.sig"); } #[test] fn packet_signature_roundtrip_openpgp_sig_1_key_2() { test_roundtrip("sig-1-key-2.sig"); } #[test] fn packet_signature_roundtrip_openpgp_sig_2_keys_1() { test_roundtrip("sig-2-keys-1.sig"); } #[test] fn packet_signature_roundtrip_openpgp_sig_2_keys_2() { test_roundtrip("sig-2-keys-2.sig"); } // Tries to roundtrip a signature containing a name + E-Mail with complicated multibyte unicode characters #[test] fn packet_signature_roundtrip_openpgp_with_unicode() { test_roundtrip("unicode.sig"); } } pgp-0.15.0/src/packet/signature/types.rs000064400000000000000000001172151046102023000162550ustar 00000000000000use std::io::Read; use bitfield::bitfield; use bstr::{BStr, BString}; use byteorder::{BigEndian, ByteOrder}; use chrono::{DateTime, Duration, Utc}; use iter_read::IterRead; use log::debug; use num_enum::{FromPrimitive, IntoPrimitive}; use smallvec::{smallvec, SmallVec}; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::Result; use crate::line_writer::LineBreak; use crate::normalize_lines::Normalized; use crate::packet::signature::SignatureConfig; use crate::packet::{PacketTrait, SignatureVersionSpecific}; use crate::ser::Serialize; use crate::types::{ self, CompressionAlgorithm, Fingerprint, KeyId, KeyVersion, PublicKeyTrait, SignatureBytes, Tag, Version, }; /// Signature Packet /// #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub struct Signature { packet_version: Version, pub config: SignatureConfig, #[debug("{}", hex::encode(signed_hash_value))] pub signed_hash_value: [u8; 2], pub signature: SignatureBytes, } impl Signature { /// Constructor for an OpenPGP v2 signature packet. /// Note: This is a historical packet version! #[allow(clippy::too_many_arguments)] pub fn v2( packet_version: Version, typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, created: DateTime, issuer: KeyId, signed_hash_value: [u8; 2], signature: SignatureBytes, ) -> Self { Signature { packet_version, config: SignatureConfig { typ, pub_alg, hash_alg, hashed_subpackets: vec![], unhashed_subpackets: vec![], version_specific: SignatureVersionSpecific::V2 { created, issuer }, }, signed_hash_value, signature, } } /// Constructor for an OpenPGP v3 signature packet. /// Note: This is a historical packet version! #[allow(clippy::too_many_arguments)] pub fn v3( packet_version: Version, typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, created: DateTime, issuer: KeyId, signed_hash_value: [u8; 2], signature: SignatureBytes, ) -> Self { Signature { packet_version, config: SignatureConfig { typ, pub_alg, hash_alg, hashed_subpackets: vec![], unhashed_subpackets: vec![], version_specific: SignatureVersionSpecific::V3 { created, issuer }, }, signed_hash_value, signature, } } /// Constructor for an OpenPGP v4 signature packet. /// /// OpenPGP v4 signatures are typically used with OpenPGP v4 keys, as specified in RFC 9580 /// (and formerly in 4880 and 2440). #[allow(clippy::too_many_arguments)] pub fn v4( packet_version: Version, typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, signed_hash_value: [u8; 2], signature: SignatureBytes, hashed_subpackets: Vec, unhashed_subpackets: Vec, ) -> Self { Signature { packet_version, config: SignatureConfig { typ, pub_alg, hash_alg, hashed_subpackets, unhashed_subpackets, version_specific: SignatureVersionSpecific::V4, }, signed_hash_value, signature, } } /// Constructor for an OpenPGP v6 signature packet. /// /// OpenPGP v6 signatures are specified in RFC 9580 and only used with OpenPGP v6 keys. #[allow(clippy::too_many_arguments)] pub fn v6( packet_version: Version, typ: SignatureType, pub_alg: PublicKeyAlgorithm, hash_alg: HashAlgorithm, signed_hash_value: [u8; 2], signature: SignatureBytes, hashed_subpackets: Vec, unhashed_subpackets: Vec, salt: Vec, ) -> Self { Signature { packet_version, config: SignatureConfig { typ, pub_alg, hash_alg, hashed_subpackets, unhashed_subpackets, version_specific: SignatureVersionSpecific::V6 { salt }, }, signed_hash_value, signature, } } pub fn from_config( config: SignatureConfig, signed_hash_value: [u8; 2], signature: SignatureBytes, ) -> Self { Signature { packet_version: Default::default(), config, signed_hash_value, signature, } } /// Returns what kind of signature this is. pub fn typ(&self) -> SignatureType { self.config.typ() } /// The used `HashAlgorithm`. pub fn hash_alg(&self) -> HashAlgorithm { self.config.hash_alg } /// Does `key` match any issuer or issuer_fingerprint subpacket in `sig`? /// If yes, we consider `key` a candidate to verify `sig` against. /// /// We also consider `key` a match for `sig` by default, if `sig` contains no issuer-related /// subpackets. fn match_identity(sig: &Signature, key: &impl PublicKeyTrait) -> bool { let issuers = sig.issuer(); let issuer_fps = sig.issuer_fingerprint(); // If there is no subpacket that signals the issuer, we consider `sig` and `key` a // potential match, and will check the cryptographic validity. if issuers.is_empty() && issuer_fps.is_empty() { return true; } // Does any issuer or issuer fingerprint subpacket matche the identity of `sig`? issuers.iter().any(|&key_id| key_id == &key.key_id()) || issuer_fps.iter().any(|&fp| fp == &key.fingerprint()) } /// Check alignment between signing key version and signature version. /// /// Version 6 signatures and version 6 keys are strongly linked: /// - only a v6 key may produce a v6 signature /// - a v6 key may only produce v6 signatures fn check_signature_key_version_alignment( key: &impl PublicKeyTrait, config: &SignatureConfig, ) -> Result<()> { // Every signature made by a version 6 key MUST be a version 6 signature. if key.version() == KeyVersion::V6 { ensure_eq!( config.version(), SignatureVersion::V6, "Non v6 signature by a v6 key is not allowed" ); } if config.version() == SignatureVersion::V6 { ensure_eq!( key.version(), KeyVersion::V6, "v6 signature by a non-v6 key is not allowed" ); } Ok(()) } /// Verify this signature. pub fn verify(&self, key: &impl PublicKeyTrait, data: R) -> Result<()> where R: Read, { Self::check_signature_key_version_alignment(&key, &self.config)?; ensure!( Self::match_identity(self, key), "verify: No matching issuer or issuer_fingerprint for Key ID: {:?}", &key.key_id(), ); let mut hasher = self.config.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.config.version_specific { // Salt size must match the expected length for the hash algorithm that is used // // See: https://www.rfc-editor.org/rfc/rfc9580.html#section-5.2.3-2.10.2.1.1 ensure_eq!( self.config.hash_alg.salt_len(), Some(salt.len()), "Illegal salt length {} for a V6 Signature using {:?}", salt.len(), self.config.hash_alg ); hasher.update(salt.as_ref()) } if matches!(self.typ(), SignatureType::Text) { let normalized = Normalized::new(data.bytes().flat_map(|b| b.ok()), LineBreak::Crlf); self.config .hash_data_to_sign(&mut *hasher, IterRead::new(normalized))?; } else { self.config.hash_data_to_sign(&mut *hasher, data)?; } let len = self.config.hash_signature_data(&mut hasher)?; hasher.update(&self.config.trailer(len)?); let hash = &hasher.finish()[..]; // Check that the high 16 bits of the hash from the signature packet match with the hash we // just calculated. // // "When verifying a version 6 signature, an implementation MUST reject the signature if // these octets do not match the first two octets of the computed hash." // // (See https://www.rfc-editor.org/rfc/rfc9580.html#name-notes-on-signatures) // // (Note: we currently also reject v4 signatures if the calculated hash doesn't match the // high 16 bits in the signature packet, even though RFC 9580 doesn't strictly require this) ensure_eq!( &self.signed_hash_value, &hash[0..2], "signature: invalid signed hash value" ); key.verify_signature(self.config.hash_alg, hash, &self.signature) } /// Verifies a certification signature type (for self-signatures). pub fn verify_certification( &self, key: &impl PublicKeyTrait, tag: Tag, id: &impl Serialize, ) -> Result<()> { self.verify_third_party_certification(&key, &key, tag, id) } /// Verifies a certification signature type (for third-party signatures). pub fn verify_third_party_certification( &self, signee: &impl PublicKeyTrait, signer: &impl PublicKeyTrait, tag: Tag, id: &impl Serialize, ) -> Result<()> { let key_id = signee.key_id(); debug!("verifying certification {:?} {:#?}", key_id, self); Self::check_signature_key_version_alignment(&signer, &self.config)?; ensure!( Self::match_identity(self, signer), "verify_certification: No matching issuer or issuer_fingerprint for Key ID: {:?}", key_id, ); let mut hasher = self.config.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.config.version_specific { hasher.update(salt.as_ref()) } // the key of the signee { let mut key_buf = Vec::new(); // TODO: this is different for V5 signee.serialize_for_hashing(&mut key_buf)?; hasher.update(&key_buf); } // the packet content { let mut packet_buf = Vec::new(); id.to_writer(&mut packet_buf)?; match self.config.version() { SignatureVersion::V2 | SignatureVersion::V3 => { // Nothing to do } SignatureVersion::V4 | SignatureVersion::V6 => { let prefix = match tag { Tag::UserId => 0xB4, Tag::UserAttribute => 0xD1, _ => bail!("invalid tag for certification validation: {:?}", tag), }; let mut prefix_buf = [prefix, 0u8, 0u8, 0u8, 0u8]; BigEndian::write_u32(&mut prefix_buf[1..], packet_buf.len().try_into()?); // prefixes hasher.update(&prefix_buf); } SignatureVersion::V5 => { bail!("v5 signature unsupported tpc") } SignatureVersion::Other(version) => { bail!("unsupported signature version: {:?}", version) } } hasher.update(&packet_buf); } let len = self.config.hash_signature_data(&mut hasher)?; hasher.update(&self.config.trailer(len)?); let hash = &hasher.finish()[..]; ensure_eq!( &self.signed_hash_value, &hash[0..2], "certification: invalid signed hash value" ); signer.verify_signature(self.config.hash_alg, hash, &self.signature) } /// Verifies a key binding (which binds a subkey to the primary key). /// /// "Subkey Binding Signature (type ID 0x18)" pub fn verify_key_binding( &self, signing_key: &impl PublicKeyTrait, key: &impl PublicKeyTrait, ) -> Result<()> { self.verify_key_binding_internal(signing_key, key, false) } /// Verifies a primary key binding signature, or "back signature" (which links the primary to a signing subkey). /// /// "Primary Key Binding Signature (type ID 0x19)" pub fn verify_backwards_key_binding( &self, signing_key: &impl PublicKeyTrait, key: &impl PublicKeyTrait, ) -> Result<()> { self.verify_key_binding_internal(signing_key, key, true) } /// Verify subkey binding signatures, either regular subkey binding, or a "back signature". /// /// - when backsig is false: verify a "Subkey Binding Signature (type ID 0x18)" /// - when backsig is true: verify a "Primary Key Binding Signature (type ID 0x19)" fn verify_key_binding_internal( &self, signer: &impl PublicKeyTrait, signee: &impl PublicKeyTrait, backsig: bool, ) -> Result<()> { debug!( "verifying key binding: {:#?} - {:#?} - {:#?} (backsig: {})", self, signer, signee, backsig ); Self::check_signature_key_version_alignment(&signer, &self.config)?; let mut hasher = self.config.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.config.version_specific { hasher.update(salt.as_ref()) } // Hash the two keys: // - for a regular binding signature, first the signer (primary), then the signee (subkey) // - for a "backward signature" (Primary Key Binding Signature), the order of hashing is signee (primary), signer (subkey) // First key to hash { let mut key_buf = Vec::new(); if !backsig { signer.serialize_for_hashing(&mut key_buf)?; // primary } else { signee.serialize_for_hashing(&mut key_buf)?; // primary } hasher.update(&key_buf); } // Second key to hash { let mut key_buf = Vec::new(); if !backsig { signee.serialize_for_hashing(&mut key_buf)?; // subkey } else { signer.serialize_for_hashing(&mut key_buf)?; // subkey } hasher.update(&key_buf); } let len = self.config.hash_signature_data(&mut hasher)?; hasher.update(&self.config.trailer(len)?); let hash = &hasher.finish()[..]; ensure_eq!( &self.signed_hash_value, &hash[0..2], "key binding: invalid signed hash value" ); signer.verify_signature(self.config.hash_alg, hash, &self.signature) } /// Verifies a direct key signature or a revocation. pub fn verify_key(&self, key: &impl PublicKeyTrait) -> Result<()> { debug!("verifying key (revocation): {:#?} - {:#?}", self, key); Self::check_signature_key_version_alignment(&key, &self.config)?; ensure!( Self::match_identity(self, key), "verify_key: No matching issuer or issuer_fingerprint for Key ID: {:?}", &key.key_id(), ); let mut hasher = self.config.hash_alg.new_hasher()?; if let SignatureVersionSpecific::V6 { salt } = &self.config.version_specific { hasher.update(salt.as_ref()) } { let mut key_buf = Vec::new(); key.serialize_for_hashing(&mut key_buf)?; hasher.update(&key_buf); } let len = self.config.hash_signature_data(&mut hasher)?; hasher.update(&self.config.trailer(len)?); let hash = &hasher.finish()[..]; ensure_eq!( &self.signed_hash_value, &hash[0..2], "key: invalid signed hash value" ); key.verify_signature(self.config.hash_alg, hash, &self.signature) } /// Returns if the signature is a certification or not. pub fn is_certification(&self) -> bool { self.config.is_certification() } pub fn key_expiration_time(&self) -> Option<&Duration> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::KeyExpirationTime(d) => Some(d), _ => None, }) } pub fn signature_expiration_time(&self) -> Option<&Duration> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::SignatureExpirationTime(d) => Some(d), _ => None, }) } pub fn created(&self) -> Option<&DateTime> { self.config.created() } pub fn issuer(&self) -> Vec<&KeyId> { self.config.issuer() } pub fn issuer_fingerprint(&self) -> Vec<&Fingerprint> { self.config.issuer_fingerprint() } pub fn preferred_symmetric_algs(&self) -> &[SymmetricKeyAlgorithm] { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::PreferredSymmetricAlgorithms(d) => Some(&d[..]), _ => None, }) .unwrap_or_else(|| &[][..]) } pub fn preferred_aead_algs(&self) -> &[(SymmetricKeyAlgorithm, AeadAlgorithm)] { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::PreferredAeadAlgorithms(d) => Some(&d[..]), _ => None, }) .unwrap_or_else(|| &[][..]) } pub fn preferred_hash_algs(&self) -> &[HashAlgorithm] { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::PreferredHashAlgorithms(d) => Some(&d[..]), _ => None, }) .unwrap_or_else(|| &[][..]) } pub fn preferred_compression_algs(&self) -> &[CompressionAlgorithm] { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::PreferredCompressionAlgorithms(d) => Some(&d[..]), _ => None, }) .unwrap_or_else(|| &[][..]) } pub fn key_server_prefs(&self) -> &[u8] { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::KeyServerPreferences(d) => Some(&d[..]), _ => None, }) .unwrap_or_else(|| &[][..]) } pub fn key_flags(&self) -> KeyFlags { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::KeyFlags(d) => Some(d[..].into()), _ => None, }) .unwrap_or_default() } pub fn features(&self) -> &[u8] { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::Features(d) => Some(&d[..]), _ => None, }) .unwrap_or_else(|| &[][..]) } pub fn revocation_reason_code(&self) -> Option<&RevocationCode> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::RevocationReason(code, _) => Some(code), _ => None, }) } pub fn revocation_reason_string(&self) -> Option<&BStr> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::RevocationReason(_, reason) => Some(reason.as_ref()), _ => None, }) } pub fn is_primary(&self) -> bool { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::IsPrimary(d) => Some(*d), _ => None, }) .unwrap_or(false) } pub fn is_revocable(&self) -> bool { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::Revocable(d) => Some(*d), _ => None, }) .unwrap_or(true) } pub fn embedded_signature(&self) -> Option<&Signature> { // We consider data from both the hashed and unhashed area here, because the embedded // signature is inherently cryptographically secured. An attacker can't add a valid // embedded signature, canonicalization will remove any invalid embedded signature // subpackets. self.config .hashed_subpackets() .chain(self.config.unhashed_subpackets()) .find_map(|p| match &p.data { SubpacketData::EmbeddedSignature(d) => Some(&**d), _ => None, }) } pub fn preferred_key_server(&self) -> Option<&str> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::PreferredKeyServer(d) => Some(d.as_str()), _ => None, }) } pub fn notations(&self) -> Vec<&Notation> { self.config .hashed_subpackets() .filter_map(|p| match &p.data { SubpacketData::Notation(d) => Some(d), _ => None, }) .collect() } pub fn revocation_key(&self) -> Option<&types::RevocationKey> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::RevocationKey(d) => Some(d), _ => None, }) } /// Gets the user id of the signer /// /// Note that the user id may not be valid utf-8, if it was created /// using a different encoding. But since the RFC describes every /// text as utf-8 it is up to the caller whether to error on non utf-8 data. pub fn signers_userid(&self) -> Option<&BStr> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::SignersUserID(d) => Some(d.as_ref()), _ => None, }) } pub fn policy_uri(&self) -> Option<&str> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::PolicyURI(d) => Some(d.as_ref()), _ => None, }) } pub fn trust_signature(&self) -> Option<(u8, u8)> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::TrustSignature(depth, value) => Some((*depth, *value)), _ => None, }) } pub fn regular_expression(&self) -> Option<&BStr> { self.config.hashed_subpackets().find_map(|p| match &p.data { SubpacketData::RegularExpression(d) => Some(d.as_ref()), _ => None, }) } pub fn exportable_certification(&self) -> bool { self.config .hashed_subpackets() .find_map(|p| match &p.data { SubpacketData::ExportableCertification(d) => Some(*d), _ => None, }) .unwrap_or(true) } } #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum SignatureVersion { /// Deprecated V2 = 2, V3 = 3, V4 = 4, V5 = 5, V6 = 6, #[num_enum(catch_all)] Other(u8), } impl Default for SignatureVersion { fn default() -> Self { Self::V4 } } #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum SignatureType { /// Signature of a binary document. /// This means the signer owns it, created it, or certifies that it has not been modified. Binary = 0x00, /// Signature of a canonical text document. /// This means the signer owns it, created it, or certifies that it /// has not been modified. The signature is calculated over the text /// data with its line endings converted to ``. Text = 0x01, /// Standalone signature. /// This signature is a signature of only its own subpacket contents. /// It is calculated identically to a signature over a zero-length /// binary document. Note that it doesn't make sense to have a V3 standalone signature. Standalone = 0x02, /// Generic certification of a User ID and Public-Key packet. /// The issuer of this certification does not make any particular /// assertion as to how well the certifier has checked that the owner /// of the key is in fact the person described by the User ID. CertGeneric = 0x10, /// Persona certification of a User ID and Public-Key packet. /// The issuer of this certification has not done any verification of /// the claim that the owner of this key is the User ID specified. CertPersona = 0x11, /// Casual certification of a User ID and Public-Key packet. /// The issuer of this certification has done some casual /// verification of the claim of identity. CertCasual = 0x12, /// Positive certification of a User ID and Public-Key packet. /// The issuer of this certification has done substantial /// verification of the claim of identity. /// /// Most OpenPGP implementations make their "key signatures" as 0x10 /// certifications. Some implementations can issue 0x11-0x13 /// certifications, but few differentiate between the types. CertPositive = 0x13, /// Subkey Binding Signature /// This signature is a statement by the top-level signing key that /// indicates that it owns the subkey. This signature is calculated /// directly on the primary key and subkey, and not on any User ID or /// other packets. A signature that binds a signing subkey MUST have /// an Embedded Signature subpacket in this binding signature that /// contains a 0x19 signature made by the signing subkey on the /// primary key and subkey. SubkeyBinding = 0x18, /// Primary Key Binding Signature /// This signature is a statement by a signing subkey, indicating /// that it is owned by the primary key and subkey. This signature /// is calculated the same way as a 0x18 signature: directly on the /// primary key and subkey, and not on any User ID or other packets. KeyBinding = 0x19, /// Signature directly on a key /// This signature is calculated directly on a key. It binds the /// information in the Signature subpackets to the key, and is /// appropriate to be used for subpackets that provide information /// about the key, such as the Revocation Key subpacket. It is also /// appropriate for statements that non-self certifiers want to make /// about the key itself, rather than the binding between a key and a name. Key = 0x1F, /// Key revocation signature /// The signature is calculated directly on the key being revoked. A /// revoked key is not to be used. Only revocation signatures by the /// key being revoked, or by an authorized revocation key, should be /// considered valid revocation signatures. KeyRevocation = 0x20, /// Subkey revocation signature /// The signature is calculated directly on the subkey being revoked. /// A revoked subkey is not to be used. Only revocation signatures /// by the top-level signature key that is bound to this subkey, or /// by an authorized revocation key, should be considered valid /// revocation signatures. SubkeyRevocation = 0x28, /// Certification revocation signature /// This signature revokes an earlier User ID certification signature /// (signature class 0x10 through 0x13) or direct-key signature /// (0x1F). It should be issued by the same key that issued the /// revoked signature or an authorized revocation key. The signature /// is computed over the same data as the certificate that it /// revokes, and should have a later creation date than that /// certificate. CertRevocation = 0x30, /// Timestamp signature. /// This signature is only meaningful for the timestamp contained in /// it. Timestamp = 0x40, /// Third-Party Confirmation signature. /// This signature is a signature over some other OpenPGP Signature /// packet(s). It is analogous to a notary seal on the signed data. /// A third-party signature SHOULD include Signature Target /// subpacket(s) to give easy identification. Note that we really do /// mean SHOULD. There are plausible uses for this (such as a blind /// party that only sees the signature, not the key or source /// document) that cannot include a target subpacket. ThirdParty = 0x50, #[num_enum(catch_all)] Other(u8), } #[derive(Debug, PartialEq, Eq, Copy, Clone)] /// Available signature subpacket types pub enum SubpacketType { SignatureCreationTime, SignatureExpirationTime, ExportableCertification, TrustSignature, RegularExpression, Revocable, KeyExpirationTime, PreferredSymmetricAlgorithms, RevocationKey, Issuer, Notation, PreferredHashAlgorithms, PreferredCompressionAlgorithms, KeyServerPreferences, PreferredKeyServer, PrimaryUserId, PolicyURI, KeyFlags, SignersUserID, RevocationReason, Features, SignatureTarget, EmbeddedSignature, IssuerFingerprint, PreferredEncryptionModes, // non-RFC, may only be 1: EAX, 2: OCB IntendedRecipientFingerprint, // AttestedCertifications, // non-RFC // KeyBlock, // non-RFC PreferredAead, Experimental(u8), Other(u8), } impl SubpacketType { pub fn as_u8(&self, is_critical: bool) -> u8 { let raw: u8 = match self { SubpacketType::SignatureCreationTime => 2, SubpacketType::SignatureExpirationTime => 3, SubpacketType::ExportableCertification => 4, SubpacketType::TrustSignature => 5, SubpacketType::RegularExpression => 6, SubpacketType::Revocable => 7, SubpacketType::KeyExpirationTime => 9, SubpacketType::PreferredSymmetricAlgorithms => 11, SubpacketType::RevocationKey => 12, SubpacketType::Issuer => 16, SubpacketType::Notation => 20, SubpacketType::PreferredHashAlgorithms => 21, SubpacketType::PreferredCompressionAlgorithms => 22, SubpacketType::KeyServerPreferences => 23, SubpacketType::PreferredKeyServer => 24, SubpacketType::PrimaryUserId => 25, SubpacketType::PolicyURI => 26, SubpacketType::KeyFlags => 27, SubpacketType::SignersUserID => 28, SubpacketType::RevocationReason => 29, SubpacketType::Features => 30, SubpacketType::SignatureTarget => 31, SubpacketType::EmbeddedSignature => 32, SubpacketType::IssuerFingerprint => 33, SubpacketType::PreferredEncryptionModes => 34, SubpacketType::IntendedRecipientFingerprint => 35, // SubpacketType::AttestedCertifications => 37, // SubpacketType::KeyBlock => 38, SubpacketType::PreferredAead => 39, SubpacketType::Experimental(n) => *n, SubpacketType::Other(n) => *n, }; if is_critical { // set critical bit raw | 0b1000_0000 } else { raw } } #[inline] pub fn from_u8(n: u8) -> (Self, bool) { let is_critical = (n >> 7) == 1; // remove critical bit let n = n & 0b0111_1111; let m = match n { 2 => SubpacketType::SignatureCreationTime, 3 => SubpacketType::SignatureExpirationTime, 4 => SubpacketType::ExportableCertification, 5 => SubpacketType::TrustSignature, 6 => SubpacketType::RegularExpression, 7 => SubpacketType::Revocable, 9 => SubpacketType::KeyExpirationTime, 11 => SubpacketType::PreferredSymmetricAlgorithms, 12 => SubpacketType::RevocationKey, 16 => SubpacketType::Issuer, 20 => SubpacketType::Notation, 21 => SubpacketType::PreferredHashAlgorithms, 22 => SubpacketType::PreferredCompressionAlgorithms, 23 => SubpacketType::KeyServerPreferences, 24 => SubpacketType::PreferredKeyServer, 25 => SubpacketType::PrimaryUserId, 26 => SubpacketType::PolicyURI, 27 => SubpacketType::KeyFlags, 28 => SubpacketType::SignersUserID, 29 => SubpacketType::RevocationReason, 30 => SubpacketType::Features, 31 => SubpacketType::SignatureTarget, 32 => SubpacketType::EmbeddedSignature, 33 => SubpacketType::IssuerFingerprint, 34 => SubpacketType::PreferredEncryptionModes, 35 => SubpacketType::IntendedRecipientFingerprint, // 37 => SubpacketType::AttestedCertifications, // 38 => SubpacketType::KeyBlock, 39 => SubpacketType::PreferredAead, 100..=110 => SubpacketType::Experimental(n), _ => SubpacketType::Other(n), }; (m, is_critical) } } #[derive(Debug, PartialEq, Eq, Clone)] pub struct Subpacket { pub is_critical: bool, pub data: SubpacketData, } impl Subpacket { /// Construct a new regular subpacket. pub const fn regular(data: SubpacketData) -> Self { Subpacket { is_critical: false, data, } } /// Construct a new critical subpacket. pub const fn critical(data: SubpacketData) -> Self { Subpacket { is_critical: true, data, } } } #[derive(derive_more::Debug, PartialEq, Eq, Clone)] pub enum SubpacketData { /// The time the signature was made. SignatureCreationTime(DateTime), /// The time the signature will expire. SignatureExpirationTime(Duration), /// When the key is going to expire KeyExpirationTime(Duration), /// The OpenPGP Key ID of the key issuing the signature. Issuer(KeyId), /// List of symmetric algorithms that indicate which algorithms the key holder prefers to use. /// Renamed to "Preferred Symmetric Ciphers for v1 SEIPD" in RFC 9580 PreferredSymmetricAlgorithms(SmallVec<[SymmetricKeyAlgorithm; 8]>), /// List of hash algorithms that indicate which algorithms the key holder prefers to use. PreferredHashAlgorithms(SmallVec<[HashAlgorithm; 8]>), /// List of compression algorithms that indicate which algorithms the key holder prefers to use. PreferredCompressionAlgorithms(SmallVec<[CompressionAlgorithm; 8]>), KeyServerPreferences(#[debug("{}", hex::encode(_0))] SmallVec<[u8; 4]>), KeyFlags(#[debug("{}", hex::encode(_0))] SmallVec<[u8; 1]>), Features(#[debug("{}", hex::encode(_0))] SmallVec<[u8; 1]>), RevocationReason(RevocationCode, BString), IsPrimary(bool), Revocable(bool), EmbeddedSignature(Box), PreferredKeyServer(String), Notation(Notation), RevocationKey(types::RevocationKey), SignersUserID(BString), /// The URI of the policy under which the signature was issued PolicyURI(String), TrustSignature(u8, u8), RegularExpression(BString), ExportableCertification(bool), IssuerFingerprint(Fingerprint), PreferredEncryptionModes(SmallVec<[AeadAlgorithm; 2]>), IntendedRecipientFingerprint(Fingerprint), PreferredAeadAlgorithms(SmallVec<[(SymmetricKeyAlgorithm, AeadAlgorithm); 4]>), Experimental(u8, #[debug("{}", hex::encode(_1))] SmallVec<[u8; 2]>), Other(u8, #[debug("{}", hex::encode(_1))] Vec), SignatureTarget( PublicKeyAlgorithm, HashAlgorithm, #[debug("{}", hex::encode(_2))] Vec, ), } bitfield! { #[derive(Default, PartialEq, Eq, Copy, Clone)] pub struct KeyFlags(u8); impl Debug; pub certify, set_certify: 0; pub sign, set_sign: 1; pub encrypt_comms, set_encrypt_comms: 2; pub encrypt_storage, set_encrypt_storage: 3; pub shared, set_shared: 4; pub authentication, set_authentication: 5; pub group, set_group: 7; } impl<'a> From<&'a [u8]> for KeyFlags { fn from(other: &'a [u8]) -> Self { if other.is_empty() { Default::default() } else { KeyFlags(other[0]) } } } impl From for SmallVec<[u8; 1]> { fn from(flags: KeyFlags) -> Self { smallvec![flags.0] } } #[derive(Debug, PartialEq, Eq, Clone)] pub struct Notation { pub readable: bool, pub name: BString, pub value: BString, } /// Codes for revocation reasons #[derive(Debug, PartialEq, Eq, Copy, Clone, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum RevocationCode { /// No reason specified (key revocations or cert revocations) NoReason = 0, /// Key is superseded (key revocations) KeySuperseded = 1, /// Key material has been compromised (key revocations) KeyCompromised = 2, /// Key is retired and no longer used (key revocations) KeyRetired = 3, /// User ID information is no longer valid (cert revocations) CertUserIdInvalid = 32, /// Private Use range (from OpenPGP) Private100 = 100, Private101 = 101, Private102 = 102, Private103 = 103, Private104 = 104, Private105 = 105, Private106 = 106, Private107 = 107, Private108 = 108, Private109 = 109, Private110 = 110, /// Undefined code #[num_enum(catch_all)] Other(u8), } impl PacketTrait for Signature { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::Signature } } #[cfg(test)] mod tests { use super::*; #[test] fn test_keyflags() { let flags: KeyFlags = Default::default(); assert_eq!(flags.0, 0x00); let mut flags = KeyFlags::default(); flags.set_certify(true); assert!(flags.certify()); assert_eq!(flags.0, 0x01); let mut flags = KeyFlags::default(); flags.set_sign(true); assert_eq!(flags.0, 0x02); let mut flags = KeyFlags::default(); flags.set_encrypt_comms(true); assert_eq!(flags.0, 0x04); let mut flags = KeyFlags::default(); flags.set_encrypt_storage(true); assert_eq!(flags.0, 0x08); let mut flags = KeyFlags::default(); flags.set_shared(true); assert_eq!(flags.0, 0x10); let mut flags = KeyFlags::default(); flags.set_authentication(true); assert_eq!(flags.0, 0x20); let mut flags = KeyFlags::default(); flags.set_group(true); assert_eq!(flags.0, 0x80); } #[test] fn test_critical() { use SubpacketType::*; let cases = [ SignatureCreationTime, SignatureExpirationTime, ExportableCertification, TrustSignature, RegularExpression, Revocable, KeyExpirationTime, PreferredSymmetricAlgorithms, RevocationKey, Issuer, Notation, PreferredHashAlgorithms, PreferredCompressionAlgorithms, KeyServerPreferences, PreferredKeyServer, PrimaryUserId, PolicyURI, KeyFlags, SignersUserID, RevocationReason, Features, SignatureTarget, EmbeddedSignature, IssuerFingerprint, PreferredAead, Experimental(101), Other(95), ]; for case in cases { assert_eq!(SubpacketType::from_u8(case.as_u8(false)), (case, false)); assert_eq!(SubpacketType::from_u8(case.as_u8(true)), (case, true)); } } } pgp-0.15.0/src/packet/single.rs000064400000000000000000000144011046102023000143620ustar 00000000000000// comes from inside somewhere of nom #![allow(clippy::useless_let_if_seq)] use log::warn; use nom::bits; use nom::branch::alt; use nom::combinator::{map, map_res}; use nom::number::streaming::{be_u32, be_u8}; use nom::sequence::{preceded, tuple}; use crate::errors::{Error, IResult, Result}; use crate::packet::packet_sum::Packet; use crate::packet::{ CompressedData, LiteralData, Marker, ModDetectionCode, OnePassSignature, Padding, PublicKey, PublicKeyEncryptedSessionKey, PublicSubkey, SecretKey, SecretSubkey, Signature, SymEncryptedData, SymEncryptedProtectedData, SymKeyEncryptedSessionKey, Trust, UserAttribute, UserId, }; use crate::types::{PacketLength, Tag, Version}; use crate::util::{u16_as_usize, u32_as_usize, u8_as_usize}; /// Parses an old format packet header ("Legacy format") /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-packet-headers fn old_packet_header(i: &[u8]) -> IResult<&[u8], (Version, Tag, PacketLength)> { #[allow(non_snake_case)] bits::bits::<_, _, crate::errors::Error, _, _>(|I| { use bits::streaming::{tag, take}; let (I, (_, ver, tag, len_type)) = tuple(( // First bit is always 1 tag(0b1, 1usize), // Version: 0 map_res(tag(0b0, 1usize), Version::try_from), // Packet Tag map_res(take(4usize), u8::try_into), // Packet Length Type take(2usize), ))(I)?; let (I, len) = match len_type { // One-Octet Lengths 0 => map(take(8usize), |val| u8_as_usize(val).into())(I)?, // Two-Octet Lengths 1 => map(take(16usize), |val| u16_as_usize(val).into())(I)?, // Four-Octet Lengths 2 => map(take(32usize), |val| u32_as_usize(val).into())(I)?, 3 => (I, PacketLength::Indeterminate), _ => { return Err(nom::Err::Error(crate::errors::Error::ParsingError( nom::error::ErrorKind::Switch, ))) } }; Ok((I, (ver, tag, len))) })(i) } pub(crate) fn read_packet_len(i: &[u8]) -> IResult<&[u8], PacketLength> { let (i, olen) = be_u8(i)?; match olen { // One-Octet Lengths 0..=191 => Ok((i, (olen as usize).into())), // Two-Octet Lengths 192..=223 => map(be_u8, |a| { (((olen as usize - 192) << 8) + 192 + a as usize).into() })(i), // Partial Body Lengths 224..=254 => Ok((i, PacketLength::Partial(1 << (olen as usize & 0x1F)))), // Five-Octet Lengths 255 => { let (i, len) = be_u32(i)?; Ok((i, (len as usize).into())) } } } /// Parses a new format packet header ("OpenPGP format") /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#name-packet-headers fn new_packet_header(i: &[u8]) -> IResult<&[u8], (Version, Tag, PacketLength)> { use bits::streaming::*; #[allow(non_snake_case)] bits::bits(|I| { preceded( // First bit is always 1 tag(0b1, 1usize), tuple(( // Version: 1 map_res(tag(0b1, 1usize), Version::try_from), // Packet Tag map(take(6usize), u8::into), // packet length bits::bytes(read_packet_len), )), )(I) })(i) } /// Parse a single Packet Header /// https://www.rfc-editor.org/rfc/rfc9580.html#name-packet-headers pub fn parser(i: &[u8]) -> IResult<&[u8], (Version, Tag, PacketLength)> { let (i, head) = alt((new_packet_header, old_packet_header))(i)?; Ok((i, head)) } pub fn body_parser(ver: Version, tag: Tag, body: &[u8]) -> Result { let res: Result = match tag { Tag::PublicKeyEncryptedSessionKey => { PublicKeyEncryptedSessionKey::from_slice(ver, body).map(Into::into) } Tag::Signature => Signature::from_slice(ver, body).map(Into::into), Tag::SymKeyEncryptedSessionKey => { SymKeyEncryptedSessionKey::from_slice(ver, body).map(Into::into) } Tag::OnePassSignature => OnePassSignature::from_slice(ver, body).map(Into::into), Tag::SecretKey => SecretKey::from_slice(ver, body).map(Into::into), Tag::PublicKey => PublicKey::from_slice(ver, body).map(Into::into), Tag::SecretSubkey => SecretSubkey::from_slice(ver, body).map(Into::into), Tag::CompressedData => CompressedData::from_slice(ver, body).map(Into::into), Tag::SymEncryptedData => SymEncryptedData::from_slice(ver, body).map(Into::into), Tag::Marker => Marker::from_slice(ver, body).map(Into::into), Tag::LiteralData => LiteralData::from_slice(ver, body).map(Into::into), Tag::Trust => Trust::from_slice(ver, body).map(Into::into), Tag::UserId => UserId::from_slice(ver, body).map(Into::into), Tag::PublicSubkey => PublicSubkey::from_slice(ver, body).map(Into::into), Tag::UserAttribute => UserAttribute::from_slice(ver, body).map(Into::into), Tag::SymEncryptedProtectedData => { SymEncryptedProtectedData::from_slice(ver, body).map(Into::into) } Tag::ModDetectionCode => ModDetectionCode::from_slice(ver, body).map(Into::into), Tag::Padding => Padding::from_slice(ver, body).map(Into::into), Tag::Other(20) => { unimplemented_err!("GnuPG-proprietary 'OCB Encrypted Data Packet' is unsupported") } Tag::Other(22..=39) => { // a "hard" error that will bubble up and interrupt processing of compositions return Err(Error::InvalidPacketContent(Box::new(Error::Message( format!("Unassigned Critical Packet type {:?}", tag), )))); } Tag::Other(40..=59) => { // a "soft" error that will usually get ignored while processing packet streams unsupported_err!("Unsupported but non-critical packet type: {:?}", tag) } Tag::Other(other) => unimplemented_err!("Unknown packet type: {}", other), }; match res { Ok(res) => Ok(res), Err(Error::Incomplete(n)) => Err(Error::Incomplete(n)), Err(err) => { warn!("invalid packet: {:?} {:?}\n{}", err, tag, hex::encode(body)); Err(Error::InvalidPacketContent(Box::new(err))) } } } pgp-0.15.0/src/packet/sym_encrypted_data.rs000064400000000000000000000026431046102023000167640ustar 00000000000000use std::io; use crate::errors::Result; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// Symmetrically Encrypted Data Packet /// /// /// "This packet is obsolete. An implementation MUST NOT create this packet. /// An implementation SHOULD reject such a packet and stop processing the message. /// If an implementation chooses to process the packet anyway, it MUST return a clear warning /// that a non-integrity-protected packet has been processed." #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub struct SymEncryptedData { packet_version: Version, #[debug("{}", hex::encode(data))] data: Vec, } impl SymEncryptedData { /// Parses a `SymEncryptedData` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { Ok(SymEncryptedData { packet_version, data: input.to_vec(), }) } pub fn data(&self) -> &[u8] { &self.data } } impl Serialize for SymEncryptedData { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_all(&self.data)?; Ok(()) } } impl PacketTrait for SymEncryptedData { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::SymEncryptedData } } pgp-0.15.0/src/packet/sym_encrypted_protected_data.rs000064400000000000000000000330551046102023000210360ustar 00000000000000use std::io; use byteorder::WriteBytesExt; use nom::bytes::streaming::take; use nom::combinator::map_res; use nom::number::streaming::be_u8; use rand::{CryptoRng, Rng}; use sha2::Sha256; use zeroize::Zeroizing; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{Error, IResult, Result}; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// Symmetrically Encrypted Integrity Protected Data Packet /// #[derive(Clone, PartialEq, Eq, Debug)] pub struct SymEncryptedProtectedData { packet_version: Version, data: Data, } #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub enum Data { V1 { #[debug("{}", hex::encode(data))] data: Vec, }, V2 { sym_alg: SymmetricKeyAlgorithm, aead: AeadAlgorithm, chunk_size: u8, #[debug("{}", hex::encode(salt))] salt: [u8; 32], #[debug("{}", hex::encode(data))] data: Vec, }, } impl SymEncryptedProtectedData { /// Parses a `SymEncryptedProtectedData` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { ensure!(input.len() > 1, "invalid input length"); let (_, data) = parse()(input)?; Ok(SymEncryptedProtectedData { data, packet_version, }) } /// Encrypts the data using the given symmetric key. pub fn encrypt_seipdv1( rng: R, alg: SymmetricKeyAlgorithm, key: &[u8], plaintext: &[u8], ) -> Result { let data = alg.encrypt_protected(rng, key, plaintext)?; Ok(SymEncryptedProtectedData { packet_version: Default::default(), data: Data::V1 { data }, }) } /// Get (info, message_key, nonce) for the given parameters #[allow(clippy::type_complexity)] fn aead_setup( sym_alg: SymmetricKeyAlgorithm, aead: AeadAlgorithm, chunk_size: u8, salt: &[u8], ikm: &[u8], ) -> Result<([u8; 5], Zeroizing>, Vec)> { let info = [ Tag::SymEncryptedProtectedData.encode(), // packet type 0x02, // version sym_alg.into(), aead.into(), chunk_size, ]; let hk = hkdf::Hkdf::::new(Some(salt), ikm); let mut okm = Zeroizing::new([0u8; 42]); hk.expand(&info, okm.as_mut_slice()).expect("42"); let mut message_key = Zeroizing::new(vec![0; sym_alg.key_size()]); message_key.copy_from_slice(&okm.as_slice()[..sym_alg.key_size()]); let raw_iv_len = aead.nonce_size() - 8; let iv = &okm[sym_alg.key_size()..sym_alg.key_size() + raw_iv_len]; let mut nonce = vec![0u8; aead.nonce_size()]; nonce[..raw_iv_len].copy_from_slice(iv); Ok((info, message_key, nonce)) } /// Encrypts the data using the given symmetric key. pub fn encrypt_seipdv2( mut rng: R, sym_alg: SymmetricKeyAlgorithm, aead: AeadAlgorithm, chunk_size: u8, session_key: &[u8], plaintext: &[u8], ) -> Result { ensure_eq!( session_key.len(), sym_alg.key_size(), "Unexpected session key length for {:?}", sym_alg ); // Initial key material is the session key. let ikm = session_key; // Generate new salt for this seipd packet. let mut salt = [0u8; 32]; rng.fill(&mut salt[..]); let chunk_size_expanded = usize::try_from(expand_chunk_size(chunk_size))?; let (info, message_key, mut nonce) = Self::aead_setup(sym_alg, aead, chunk_size, &salt[..], ikm)?; // Calculate output size (for more efficient vector allocation): // - plaintext length let plain_len = plaintext.len(); // - number of chunks: plaintext length divided by chunk size, rounded up to the next integer let num_chunks = plain_len.div_ceil(chunk_size_expanded); // - total output size: plaintext length + size of all authentication tags (one tag per chunk, plus one final tag) let out_len = plain_len + (num_chunks + 1) * aead.tag_size().unwrap_or_default(); let mut out = Vec::with_capacity(out_len); let mut chunk_index: u64 = 0; for chunk in plaintext.chunks(chunk_size_expanded) { let pos = out.len(); // append this next unencrypted chunk to `out`, and encrypt it in place out.extend_from_slice(chunk); let encrypt_chunk = &mut out[pos..]; let auth_tag = aead.encrypt_in_place(&sym_alg, &message_key, &nonce, &info, encrypt_chunk)?; out.extend_from_slice(&auth_tag); // Update nonce to include the next chunk index chunk_index += 1; let l = nonce.len() - 8; nonce[l..].copy_from_slice(&chunk_index.to_be_bytes()); } // Make and append final auth tag // Associated data is extended with number of plaintext octets. let size = plaintext.len() as u64; let mut final_info = info.to_vec(); final_info.extend_from_slice(&size.to_be_bytes()); let final_auth_tag = aead.encrypt_in_place( &sym_alg, &message_key, &nonce, &final_info, &mut [][..], // encrypts empty string )?; out.extend_from_slice(&final_auth_tag); debug_assert_eq!(out.len(), out_len, "we pre-allocated the wrong output size"); Ok(SymEncryptedProtectedData { packet_version: Default::default(), data: Data::V2 { sym_alg, aead, chunk_size, salt, data: out, }, }) } pub fn data(&self) -> &Data { &self.data } pub fn data_as_slice(&self) -> &[u8] { match &self.data { Data::V1 { data } => data, Data::V2 { data, .. } => data, } } pub fn version(&self) -> usize { match self.data { Data::V1 { .. } => 1, Data::V2 { .. } => 2, } } /// Decrypts the inner data, returning the result. pub fn decrypt( &self, session_key: &[u8], sym_alg: Option, ) -> Result> { match &self.data { Data::V1 { data } => { let mut data = data.clone(); let res = sym_alg .expect("v1") .decrypt_protected(session_key, &mut data)?; Ok(res.to_vec()) } Data::V2 { sym_alg, aead, chunk_size, salt, data, } => { ensure_eq!( session_key.len(), sym_alg.key_size(), "Unexpected session key length for {:?}", sym_alg ); // Initial key material is the session key. let ikm = session_key; let chunk_size_expanded = usize::try_from(expand_chunk_size(*chunk_size))?; let (info, message_key, mut nonce) = Self::aead_setup(*sym_alg, *aead, *chunk_size, &salt[..], ikm)?; let mut data = data.clone(); // There are n chunks, n auth tags + 1 final auth tag let Some(aead_tag_size) = aead.tag_size() else { unsupported_err!("AEAD mode: {:?}", aead); }; if data.len() < aead_tag_size { return Err(Error::InvalidInput); } let offset = data.len() - aead_tag_size; let (main_chunks, final_auth_tag) = data.split_at_mut(offset); // Calculate output size (for more efficient vector allocation): // - number of chunks: main_chunks length divided by (chunk size + tag size), rounded up to the next integer let Some(aead_tag_size) = aead.tag_size() else { unsupported_err!("AEAD mode: {:?}", aead); }; let chunk_and_tag_len = chunk_size_expanded + aead_tag_size; let main_len = main_chunks.len(); let num_chunks = main_len.div_ceil(chunk_and_tag_len); // - total output size: main_chunks length - size of one authentication tag per chunk let out_len = main_len - num_chunks * aead_tag_size; let mut out = Vec::with_capacity(out_len); let mut chunk_index: u64 = 0; for chunk in main_chunks.chunks_mut(chunk_size_expanded + aead_tag_size) { let offset = chunk.len() - aead_tag_size; let (chunk, auth_tag) = chunk.split_at_mut(offset); aead.decrypt_in_place(sym_alg, &message_key, &nonce, &info, auth_tag, chunk)?; out.extend_from_slice(chunk); // Update nonce to include the next chunk index chunk_index += 1; let l = nonce.len() - 8; nonce[l..].copy_from_slice(&chunk_index.to_be_bytes()); } // verify final auth tag // Associated data is extended with number of plaintext octets. let size = out.len() as u64; let mut final_info = info.to_vec(); final_info.extend_from_slice(&size.to_be_bytes()); // Update final nonce aead.decrypt_in_place( sym_alg, &message_key, &nonce, &final_info, final_auth_tag, &mut [][..], // decrypts empty string )?; debug_assert_eq!(out.len(), out_len, "we pre-allocated the wrong output size"); Ok(out) } } } } impl Serialize for SymEncryptedProtectedData { fn to_writer(&self, writer: &mut W) -> Result<()> { match &self.data { Data::V1 { data } => { writer.write_u8(0x01)?; writer.write_all(data)?; } Data::V2 { sym_alg, aead, chunk_size, salt, data, } => { writer.write_u8(0x02)?; writer.write_u8((*sym_alg).into())?; writer.write_u8((*aead).into())?; writer.write_u8(*chunk_size)?; writer.write_all(salt)?; writer.write_all(data)?; } } Ok(()) } } impl PacketTrait for SymEncryptedProtectedData { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::SymEncryptedProtectedData } } fn expand_chunk_size(s: u8) -> u32 { 1u32 << (s as u32 + 6) } fn parse() -> impl Fn(&[u8]) -> IResult<&[u8], Data> { move |i: &[u8]| { let (i, version) = be_u8(i)?; match version { 0x01 => Ok((&[][..], Data::V1 { data: i.to_vec() })), 0x02 => { let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, aead) = map_res(be_u8, AeadAlgorithm::try_from)(i)?; let (i, chunk_size) = be_u8(i)?; let (i, salt) = take(32usize)(i)?; Ok(( &[][..], Data::V2 { sym_alg, aead, chunk_size, salt: salt.try_into().expect("size checked"), data: i.to_vec(), }, )) } _ => Err(nom::Err::Error(Error::Unsupported(format!( "unknown SymEncryptedProtectedData version {}", version )))), } } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use rand::{RngCore, SeedableRng}; use rand_chacha::ChaCha8Rng; use super::*; #[test] fn test_aead_message_sizes() { // Test that AEAD encryption/decryption works for message sizes that span 0-2 chunks. let mut rng = ChaCha8Rng::from_seed([0u8; 32]); // Chunk size parameter 0 means "chunks of 64 byte each" const CHUNK_SIZE: u8 = 0; const SYM_ALG: SymmetricKeyAlgorithm = SymmetricKeyAlgorithm::AES128; let mut session_key = [0; 16]; rng.fill_bytes(&mut session_key); // Iterate over message sizes from 0 bytes through all 1-chunk and 2-chunk lengths // (ending with two chunks of a full 64 bytes) for size in 0..=128 { let mut message = vec![0; size]; rng.fill_bytes(&mut message); for aead in [AeadAlgorithm::Ocb, AeadAlgorithm::Eax, AeadAlgorithm::Gcm] { let enc = SymEncryptedProtectedData::encrypt_seipdv2( &mut rng, SYM_ALG, aead, CHUNK_SIZE, &session_key, &message, ) .expect("encrypt"); let dec = enc.decrypt(&session_key, Some(SYM_ALG)).expect("decrypt"); assert_eq!(message, dec); } } } } pgp-0.15.0/src/packet/sym_key_encrypted_session_key.rs000064400000000000000000000364701046102023000212630ustar 00000000000000use std::io; use byteorder::WriteBytesExt; use log::debug; use nom::bytes::streaming::take; use nom::combinator::map_res; use nom::number::streaming::be_u8; use rand::{CryptoRng, Rng}; use sha2::Sha256; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{Error, IResult, Result}; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{s2k_parser, SkeskVersion, StringToKey, Tag, Version}; use crate::util::rest_len; use crate::PlainSessionKey; /// Symmetric-Key Encrypted Session Key Packet /// #[derive(derive_more::Debug, Clone, PartialEq, Eq)] pub enum SymKeyEncryptedSessionKey { V4 { packet_version: Version, sym_algorithm: SymmetricKeyAlgorithm, s2k: StringToKey, #[debug("{:?}", encrypted_key.as_ref().map(hex::encode))] encrypted_key: Option>, }, V5 { packet_version: Version, sym_algorithm: SymmetricKeyAlgorithm, s2k: StringToKey, aead: AeadAlgorithm, #[debug("{}", hex::encode(iv))] iv: Vec, #[debug("{}", hex::encode(auth_tag))] auth_tag: Vec, #[debug("{}", hex::encode(encrypted_key))] encrypted_key: Vec, }, V6 { packet_version: Version, sym_algorithm: SymmetricKeyAlgorithm, s2k: StringToKey, aead: AeadAlgorithm, #[debug("{}", hex::encode(iv))] iv: Vec, #[debug("{}", hex::encode(auth_tag))] auth_tag: Vec, #[debug("{}", hex::encode(encrypted_key))] encrypted_key: Vec, }, } impl SymKeyEncryptedSessionKey { /// Parses a `SymKeyEncryptedSessionKey` packet from the given slice. pub fn from_slice(version: Version, input: &[u8]) -> Result { let (_, pk) = parse(version)(input)?; Ok(pk) } pub fn sym_algorithm(&self) -> SymmetricKeyAlgorithm { match self { Self::V4 { ref sym_algorithm, .. } => *sym_algorithm, Self::V5 { ref sym_algorithm, .. } => *sym_algorithm, Self::V6 { ref sym_algorithm, .. } => *sym_algorithm, } } pub fn s2k(&self) -> &StringToKey { match self { Self::V4 { ref s2k, .. } => s2k, Self::V5 { ref s2k, .. } => s2k, Self::V6 { ref s2k, .. } => s2k, } } pub fn version(&self) -> SkeskVersion { // TODO: use enum match self { Self::V4 { .. } => SkeskVersion::V4, Self::V5 { .. } => SkeskVersion::Other(5), Self::V6 { .. } => SkeskVersion::V6, } } pub fn decrypt(&self, key: &[u8]) -> Result { debug!("decrypt session key {:?}", self.version()); let mut decrypted_key = self.encrypted_key().map(|v| v.to_vec()).unwrap_or_default(); match self { Self::V4 { sym_algorithm, .. } => { let iv = vec![0u8; sym_algorithm.block_size()]; self.sym_algorithm() .decrypt_with_iv_regular(key, &iv, &mut decrypted_key)?; let sym_alg = SymmetricKeyAlgorithm::from(decrypted_key[0]); Ok(PlainSessionKey::V3_4 { key: decrypted_key[1..].to_vec(), sym_alg, }) } Self::V5 { iv, sym_algorithm, aead, auth_tag, .. } => { // Initial key material is the s2k derived key. let ikm = key; // No salt is used let salt = None; let info = [ Tag::SymKeyEncryptedSessionKey.encode(), // packet type 0x05, // version (*sym_algorithm).into(), (*aead).into(), ]; let hk = hkdf::Hkdf::::new(salt, ikm); let mut okm = [0u8; 42]; hk.expand(&info, &mut okm).expect("42"); // AEAD decrypt aead.decrypt_in_place( sym_algorithm, &okm, iv, &info, auth_tag, &mut decrypted_key, )?; Ok(PlainSessionKey::V5 { key: decrypted_key }) } Self::V6 { iv, sym_algorithm, aead, auth_tag, .. } => { // Initial key material is the s2k derived key. let ikm = key; // No salt is used let salt = None; let info = [ Tag::SymKeyEncryptedSessionKey.encode(), // packet type 0x06, // version (*sym_algorithm).into(), (*aead).into(), ]; let hk = hkdf::Hkdf::::new(salt, ikm); let mut okm = [0u8; 42]; hk.expand(&info, &mut okm).expect("42"); // AEAD decrypt aead.decrypt_in_place( sym_algorithm, &okm, iv, &info, auth_tag, &mut decrypted_key, )?; Ok(PlainSessionKey::V6 { key: decrypted_key }) } } } pub fn encrypted_key(&self) -> Option<&[u8]> { match self { Self::V4 { ref encrypted_key, .. } => encrypted_key.as_ref().map(|s| &s[..]), Self::V5 { ref encrypted_key, .. } => Some(encrypted_key), Self::V6 { ref encrypted_key, .. } => Some(encrypted_key), } } /// Encrypt a session key to a password as a Version 4 Symmetric Key Encrypted Session Key Packet /// /// See pub fn encrypt_v4( msg_pw: F, session_key: &[u8], s2k: StringToKey, alg: SymmetricKeyAlgorithm, ) -> Result where F: FnOnce() -> String + Clone, { ensure!( s2k.uses_salt(), "Can not use an s2k algorithm without a salt: {:?}", s2k ); // Implementations MUST NOT generate packets using MD5, SHA-1, or RIPEMD-160 as a hash function in an S2K KDF. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.5-3) ensure!( !s2k.known_weak_hash_algo(), "Weak hash algorithm in S2K not allowed for v6 {:?}", s2k ); let key = s2k.derive_key(&msg_pw(), alg.key_size())?; let mut private_key = Vec::with_capacity(session_key.len()); private_key.push(u8::from(alg)); private_key.extend(session_key); let iv = vec![0u8; alg.block_size()]; let mut encrypted_key = private_key.to_vec(); alg.encrypt_with_iv_regular(&key, &iv, &mut encrypted_key)?; Ok(SymKeyEncryptedSessionKey::V4 { packet_version: Default::default(), s2k, sym_algorithm: alg, encrypted_key: Some(encrypted_key), }) } /// Encrypt a session key to a password as a Version 6 Symmetric Key Encrypted Session Key Packet /// /// See pub fn encrypt_v6( mut rng: R, msg_pw: F, session_key: &[u8], s2k: StringToKey, sym_algorithm: SymmetricKeyAlgorithm, aead: AeadAlgorithm, ) -> Result where F: FnOnce() -> String + Clone, { ensure!( s2k.uses_salt(), "Can not use an s2k algorithm without a salt: {:?}", s2k ); // Implementations MUST NOT generate packets using MD5, SHA-1, or RIPEMD-160 as a hash function in an S2K KDF. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.5-3) ensure!( !s2k.known_weak_hash_algo(), "Weak hash algorithm in S2K not allowed for v6 {:?}", s2k ); // Initial key material is the s2k derived key. let ikm = s2k.derive_key(&msg_pw(), sym_algorithm.key_size())?; // No salt is used let salt = None; let info = [ Tag::SymKeyEncryptedSessionKey.encode(), // packet type 0x06, // version sym_algorithm.into(), aead.into(), ]; let hk = hkdf::Hkdf::::new(salt, &ikm); let mut okm = [0u8; 42]; hk.expand(&info, &mut okm).expect("42"); let mut iv = vec![0; aead.iv_size()]; rng.fill_bytes(&mut iv); // AEAD encrypt let mut encrypted_key = session_key.to_vec(); let auth_tag = aead.encrypt_in_place(&sym_algorithm, &okm, &iv, &info, &mut encrypted_key)?; Ok(SymKeyEncryptedSessionKey::V6 { packet_version: Default::default(), sym_algorithm, s2k, aead, iv, auth_tag, encrypted_key, }) } } fn parse(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], SymKeyEncryptedSessionKey> { move |i: &[u8]| { let (i, version) = be_u8(i)?; match version { 4 => parse_v4(packet_version)(i), 5 => parse_v5(packet_version)(i), 6 => parse_v6(packet_version)(i), _ => Err(nom::Err::Error(Error::Unsupported(format!( "Unsupported SKESK version {}", version )))), } } } fn parse_v4( packet_version: Version, ) -> impl Fn(&[u8]) -> IResult<&[u8], SymKeyEncryptedSessionKey> { move |i: &[u8]| { let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, s2k) = s2k_parser(i)?; let encrypted_key = if i.is_empty() { None } else { Some(i.to_vec()) }; Ok(( &[][..], SymKeyEncryptedSessionKey::V4 { packet_version, sym_algorithm: sym_alg, s2k, encrypted_key, }, )) } } fn parse_v5( packet_version: Version, ) -> impl Fn(&[u8]) -> IResult<&[u8], SymKeyEncryptedSessionKey> { move |i: &[u8]| { let (i, _count) = be_u8(i)?; let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, aead) = map_res(be_u8, AeadAlgorithm::try_from)(i)?; let (i, _s2k_len) = be_u8(i)?; let (i, s2k) = s2k_parser(i)?; let (i, iv) = take(aead.iv_size())(i)?; let (i, l) = rest_len(i)?; let aead_tag_size = aead.tag_size().unwrap_or_default(); if l < aead_tag_size { return Err(nom::Err::Error(Error::InvalidInput)); } let (i, esk) = take(l - aead_tag_size)(i)?; let (i, auth_tag) = take(aead_tag_size)(i)?; Ok(( i, SymKeyEncryptedSessionKey::V5 { packet_version, sym_algorithm: sym_alg, aead, iv: iv.to_vec(), auth_tag: auth_tag.to_vec(), s2k, encrypted_key: esk.to_vec(), }, )) } } fn parse_v6( packet_version: Version, ) -> impl Fn(&[u8]) -> IResult<&[u8], SymKeyEncryptedSessionKey> { move |i: &[u8]| { let (i, _count) = be_u8(i)?; let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, aead) = map_res(be_u8, AeadAlgorithm::try_from)(i)?; let (i, _s2k_len) = be_u8(i)?; let (i, s2k) = s2k_parser(i)?; let (i, iv) = take(aead.iv_size())(i)?; let (i, l) = rest_len(i)?; let aead_tag_size = aead.tag_size().unwrap_or_default(); if l < aead_tag_size { return Err(nom::Err::Error(Error::InvalidInput)); } let (i, esk) = take(l - aead_tag_size)(i)?; let (i, auth_tag) = take(aead_tag_size)(i)?; Ok(( i, SymKeyEncryptedSessionKey::V6 { packet_version, sym_algorithm: sym_alg, aead, iv: iv.to_vec(), auth_tag: auth_tag.to_vec(), s2k, encrypted_key: esk.to_vec(), }, )) } } impl Serialize for SymKeyEncryptedSessionKey { fn to_writer(&self, writer: &mut W) -> Result<()> { match &self { SymKeyEncryptedSessionKey::V4 { packet_version: _, sym_algorithm, s2k, encrypted_key, } => { writer.write_u8(0x04)?; writer.write_u8((*sym_algorithm).into())?; s2k.to_writer(writer)?; if let Some(ref key) = encrypted_key { writer.write_all(key)?; } } SymKeyEncryptedSessionKey::V5 { packet_version: _, sym_algorithm, s2k, aead, iv, auth_tag, encrypted_key, } => { writer.write_u8(0x05)?; let mut first_buf = vec![u8::from(*sym_algorithm), u8::from(*aead)]; let mut buf = Vec::new(); s2k.to_writer(&mut buf)?; first_buf.push(buf.len().try_into()?); first_buf.extend(buf); first_buf.extend_from_slice(iv); writer.write_u8(first_buf.len().try_into()?)?; writer.write_all(&first_buf)?; writer.write_all(encrypted_key)?; writer.write_all(auth_tag)?; } SymKeyEncryptedSessionKey::V6 { packet_version: _, sym_algorithm, s2k, aead, iv, auth_tag, encrypted_key, } => { writer.write_u8(0x06)?; let mut first_buf = vec![u8::from(*sym_algorithm), u8::from(*aead)]; let mut buf = Vec::new(); s2k.to_writer(&mut buf)?; first_buf.push(buf.len().try_into()?); first_buf.extend(buf); first_buf.extend_from_slice(iv); writer.write_u8(first_buf.len().try_into()?)?; writer.write_all(&first_buf)?; writer.write_all(encrypted_key)?; writer.write_all(auth_tag)?; } } Ok(()) } } impl PacketTrait for SymKeyEncryptedSessionKey { fn packet_version(&self) -> Version { match self { SymKeyEncryptedSessionKey::V4 { packet_version, .. } => *packet_version, SymKeyEncryptedSessionKey::V5 { packet_version, .. } => *packet_version, SymKeyEncryptedSessionKey::V6 { packet_version, .. } => *packet_version, } } fn tag(&self) -> Tag { Tag::SymKeyEncryptedSessionKey } } pgp-0.15.0/src/packet/trust.rs000064400000000000000000000020061046102023000142600ustar 00000000000000use std::io; use log::warn; use crate::errors::Result; use crate::packet::PacketTrait; use crate::ser::Serialize; use crate::types::{Tag, Version}; /// Trust Packet /// /// /// Trust packets SHOULD NOT be emitted to output streams that are /// transferred to other users, and they SHOULD be ignored on any input /// other than local keyring files. #[derive(Debug, PartialEq, Eq)] pub struct Trust { packet_version: Version, } impl Trust { /// Parses a `Trust` packet from the given slice. pub fn from_slice(packet_version: Version, _: &[u8]) -> Result { warn!("Trust packet detected, ignoring"); Ok(Trust { packet_version }) } } impl Serialize for Trust { fn to_writer(&self, _writer: &mut W) -> Result<()> { Ok(()) } } impl PacketTrait for Trust { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::Trust } } pgp-0.15.0/src/packet/user_attribute.rs000064400000000000000000000150001046102023000161360ustar 00000000000000use std::{fmt, io}; use aes_gcm::aead::rand_core::CryptoRng; use byteorder::{LittleEndian, WriteBytesExt}; use chrono::{SubsecRound, Utc}; use log::debug; use nom::bytes::streaming::take; use nom::combinator::{map, map_parser, rest}; use nom::number::streaming::{be_u8, le_u16}; use rand::Rng; use crate::errors::{IResult, Result}; use crate::packet::{ PacketTrait, Signature, SignatureConfig, SignatureType, Subpacket, SubpacketData, }; use crate::ser::Serialize; use crate::types::{KeyVersion, PublicKeyTrait, SecretKeyTrait, SignedUserAttribute, Tag, Version}; use crate::util::{packet_length, write_packet_length}; /// User Attribute Packet /// #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub enum UserAttribute { Image { packet_version: Version, #[debug("{}", hex::encode(header))] header: Vec, #[debug("{}", hex::encode(data))] data: Vec, }, Unknown { packet_version: Version, typ: u8, #[debug("{}", hex::encode(data))] data: Vec, }, } impl UserAttribute { /// Parses a `UserAttribute` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { let (_, pk) = parse(packet_version)(input)?; Ok(pk) } pub fn to_u8(&self) -> u8 { match *self { UserAttribute::Image { .. } => 1, UserAttribute::Unknown { typ, .. } => typ, } } pub fn packet_len(&self) -> usize { match self { UserAttribute::Image { ref data, .. } => { // typ + image header + data length 1 + 16 + data.len() } UserAttribute::Unknown { ref data, .. } => { // typ + data length 1 + data.len() } } } /// Create a self-signature pub fn sign( &self, rng: R, key: &impl SecretKeyTrait, key_pw: F, ) -> Result where R: CryptoRng + Rng, F: FnOnce() -> String, { self.sign_third_party(rng, key, key_pw, key) } /// Create a third-party signature pub fn sign_third_party( &self, mut rng: R, signer: &impl SecretKeyTrait, signer_pw: F, signee: &impl PublicKeyTrait, ) -> Result where R: CryptoRng + Rng, F: FnOnce() -> String, { let hashed_subpackets = vec![Subpacket::regular(SubpacketData::SignatureCreationTime( Utc::now().trunc_subsecs(0), ))]; let unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(signer.key_id()))]; let mut config = match signer.version() { KeyVersion::V4 => SignatureConfig::v4( SignatureType::CertGeneric, signer.algorithm(), signer.hash_alg(), ), KeyVersion::V6 => SignatureConfig::v6( &mut rng, SignatureType::CertGeneric, signer.algorithm(), signer.hash_alg(), )?, v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; let sig = config.sign_certification_third_party(signer, signer_pw, signee, self.tag(), &self)?; Ok(SignedUserAttribute::new(self.clone(), vec![sig])) } pub fn into_signed(self, sig: Signature) -> SignedUserAttribute { SignedUserAttribute::new(self, vec![sig]) } } impl fmt::Display for UserAttribute { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { match self { UserAttribute::Image { data, .. } => { write!(f, "User Attribute: Image (len: {})", data.len()) } UserAttribute::Unknown { typ, data, .. } => { write!(f, "User Attribute: typ: {} (len: {})", typ, data.len()) } } } } fn image(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], UserAttribute> { move |i: &[u8]| { // little endian, for historical reasons.. let (i, len) = le_u16(i)?; if len < 2 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } let (img, header) = take(len - 2)(i)?; // the actual image is the rest Ok(( &[][..], UserAttribute::Image { packet_version, header: header.to_vec(), data: img.to_vec(), }, )) } } fn parse(packet_version: Version) -> impl Fn(&[u8]) -> IResult<&[u8], UserAttribute> { move |i: &[u8]| { let (i, len) = packet_length(i)?; if len < 1 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } let (i, typ) = be_u8(i)?; let (i, attr) = map_parser(take(len - 1), |i| match typ { 1 => image(packet_version)(i), _ => map(rest, |data: &[u8]| UserAttribute::Unknown { packet_version, typ, data: data.to_vec(), })(i), })(i)?; Ok((i, { debug!("attr with len {}", len); attr })) } } impl Serialize for UserAttribute { fn to_writer(&self, writer: &mut W) -> Result<()> { debug!("write_packet_len {}", self.packet_len()); write_packet_length(self.packet_len(), writer)?; match self { UserAttribute::Image { ref data, ref header, .. } => { // typ: image writer.write_u8(0x01)?; writer.write_u16::((header.len() + 2).try_into()?)?; writer.write_all(header)?; // actual data writer.write_all(data)?; } UserAttribute::Unknown { ref data, typ, .. } => { writer.write_u8(*typ)?; writer.write_all(data)?; } } Ok(()) } } impl PacketTrait for UserAttribute { fn packet_version(&self) -> Version { match self { UserAttribute::Image { packet_version, .. } => *packet_version, UserAttribute::Unknown { packet_version, .. } => *packet_version, } } fn tag(&self) -> Tag { Tag::UserAttribute } } pgp-0.15.0/src/packet/user_id.rs000064400000000000000000000122731046102023000145400ustar 00000000000000use std::{fmt, io, str}; use aes_gcm::aead::rand_core::CryptoRng; use bstr::{BStr, BString}; use chrono::{SubsecRound, Utc}; use rand::Rng; use crate::errors::Result; use crate::packet::{ PacketTrait, Signature, SignatureConfig, SignatureType, Subpacket, SubpacketData, }; use crate::ser::Serialize; use crate::types::{KeyVersion, PublicKeyTrait, SecretKeyTrait, SignedUser, Tag, Version}; /// User ID Packet /// #[derive(Debug, Clone, PartialEq, Eq)] pub struct UserId { packet_version: Version, id: BString, } impl UserId { /// Parses a `UserId` packet from the given slice. pub fn from_slice(packet_version: Version, input: &[u8]) -> Result { Ok(UserId { packet_version, id: BString::from(input), }) } pub fn from_str(packet_version: Version, input: &str) -> Self { UserId { packet_version, id: BString::from(input), } } pub fn id(&self) -> &BStr { self.id.as_ref() } /// Create a self-signature pub fn sign(&self, rng: R, key: &impl SecretKeyTrait, key_pw: F) -> Result where R: CryptoRng + Rng, F: FnOnce() -> String, { self.sign_third_party(rng, key, key_pw, key) } /// Create a third-party signature pub fn sign_third_party( &self, mut rng: R, signer: &impl SecretKeyTrait, signer_pw: F, signee: &impl PublicKeyTrait, ) -> Result where R: CryptoRng + Rng, F: FnOnce() -> String, { let hashed_subpackets = vec![Subpacket::regular(SubpacketData::SignatureCreationTime( Utc::now().trunc_subsecs(0), ))]; let unhashed_subpackets = vec![Subpacket::regular(SubpacketData::Issuer(signer.key_id()))]; let mut config = match signer.version() { KeyVersion::V4 => SignatureConfig::v4( SignatureType::CertGeneric, signer.algorithm(), signer.hash_alg(), ), KeyVersion::V6 => SignatureConfig::v6( &mut rng, SignatureType::CertGeneric, signer.algorithm(), signer.hash_alg(), )?, v => unsupported_err!("unsupported key version: {:?}", v), }; config.hashed_subpackets = hashed_subpackets; config.unhashed_subpackets = unhashed_subpackets; let sig = config.sign_certification_third_party(signer, signer_pw, signee, self.tag(), &self)?; Ok(SignedUser::new(self.clone(), vec![sig])) } pub fn into_signed(self, sig: Signature) -> SignedUser { SignedUser::new(self, vec![sig]) } } impl Serialize for UserId { fn to_writer(&self, writer: &mut W) -> Result<()> { writer.write_all(&self.id)?; Ok(()) } } impl fmt::Display for UserId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "User ID: \"{}\"", self.id) } } impl PacketTrait for UserId { fn packet_version(&self) -> Version { self.packet_version } fn tag(&self) -> Tag { Tag::UserId } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use super::*; use crate::types::KeyVersion; use crate::{packet, KeyType}; #[test] fn test_user_id_certification() { let key_type = KeyType::EdDSALegacy; let mut rng = ChaCha8Rng::seed_from_u64(0); let (public_params, secret_params) = key_type.generate(&mut rng).unwrap(); let alice_sec = packet::SecretKey::new( packet::PublicKey::new( Version::New, KeyVersion::V4, key_type.to_alg(), Utc::now().trunc_subsecs(0), None, public_params, ) .unwrap(), secret_params, ); let alice_pub = alice_sec.public_key(); let alice_uid = UserId::from_str(Version::New, ""); // test self-signature let self_signed = alice_uid .sign(&mut rng, &alice_sec, String::default) .unwrap(); self_signed .verify(&alice_pub) .expect("self signature verification failed"); // test third-party signature let (public_params, secret_params) = key_type.generate(&mut rng).unwrap(); let signer_sec = packet::SecretKey::new( packet::PublicKey::new( Version::New, KeyVersion::V4, key_type.to_alg(), Utc::now().trunc_subsecs(0), None, public_params, ) .unwrap(), secret_params, ); let signer_pub = signer_sec.public_key(); let third_signed = alice_uid .sign_third_party(&mut rng, &signer_sec, String::default, &alice_pub) .unwrap(); third_signed .verify_third_party(&alice_pub, &signer_pub) .expect("self signature verification failed"); } } pgp-0.15.0/src/ser.rs000064400000000000000000000015521046102023000124260ustar 00000000000000//! # Serialize trait module use std::io; use crate::errors::Result; pub trait Serialize { fn to_writer(&self, _: &mut W) -> Result<()>; fn to_bytes(&self) -> Result> { let mut buf = Vec::new(); self.to_writer(&mut buf)?; Ok(buf) } } impl Serialize for &T { fn to_writer(&self, writer: &mut W) -> Result<()> { (*self).to_writer(writer) } } impl Serialize for &[T] { fn to_writer(&self, writer: &mut W) -> Result<()> { for x in self.iter() { (*x).to_writer(writer)?; } Ok(()) } } impl Serialize for Vec { fn to_writer(&self, writer: &mut W) -> Result<()> { for x in self.iter() { (*x).to_writer(writer)?; } Ok(()) } } pgp-0.15.0/src/types/compression.rs000064400000000000000000000007301046102023000153370ustar 00000000000000use num_enum::{FromPrimitive, IntoPrimitive}; #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] /// Available compression algorithms. /// Ref: #[repr(u8)] pub enum CompressionAlgorithm { Uncompressed = 0, ZIP = 1, ZLIB = 2, BZip2 = 3, /// Do not use, just for compatibility with GnuPG. Private10 = 110, #[num_enum(catch_all)] Other(u8), } pgp-0.15.0/src/types/fingerprint.rs000064400000000000000000000063341046102023000153330ustar 00000000000000use crate::errors::{Error, Result}; use crate::types::KeyVersion; /// Represents a Fingerprint. /// /// OpenPGP fingerprints consist of two pieces of information: /// The key version, and binary data that represents the fingerprint itself. #[derive(Clone, Eq, Hash, PartialEq, derive_more::Debug)] pub enum Fingerprint { #[debug("{}", hex::encode(_0))] V2([u8; 16]), #[debug("{}", hex::encode(_0))] V3([u8; 16]), #[debug("{}", hex::encode(_0))] V4([u8; 20]), #[debug("{}", hex::encode(_0))] V5([u8; 32]), #[debug("{}", hex::encode(_0))] V6([u8; 32]), #[debug("{}", hex::encode(_0))] /// Fingerprint with unknown key version Unknown(Box<[u8]>), } impl Fingerprint { /// Constructor for an OpenPGP fingerprint. /// /// The length of the binary data in `fp` must match the expected length for `version`, /// otherwise an error is returned. pub fn new(version: KeyVersion, fp: &[u8]) -> Result { let e = |_| { Error::Message(format!( "Illegal fingerprint length {} for key version {:?}", fp.len(), version )) }; let fp = match version { KeyVersion::V2 => Fingerprint::V2(fp.try_into().map_err(e)?), KeyVersion::V3 => Fingerprint::V3(fp.try_into().map_err(e)?), KeyVersion::V4 => Fingerprint::V4(fp.try_into().map_err(e)?), KeyVersion::V5 => Fingerprint::V5(fp.try_into().map_err(e)?), KeyVersion::V6 => Fingerprint::V6(fp.try_into().map_err(e)?), KeyVersion::Other(v) => bail!("Unsupported version {}", v), }; Ok(fp) } /// Make a fingerprint with unknown key version. /// /// A fingerprint without version information is not usually desirable to have. /// It can't be processed in a lot of places, in rPGP. /// /// However, sometimes a fingerprint may be obtained where the key version is unknown. /// Then, this is the only possible way to encode it. #[allow(dead_code)] pub(crate) fn new_unknown(fp: &[u8]) -> Result { Ok(Fingerprint::Unknown(Box::from(fp))) } /// Returns the length of the fingerprint's binary data, based on the key version. #[allow(clippy::len_without_is_empty)] pub fn len(&self) -> usize { match self { Self::V2(_) | Self::V3(_) => 16, Self::V4(_) => 20, Self::V5(_) | Self::V6(_) => 32, Self::Unknown(fp) => fp.len(), } } /// The key version of the key that this fingerprint references. pub fn version(&self) -> Option { match self { Self::V2(_) => Some(KeyVersion::V2), Self::V3(_) => Some(KeyVersion::V3), Self::V4(_) => Some(KeyVersion::V4), Self::V5(_) => Some(KeyVersion::V5), Self::V6(_) => Some(KeyVersion::V6), Self::Unknown(_) => None, } } /// The binary data of this fingerprint. pub fn as_bytes(&self) -> &[u8] { match self { Self::V2(fp) | Self::V3(fp) => &fp[..], Self::V4(fp) => &fp[..], Self::V5(fp) | Self::V6(fp) => &fp[..], Self::Unknown(fp) => fp, } } } pgp-0.15.0/src/types/key_id.rs000064400000000000000000000022751046102023000142500ustar 00000000000000use std::fmt; use crate::errors::Result; /// Represents a Key ID. #[derive(Clone, Hash, Eq, PartialEq, derive_more::Debug)] pub struct KeyId(#[debug("{}", hex::encode(_0))] [u8; 8]); impl AsRef<[u8]> for KeyId { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } impl KeyId { pub fn from_slice(input: &[u8]) -> Result { ensure_eq!(input.len(), 8, "invalid input length"); let mut r = [0u8; 8]; r.copy_from_slice(input); Ok(KeyId(r)) } pub fn to_vec(&self) -> Vec { self.0.to_vec() } /// True, if `self` is the "wild card" (or "anonymous recipient") Key ID of all zeros. /// /// See pub fn is_wildcard(&self) -> bool { self.0 == [0, 0, 0, 0, 0, 0, 0, 0] } } impl fmt::LowerHex for KeyId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { write!(f, "{}", hex::encode(self.as_ref())) } } impl fmt::UpperHex for KeyId { fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { let mut encoded = hex::encode(self.as_ref()); encoded.make_ascii_uppercase(); write!(f, "{encoded}") } } pgp-0.15.0/src/types/mod.rs000064400000000000000000000104471046102023000135630ustar 00000000000000mod compression; mod fingerprint; mod key_id; mod mpi; mod packet; mod params; mod public_key; mod revocation_key; mod s2k; mod secret_key; mod secret_key_repr; mod user; use log::debug; pub use self::compression::*; pub use self::fingerprint::*; pub use self::key_id::*; pub use self::mpi::*; pub use self::packet::*; pub use self::params::*; pub use self::public_key::*; pub use self::revocation_key::*; pub use self::s2k::*; pub use self::secret_key::*; pub use self::secret_key_repr::*; pub use self::user::*; use crate::crypto::sym::SymmetricKeyAlgorithm; /// An OpenPGP cryptographic signature. /// /// It is an element of a [crate::packet::Signature] packet. /// Historically, cryptographic signatures in OpenPGP were encoded as [crate::types::Mpi], /// however, in RFC 9580, native encoding is used for the modern Ed25519 and Ed448 signatures. /// /// This type can represent both flavors of cryptographic signature data. #[derive(Debug, PartialEq, Eq, Clone)] pub enum SignatureBytes { /// A cryptographic signature that is represented as a set of [Mpi]s. /// /// This format has been used for all OpenPGP cryptographic signatures in RFCs 4880 and 6637. Mpis(Vec), /// A cryptographic signature that is represented in native format. /// /// This format was introduced in RFC 9580 and is currently only used for Ed25519 and Ed448. Native(Vec), } impl SignatureBytes { pub(crate) fn to_writer(&self, writer: &mut W) -> crate::errors::Result<()> { use crate::ser::Serialize; match &self { SignatureBytes::Mpis(mpis) => { // the actual signature for val in mpis { debug!("writing: {}", hex::encode(val)); val.to_writer(writer)?; } } SignatureBytes::Native(sig) => { writer.write_all(sig)?; } } Ok(()) } } impl<'a> TryFrom<&'a SignatureBytes> for &'a [Mpi] { type Error = crate::errors::Error; fn try_from(value: &'a SignatureBytes) -> std::result::Result { match value { SignatureBytes::Mpis(mpis) => Ok(mpis), // We reject this operation because it doesn't fit with the intent of the Sig abstraction SignatureBytes::Native(_) => bail!("Native Sig can't be transformed into Mpis"), } } } impl<'a> TryFrom<&'a SignatureBytes> for &'a [u8] { type Error = crate::errors::Error; fn try_from(value: &'a SignatureBytes) -> std::result::Result { match value { // We reject this operation because it doesn't fit with the intent of the Sig abstraction SignatureBytes::Mpis(_) => bail!("Mpi-based Sig can't be transformed into &[u8]"), SignatureBytes::Native(native) => Ok(native), } } } impl From> for SignatureBytes { fn from(value: Vec) -> Self { SignatureBytes::Mpis(value) } } impl From> for SignatureBytes { fn from(value: Vec) -> Self { SignatureBytes::Native(value) } } /// Select which type of encrypted session key data should be produced in an encryption step #[derive(Debug)] pub enum EskType { /// V3 PKESK or V4 SKESK (these are used in RFC 4880 and 2440) V3_4, /// V6 PKESK or SKESK (introduced in RFC 9580) V6, } /// Values comprising a Public Key Encrypted Session Key #[derive(Clone, Debug, Eq, PartialEq)] pub enum PkeskBytes { Rsa { mpi: Mpi, }, Elgamal { first: Mpi, second: Mpi, }, Ecdh { public_point: Mpi, encrypted_session_key: Vec, }, X25519 { /// Ephemeral X25519 public key (32 bytes). ephemeral: [u8; 32], /// Encrypted and wrapped session key. session_key: Vec, /// Set for v3 PKESK only (the sym_alg is not encrypted with the session key for X25519) sym_alg: Option, }, X448 { /// Ephemeral X448 public key (56 bytes). ephemeral: [u8; 56], /// Encrypted and wrapped session key. session_key: Vec, /// Set for v3 PKESK only (the sym_alg is not encrypted with the session key for X448) sym_alg: Option, }, Other, } pgp-0.15.0/src/types/mpi.rs000064400000000000000000000174261046102023000135750ustar 00000000000000use std::io; use byteorder::{BigEndian, WriteBytesExt}; use nom::number::streaming::be_u16; use nom::{Err, InputIter, InputTake}; use num_bigint::BigUint; use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::errors::{self, Error, IResult}; use crate::ser::Serialize; use crate::util::{bit_size, strip_leading_zeros, strip_leading_zeros_vec}; /// Number of bits we accept when reading or writing MPIs. /// The value is the same as gnupgs. const MAX_EXTERN_MPI_BITS: u32 = 16384; /// Parse Multi Precision Integers /// Ref: /// /// # Examples /// /// ```rust /// use pgp::types::mpi; /// use pgp::types::MpiRef; /// /// // Decode the number `1`. /// assert_eq!( /// mpi(&[0x00, 0x01, 0x01][..]).unwrap(), /// (&b""[..], MpiRef::from_slice(&[1][..])) /// ); /// ``` pub fn mpi(input: &[u8]) -> IResult<&[u8], MpiRef<'_>> { let (number, len) = be_u16(input)?; let bits = u32::from(len); let len_actual = (bits + 7) >> 3; if len_actual > MAX_EXTERN_MPI_BITS { Err(Err::Error(Error::InvalidInput)) } else { // same as take! let cnt = len_actual as usize; match number.slice_index(cnt) { Err(needed) => Err(nom::Err::Incomplete(needed)), Ok(index) => { let (rest, n) = number.take_split(index); let n_stripped: MpiRef<'_> = MpiRef::from_slice(strip_leading_zeros(n)); Ok((rest, n_stripped)) } } } } /// Represents an owned MPI value. /// The inner value is ready to be serialized, without the need to strip leading zeros. #[derive(Default, Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop, derive_more::Debug)] pub struct Mpi(#[debug("{}", hex::encode(_0))] Vec); /// Represents a borrowed MPI value. /// The inner value is ready to be serialized, without the need to strip leading zeros. #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub struct MpiRef<'a>(#[debug("{}", hex::encode(_0))] &'a [u8]); impl AsRef<[u8]> for Mpi { fn as_ref(&self) -> &[u8] { self.0.as_ref() } } impl Mpi { pub fn from_raw(mut v: Vec) -> Self { strip_leading_zeros_vec(&mut v); Mpi(v) } /// Strips leading zeros. pub fn from_slice(raw: &[u8]) -> Self { Mpi(strip_leading_zeros(raw).to_vec()) } pub fn as_ref(&self) -> MpiRef<'_> { MpiRef(&self.0) } pub fn as_bytes(&self) -> &[u8] { &self.0 } } impl std::ops::Deref for Mpi { type Target = [u8]; fn deref(&self) -> &Self::Target { &self.0 } } impl std::ops::Deref for MpiRef<'_> { type Target = [u8]; fn deref(&self) -> &Self::Target { self.0 } } impl<'a> MpiRef<'a> { pub fn from_slice(slice: &'a [u8]) -> Self { MpiRef(strip_leading_zeros(slice)) } pub fn to_owned(&self) -> Mpi { Mpi(self.0.to_owned()) } pub fn parse(slice: &'a [u8]) -> IResult<&'a [u8], MpiRef<'a>> { mpi(slice) } pub fn as_bytes(&self) -> &[u8] { self.0 } } impl Serialize for Mpi { fn to_writer(&self, w: &mut W) -> errors::Result<()> { MpiRef(&self.0).to_writer(w) } } impl Serialize for MpiRef<'_> { fn to_writer(&self, w: &mut W) -> errors::Result<()> { let bytes = &self.0; let size = bit_size(bytes); w.write_u16::(size as u16)?; w.write_all(bytes)?; Ok(()) } } impl From for Mpi { fn from(other: BigUint) -> Self { Mpi(other.to_bytes_be()) } } impl From for BigUint { fn from(other: Mpi) -> Self { BigUint::from_bytes_be(other.as_bytes()) } } impl<'a> From<&'a Mpi> for BigUint { fn from(other: &'a Mpi) -> Self { BigUint::from_bytes_be(other.as_bytes()) } } impl<'a> From> for BigUint { fn from(other: MpiRef<'a>) -> Self { BigUint::from_bytes_be(other.as_bytes()) } } impl<'a, 'b> From<&'b MpiRef<'a>> for BigUint { fn from(other: &'b MpiRef<'a>) -> Self { BigUint::from_bytes_be(other.as_bytes()) } } impl<'a> From<&'a BigUint> for Mpi { fn from(other: &'a BigUint) -> Self { Mpi(other.to_bytes_be()) } } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; #[test] fn test_mpi() { // Decode the number `511` (`0x1FF` in hex). assert_eq!( mpi(&[0x00, 0x09, 0x01, 0xFF][..]).unwrap(), (&b""[..], MpiRef::from_slice(&[0x01, 0xFF][..])) ); // Decode the number `2^255 + 7`. assert_eq!( mpi(&[ 0x01, 0, 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x07 ][..]) .unwrap(), ( &b""[..], MpiRef::from_slice( &[ 0x80, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x07 ][..] ) ) ); } #[test] fn test_bignum_mpi() { let fixtures = [ ("b4a71b058ac8aa1ddc453ab2663331c38f7645542815ac189a9af56d0e07a615469d3e08849650e03026d49259423cf00d089931cd700fd3a6e940bf83c81406e142a4b0a86f00738c7e1a9ff1b709f6bccc6cf900d0113a8e62e53d63be0a05105755b9efc6a4098c362c73fb422d40187d8e2382e88624d72caffceb13cec8fa0079c7d17883a46a1336471ab5be8cbb555c5d330d7fadb43318fa73b584edac312fa3302886bb5d04a05da3be2676c1fb94b3cf5c19d598659c3a7728ebab95f71721b662ac46aa9910726fe576d438f789c5ce2448f54546f254da814bcae1c35ee44b171e870ffa6403167a10e68573bdf155549274b431ff8e2418b627", "0800b4a71b058ac8aa1ddc453ab2663331c38f7645542815ac189a9af56d0e07a615469d3e08849650e03026d49259423cf00d089931cd700fd3a6e940bf83c81406e142a4b0a86f00738c7e1a9ff1b709f6bccc6cf900d0113a8e62e53d63be0a05105755b9efc6a4098c362c73fb422d40187d8e2382e88624d72caffceb13cec8fa0079c7d17883a46a1336471ab5be8cbb555c5d330d7fadb43318fa73b584edac312fa3302886bb5d04a05da3be2676c1fb94b3cf5c19d598659c3a7728ebab95f71721b662ac46aa9910726fe576d438f789c5ce2448f54546f254da814bcae1c35ee44b171e870ffa6403167a10e68573bdf155549274b431ff8e2418b627"), ("00e57192fa7bd6abd7d01331f0411eebff4651290af1329369cc3bb3b8ccbd7ba6e352400c3f64f637967e24524921ee04f1e0a79168781f0bec9029e34c8a1fb1c328a4b8d74c31429616a6ff4707bb56b71ab66643243087c8ff0d0c4883b3473c56deece9a83dbd06eef09fac3558003ae45f8898b8a9490aa79672eebdd7d985d051d62698f2da7eee33ba740e30fc5a93c3f16ca1490dfd62b84ba016c9da7c087a28a4e97d8af79c6b638bc22f20a8b5953bb83caa3dddaaf1d0dc15a3f7ed47870174af74e5308b856138771a10019fe4374389eb89d2280776e33fa2dd3526cec35cd86a9cf6c94253fe00c4b8a87a36451745116456833bb1a237", "07f0e57192fa7bd6abd7d01331f0411eebff4651290af1329369cc3bb3b8ccbd7ba6e352400c3f64f637967e24524921ee04f1e0a79168781f0bec9029e34c8a1fb1c328a4b8d74c31429616a6ff4707bb56b71ab66643243087c8ff0d0c4883b3473c56deece9a83dbd06eef09fac3558003ae45f8898b8a9490aa79672eebdd7d985d051d62698f2da7eee33ba740e30fc5a93c3f16ca1490dfd62b84ba016c9da7c087a28a4e97d8af79c6b638bc22f20a8b5953bb83caa3dddaaf1d0dc15a3f7ed47870174af74e5308b856138771a10019fe4374389eb89d2280776e33fa2dd3526cec35cd86a9cf6c94253fe00c4b8a87a36451745116456833bb1a237"), ]; for (i, (raw, encoded)) in fixtures.iter().enumerate() { println!("fixture {i}"); let n = hex::decode(raw).unwrap(); let n_big = BigUint::from_bytes_be(&n); let n_mpi: Mpi = n_big.clone().into(); let mut n_encoded = Vec::new(); n_mpi.to_writer(&mut n_encoded).unwrap(); assert_eq!(&n_encoded, &hex::decode(encoded).unwrap()); let (rest, n_big2) = mpi(&n_encoded).unwrap(); assert_eq!(rest.len(), 0); assert_eq!(n_big, n_big2.into()); } } } pgp-0.15.0/src/types/packet.rs000064400000000000000000000145351046102023000142550ustar 00000000000000use std::io; use byteorder::{BigEndian, WriteBytesExt}; use log::debug; use num_enum::{FromPrimitive, IntoPrimitive, TryFromPrimitive}; use crate::errors::Result; /// Represents a Packet. A packet is the record structure used to encode a chunk of data in OpenPGP. /// Ref: #[derive(Debug, PartialEq, Eq, Clone)] pub struct Packet { /// Indicator if this is an old or new versioned packet pub version: Version, /// Denotes the type of data this packet holds pub tag: Tag, /// The raw bytes of the packet pub body: Vec, } /// Represents the packet length. #[derive(Debug, PartialEq, Eq, Clone)] pub enum PacketLength { Fixed(usize), Indeterminate, Partial(usize), } impl From for PacketLength { fn from(val: usize) -> PacketLength { PacketLength::Fixed(val) } } /// Packet Type ID, see /// /// The "Packet Type ID" was called "Packet tag" in RFC 4880 (Section 4.3 "Packet Tags"). /// Ref /// /// However, rPGP will continue to use the term "(Packet) Tag" for the time being. #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum Tag { /// Public-Key Encrypted Session Key Packet PublicKeyEncryptedSessionKey = 1, /// Signature Packet Signature = 2, /// Symmetric-Key Encrypted Session Key Packet SymKeyEncryptedSessionKey = 3, /// One-Pass Signature Packet OnePassSignature = 4, /// Secret-Key Packet SecretKey = 5, /// Public-Key Packet PublicKey = 6, /// Secret-Subkey Packet SecretSubkey = 7, /// Compressed Data Packet CompressedData = 8, /// Symmetrically Encrypted Data Packet SymEncryptedData = 9, /// Marker Packet Marker = 10, /// Literal Data Packet LiteralData = 11, /// Trust Packet Trust = 12, /// User ID Packet UserId = 13, /// Public-Subkey Packet PublicSubkey = 14, /// User Attribute Packet UserAttribute = 17, /// Sym. Encrypted and Integrity Protected Data Packet SymEncryptedProtectedData = 18, /// Modification Detection Code Packet ModDetectionCode = 19, /// Padding Packet Padding = 21, #[num_enum(catch_all)] Other(u8), } impl Tag { /// Packet Type ID encoded in OpenPGP format /// (bits 7 and 6 set, bits 5-0 carry the packet type ID) pub fn encode(self) -> u8 { let t: u8 = self.into(); 0b1100_0000 | t } } /// The version of the packet format. /// /// There are two packet formats /// (see ): /// /// 1) the (current) OpenPGP packet format specified by this document and its /// predecessors RFC 4880 and RFC 2440 and /// /// 2) the Legacy packet format as used by implementations predating any IETF specification of OpenPGP. #[derive(Debug, PartialEq, Eq, Clone, Copy, TryFromPrimitive)] #[repr(u8)] #[derive(Default)] pub enum Version { /// Old Packet Format ("Legacy packet format") Old = 0, /// New Packet Format ("OpenPGP packet format") #[default] New = 1, } impl Version { pub fn write_header(self, writer: &mut impl io::Write, tag: u8, len: usize) -> Result<()> { debug!("write_header {:?} {} {}", self, tag, len); match self { Version::Old => { if len < 256 { // one octet writer.write_u8(0b1000_0000 | tag << 2)?; writer.write_u8(len.try_into()?)?; } else if len < 65536 { // two octets writer.write_u8(0b1000_0001 | tag << 2)?; writer.write_u16::(len as u16)?; } else { // four octets writer.write_u8(0b1000_0010 | tag << 2)?; writer.write_u32::(len as u32)?; } } Version::New => { writer.write_u8(0b1100_0000 | tag)?; if len < 192 { writer.write_u8(len.try_into()?)?; } else if len < 8384 { writer.write_u8((((len - 192) >> 8) + 192) as u8)?; writer.write_u8(((len - 192) & 0xFF) as u8)?; } else { writer.write_u8(255)?; writer.write_u32::(len as u32)?; } } } Ok(()) } } // TODO: find a better place for this #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum KeyVersion { V2 = 2, V3 = 3, V4 = 4, V5 = 5, V6 = 6, #[num_enum(catch_all)] Other(u8), } impl KeyVersion { /// Size of OpenPGP fingerprint in bytes /// (returns `None` for unknown versions) pub const fn fingerprint_len(&self) -> Option { match self { KeyVersion::V2 | KeyVersion::V3 => Some(16), // MD5 KeyVersion::V4 => Some(20), // SHA1 KeyVersion::V5 | KeyVersion::V6 => Some(32), // SHA256 KeyVersion::Other(_) => None, } } } impl Default for KeyVersion { fn default() -> Self { Self::V4 } } #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum PkeskVersion { V3 = 3, V6 = 6, #[num_enum(catch_all)] Other(u8), } #[derive(Debug, PartialEq, Eq, Clone, Copy, FromPrimitive, IntoPrimitive)] #[repr(u8)] pub enum SkeskVersion { V4 = 4, V6 = 6, #[num_enum(catch_all)] Other(u8), } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; #[test] fn test_write_header() { let mut buf = Vec::new(); Version::New .write_header(&mut buf, Tag::UserAttribute.into(), 12875) .unwrap(); assert_eq!(hex::encode(buf), "d1ff0000324b"); let mut buf = Vec::new(); Version::New .write_header(&mut buf, Tag::Signature.into(), 302) .unwrap(); assert_eq!(hex::encode(buf), "c2c06e"); let mut buf = Vec::new(); Version::New .write_header(&mut buf, Tag::Signature.into(), 303) .unwrap(); assert_eq!(hex::encode(buf), "c2c06f"); } } pgp-0.15.0/src/types/params/encrypted_secret.rs000064400000000000000000000240471046102023000176320ustar 00000000000000use std::io; use std::io::Write; use byteorder::{BigEndian, ByteOrder, WriteBytesExt}; use digest::Digest; use crate::crypto::checksum; use crate::errors::{Error, Result}; use crate::ser::Serialize; use crate::types::*; #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub struct EncryptedSecretParams { /// The encrypted data, including the checksum. #[debug("{}", hex::encode(data))] data: Vec, /// S2k Params s2k_params: S2kParams, } impl EncryptedSecretParams { pub fn new(data: Vec, s2k_params: S2kParams) -> Self { assert_ne!(s2k_params, S2kParams::Unprotected, "invalid string to key"); EncryptedSecretParams { data, s2k_params } } pub fn data(&self) -> &[u8] { &self.data } pub fn string_to_key_id(&self) -> u8 { (&self.s2k_params).into() } pub fn string_to_key_params(&self) -> &S2kParams { &self.s2k_params } pub fn checksum(&self) -> Vec { match self.s2k_params { S2kParams::Unprotected => unreachable!(), S2kParams::LegacyCfb { .. } | S2kParams::Aead { .. } | S2kParams::MalleableCfb { .. } => { // 2 octets self.data[self.data.len() - 2..].to_vec() } S2kParams::Cfb { .. } => { // 20 octets SHA1 self.data[self.data.len() - 20..].to_vec() } } } pub fn unlock( &self, pw: F, pub_key: &(impl PublicKeyTrait + Serialize), secret_tag: Option, ) -> Result where F: FnOnce() -> String, { // Argon2 is only used with AEAD (S2K usage octet 253). // // An implementation MUST NOT create and MUST reject as malformed any secret key packet // where the S2K usage octet is not AEAD (253) and the S2K specifier type is Argon2. // // Ref: https://www.rfc-editor.org/rfc/rfc9580.html#section-3.7.2.1-10 match &self.s2k_params { S2kParams::Cfb { s2k, .. } | S2kParams::MalleableCfb { s2k, .. } => { if matches!(s2k, StringToKey::Argon2 { .. }) { bail!( "S2k method Argon2 is only allowed in combination with usage mode 'AEAD'" ); } } _ => {} } // For Version 6 keys: Additionally refuse legacy s2k mechanisms. // Those should never be generated or used. if pub_key.version() == KeyVersion::V6 { match &self.s2k_params { S2kParams::Aead { s2k, .. } | S2kParams::Cfb { s2k, .. } => { match s2k { StringToKey::Argon2 { .. } | StringToKey::IteratedAndSalted { .. } | StringToKey::Salted { .. } => { // we'll allow these, generally } _ => bail!("Version 6 keys may not use the weak S2k type {:?}", s2k), } // Implementations MUST NOT decrypt a secret using MD5, SHA-1, or RIPEMD-160 // as a hash function in an S2K KDF in a version 6 (or later) packet. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.5-3) ensure!( !s2k.known_weak_hash_algo(), "Weak hash algorithm in S2K not allowed for v6 {:?}", s2k ) } _ => bail!("Version 6 keys may only be encrypted with S2k usage AEAD or CFB"), } } // We're willing to unlock. let alg = pub_key.algorithm(); let params = pub_key.public_params(); match &self.s2k_params { S2kParams::Unprotected => unreachable!(), S2kParams::LegacyCfb { sym_alg, iv } => { let key = md5::Md5::digest(pw()); // Decryption let mut plaintext = self.data.clone(); sym_alg.decrypt_with_iv_regular(&key, iv, &mut plaintext)?; // Checksum if plaintext.len() < 2 { return Err(Error::InvalidInput); } let (plaintext, checksum) = plaintext.split_at(self.data.len() - 2); let calculated_checksum = checksum::calculate_simple(plaintext); if calculated_checksum != BigEndian::read_u16(checksum) { return Err(Error::InvalidInput); } PlainSecretParams::from_slice(plaintext, alg, params) } S2kParams::Aead { sym_alg, aead_mode, s2k, nonce, } => { match s2k { StringToKey::Argon2 { .. } | StringToKey::IteratedAndSalted { .. } => { let Some(tag_size) = aead_mode.tag_size() else { unsupported_err!("AEAD mode: {:?}", aead_mode); }; if self.data.len() < tag_size { return Err(Error::InvalidInput); } // derive key let derived = s2k.derive_key(&pw(), 32)?; let Some(secret_tag) = secret_tag else { bail!("no secret_tag provided"); }; let (okm, ad) = s2k_usage_aead(&derived, secret_tag, pub_key, *sym_alg, *aead_mode)?; // AEAD decrypt let (ciphertext, tag) = self.data.split_at(self.data.len() - tag_size); let mut decrypt: Vec<_> = ciphertext.to_vec(); aead_mode.decrypt_in_place(sym_alg, &okm, nonce, &ad, tag, &mut decrypt)?; // "decrypt" now contains the decrypted key material PlainSecretParams::from_slice(&decrypt, alg, pub_key.public_params()) } _ => bail!("S2K usage AEAD is not allowed with S2K type {:?}", s2k.id()), } } S2kParams::Cfb { sym_alg, s2k, iv } => { let key = s2k.derive_key(&pw(), sym_alg.key_size())?; // Decryption let mut plaintext = self.data.clone(); sym_alg.decrypt_with_iv_regular(&key, iv, &mut plaintext)?; // Checksum // Check SHA-1 hash if it is present. // See for details. if plaintext.len() < 20 { return Err(Error::InvalidInput); } let (plaintext, expected_sha1) = plaintext.split_at(self.data.len() - 20); let calculated_sha1 = checksum::calculate_sha1([plaintext])?; if expected_sha1 != calculated_sha1 { return Err(Error::InvalidInput); } PlainSecretParams::from_slice(plaintext, alg, params) } S2kParams::MalleableCfb { sym_alg, s2k, iv } => { let key = s2k.derive_key(&pw(), sym_alg.key_size())?; // Decryption let mut plaintext = self.data.clone(); sym_alg.decrypt_with_iv_regular(&key, iv, &mut plaintext)?; if plaintext.len() < 2 { return Err(Error::InvalidInput); } // Checksum let (plaintext, checksum) = plaintext.split_at(self.data.len() - 2); let calculated_checksum = checksum::calculate_simple(plaintext); if calculated_checksum != BigEndian::read_u16(checksum) { return Err(Error::InvalidInput); } PlainSecretParams::from_slice(plaintext, alg, params) } } } pub(crate) fn to_writer( &self, writer: &mut W, version: KeyVersion, ) -> Result<()> { writer.write_u8((&self.s2k_params).into())?; let mut s2k_params = vec![]; let mut s2k_writer = &mut s2k_params; match &self.s2k_params { S2kParams::Unprotected => { panic!("encrypted secret params should not have an unencrypted identifier") } S2kParams::LegacyCfb { ref iv, .. } => { s2k_writer.write_all(iv)?; } S2kParams::Aead { sym_alg, aead_mode, s2k, ref nonce, } => { s2k_writer.write_u8((*sym_alg).into())?; s2k_writer.write_u8((*aead_mode).into())?; if version == KeyVersion::V6 { s2k_writer.write_u8(s2k.len()?)?; // length of S2K Specifier Type } s2k.to_writer(&mut s2k_writer)?; s2k_writer.write_all(nonce)?; } S2kParams::Cfb { sym_alg, s2k, ref iv, } | S2kParams::MalleableCfb { sym_alg, s2k, ref iv, } => { s2k_writer.write_u8((*sym_alg).into())?; if version == KeyVersion::V6 && matches!(self.s2k_params, S2kParams::Cfb { .. }) { s2k_writer.write_u8(s2k.len()?)?; // length of S2K Specifier Type } s2k.to_writer(&mut s2k_writer)?; s2k_writer.write_all(iv)?; } } if self.s2k_params != S2kParams::Unprotected { if version == KeyVersion::V6 { let len = s2k_params.len(); ensure!(len <= 255, "unexpected s2k_params length {}", len); writer.write_u8(len.try_into()?)?; } writer.write_all(&s2k_params)?; } writer.write_all(&self.data)?; Ok(()) } } pgp-0.15.0/src/types/params/mod.rs000064400000000000000000000003051046102023000150360ustar 00000000000000pub mod encrypted_secret; pub mod plain_secret; pub mod public; pub mod secret; pub use self::encrypted_secret::*; pub use self::plain_secret::*; pub use self::public::*; pub use self::secret::*; pgp-0.15.0/src/types/params/plain_secret.rs000064400000000000000000000513651046102023000167430ustar 00000000000000use std::hash::Hasher; use std::io; use byteorder::{BigEndian, ByteOrder}; use hkdf::Hkdf; use nom::combinator::map; use nom::sequence::tuple; use rsa::RsaPrivateKey; use sha2::Sha256; use zeroize::{Zeroize, ZeroizeOnDrop}; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::checksum; use crate::crypto::ecc_curve::ECCCurve; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{IResult, Result}; use crate::ser::Serialize; use crate::types::*; use crate::util::TeeWriter; #[derive(Clone, PartialEq, Eq, Zeroize, ZeroizeOnDrop, derive_more::Debug)] pub enum PlainSecretParams { RSA { #[debug("..")] d: Mpi, #[debug("..")] p: Mpi, #[debug("..")] q: Mpi, #[debug("..")] u: Mpi, }, DSA(#[debug("..")] Mpi), ECDSA(#[debug("..")] Mpi), ECDH(#[debug("..")] Mpi), Elgamal(#[debug("..")] Mpi), EdDSALegacy(#[debug("..")] Mpi), Ed25519(#[debug("..")] [u8; 32]), X25519(#[debug("..")] [u8; 32]), #[cfg(feature = "unstable-curve448")] X448(#[debug("..")] [u8; 56]), } #[derive(Clone, PartialEq, Eq, derive_more::Debug)] pub enum PlainSecretParamsRef<'a> { RSA { #[debug("..")] d: MpiRef<'a>, #[debug("..")] p: MpiRef<'a>, #[debug("..")] q: MpiRef<'a>, #[debug("..")] u: MpiRef<'a>, }, DSA(#[debug("..")] MpiRef<'a>), ECDSA(#[debug("..")] MpiRef<'a>), ECDH(#[debug("..")] MpiRef<'a>), Elgamal(#[debug("..")] MpiRef<'a>), EdDSALegacy(#[debug("..")] MpiRef<'a>), Ed25519(#[debug("..")] &'a [u8; 32]), X25519(#[debug("..")] &'a [u8; 32]), #[cfg(feature = "unstable-curve448")] X448(#[debug("..")] &'a [u8; 56]), } impl PlainSecretParamsRef<'_> { pub fn to_owned(&self) -> PlainSecretParams { match self { PlainSecretParamsRef::RSA { d, p, q, u } => PlainSecretParams::RSA { d: (*d).to_owned(), p: (*p).to_owned(), q: (*q).to_owned(), u: (*u).to_owned(), }, PlainSecretParamsRef::DSA(v) => PlainSecretParams::DSA((*v).to_owned()), PlainSecretParamsRef::ECDSA(v) => PlainSecretParams::ECDSA((*v).to_owned()), PlainSecretParamsRef::ECDH(v) => PlainSecretParams::ECDH((*v).to_owned()), PlainSecretParamsRef::Elgamal(v) => PlainSecretParams::Elgamal((*v).to_owned()), PlainSecretParamsRef::EdDSALegacy(v) => PlainSecretParams::EdDSALegacy((*v).to_owned()), PlainSecretParamsRef::Ed25519(s) => PlainSecretParams::Ed25519((*s).to_owned()), PlainSecretParamsRef::X25519(s) => PlainSecretParams::X25519((*s).to_owned()), #[cfg(feature = "unstable-curve448")] PlainSecretParamsRef::X448(s) => PlainSecretParams::X448((*s).to_owned()), } } pub fn string_to_key_id(&self) -> u8 { 0 } fn to_writer_raw(&self, writer: &mut W) -> Result<()> { match self { PlainSecretParamsRef::RSA { d, p, q, u } => { (*d).to_writer(writer)?; (*p).to_writer(writer)?; (*q).to_writer(writer)?; (*u).to_writer(writer)?; } PlainSecretParamsRef::DSA(x) => { (*x).to_writer(writer)?; } PlainSecretParamsRef::ECDSA(x) => { (*x).to_writer(writer)?; } PlainSecretParamsRef::ECDH(x) => { (*x).to_writer(writer)?; } PlainSecretParamsRef::Elgamal(d) => { (*d).to_writer(writer)?; } PlainSecretParamsRef::EdDSALegacy(x) => { (*x).to_writer(writer)?; } PlainSecretParamsRef::Ed25519(s) => { writer.write_all(&s[..])?; } PlainSecretParamsRef::X25519(s) => { writer.write_all(&s[..])?; } #[cfg(feature = "unstable-curve448")] PlainSecretParamsRef::X448(s) => { writer.write_all(&s[..])?; } } Ok(()) } pub fn compare_checksum_simple(&self, other: Option<&[u8]>) -> Result<()> { if let Some(other) = other { let mut hasher = checksum::SimpleChecksum::default(); self.to_writer_raw(&mut hasher)?; ensure_eq!( BigEndian::read_u16(other), hasher.finish() as u16, "Invalid checksum" ); Ok(()) } else { bail!("Missing checksum"); } } pub fn checksum_simple(&self) -> Vec { let mut hasher = checksum::SimpleChecksum::default(); self.to_writer_raw(&mut hasher).expect("known write target"); hasher.finalize().to_vec() } /// Uses sha1_checked pub fn checksum_sha1(&self) -> Result<[u8; 20]> { let mut buf = Vec::new(); self.to_writer_raw(&mut buf).expect("known write target"); checksum::calculate_sha1([&buf]) } fn pad_key(val: &[u8]) -> Result<[u8; SIZE]> { ensure!(val.len() <= SIZE, "invalid secret key size"); let mut key = [0u8; SIZE]; key[SIZE - val.len()..].copy_from_slice(val); Ok(key) } pub fn as_repr(&self, public_params: &PublicParams) -> Result { match self { PlainSecretParamsRef::RSA { d, p, q, .. } => match public_params { PublicParams::RSA { ref n, ref e } => { let secret_key = RsaPrivateKey::from_components( n.into(), e.into(), d.into(), vec![p.into(), q.into()], )?; Ok(SecretKeyRepr::RSA(crate::crypto::rsa::PrivateKey::from( secret_key, ))) } _ => unreachable!("inconsistent key state"), }, PlainSecretParamsRef::ECDH(d) => match public_params { PublicParams::ECDH(EcdhPublicParams::Known { ref curve, ref hash, ref alg_sym, .. }) => match curve { ECCCurve::Curve25519 => { const SIZE: usize = ECCCurve::Curve25519.secret_key_length(); Ok(SecretKeyRepr::ECDH( crate::crypto::ecdh::SecretKey::Curve25519 { secret: Self::pad_key::(d)?, hash: *hash, alg_sym: *alg_sym, }, )) } ECCCurve::P256 => { const SIZE: usize = ECCCurve::P256.secret_key_length(); Ok(SecretKeyRepr::ECDH(crate::crypto::ecdh::SecretKey::P256 { secret: Self::pad_key::(d)?, hash: *hash, alg_sym: *alg_sym, })) } ECCCurve::P384 => { const SIZE: usize = ECCCurve::P384.secret_key_length(); Ok(SecretKeyRepr::ECDH(crate::crypto::ecdh::SecretKey::P384 { secret: Self::pad_key::(d)?, hash: *hash, alg_sym: *alg_sym, })) } ECCCurve::P521 => { const SIZE: usize = ECCCurve::P521.secret_key_length(); Ok(SecretKeyRepr::ECDH(crate::crypto::ecdh::SecretKey::P521 { secret: Self::pad_key::(d)?, hash: *hash, alg_sym: *alg_sym, })) } _ => unsupported_err!("curve {:?} for ECDH", curve.to_string()), }, PublicParams::ECDH(EcdhPublicParams::Unsupported { ref curve, .. }) => { unsupported_err!("curve {:?} for ECDH", curve) } _ => unreachable!("inconsistent key state"), }, PlainSecretParamsRef::EdDSALegacy(d) => match public_params { PublicParams::EdDSALegacy { ref curve, .. } => match *curve { ECCCurve::Ed25519 => { const SIZE: usize = ECCCurve::Ed25519.secret_key_length(); Ok(SecretKeyRepr::EdDSA(crate::crypto::eddsa::SecretKey { oid: curve.oid(), secret: Self::pad_key::(d)?, })) } _ => unsupported_err!("curve {:?} for EdDSA", curve.to_string()), }, _ => unreachable!("inconsistent key state"), }, PlainSecretParamsRef::Ed25519(d) => { Ok(SecretKeyRepr::EdDSA(crate::crypto::eddsa::SecretKey { oid: ECCCurve::Ed25519.oid(), secret: **d, })) } PlainSecretParamsRef::X25519(d) => { Ok(SecretKeyRepr::X25519(crate::crypto::x25519::SecretKey { secret: **d, })) } #[cfg(feature = "unstable-curve448")] PlainSecretParamsRef::X448(d) => { Ok(SecretKeyRepr::X448(crate::crypto::x448::SecretKey { secret: **d, })) } PlainSecretParamsRef::DSA(x) => Ok(SecretKeyRepr::DSA(crate::crypto::dsa::SecretKey { x: x.into(), })), PlainSecretParamsRef::Elgamal(_) => { unimplemented_err!("Elgamal"); } PlainSecretParamsRef::ECDSA(d) => match public_params { PublicParams::ECDSA(params) => match params { EcdsaPublicParams::P256 { .. } => { let secret = p256::SecretKey::from_slice(d.as_bytes())?; Ok(SecretKeyRepr::ECDSA(crate::crypto::ecdsa::SecretKey::P256( secret, ))) } EcdsaPublicParams::P384 { .. } => { let secret = p384::SecretKey::from_slice(d.as_bytes())?; Ok(SecretKeyRepr::ECDSA(crate::crypto::ecdsa::SecretKey::P384( secret, ))) } EcdsaPublicParams::P521 { .. } => { let secret = p521::SecretKey::from_slice(d.as_bytes())?; Ok(SecretKeyRepr::ECDSA(crate::crypto::ecdsa::SecretKey::P521( secret, ))) } EcdsaPublicParams::Secp256k1 { .. } => { let secret = k256::SecretKey::from_slice(d.as_bytes())?; Ok(SecretKeyRepr::ECDSA( crate::crypto::ecdsa::SecretKey::Secp256k1(secret), )) } EcdsaPublicParams::Unsupported { curve, .. } => { unsupported_err!("curve {:?} for ECDSA", curve.to_string()) } }, _ => unreachable!("inconsistent key state"), }, } } } impl PlainSecretParams { pub fn from_slice( data: &[u8], alg: PublicKeyAlgorithm, _params: &PublicParams, ) -> Result { let (_, repr) = parse_secret_params(alg)(data)?; Ok(repr) } pub fn string_to_key_id(&self) -> u8 { self.as_ref().string_to_key_id() } pub fn checksum_simple(&self) -> Vec { self.as_ref().checksum_simple() } /// Uses sha1_checked pub fn checksum_sha1(&self) -> Result<[u8; 20]> { self.as_ref().checksum_sha1() } pub fn as_ref(&self) -> PlainSecretParamsRef<'_> { match self { PlainSecretParams::RSA { d, p, q, u } => PlainSecretParamsRef::RSA { d: d.as_ref(), p: p.as_ref(), q: q.as_ref(), u: u.as_ref(), }, PlainSecretParams::DSA(v) => PlainSecretParamsRef::DSA(v.as_ref()), PlainSecretParams::ECDSA(v) => PlainSecretParamsRef::ECDSA(v.as_ref()), PlainSecretParams::ECDH(v) => PlainSecretParamsRef::ECDH(v.as_ref()), PlainSecretParams::Elgamal(v) => PlainSecretParamsRef::Elgamal(v.as_ref()), PlainSecretParams::EdDSALegacy(v) => PlainSecretParamsRef::EdDSALegacy(v.as_ref()), PlainSecretParams::Ed25519(s) => PlainSecretParamsRef::Ed25519(s), PlainSecretParams::X25519(s) => PlainSecretParamsRef::X25519(s), #[cfg(feature = "unstable-curve448")] PlainSecretParams::X448(s) => PlainSecretParamsRef::X448(s), } } pub fn encrypt( &self, passphrase: &str, s2k_params: S2kParams, pub_key: &(impl PublicKeyTrait + Serialize), secret_tag: Option, ) -> Result { let version = pub_key.version(); // forbid weak hash algo in s2k match &s2k_params { S2kParams::Cfb { s2k, .. } | S2kParams::Aead { s2k, .. } | S2kParams::MalleableCfb { s2k, .. } => { // Implementations MUST NOT generate packets using MD5, SHA-1, or RIPEMD-160 as a hash function in an S2K KDF. // (See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.5-3) ensure!( !s2k.known_weak_hash_algo(), "Weak hash algorithm in S2K not allowed for v6 {:?}", s2k ) } _ => {} } match &s2k_params { S2kParams::Unprotected => bail!("cannot encrypt to unprotected"), S2kParams::Cfb { sym_alg, s2k, iv } => { // An implementation MUST NOT create [..] any Secret Key packet where the S2K usage // octet is not AEAD (253) and the S2K Specifier Type is Argon2. ensure!( !matches!(s2k, StringToKey::Argon2 { .. }), "Argon2 not allowed with Cfb" ); let key = s2k.derive_key(passphrase, sym_alg.key_size())?; let enc_data = match version { KeyVersion::V2 | KeyVersion::V3 => { unimplemented_err!("Encryption for V2/V3 keys is not available") } KeyVersion::V4 | KeyVersion::V6 => { let mut data = Vec::new(); self.as_ref() .to_writer_raw(&mut data) .expect("preallocated vector"); data.extend_from_slice(&self.checksum_sha1()?[..]); sym_alg.encrypt_with_iv_regular(&key, iv, &mut data)?; data } KeyVersion::V5 => unimplemented_err!("v5 encryption"), KeyVersion::Other(v) => unimplemented_err!("encryption for key version {}", v), }; Ok(EncryptedSecretParams::new(enc_data, s2k_params)) } S2kParams::Aead { sym_alg, aead_mode, s2k, nonce, } => { let key = s2k.derive_key(passphrase, sym_alg.key_size())?; let enc_data = match version { KeyVersion::V2 | KeyVersion::V3 => { unimplemented_err!("Encryption for V2/V3 keys is not available") } KeyVersion::V4 | KeyVersion::V6 => { let mut data = Vec::new(); self.as_ref() .to_writer_raw(&mut data) .expect("preallocated vector"); let Some(secret_tag) = secret_tag else { bail!("no secret_tag provided"); }; let (okm, ad) = s2k_usage_aead(&key, secret_tag, pub_key, *sym_alg, *aead_mode)?; // AEAD encrypt let tag = aead_mode.encrypt_in_place(sym_alg, &okm, nonce, &ad, &mut data)?; // append tag to now encrypted secret params data.extend_from_slice(&tag); data } KeyVersion::V5 => unimplemented_err!("v5 encryption"), KeyVersion::Other(v) => unimplemented_err!("encryption for key version {}", v), }; Ok(EncryptedSecretParams::new(enc_data, s2k_params)) } _ => unimplemented_err!("{:?} not implemented yet", s2k_params), } } pub fn to_writer(&self, writer: &mut W, version: KeyVersion) -> Result<()> { writer.write_all(&[self.string_to_key_id()])?; let mut hasher = checksum::SimpleChecksum::default(); { let mut tee = TeeWriter::new(&mut hasher, writer); self.as_ref().to_writer_raw(&mut tee)?; } if version == KeyVersion::V3 || version == KeyVersion::V4 { // Only for a version 3 or 4 packet where the string-to-key usage octet is zero, a // two-octet checksum of the algorithm-specific portion (sum of all octets, mod 65536). // // https://www.rfc-editor.org/rfc/rfc9580.html#section-5.5.3-3.6.1 hasher.to_writer(writer)?; } Ok(()) } } fn parse_secret_params( alg: PublicKeyAlgorithm, ) -> impl Fn(&[u8]) -> IResult<&[u8], PlainSecretParams> { move |i: &[u8]| match alg { PublicKeyAlgorithm::RSA | PublicKeyAlgorithm::RSAEncrypt | PublicKeyAlgorithm::RSASign => { rsa_secret_params(i) } PublicKeyAlgorithm::DSA => map(mpi, |m| PlainSecretParams::DSA(m.to_owned()))(i), PublicKeyAlgorithm::Elgamal => map(mpi, |m| PlainSecretParams::Elgamal(m.to_owned()))(i), PublicKeyAlgorithm::ECDH => map(mpi, |m| PlainSecretParams::ECDH(m.to_owned()))(i), PublicKeyAlgorithm::ECDSA => map(mpi, |m| PlainSecretParams::ECDSA(m.to_owned()))(i), PublicKeyAlgorithm::EdDSALegacy => { map(mpi, |m| PlainSecretParams::EdDSALegacy(m.to_owned()))(i) } PublicKeyAlgorithm::Ed25519 => { let (i, s) = nom::bytes::complete::take(32u8)(i)?; Ok((i, PlainSecretParams::Ed25519(s.try_into().expect("32")))) } PublicKeyAlgorithm::X25519 => { let (i, s) = nom::bytes::complete::take(32u8)(i)?; Ok((i, PlainSecretParams::X25519(s.try_into().expect("32")))) } #[cfg(feature = "unstable-curve448")] PublicKeyAlgorithm::X448 => { let (i, s) = nom::bytes::complete::take(56u8)(i)?; Ok((i, PlainSecretParams::X448(s.try_into().expect("56")))) } _ => Err(nom::Err::Error(crate::errors::Error::ParsingError( nom::error::ErrorKind::Switch, ))), } } // Parse the decrypted private params of an RSA private key. fn rsa_secret_params(i: &[u8]) -> IResult<&[u8], PlainSecretParams> { map(tuple((mpi, mpi, mpi, mpi)), |(d, p, q, u)| { PlainSecretParams::RSA { d: d.to_owned(), p: p.to_owned(), q: q.to_owned(), u: u.to_owned(), } })(i) } /// Derive output keying material and associated data for the s2k usage method AEAD. /// /// https://www.rfc-editor.org/rfc/rfc9580.html#name-secret-key-packet-formats pub(crate) fn s2k_usage_aead( derived: &[u8], secret_tag: Tag, pub_key: &(impl PublicKeyTrait + Serialize), sym_alg: SymmetricKeyAlgorithm, aead_mode: AeadAlgorithm, ) -> Result<([u8; 32], Vec)> { // HKDF to derive output keying material let hk = Hkdf::::new(None, derived); let mut okm = [0u8; 32]; let type_id = u8::from(secret_tag) | 0xc0; // HKDF info parameter let info = [ type_id, pub_key.version().into(), sym_alg.into(), aead_mode.into(), ]; hk.expand(&info, &mut okm) .expect("32 is a valid length for Sha256 to output"); // Additional data: // - the Packet Type ID in OpenPGP format encoding // - followed by the public key packet fields, starting with the packet version number let mut ad = vec![type_id]; pub_key.to_writer(&mut ad)?; Ok((okm, ad)) } pgp-0.15.0/src/types/params/public.rs000064400000000000000000000201551046102023000155420ustar 00000000000000use std::io; use byteorder::WriteBytesExt; use crate::crypto::ecc_curve::ECCCurve; use crate::crypto::hash::HashAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::Result; use crate::ser::Serialize; use crate::types::{Mpi, MpiRef}; /// Represent the public parameters for the different algorithms. #[derive(PartialEq, Eq, Clone, Debug)] pub enum PublicParams { RSA { n: Mpi, e: Mpi, }, DSA { p: Mpi, q: Mpi, g: Mpi, y: Mpi, }, ECDSA(EcdsaPublicParams), ECDH(EcdhPublicParams), Elgamal { p: Mpi, g: Mpi, y: Mpi, }, EdDSALegacy { curve: ECCCurve, q: Mpi, }, Ed25519 { public: [u8; 32], }, X25519 { public: [u8; 32], }, #[cfg(feature = "unstable-curve448")] X448 { public: [u8; 56], }, Unknown { data: Vec, }, } #[derive(Debug, PartialEq, Eq, Clone)] pub enum EcdhPublicParams { /// ECDH public parameters for a curve that we know uses Mpi representation Known { curve: ECCCurve, p: Mpi, hash: HashAlgorithm, alg_sym: SymmetricKeyAlgorithm, }, /// Public parameters for a curve that we don't know about (which might not use Mpi representation). Unsupported { curve: ECCCurve, opaque: Vec }, } #[derive(Debug, PartialEq, Eq, Clone)] pub enum EcdsaPublicParams { P256 { key: p256::PublicKey, /// Stores the original Mpi, to ensure we keep the padding around. p: Mpi, }, P384 { key: p384::PublicKey, /// Stores the original Mpi, to ensure we keep the padding around. p: Mpi, }, P521 { key: p521::PublicKey, /// Stores the original Mpi, to ensure we keep the padding around. p: Mpi, }, Secp256k1 { key: k256::PublicKey, /// Stores the original Mpi, to ensure we keep the padding around. p: Mpi, }, Unsupported { curve: ECCCurve, p: Mpi, }, } impl EcdsaPublicParams { pub fn try_from_mpi(p: MpiRef<'_>, curve: ECCCurve) -> Result { match curve { ECCCurve::P256 => { ensure!(p.len() <= 65, "invalid public key length"); let mut key = [0u8; 65]; key[..p.len()].copy_from_slice(p.as_bytes()); let public = p256::PublicKey::from_sec1_bytes(&key)?; Ok(EcdsaPublicParams::P256 { key: public, p: p.to_owned(), }) } ECCCurve::P384 => { ensure!(p.len() <= 97, "invalid public key length"); let mut key = [0u8; 97]; key[..p.len()].copy_from_slice(p.as_bytes()); let public = p384::PublicKey::from_sec1_bytes(&key)?; Ok(EcdsaPublicParams::P384 { key: public, p: p.to_owned(), }) } ECCCurve::P521 => { ensure!(p.len() <= 133, "invalid public key length"); let mut key = [0u8; 133]; key[..p.len()].copy_from_slice(p.as_bytes()); let public = p521::PublicKey::from_sec1_bytes(&key)?; Ok(EcdsaPublicParams::P521 { key: public, p: p.to_owned(), }) } ECCCurve::Secp256k1 => { ensure!(p.len() <= 65, "invalid public key length"); let mut key = [0u8; 65]; key[..p.len()].copy_from_slice(p.as_bytes()); let public = k256::PublicKey::from_sec1_bytes(&key)?; Ok(EcdsaPublicParams::Secp256k1 { key: public, p: p.to_owned(), }) } _ => Ok(EcdsaPublicParams::Unsupported { curve, p: p.to_owned(), }), } } pub const fn secret_key_length(&self) -> Option { match self { EcdsaPublicParams::P256 { .. } => Some(32), EcdsaPublicParams::P384 { .. } => Some(48), EcdsaPublicParams::P521 { .. } => Some(66), EcdsaPublicParams::Secp256k1 { .. } => Some(32), EcdsaPublicParams::Unsupported { .. } => None, } } } impl Serialize for EcdsaPublicParams { fn to_writer(&self, writer: &mut W) -> Result<()> { let oid = match self { EcdsaPublicParams::P256 { .. } => ECCCurve::P256.oid(), EcdsaPublicParams::P384 { .. } => ECCCurve::P384.oid(), EcdsaPublicParams::P521 { .. } => ECCCurve::P521.oid(), EcdsaPublicParams::Secp256k1 { .. } => ECCCurve::Secp256k1.oid(), EcdsaPublicParams::Unsupported { curve, .. } => curve.oid(), }; writer.write_u8(oid.len().try_into()?)?; writer.write_all(&oid)?; match self { EcdsaPublicParams::P256 { p, .. } => { p.as_ref().to_writer(writer)?; } EcdsaPublicParams::P384 { p, .. } => { p.as_ref().to_writer(writer)?; } EcdsaPublicParams::P521 { p, .. } => { p.as_ref().to_writer(writer)?; } EcdsaPublicParams::Secp256k1 { p, .. } => { p.as_ref().to_writer(writer)?; } EcdsaPublicParams::Unsupported { p, .. } => { p.as_ref().to_writer(writer)?; } } Ok(()) } } impl Serialize for PublicParams { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { PublicParams::RSA { ref n, ref e } => { n.to_writer(writer)?; e.to_writer(writer)?; } PublicParams::DSA { ref p, ref q, ref g, ref y, } => { p.to_writer(writer)?; q.to_writer(writer)?; g.to_writer(writer)?; y.to_writer(writer)?; } PublicParams::ECDSA(params) => { params.to_writer(writer)?; } PublicParams::ECDH(EcdhPublicParams::Known { ref curve, ref p, ref hash, ref alg_sym, }) => { let oid = curve.oid(); writer.write_u8(oid.len().try_into()?)?; writer.write_all(&oid)?; p.to_writer(writer)?; writer.write_u8(0x03)?; // len of the following fields writer.write_u8(0x01)?; // fixed tag writer.write_u8((*hash).into())?; writer.write_u8((*alg_sym).into())?; } PublicParams::ECDH(EcdhPublicParams::Unsupported { ref curve, ref opaque, }) => { let oid = curve.oid(); writer.write_u8(oid.len().try_into()?)?; writer.write_all(&oid)?; writer.write_all(opaque)?; } PublicParams::Elgamal { ref p, ref g, ref y, } => { p.to_writer(writer)?; g.to_writer(writer)?; y.to_writer(writer)?; } PublicParams::EdDSALegacy { ref curve, ref q } => { let oid = curve.oid(); writer.write_u8(oid.len().try_into()?)?; writer.write_all(&oid)?; q.to_writer(writer)?; } PublicParams::Ed25519 { ref public } => { writer.write_all(&public[..])?; } PublicParams::X25519 { ref public } => { writer.write_all(&public[..])?; } #[cfg(feature = "unstable-curve448")] PublicParams::X448 { ref public } => { writer.write_all(&public[..])?; } PublicParams::Unknown { ref data } => { writer.write_all(data)?; } } Ok(()) } } pgp-0.15.0/src/types/params/secret.rs000064400000000000000000000204111046102023000155440ustar 00000000000000use std::io; use nom::bytes::streaming::take; use nom::combinator::{map, map_res, rest_len}; use nom::number::streaming::be_u8; use zeroize::Zeroize; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{IResult, Result}; use crate::types::*; /// A list of params that are used to represent the values of possibly encrypted key, /// from imports and exports. #[derive(Debug, Clone, PartialEq, Eq)] pub enum SecretParams { Plain(PlainSecretParams), Encrypted(EncryptedSecretParams), } impl Zeroize for SecretParams { fn zeroize(&mut self) { match self { SecretParams::Plain(p) => p.zeroize(), SecretParams::Encrypted(_) => { /* encrypted params do not need zeroing */ } } } } impl SecretParams { pub fn is_encrypted(&self) -> bool { match self { SecretParams::Plain(_) => false, SecretParams::Encrypted(_) => true, } } pub fn from_slice( data: &[u8], key_ver: KeyVersion, alg: PublicKeyAlgorithm, params: &PublicParams, ) -> Result { let (_, params) = parse_secret_fields(key_ver, alg, params)(data)?; // Version 6 secret keys may only use "S2K Usage" 0, 253 or 254 // // See: https://www.rfc-editor.org/rfc/rfc9580.html#section-3.7.2.1-8 if key_ver == KeyVersion::V6 && ![0, 253, 254].contains(¶ms.string_to_key_id()) { bail!( "Illegal S2K Usage setting {} for a V6 key", params.string_to_key_id() ) } Ok(params) } pub fn string_to_key_id(&self) -> u8 { match self { SecretParams::Plain(k) => k.string_to_key_id(), SecretParams::Encrypted(k) => k.string_to_key_id(), } } pub fn checksum(&self) -> Vec { match self { SecretParams::Plain(k) => k.checksum_simple(), SecretParams::Encrypted(k) => k.checksum(), } } pub fn to_writer(&self, writer: &mut W, version: KeyVersion) -> Result<()> { match self { SecretParams::Plain(k) => k.to_writer(writer, version), SecretParams::Encrypted(k) => k.to_writer(writer, version), } } } /// Parse possibly encrypted private fields of a key. fn parse_secret_fields( key_ver: KeyVersion, alg: PublicKeyAlgorithm, public_params: &PublicParams, ) -> impl Fn(&[u8]) -> IResult<&[u8], SecretParams> + '_ { move |i: &[u8]| { // We've already consumed the public fields, and have arrived at the private key-specific // part of this secret key packet // (see https://www.rfc-editor.org/rfc/rfc9580.html#name-secret-key-packet-formats) let (i, s2k_usage) = map_res(be_u8, S2kUsage::try_from)(i)?; let (i, s2k_len) = if key_ver == KeyVersion::V6 && s2k_usage != S2kUsage::Unprotected { // Only for a version 6 packet where the secret key material is encrypted (that is, // where the previous octet is not zero), a 1-octet scalar octet count of the // cumulative length of all the following conditionally included S2K parameter fields. let (i, len) = be_u8(i)?; if len == 0 { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } (i, Some(len)) } else { (i, None) }; // expected length of the remaining data after consuming the conditionally included // s2k parameter fields let after_s2k = match s2k_len { Some(len) => { let len = len as usize; if i.len() < len { return Err(nom::Err::Error(crate::errors::Error::InvalidInput)); } Some(i.len() - len) } None => None, }; let (i, enc_params) = match s2k_usage { // 0 is no encryption S2kUsage::Unprotected => (i, S2kParams::Unprotected), // symmetric key algorithm S2kUsage::LegacyCfb(sym_alg) => { let (i, iv) = take(sym_alg.block_size())(i)?; ( i, S2kParams::LegacyCfb { sym_alg, iv: iv.to_vec(), }, ) } S2kUsage::Aead => { let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, aead_mode) = map_res(be_u8, AeadAlgorithm::try_from)(i)?; let (i, len) = if key_ver == KeyVersion::V6 { // Only for a version 6 packet, and if the S2K usage octet was 253 or 254, // a 1-octet count of the size of the one field following this octet. map(be_u8, Some)(i)? } else { (i, None) }; let (i, s2k) = s2k_parser(i)?; // if we got a length field (in v6), check that it contained a consistent value if let Some(len) = len { if s2k.len()? != len { return Err(nom::Err::Error(crate::errors::Error::Message(format!( "String2Key length {} doesn't match for s2k type {:?}", len, s2k )))); } } let (i, nonce) = take(aead_mode.nonce_size())(i)?; ( i, S2kParams::Aead { sym_alg, aead_mode, s2k, nonce: nonce.to_vec(), }, ) } // symmetric key + string-to-key S2kUsage::Cfb => { let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, len) = if key_ver == KeyVersion::V6 { // Only for a version 6 packet, and if the S2K usage octet was 253 or 254, // a 1-octet count of the size of the one field following this octet. map(be_u8, Some)(i)? } else { (i, None) }; let (i, s2k) = s2k_parser(i)?; // if we got a length field (in v6), check that it contained a consistent value if let Some(len) = len { if s2k.len()? != len { return Err(nom::Err::Error(crate::errors::Error::Message(format!( "String2Key length {} doesn't match for s2k type {:?}", len, s2k )))); } } let (i, iv) = take(sym_alg.block_size())(i)?; ( i, S2kParams::Cfb { sym_alg, s2k, iv: iv.to_vec(), }, ) } S2kUsage::MalleableCfb => { let (i, sym_alg) = map_res(be_u8, SymmetricKeyAlgorithm::try_from)(i)?; let (i, s2k) = s2k_parser(i)?; let (i, iv) = take(sym_alg.block_size())(i)?; ( i, S2kParams::Cfb { sym_alg, s2k, iv: iv.to_vec(), }, ) } }; if let Some(after_s2k) = after_s2k { if i.len() != after_s2k { return Err(nom::Err::Error(crate::errors::Error::Message( "Unexpected length of S2K parameter fields".to_string(), ))); } } let (i, len) = rest_len(i)?; let (i, data) = take(len)(i)?; let res = match s2k_usage { S2kUsage::Unprotected => { let repr = PlainSecretParams::from_slice(data, alg, public_params)?; SecretParams::Plain(repr) } _ => SecretParams::Encrypted(EncryptedSecretParams::new(data.to_vec(), enc_params)), }; Ok((i, res)) } } pgp-0.15.0/src/types/public_key.rs000064400000000000000000000056761046102023000151420ustar 00000000000000use std::io; use rand::{CryptoRng, Rng}; use crate::crypto::hash::HashAlgorithm; use crate::crypto::public_key::PublicKeyAlgorithm; use crate::errors::Result; use crate::types::PkeskBytes; use crate::types::{EskType, Fingerprint, KeyId, KeyVersion, PublicParams, SignatureBytes}; pub trait PublicKeyTrait: std::fmt::Debug { fn version(&self) -> KeyVersion; fn fingerprint(&self) -> Fingerprint; /// Returns the Key ID of the associated primary key. fn key_id(&self) -> KeyId; fn algorithm(&self) -> PublicKeyAlgorithm; fn created_at(&self) -> &chrono::DateTime; fn expiration(&self) -> Option; /// Verify a signed message. /// Data will be hashed using `hash`, before verifying. fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()>; /// Encrypt the given `plain` for this key. fn encrypt(&self, rng: R, plain: &[u8], typ: EskType) -> Result; // TODO: figure out a better place for this /// This is the data used for hashing in a signature. Only uses the public portion of the key. fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()>; fn public_params(&self) -> &PublicParams; fn is_signing_key(&self) -> bool { use crate::crypto::public_key::PublicKeyAlgorithm::*; matches!( self.algorithm(), RSA | RSASign | ElgamalSign | DSA | ECDSA | EdDSALegacy | Ed25519 | Ed448 ) } fn is_encryption_key(&self) -> bool { use crate::crypto::public_key::PublicKeyAlgorithm::*; matches!( self.algorithm(), RSA | RSAEncrypt | ECDH | DiffieHellman | Elgamal | X25519 | X448 ) } } impl PublicKeyTrait for &T { fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> Result<()> { (*self).verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> Result { (*self).encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl io::Write) -> Result<()> { (*self).serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { (*self).public_params() } fn version(&self) -> KeyVersion { (*self).version() } fn fingerprint(&self) -> Fingerprint { (*self).fingerprint() } /// Returns the Key ID of the associated primary key. fn key_id(&self) -> KeyId { (*self).key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { (*self).algorithm() } fn expiration(&self) -> Option { (*self).expiration() } fn created_at(&self) -> &chrono::DateTime { (*self).created_at() } } pgp-0.15.0/src/types/revocation_key.rs000064400000000000000000000014471046102023000160250ustar 00000000000000use num_enum::TryFromPrimitive; use smallvec::SmallVec; use crate::crypto::public_key::PublicKeyAlgorithm; #[derive(derive_more::Debug, PartialEq, Eq, Clone)] pub struct RevocationKey { pub class: RevocationKeyClass, pub algorithm: PublicKeyAlgorithm, #[debug("{}", hex::encode(fingerprint))] pub fingerprint: SmallVec<[u8; 20]>, } #[derive(Debug, PartialEq, Eq, Copy, Clone, TryFromPrimitive)] #[repr(u8)] pub enum RevocationKeyClass { Default = 0x80, Sensitive = 0x80 | 0x40, } impl RevocationKey { pub fn new( class: RevocationKeyClass, algorithm: PublicKeyAlgorithm, fingerprint: &[u8], ) -> Self { RevocationKey { class, algorithm, fingerprint: SmallVec::from_slice(fingerprint), } } } pgp-0.15.0/src/types/s2k.rs000064400000000000000000000571511046102023000135060ustar 00000000000000use std::io; use byteorder::WriteBytesExt; use nom::bytes::streaming::take; use nom::combinator::{map, rest}; use nom::number::streaming::be_u8; use rand::{CryptoRng, Rng}; use crate::crypto::aead::AeadAlgorithm; use crate::crypto::hash::HashAlgorithm; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::errors::{Error, IResult, Result}; use crate::ser::Serialize; use crate::types::KeyVersion; const EXPBIAS: u32 = 6; const DEFAULT_ITER_SALTED_COUNT: u8 = 224; /// Restriction for Argon2 memory usage (in KiB) to prevent OOM attacks const ARGON2_MEMORY_LIMIT_KIB: u32 = 2 * 1024 * 1024; // 2 ~mio KiB (== 2 GiB) /// The available s2k usages. /// /// Ref 3.7.2.1. Secret-Key Encryption #[derive(Debug, PartialEq, Eq, Clone, Copy)] pub enum S2kUsage { /// 0 Unprotected, /// 1..253 LegacyCfb(SymmetricKeyAlgorithm), /// 253 Aead, /// 254 Cfb, /// 255 MalleableCfb, } #[derive(derive_more::Debug, PartialEq, Eq, Clone)] pub enum S2kParams { Unprotected, LegacyCfb { sym_alg: SymmetricKeyAlgorithm, #[debug("{}", hex::encode(iv))] iv: Vec, }, Aead { sym_alg: SymmetricKeyAlgorithm, aead_mode: AeadAlgorithm, s2k: StringToKey, #[debug("{}", hex::encode(nonce))] nonce: Vec, }, Cfb { sym_alg: SymmetricKeyAlgorithm, s2k: StringToKey, #[debug("{}", hex::encode(iv))] iv: Vec, }, MalleableCfb { sym_alg: SymmetricKeyAlgorithm, s2k: StringToKey, #[debug("{}", hex::encode(iv))] iv: Vec, }, } impl From<&S2kParams> for u8 { fn from(value: &S2kParams) -> Self { match value { S2kParams::Unprotected => 0, S2kParams::LegacyCfb { sym_alg, .. } => (*sym_alg).into(), S2kParams::Aead { .. } => 253, S2kParams::Cfb { .. } => 254, S2kParams::MalleableCfb { .. } => 255, } } } impl S2kParams { /// Create a new default set of parameters /// and initialises relevant randomized values. /// /// For v6 keys: /// - Ocb with AES256 /// - Argon2 derivation (with parameter choice (2) from ) /// /// For v4 keys: /// - AES256 /// - CFB /// - Iterated and Salted with 224 rounds pub fn new_default(mut rng: R, key_version: KeyVersion) -> Self { match key_version { KeyVersion::V6 => { let sym_alg = SymmetricKeyAlgorithm::AES256; let aead_mode = AeadAlgorithm::Ocb; let mut nonce = vec![0u8; aead_mode.nonce_size()]; rng.fill(&mut nonce[..]); let mut salt = [0u8; 16]; rng.fill(&mut salt[..]); S2kParams::Aead { sym_alg, aead_mode, // parameter choice (2) from https://www.rfc-editor.org/rfc/rfc9106#name-parameter-choice s2k: StringToKey::Argon2 { salt, t: 3, p: 4, m_enc: 16, // 64 MiB }, nonce, } } _ => { let sym_alg = SymmetricKeyAlgorithm::AES256; let mut iv = vec![0u8; sym_alg.block_size()]; rng.fill(&mut iv[..]); Self::Cfb { sym_alg, s2k: StringToKey::new_default(rng), iv, } } } } } impl From for S2kUsage { fn from(value: u8) -> Self { match value { 0 => Self::Unprotected, v @ 1..=252 => Self::LegacyCfb(SymmetricKeyAlgorithm::from(v)), 253 => Self::Aead, 254 => Self::Cfb, 255 => Self::MalleableCfb, } } } #[derive(derive_more::Debug, PartialEq, Eq, Clone)] pub enum StringToKey { // Type ID 0 Simple { hash_alg: HashAlgorithm, }, // Type ID 1 Salted { hash_alg: HashAlgorithm, #[debug("{}", hex::encode(salt))] salt: [u8; 8], }, // Type ID 2 Reserved { #[debug("{}", hex::encode(unknown))] unknown: Vec, }, // Type ID 3 IteratedAndSalted { hash_alg: HashAlgorithm, #[debug("{}", hex::encode(salt))] salt: [u8; 8], count: u8, }, // Type ID 4 Argon2 { #[debug("{}", hex::encode(salt))] salt: [u8; 16], t: u8, // one-octet number of passes t p: u8, // one-octet degree of parallelism p m_enc: u8, // one-octet encoded_m, specifying the exponent of the memory size }, // Private/Experimental S2K: 100-110 Private { typ: u8, #[debug("{}", hex::encode(unknown))] unknown: Vec, }, Other { typ: u8, #[debug("{}", hex::encode(unknown))] unknown: Vec, }, } impl StringToKey { pub fn new_default(rng: R) -> Self { StringToKey::new_iterated(rng, HashAlgorithm::default(), DEFAULT_ITER_SALTED_COUNT) } pub fn new_iterated( mut rng: R, hash_alg: HashAlgorithm, count: u8, ) -> Self { let mut salt = [0u8; 8]; rng.fill(&mut salt[..]); StringToKey::IteratedAndSalted { hash_alg, salt, count, } } pub fn new_argon2(mut rng: R, t: u8, p: u8, m_enc: u8) -> Self { let mut salt = [0u8; 16]; rng.fill(&mut salt[..]); StringToKey::Argon2 { salt, t, p, m_enc } } pub fn id(&self) -> u8 { match self { Self::Simple { .. } => 0, Self::Salted { .. } => 1, Self::Reserved { .. } => 2, Self::IteratedAndSalted { .. } => 3, Self::Argon2 { .. } => 4, Self::Private { typ, .. } => *typ, Self::Other { typ, .. } => *typ, } } /// true, if this StringToKey uses a salt pub fn uses_salt(&self) -> bool { matches![ self, StringToKey::Salted { .. } | StringToKey::IteratedAndSalted { .. } | StringToKey::Argon2 { .. } ] } /// RFC 9580 limits the use of S2K KDF results that are based on MD5, SHA-1, or RIPEMD-160. /// This function returns true for StringToKey configurations that use one of these hash algorithms. pub(crate) fn known_weak_hash_algo(&self) -> bool { match self { Self::Simple { hash_alg } | Self::Salted { hash_alg, .. } | Self::IteratedAndSalted { hash_alg, .. } => { hash_alg == &HashAlgorithm::MD5 || hash_alg == &HashAlgorithm::SHA1 || hash_alg == &HashAlgorithm::RIPEMD160 } _ => false, } } /// String-To-Key methods are used to convert a given password string into a key. /// Ref: /// /// Note that RFC 9580 specifies that: /// /// - Implementations MUST NOT generate packets using MD5, SHA-1, or RIPEMD-160 as a hash /// function in an S2K KDF. /// - Implementations MUST NOT decrypt a secret using MD5, SHA-1, or RIPEMD-160 as a hash /// function in an S2K KDF in a version 6 (or later) packet. pub fn derive_key(&self, passphrase: &str, key_size: usize) -> Result> { let key = match self { Self::Simple { hash_alg, .. } | Self::Salted { hash_alg, .. } | Self::IteratedAndSalted { hash_alg, .. } => { let Some(digest_size) = hash_alg.digest_size() else { bail!("invalid hash algorithm: {}", hash_alg); }; let rounds = (key_size as f32 / digest_size as f32).ceil() as usize; let mut key = vec![0u8; key_size]; let zeros = vec![0u8; rounds]; for round in 0..rounds { let mut hasher = hash_alg.new_hasher()?; // add 0s prefix hasher.update(&zeros[..round]); match self { StringToKey::Simple { .. } => { hasher.update(passphrase.as_bytes()); } StringToKey::Salted { salt, .. } => { hasher.update(salt); hasher.update(passphrase.as_bytes()); } StringToKey::IteratedAndSalted { salt, count, .. } => { /// Converts a coded iteration count into a decoded count. /// Ref: https://www.rfc-editor.org/rfc/rfc9580.html#section-3.7.1.3-3 fn decode_count(coded_count: u8) -> usize { ((16u32 + u32::from(coded_count & 15)) << (u32::from(coded_count >> 4) + EXPBIAS)) as usize } let pw = passphrase.as_bytes(); let data_size = salt.len() + pw.len(); // how many bytes are supposed to be hashed let mut count = decode_count(*count); if count < data_size { // if the count is less, hash one full set count = data_size; } while count > data_size { hasher.update(salt); hasher.update(pw); count -= data_size; } if count < salt.len() { hasher.update(&salt[..count]); } else { hasher.update(salt); count -= salt.len(); hasher.update(&pw[..count]); } } _ => unimplemented_err!("S2K {:?} is not available", self), } let start = round * digest_size; let end = if round == rounds - 1 { key_size } else { (round + 1) * digest_size }; hasher.finish_reset_into(&mut key[start..end]); } key } Self::Argon2 { salt, t, p, m_enc } => { // Argon2 is invoked with the passphrase as P, the salt as S, the values of t, p // and m as described above, the required key size as the tag length T, 0x13 as the // version v, and Argon2id as the type // Limit the amount of CPU resources an Argon2 derivation may consume, // to limit potential DoS attacks via e.g. one (or multiple) adversarial SKESKv6, // especially if an application tries to decrypt without user interaction. // // Benchmark results (on a desktop machine in 2024), for reference: // t = 16, p = 16, m = 8 GiB finished in 74.93s // t = 16, p = 16, m = 2 GiB finished in 18.43s // t = 16, p = 17, m = 2 GiB finished in 18.37s // t = 32, p = 32, m = 2 GiB finished in 35.54s // t = 128, p = 17, m = 2 GiB finished in 144.57 ensure!( *t <= 32 && *p <= 32, "unsupported settings t={}, p={} in argon s2k", t, p, ); // The encoded memory size MUST be a value from 3+ceil(log_2(p)) to 31, such that // the decoded memory size m is a value from 8*p to 2**31 let min_m = (*p as f32).log2().ceil() as u8; ensure!( *m_enc >= min_m && *m_enc <= 31, "unsupported value {} for m in argon s2k", m_enc ); // Decoded memory size // (Note that memory-hardness size is indicated in kibibytes (KiB), not octets.) let m = 2u32.pow(*m_enc as u32); ensure!( m <= ARGON2_MEMORY_LIMIT_KIB, "unsupported memory usage setting ({} KiB) for m in argon s2k", m ); use argon2::{Algorithm, Argon2, Params, Version}; let a2 = Argon2::new( Algorithm::Argon2id, Version::V0x13, Params::new(m, *t as u32, *p as u32, Some(key_size)) .map_err(|e| Error::Message(format!("{:?}", e)))?, ); let mut output_key_material = vec![0; key_size]; a2.hash_password_into(passphrase.as_bytes(), salt, &mut output_key_material) .map_err(|e| Error::Message(format!("{:?}", e)))?; output_key_material } _ => unimplemented_err!("S2K {:?} is not available", self), }; Ok(key) } #[allow(clippy::len_without_is_empty)] pub(crate) fn len(&self) -> Result { let len = match self { Self::Simple { .. } => 2, Self::Salted { .. } => 10, Self::IteratedAndSalted { .. } => 11, Self::Argon2 { .. } => 20, _ => bail!("not implemented for StringToKey: {:?}", self), }; Ok(len) } } pub fn s2k_parser(i: &[u8]) -> IResult<&[u8], StringToKey> { let (i, typ) = be_u8(i)?; match typ { 0 => { let (i, hash_alg) = map(be_u8, HashAlgorithm::from)(i)?; Ok((i, StringToKey::Simple { hash_alg })) } 1 => { let (i, hash_alg) = map(be_u8, HashAlgorithm::from)(i)?; let (i, salt) = map(take(8usize), |v: &[u8]| { v.try_into().expect("should never fail") })(i)?; Ok((i, StringToKey::Salted { hash_alg, salt })) } 2 => { let (i, unknown) = map(rest, Into::into)(i)?; Ok((i, StringToKey::Reserved { unknown })) } 3 => { let (i, hash_alg) = map(be_u8, HashAlgorithm::from)(i)?; let (i, salt) = map(take(8usize), |v: &[u8]| { v.try_into().expect("should never fail") })(i)?; let (i, count) = be_u8(i)?; Ok(( i, StringToKey::IteratedAndSalted { hash_alg, salt, count, }, )) } 4 => { let (i, salt) = map(take(16usize), |v: &[u8]| { v.try_into().expect("should never fail") })(i)?; let (i, t) = be_u8(i)?; let (i, p) = be_u8(i)?; let (i, m_enc) = be_u8(i)?; Ok((i, StringToKey::Argon2 { salt, t, p, m_enc })) } 100..=110 => { let (i, unknown) = map(rest, Into::into)(i)?; Ok((i, StringToKey::Private { typ, unknown })) } _ => { let (i, unknown) = map(rest, Into::into)(i)?; Ok((i, StringToKey::Other { typ, unknown })) } } } impl Serialize for StringToKey { fn to_writer(&self, writer: &mut W) -> Result<()> { match self { Self::Simple { hash_alg } => { writer.write_u8(self.id())?; writer.write_u8((*hash_alg).into())?; } Self::Salted { hash_alg, salt } => { writer.write_u8(self.id())?; writer.write_u8((*hash_alg).into())?; writer.write_all(salt)?; } Self::IteratedAndSalted { hash_alg, salt, count, } => { writer.write_u8(self.id())?; writer.write_u8((*hash_alg).into())?; writer.write_all(salt)?; writer.write_u8(*count)?; } Self::Argon2 { salt, t, p, m_enc } => { writer.write_u8(self.id())?; writer.write_all(salt)?; writer.write_all(&[*t, *p, *m_enc])?; } Self::Reserved { unknown, .. } | Self::Private { unknown, .. } | Self::Other { unknown, .. } => { writer.write_u8(self.id())?; writer.write_all(unknown)?; } } Ok(()) } } #[cfg(test)] mod tests { use rand::distributions::{Alphanumeric, DistString}; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; use super::*; use crate::ArmorOptions; #[test] #[ignore] fn iterated_and_salted() { let sizes = [10, 100, 1000]; let mut rng = ChaCha8Rng::seed_from_u64(0); let algs = [ HashAlgorithm::SHA1, HashAlgorithm::SHA2_256, HashAlgorithm::SHA3_256, ]; let counts = [ 1u8, 224u8, // default in rpgp u8::MAX, // maximum possible ]; let sym_algs = [SymmetricKeyAlgorithm::AES128, SymmetricKeyAlgorithm::AES256]; for size in sizes { for sym_alg in sym_algs { for alg in algs { for count in counts { println!("{size}/{alg:?}/{count}/{sym_alg:?}"); let s2k = StringToKey::new_iterated(&mut rng, alg, count); let passphrase = Alphanumeric.sample_string(&mut rng, size); let res = s2k .derive_key(&passphrase, sym_alg.key_size()) .expect("failed to derive key"); assert_eq!(res.len(), sym_alg.key_size()); } } } } } #[test] #[ignore] // slow in debug mode fn argon2() { // test vectors from RFC 9580 // 16 byte key size let s2k = StringToKey::Argon2 { salt: [ 0x9c, 0x52, 0xf8, 0x3c, 0x27, 0xf9, 0x5e, 0x50, 0xd5, 0x35, 0x44, 0x0e, 0xcd, 0xff, 0x31, 0x36, ], t: 1, p: 4, m_enc: 21, }; let key = s2k.derive_key("password", 16).expect("argon derive"); assert_eq!( key, [ 0x84, 0xa3, 0x64, 0x3c, 0x39, 0xd5, 0xf5, 0x50, 0x52, 0x6d, 0x19, 0x39, 0xe8, 0x57, 0xfa, 0x66 ] ); // 24 byte key size let s2k = StringToKey::Argon2 { salt: [ 0xe1, 0x4c, 0xac, 0x47, 0x15, 0x34, 0x59, 0x18, 0xa9, 0x62, 0xdc, 0xa3, 0x47, 0xe1, 0x43, 0xf8, ], t: 1, p: 4, m_enc: 21, }; let key = s2k.derive_key("password", 24).expect("argon derive"); assert_eq!( key, [ 0xf5, 0x42, 0x47, 0x6d, 0x2b, 0x9f, 0xf4, 0x35, 0x15, 0x85, 0x18, 0x11, 0x21, 0x2d, 0xe9, 0x49, 0x7f, 0x1b, 0xfe, 0x1a, 0x3d, 0x08, 0xd7, 0x07 ] ); // 32 byte key size let s2k = StringToKey::Argon2 { salt: [ 0xb8, 0x78, 0x95, 0x20, 0x20, 0x6f, 0xf7, 0x99, 0xc6, 0x88, 0x2c, 0x42, 0x45, 0xa6, 0x62, 0x7c, ], t: 1, p: 4, m_enc: 21, }; let key = s2k.derive_key("password", 32).expect("argon derive"); assert_eq!( key, [ 0x4e, 0xd7, 0xeb, 0x27, 0x43, 0x4f, 0x6d, 0xf6, 0x23, 0xce, 0xe3, 0xac, 0x08, 0xb7, 0x63, 0xc4, 0xaf, 0x79, 0xdf, 0xde, 0x5f, 0xdc, 0x92, 0xdd, 0x1d, 0x88, 0x1c, 0x6c, 0x99, 0x93, 0x8b, 0x4f ] ); } #[test] #[ignore] // slow in debug mode fn argon2_skesk_msg() { // Tests decrypting the messages from // https://www.rfc-editor.org/rfc/rfc9580.html#name-sample-messages-encrypted-u // // "These messages are the literal data "Hello, world!" encrypted using v1 SEIPD, with Argon2 // and the passphrase "password", using different session key sizes." const MSGS: &[&str] = &[ "./tests/unit-tests/argon2/aes128.msg", "./tests/unit-tests/argon2/aes192.msg", "./tests/unit-tests/argon2/aes256.msg", ]; use crate::{composed::Deserializable, Message}; for filename in MSGS { println!("reading {}", filename); let (msg, header) = Message::from_armor_single(std::fs::File::open(filename).expect("failed to open")) .expect("failed to load msg"); dbg!(&header); let decrypted = msg .decrypt_with_password(|| "password".to_string()) .expect("decrypt argon2 skesk"); let Message::Literal(data) = decrypted else { panic!("expected literal data") }; assert_eq!(data.data(), b"Hello, world!"); // roundtrip let armored = msg .to_armored_string(ArmorOptions { headers: Some(&header), include_checksum: false, // No checksum on v6 }) .expect("encode"); let orig_armored = std::fs::read_to_string(filename).expect("file read"); let orig_armored = orig_armored.replace("\r\n", "\n").replace('\r', "\n"); let armored = armored .to_string() .replace("\r\n", "\n") .replace('\r', "\n"); assert_eq!(armored, orig_armored); } } // "These messages are the literal data "Hello, world!" encrypted using AES-128 with various AEADs #[test] fn test_aead_skesk_msg_gcm() { aead_skesk_msg("./tests/unit-tests/aead/gcm.msg"); } #[test] fn test_aead_skesk_msg_eax() { aead_skesk_msg("./tests/unit-tests/aead/eax.msg"); } #[test] fn test_aead_skesk_msg_ocb() { aead_skesk_msg("./tests/unit-tests/aead/ocb.msg"); } /// Tests decrypting messages fn aead_skesk_msg(filename: &str) { let _ = pretty_env_logger::try_init(); use crate::{composed::Deserializable, Message}; println!("reading {}", filename); let raw_file = std::fs::File::open(filename).expect("file open"); let (msg, header) = Message::from_armor_single(raw_file).expect("parse"); let decrypted = msg .decrypt_with_password(|| "password".to_string()) .expect("decrypt"); let Message::Literal(data) = decrypted else { panic!("expected literal data") }; assert_eq!(data.data(), b"Hello, world!"); // roundtrip let armored = msg .to_armored_string(ArmorOptions { headers: Some(&header), include_checksum: false, // No checksum on v6 }) .expect("encode"); let orig_armored = std::fs::read_to_string(filename).expect("file read"); let orig_armored = orig_armored.replace("\r\n", "\n").replace('\r', "\n"); let armored = armored .to_string() .replace("\r\n", "\n") .replace('\r', "\n"); assert_eq!(armored, orig_armored); } } pgp-0.15.0/src/types/secret_key.rs000064400000000000000000000034601046102023000151360ustar 00000000000000use crate::crypto::hash::HashAlgorithm; use crate::errors::Result; use crate::types::{EcdsaPublicParams, PublicKeyTrait, PublicParams, SignatureBytes}; pub trait SecretKeyTrait: PublicKeyTrait { type PublicKey; /// The type representing the unlocked version of this. type Unlocked; /// Unlock the raw data in the secret parameters. fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result; fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String; fn public_key(&self) -> Self::PublicKey; /// The suggested hash algorithm to calculate the signature hash digest with, when using this /// key as a signer fn hash_alg(&self) -> HashAlgorithm { match self.public_params() { PublicParams::ECDSA(EcdsaPublicParams::P384 { .. }) => HashAlgorithm::SHA2_384, PublicParams::ECDSA(EcdsaPublicParams::P521 { .. }) => HashAlgorithm::SHA2_512, _ => HashAlgorithm::default(), } } } impl SecretKeyTrait for &T { type PublicKey = T::PublicKey; type Unlocked = T::Unlocked; fn unlock(&self, pw: F, work: G) -> Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> Result, { (*self).unlock(pw, work) } fn create_signature( &self, key_pw: F, hash: HashAlgorithm, data: &[u8], ) -> Result where F: FnOnce() -> String, { (*self).create_signature(key_pw, hash, data) } fn public_key(&self) -> Self::PublicKey { (*self).public_key() } } pgp-0.15.0/src/types/secret_key_repr.rs000064400000000000000000000136111046102023000161650ustar 00000000000000use log::debug; use zeroize::ZeroizeOnDrop; use crate::crypto::sym::SymmetricKeyAlgorithm; use crate::crypto::{checksum, dsa, ecdh, ecdsa, eddsa, rsa, x25519, Decryptor}; use crate::errors::Result; use crate::types::PkeskBytes; use crate::types::{EskType, PublicKeyTrait, PublicParams}; use crate::PlainSessionKey; /// The version of the secret key that is actually exposed to users to do crypto operations. #[allow(clippy::large_enum_variant)] // FIXME #[derive(Debug, ZeroizeOnDrop)] pub enum SecretKeyRepr { RSA(rsa::PrivateKey), DSA(dsa::SecretKey), ECDSA(ecdsa::SecretKey), ECDH(ecdh::SecretKey), EdDSA(eddsa::SecretKey), X25519(x25519::SecretKey), #[cfg(feature = "unstable-curve448")] X448(crate::crypto::x448::SecretKey), } impl SecretKeyRepr { pub fn decrypt

( &self, values: &PkeskBytes, typ: EskType, recipient: &P, ) -> Result where P: PublicKeyTrait, { let decrypted_key = match (self, values) { (SecretKeyRepr::RSA(ref priv_key), PkeskBytes::Rsa { mpi }) => priv_key.decrypt(mpi)?, (SecretKeyRepr::DSA(_), _) => bail!("DSA is only used for signing"), (SecretKeyRepr::ECDSA(_), _) => bail!("ECDSA is only used for signing"), ( SecretKeyRepr::ECDH(ref priv_key), PkeskBytes::Ecdh { public_point, encrypted_session_key, }, ) => priv_key.decrypt(ecdh::EncryptionFields { public_point, encrypted_session_key, fingerprint: recipient.fingerprint().as_bytes(), })?, ( SecretKeyRepr::X25519(ref priv_key), PkeskBytes::X25519 { ephemeral, session_key, sym_alg, }, ) => { // Recipient public key (32 bytes) let PublicParams::X25519 { public } = recipient.public_params() else { bail!( "Unexpected recipient public_params {:?} for X25519", recipient.public_params() ); }; let data = x25519::EncryptionFields { ephemeral_public_point: ephemeral.to_owned(), recipient_public: *public, encrypted_session_key: session_key, }; let key = priv_key.decrypt(data)?; return match (&typ, *sym_alg) { // We expect `sym_alg` to be set for v3 PKESK, and unset for v6 PKESK (EskType::V3_4, Some(sym_alg)) => Ok(PlainSessionKey::V3_4 { key, sym_alg }), (EskType::V6, None) => Ok(PlainSessionKey::V6 { key }), _ => bail!("unexpected: sym_alg {:?} for {:?}", sym_alg, typ), }; } #[cfg(feature = "unstable-curve448")] ( SecretKeyRepr::X448(ref priv_key), PkeskBytes::X448 { ephemeral, session_key, sym_alg, }, ) => { // Recipient public key (56 bytes) let PublicParams::X448 { public } = recipient.public_params() else { bail!( "Unexpected recipient public_params {:?} for X448", recipient.public_params() ); }; let data = crate::crypto::x448::EncryptionFields { ephemeral_public_point: ephemeral.to_owned(), recipient_public: *public, encrypted_session_key: session_key, }; let key = priv_key.decrypt(data)?; // We expect `algo` to be set for v3 PKESK, and unset for v6 PKESK return if let Some(sym_alg) = *sym_alg { Ok(PlainSessionKey::V3_4 { key, sym_alg }) } else { Ok(PlainSessionKey::V6 { key }) }; } (SecretKeyRepr::EdDSA(_), _) => bail!("EdDSA is only used for signing"), _ => unimplemented_err!( "Unsupported: SecretKeyRepr {:?}, PkeskBytes {:?}", self, values ), }; match typ { EskType::V3_4 => { let sym_alg = SymmetricKeyAlgorithm::from(decrypted_key[0]); ensure!( sym_alg != SymmetricKeyAlgorithm::Plaintext, "session key algorithm cannot be plaintext" ); debug!("sym_alg: {:?}", sym_alg); let key_size = sym_alg.key_size(); ensure_eq!( decrypted_key.len(), key_size + 3, "unexpected decrypted_key length ({}) for sym_alg {:?}", decrypted_key.len(), sym_alg ); let key = decrypted_key[1..=key_size].to_vec(); let checksum = &decrypted_key[key_size + 1..key_size + 3]; checksum::simple(checksum, &key)?; Ok(PlainSessionKey::V3_4 { key, sym_alg }) } EskType::V6 => { let len = decrypted_key.len(); // ensure minimal length so that we don't panic in the slice splitting, below ensure!( len >= 2, "unexpected decrypted_key length ({}) for V6 ESK", len, ); let key = decrypted_key[0..len - 2].to_vec(); let checksum = &decrypted_key[len - 2..]; checksum::simple(checksum, &key)?; Ok(PlainSessionKey::V6 { key }) } } } } pgp-0.15.0/src/types/user.rs000064400000000000000000000104221046102023000137530ustar 00000000000000use std::io; use log::{debug, warn}; use crate::errors::Result; use crate::packet::{write_packet, Signature, UserAttribute, UserId}; use crate::ser::Serialize; use crate::types::{PublicKeyTrait, Tag}; #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedUser { pub id: UserId, pub signatures: Vec, } impl SignedUser { pub fn new(id: UserId, signatures: Vec) -> Self { let signatures = signatures .into_iter() .filter(|sig| { if !sig.is_certification() { warn!( "ignoring unexpected signature {:?} after User ID packet", sig.typ() ); false } else { true } }) .collect(); SignedUser { id, signatures } } /// Verify all signatures (for self-signatures). If signatures is empty, this fails. pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<()> { debug!("verify signed user {:#?}", self); ensure!(!self.signatures.is_empty(), "no signatures found"); for signature in &self.signatures { signature.verify_certification(key, Tag::UserId, &self.id)?; } Ok(()) } /// Verify all signatures (for third-party signatures). If signatures is empty, this fails. pub fn verify_third_party( &self, signee: &impl PublicKeyTrait, signer: &impl PublicKeyTrait, ) -> Result<()> { debug!("verify signed user {:#?} with signer {:#?}", self, signer); ensure!(!self.signatures.is_empty(), "no signatures found"); for signature in &self.signatures { signature.verify_third_party_certification(signee, signer, Tag::UserId, &self.id)?; } Ok(()) } pub fn is_primary(&self) -> bool { self.signatures.iter().any(Signature::is_primary) } } impl Serialize for SignedUser { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet(writer, &self.id)?; for sig in &self.signatures { write_packet(writer, sig)?; } Ok(()) } } #[derive(Debug, PartialEq, Eq, Clone)] pub struct SignedUserAttribute { pub attr: UserAttribute, pub signatures: Vec, } impl SignedUserAttribute { pub fn new(attr: UserAttribute, signatures: Vec) -> Self { let signatures = signatures .into_iter() .filter(|sig| { if !sig.is_certification() { warn!( "ignoring unexpected signature {:?} after User Attribute packet", sig.typ() ); false } else { true } }) .collect(); SignedUserAttribute { attr, signatures } } /// Verify all signatures (for self-signatures). If signatures is empty, this fails. pub fn verify(&self, key: &impl PublicKeyTrait) -> Result<()> { debug!("verify signed attribute {:?}", self); ensure!(!self.signatures.is_empty(), "no signatures found"); for signature in &self.signatures { signature.verify_certification(key, Tag::UserAttribute, &self.attr)?; } Ok(()) } /// Verify all signatures (for third-party signatures). If signatures is empty, this fails. pub fn verify_third_party( &self, signee: &impl PublicKeyTrait, signer: &impl PublicKeyTrait, ) -> Result<()> { debug!( "verify signed attribute {:#?} with signer {:#?}", self, signer ); ensure!(!self.signatures.is_empty(), "no signatures found"); for signature in &self.signatures { signature.verify_third_party_certification( signee, signer, Tag::UserAttribute, &self.attr, )?; } Ok(()) } } impl Serialize for SignedUserAttribute { fn to_writer(&self, writer: &mut W) -> Result<()> { write_packet(writer, &self.attr)?; for sig in &self.signatures { write_packet(writer, sig)?; } Ok(()) } } pgp-0.15.0/src/util.rs000064400000000000000000000143101046102023000126060ustar 00000000000000//! # Utilities use std::ops::{Range, RangeFrom, RangeTo}; use std::{hash, io}; use byteorder::{BigEndian, WriteBytesExt}; use nom::bytes::streaming::take_while1; use nom::character::is_alphanumeric; use nom::character::streaming::line_ending; use nom::combinator::map; use nom::multi::many0; use nom::number::streaming::{be_u32, be_u8}; use nom::sequence::preceded; use nom::{error_position, Err, InputIter, InputLength, Slice}; use crate::errors::{self, IResult}; #[inline] pub fn u8_as_usize(a: u8) -> usize { a as usize } #[inline] pub fn u16_as_usize(a: u16) -> usize { a as usize } #[inline] pub fn u32_as_usize(a: u32) -> usize { a as usize } #[inline] pub fn is_base64_token(c: u8) -> bool { is_alphanumeric(c) || c == b'/' || c == b'+' || c == b'=' || c == b'\n' || c == b'\r' } pub fn prefixed(input: &[u8]) -> IResult<&[u8], &[u8]> { preceded(many0(line_ending), take_while1(is_base64_token))(input) } /// Recognizes one or more body tokens pub fn base64_token(input: &[u8]) -> nom::IResult<&[u8], &[u8]> { let input_length = input.input_len(); if input_length == 0 { return Err(Err::Incomplete(nom::Needed::Unknown)); } for (idx, item) in input.iter_indices() { if !is_base64_token(item) { if idx == 0 { return Err(Err::Error(error_position!( input, nom::error::ErrorKind::AlphaNumeric ))); } else { return Ok((input.slice(idx..), input.slice(0..idx))); } } } Ok((input.slice(input_length..), input)) } /// Returns the bit length of a given slice. #[inline] pub fn bit_size(val: &[u8]) -> usize { if val.is_empty() { 0 } else { (val.len() * 8) - val[0].leading_zeros() as usize } } #[inline] pub fn strip_leading_zeros(bytes: &[u8]) -> &[u8] { bytes .iter() .position(|b| b != &0) .map_or(&[], |offset| &bytes[offset..]) } #[inline] pub fn strip_leading_zeros_vec(bytes: &mut Vec) { if let Some(offset) = bytes.iter_mut().position(|b| b != &0) { bytes.drain(..offset); } } /// Convert a slice into an array. pub fn clone_into_array(slice: &[T]) -> A where A: Sized + Default + AsMut<[T]>, T: Clone, { let mut a = Default::default(); >::as_mut(&mut a).clone_from_slice(slice); a } // Parse a packet length. pub(crate) fn packet_length(i: &[u8]) -> IResult<&[u8], usize> { let (i, olen) = be_u8(i)?; match olen { // One-Octet Lengths 0..=191 => Ok((i, olen as usize)), // Two-Octet Lengths 192..=254 => map(be_u8, |a| ((olen as usize - 192) << 8) + 192 + a as usize)(i), // Five-Octet Lengths 255 => map(be_u32, u32_as_usize)(i), } } /// Write packet length, including the prefix for lengths larger or equal than 8384. pub fn write_packet_length(len: usize, writer: &mut impl io::Write) -> errors::Result<()> { if len < 192 { writer.write_u8(len.try_into()?)?; } else if len < 8384 { writer.write_u8((((len - 192) / 256) + 192) as u8)?; writer.write_u8(((len - 192) % 256) as u8)?; } else { writer.write_u8(0xFF)?; writer.write_u32::(len as u32)?; } Ok(()) } /// Return the length of the remaining input. // Adapted from https://github.com/Geal/nom/pull/684 #[inline] pub fn rest_len(input: T) -> IResult where T: Slice> + Slice> + Slice>, T: InputLength, { let len = input.input_len(); Ok((input, len)) } #[macro_export] macro_rules! impl_try_from_into { ($enum_name:ident, $( $name:ident => $variant_type:ty ),*) => { $( impl std::convert::TryFrom<$enum_name> for $variant_type { // TODO: Proper error type Error = $crate::errors::Error; fn try_from(other: $enum_name) -> ::std::result::Result<$variant_type, Self::Error> { if let $enum_name::$name(value) = other { Ok(value) } else { Err(format_err!("invalid packet type: {:?}", other)) } } } impl From<$variant_type> for $enum_name { fn from(other: $variant_type) -> $enum_name { $enum_name::$name(other) } } )* } } pub struct TeeWriter<'a, A, B> { a: &'a mut A, b: &'a mut B, } impl<'a, A, B> TeeWriter<'a, A, B> { pub fn new(a: &'a mut A, b: &'a mut B) -> Self { TeeWriter { a, b } } } impl io::Write for TeeWriter<'_, A, B> { fn write(&mut self, buf: &[u8]) -> io::Result { self.a.write(buf); write_all(&mut self.b, buf)?; Ok(buf.len()) } fn flush(&mut self) -> io::Result<()> { self.b.flush()?; Ok(()) } } /// The same as the std lib, but doesn't choke on write 0. This is a hack, to be compatible with /// rust-base64. pub fn write_all(writer: &mut impl io::Write, mut buf: &[u8]) -> io::Result<()> { while !buf.is_empty() { match writer.write(buf) { Ok(0) => {} Ok(n) => buf = &buf[n..], Err(ref e) if e.kind() == io::ErrorKind::Interrupted => {} Err(e) => return Err(e), } } Ok(()) } #[cfg(test)] mod tests { #![allow(clippy::unwrap_used)] use super::*; #[test] fn test_write_packet_len() { let mut res = Vec::new(); write_packet_length(1173, &mut res).unwrap(); assert_eq!(hex::encode(res), "c3d5"); } #[test] fn test_write_packet_length() { let mut res = Vec::new(); write_packet_length(12870, &mut res).unwrap(); assert_eq!(hex::encode(res), "ff00003246"); } #[test] fn test_strip_leading_zeros_with_all_zeros() { let buf = [0, 0, 0]; let stripped = strip_leading_zeros(&buf); assert_eq!(stripped, &[]); } #[test] fn test_strip_leading_zeros_vec() { let mut vec = vec![0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9]; strip_leading_zeros_vec(&mut vec); assert_eq!(vec, vec![1, 2, 3, 4, 5, 6, 7, 8, 9]); } } pgp-0.15.0/tests/autocrypt/alice@autocrypt.example.pub.asc000064400000000000000000000011741046102023000217330ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/U b7O1u120F2FsaWNlQGF1dG9jcnlwdC5leGFtcGxliJYEExYIAD4WIQTrhbtfozp1 4V6UTmPyMVUMT0fjjgUCXEcE6QIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIe AQIXgAAKCRDyMVUMT0fjjkqLAP9frlijwBJvA+HFnqCZcYIVxlyXzS5Gi5gMTpp3 7K73jgD/VbKYhkwk9iu689OYH4K7q7LbmdeaJ+RX88Y/ad9hZwy4OARcRwTpEgor BgEEAZdVAQUBAQdAQv8GIa2rSTzgqbXCpDDYMiKRVitCsy203x3sE9+eviIDAQgH iHgEGBYIACAWIQTrhbtfozp14V6UTmPyMVUMT0fjjgUCXEcE6QIbDAAKCRDyMVUM T0fjjlnQAQDFHUs6TIcxrNTtEZFjUFm1M0PJ1Dng/cDW4xN80fsn0QEA22Kr7VkC jeAEC08VSTeV+QFsmz55/lntWkwYWhmvOgE= =mZAd -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/autocrypt/alice@autocrypt.example.sec.asc000064400000000000000000000013441046102023000217160ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lFgEXEcE6RYJKwYBBAHaRw8BAQdArjWwk3FAqyiFbFBKT4TzXcVBqPTB3gmzlC/U b7O1u10AAP9XBeW6lzGOLx7zHH9AsUDUTb2pggYGMzd0P3ulJ2AfvQ4RtBdhbGlj ZUBhdXRvY3J5cHQuZXhhbXBsZYiWBBMWCAA+FiEE64W7X6M6deFelE5j8jFVDE9H 444FAlxHBOkCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQ8jFV DE9H445KiwD/X65Yo8ASbwPhxZ6gmXGCFcZcl80uRouYDE6ad+yu944A/1WymIZM JPYruvPTmB+Cu6uy25nXmifkV/PGP2nfYWcMnF0EXEcE6RIKKwYBBAGXVQEFAQEH QEL/BiGtq0k84Km1wqQw2DIikVYrQrMttN8d7BPfnr4iAwEIBwAA/3/xFPG6U17r hTuq+07gmEvaFYKfxRB6sgAYiW6TMTpQEK6IeAQYFggAIBYhBOuFu1+jOnXhXpRO Y/IxVQxPR+OOBQJcRwTpAhsMAAoJEPIxVQxPR+OOWdABAMUdSzpMhzGs1O0RkWNQ WbUzQ8nUOeD9wNbjE3zR+yfRAQDbYqvtWQKN4AQLTxVJN5X5AWybPnn+We1aTBha Ga86AQ== =BdSF -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/autocrypt/bob@autocrypt.example.pub.asc000064400000000000000000000011701046102023000214140ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEXEcE6RYJKwYBBAHaRw8BAQdAPPy13Q7Y8w2VPRkksrijrn9o8u59ra1c2CJi HFpbM2G0FWJvYkBhdXRvY3J5cHQuZXhhbXBsZYiWBBMWCAA+FiEE8FQeqC0xAKoa 3zse4w5v3UWQH4IFAlxHBOkCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgEC F4AACgkQ4w5v3UWQH4IfwAEA3lujohz3Nj9afUnaGUXN7YboIzQsmpgGkN8thyb/ slIBAKwdJyg1SurKqHnxy3Wl/DBzOrR12/pN7nScn0+x4sgBuDgEXEcE6RIKKwYB BAGXVQEFAQEHQJSU7QErtJOYXsIagw2qwnVbt31ooVEx8Xcb476NCbFjAwEIB4h4 BBgWCAAgFiEE8FQeqC0xAKoa3zse4w5v3UWQH4IFAlxHBOkCGwwACgkQ4w5v3UWQ H4LlHQEAlwUBfUU8ORC0RAS/dzlZSEm7+ImY12Wv8QGUCx5zPbUA/3YH84ZOAQDb mV/C+R//0WVNbGfav9X5KYmiratYR7oL =OEK0 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/autocrypt/bob@autocrypt.example.sec.asc000064400000000000000000000013401046102023000213770ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lFgEXEcE6RYJKwYBBAHaRw8BAQdAPPy13Q7Y8w2VPRkksrijrn9o8u59ra1c2CJi HFpbM2EAAP43HDDsNHyz6+NCWq2H1fn4hh2JfrxVbF8o1L0CrSpPGBCztBVib2JA YXV0b2NyeXB0LmV4YW1wbGWIlgQTFggAPhYhBPBUHqgtMQCqGt87HuMOb91FkB+C BQJcRwTpAhsDBQkDwmcABQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEOMOb91F kB+CH8ABAN5bo6Ic9zY/Wn1J2hlFze2G6CM0LJqYBpDfLYcm/7JSAQCsHScoNUrq yqh58ct1pfwwczq0ddv6Te50nJ9PseLIAZxdBFxHBOkSCisGAQQBl1UBBQEBB0CU lO0BK7STmF7CGoMNqsJ1W7d9aKFRMfF3G+O+jQmxYwMBCAcAAP90mVSmQlny8B/W W3PCnVoxe9ySCaZAu2qgJ0pHlXfaQBCriHgEGBYIACAWIQTwVB6oLTEAqhrfOx7j Dm/dRZAfggUCXEcE6QIbDAAKCRDjDm/dRZAfguUdAQCXBQF9RTw5ELREBL93OVlI Sbv4iZjXZa/xAZQLHnM9tQD/dgfzhk4BANuZX8L5H//RZU1sZ9q/1fkpiaKtq1hH ugs= =xdG6 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/autocrypt/carol@autocrypt.example.pub.asc000064400000000000000000000011741046102023000217560ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEXEcE6RYJKwYBBAHaRw8BAQdAKiHXLyIgys0xGLa+vS+BLtUDydKd3A1E9DpS ozOBdfa0F2Nhcm9sQGF1dG9jcnlwdC5leGFtcGxliJYEExYIAD4WIQSt8CGd+u2e 0+MFQA8EcmYYsmQnEgUCXEcE6QIbAwUJA8JnAAULCQgHAgYVCgkICwIEFgIDAQIe AQIXgAAKCRAEcmYYsmQnEnQFAQDZjvUBE80VZkocXiATJ9pU2pPg77ygrcJbiIuH ExcmmgEArhI+IzZWmOFQH6QVGsLYQf981GMGDCoV8MyNhBHCqQ64OARcRwTpEgor BgEEAZdVAQUBAQdAHx6p0V/ki//8CqLOh0EWwqTKyFeHGY4b2c2YFV+jF3YDAQgH iHgEGBYIACAWIQSt8CGd+u2e0+MFQA8EcmYYsmQnEgUCXEcE6QIbDAAKCRAEcmYY smQnEtI2AQDc+PCbtyj9BfNTtqxSD3JMTXlbHDDxuZ84+nXfEVuivQD9Hl5eunlZ nm76voE9rgjPw6h3ReWkUrgbT7fX4YsHdws= =IYdN -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/autocrypt/carol@autocrypt.example.sec.asc000064400000000000000000000013441046102023000217410ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lFgEXEcE6RYJKwYBBAHaRw8BAQdAKiHXLyIgys0xGLa+vS+BLtUDydKd3A1E9DpS ozOBdfYAAP4rNou2uMIToHv4Dj6IRo4t1OzbVOJxcN8NjssDDSa+fBB8tBdjYXJv bEBhdXRvY3J5cHQuZXhhbXBsZYiWBBMWCAA+FiEErfAhnfrtntPjBUAPBHJmGLJk JxIFAlxHBOkCGwMFCQPCZwAFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQBHJm GLJkJxJ0BQEA2Y71ARPNFWZKHF4gEyfaVNqT4O+8oK3CW4iLhxMXJpoBAK4SPiM2 VpjhUB+kFRrC2EH/fNRjBgwqFfDMjYQRwqkOnF0EXEcE6RIKKwYBBAGXVQEFAQEH QB8eqdFf5Iv//AqizodBFsKkyshXhxmOG9nNmBVfoxd2AwEIBwAA/2NDa7N0kewL l4l5kjXepJGecIX81x3KxWInHXl3U3/gEYyIeAQYFggAIBYhBK3wIZ367Z7T4wVA DwRyZhiyZCcSBQJcRwTpAhsMAAoJEARyZhiyZCcS0jYBANz48Ju3KP0F81O2rFIP ckxNeVscMPG5nzj6dd8RW6K9AP0eXl66eVmebvq+gT2uCM/DqHdF5aRSuBtPt9fh iwd3Cw== =qT++ -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/backward-compat.rs000064400000000000000000000077221046102023000152540ustar 00000000000000use rand::SeedableRng; use rand_chacha::ChaChaRng; // Tests that check for backward compatibility with older versions of rpgp #[test] fn ecdh_roundtrip_with_rpgp_0_10() { // Encrypt/decrypt roundtrip to validate that there is no padding breakage between rPGP versions. // Context: rPGP versions before 0.11 couldn't handle "long padding" (that exceeds one block), // see https://github.com/rpgp/rpgp/pull/280 // However, rPGP 0.12 - 0.13.1 emit "long padding" by default (see https://github.com/rpgp/rpgp/pull/307), // which older rPGP cannot unpad (and thus not decrypt). // To avoid incompatibility with the (erroneous) ecdh handling in rPGP <0.11, rPGP produces // "short padding" again, starting with 0.13.2 // Note: We use AES128 in this test so that the encrypting party is able to use "long padding". const MSG: &[u8] = b"hello world"; // a test-key with an ECDH(Curve25519) encryption subkey const KEYFILE: &str = "./tests/unit-tests/padding/alice.key"; // 0.10 -> 0.10 let enc = encrypt_rpgp_0_10(MSG, KEYFILE); let dec = decrypt_rpgp_0_10(&enc, KEYFILE); assert_eq!(dec, MSG, "0.10 -> 0.10"); // 0.10 -> cur let enc = encrypt_rpgp_0_10(MSG, KEYFILE); let dec = decrypt_rpgp_cur(&enc, KEYFILE); assert_eq!(dec, MSG, "0.10 -> cur"); // cur -> 0.10 let enc = encrypt_rpgp_cur(MSG, KEYFILE); let dec = decrypt_rpgp_0_10(&enc, KEYFILE); assert_eq!(dec, MSG, "cur -> 0.10"); // cur -> cur let enc = encrypt_rpgp_cur(MSG, KEYFILE); let dec = decrypt_rpgp_cur(&enc, KEYFILE); assert_eq!(dec, MSG, "cur -> cur"); } fn decrypt_rpgp_0_10(enc_msg: &str, keyfile: &str) -> Vec { use rpgp_0_10::Deserializable; let (enc_msg, _) = rpgp_0_10::Message::from_string(enc_msg).unwrap(); let (ssk, _headers) = rpgp_0_10::SignedSecretKey::from_armor_single(std::fs::File::open(keyfile).unwrap()) .expect("failed to read key"); let (mut dec, _) = enc_msg .decrypt(|| "".to_string(), &[&ssk]) .expect("decrypt_rpgp_0_10"); let inner = dec.next().unwrap().unwrap(); inner.get_literal().unwrap().data().to_vec() } fn decrypt_rpgp_cur(enc_msg: &str, keyfile: &str) -> Vec { use pgp::Deserializable; let (enc_msg, _) = pgp::Message::from_string(enc_msg).expect("decrypt_rpgp_cur"); let (ssk, _headers) = pgp::SignedSecretKey::from_armor_single(std::fs::File::open(keyfile).unwrap()) .expect("failed to read key"); let (dec, _) = enc_msg.decrypt(|| "".to_string(), &[&ssk]).unwrap(); dec.get_literal().unwrap().data().to_vec() } fn encrypt_rpgp_0_10(msg: &[u8], keyfile: &str) -> String { use rpgp_0_10::crypto::sym::SymmetricKeyAlgorithm; use rpgp_0_10::Deserializable; let mut rng = ChaChaRng::from_seed([0u8; 32]); let lit = rpgp_0_10::packet::LiteralData::from_bytes((&[]).into(), msg); let msg = rpgp_0_10::Message::Literal(lit); let (ssk, _headers) = rpgp_0_10::SignedSecretKey::from_armor_single(std::fs::File::open(keyfile).unwrap()) .expect("failed to read key"); let enc = &ssk.secret_subkeys[0]; let enc_msg = msg .encrypt_to_keys(&mut rng, SymmetricKeyAlgorithm::AES128, &[enc]) .unwrap(); enc_msg.to_armored_string(None).unwrap() } fn encrypt_rpgp_cur(msg: &[u8], keyfile: &str) -> String { use pgp::crypto::sym::SymmetricKeyAlgorithm; use pgp::{ArmorOptions, Deserializable}; let mut rng = ChaChaRng::from_seed([0u8; 32]); let lit = pgp::packet::LiteralData::from_bytes((&[]).into(), msg); let msg = pgp::Message::Literal(lit); let (ssk, _headers) = pgp::SignedSecretKey::from_armor_single(std::fs::File::open(keyfile).unwrap()) .expect("failed to read key"); let enc = &ssk.secret_subkeys[0]; let enc_msg = msg .encrypt_to_keys_seipdv1(&mut rng, SymmetricKeyAlgorithm::AES128, &[enc]) .unwrap(); enc_msg.to_armored_string(ArmorOptions::default()).unwrap() } pgp-0.15.0/tests/draft-bre-openpgp-samples-00/bob.pub.asc000064400000000000000000000046541046102023000210620ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: Bob's OpenPGP certificate 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 NEJd3XZRzaXZE2aAMQ== =NXei -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/draft-bre-openpgp-samples-00/bob.sec.asc000064400000000000000000000117751046102023000210500ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: Bob's OpenPGP Transferable Secret Key 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 =miES -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/hsm-test.rs000064400000000000000000000503401046102023000137530ustar 00000000000000use std::fmt::Debug; use std::fs::File; use chrono::{DateTime, Utc}; use pgp::crypto::checksum; use pgp::crypto::ecc_curve::ECCCurve; use pgp::crypto::hash::HashAlgorithm; use pgp::crypto::public_key::PublicKeyAlgorithm; use pgp::crypto::sym::SymmetricKeyAlgorithm; use pgp::packet::{PacketTrait, PublicKey, SignatureConfig}; use pgp::types::{EcdhPublicParams, EskType, Fingerprint, PkeskBytes, SignatureBytes}; use pgp::types::{KeyId, Mpi, PublicKeyTrait, PublicParams, SecretKeyTrait}; use pgp::{packet, Deserializable, Esk}; use pgp::{Message, SignedPublicKey, SignedSecretKey}; use rand::{CryptoRng, Rng}; #[derive(Debug, Clone)] pub struct FakeHsm { public_key: PublicKey, // data to decrypt() -> data from card decrypt_data: Option<(&'static [&'static [u8]], &'static [u8])>, // data to card -> data from card sign_data: Option<(&'static [u8], &'static [u8])>, } impl FakeHsm { pub fn with_public_key(public_key: PublicKey) -> Result { Ok(Self { public_key, decrypt_data: None, sign_data: None, }) } pub fn set_fake_decryption_data( &mut self, input: &'static [&'static [u8]], out: &'static [u8], ) { self.decrypt_data = Some((input, out)); } pub fn set_fake_signing_data(&mut self, input: &'static [u8], out: &'static [u8]) { self.sign_data = Some((input, out)); } /// The OpenPGP public key material that corresponds to the key in this CardSlot pub fn public_key(&self) -> &PublicKey { &self.public_key } } impl PublicKeyTrait for FakeHsm { fn verify_signature( &self, hash: HashAlgorithm, data: &[u8], sig: &SignatureBytes, ) -> pgp::errors::Result<()> { self.public_key.verify_signature(hash, data, sig) } fn encrypt( &self, rng: R, plain: &[u8], typ: EskType, ) -> pgp::errors::Result { self.public_key.encrypt(rng, plain, typ) } fn serialize_for_hashing(&self, writer: &mut impl std::io::Write) -> pgp::errors::Result<()> { self.public_key.serialize_for_hashing(writer) } fn public_params(&self) -> &PublicParams { self.public_key.public_params() } fn version(&self) -> pgp::types::KeyVersion { self.public_key.version() } fn fingerprint(&self) -> Fingerprint { self.public_key.fingerprint() } fn key_id(&self) -> KeyId { self.public_key.key_id() } fn algorithm(&self) -> PublicKeyAlgorithm { self.public_key.algorithm() } fn created_at(&self) -> &chrono::DateTime { self.public_key.created_at() } fn expiration(&self) -> Option { self.public_key.expiration() } } pub struct Unlocked; impl SecretKeyTrait for FakeHsm { // XXX: This choice of the public key packet type here is a bit arbitrary. type PublicKey = PublicKey; type Unlocked = Self; fn unlock(&self, _pw: F, work: G) -> pgp::errors::Result where F: FnOnce() -> String, G: FnOnce(&Self::Unlocked) -> pgp::errors::Result, { work(self) } fn create_signature( &self, _key_pw: F, _hash: HashAlgorithm, data: &[u8], ) -> pgp::errors::Result where F: FnOnce() -> String, { assert_eq!(data, self.sign_data.unwrap().0); // XXX: imagine a smartcard producing a signature for `data`, here let sig = self.sign_data.unwrap().1; // fake smartcard output let mpis = match self.public_key.algorithm() { PublicKeyAlgorithm::RSA => vec![Mpi::from_slice(sig)], PublicKeyAlgorithm::ECDSA => { let mid = sig.len() / 2; vec![Mpi::from_slice(&sig[..mid]), Mpi::from_slice(&sig[mid..])] } PublicKeyAlgorithm::EdDSALegacy => { assert_eq!(sig.len(), 64); // FIXME: check curve; add error handling vec![Mpi::from_slice(&sig[..32]), Mpi::from_slice(&sig[32..])] } _ => unimplemented!(), }; Ok(mpis.into()) } fn public_key(&self) -> Self::PublicKey { self.public_key.clone() } } impl FakeHsm { pub fn decrypt( &self, values: &PkeskBytes, ) -> pgp::errors::Result<(Vec, SymmetricKeyAlgorithm)> { let decrypted_key = match (self.public_key.public_params(), values) { (PublicParams::RSA { .. }, PkeskBytes::Rsa { mpi }) => { // The test data in self.decrypt_data must match the parameters // (this fake hsm just stores the answer for one request, and it's only legal to // call it with the exact set of parameters we have stored) assert_eq!(vec![mpi.as_bytes()], self.decrypt_data.unwrap().0); let _ciphertext = mpi.as_bytes(); // XXX: imagine a smartcard decrypting `_ciphertext`, here let dec = self.decrypt_data.unwrap().1; // fake smartcard output dec.to_vec() } ( PublicParams::ECDH(EcdhPublicParams::Known { curve, alg_sym, hash, .. }), PkeskBytes::Ecdh { public_point, encrypted_session_key, }, ) => { // The test data in self.decrypt_data must match the parameters // (this fake hsm just stores the answer for one request, and it's only legal to // call it with the exact set of parameters we have stored) assert_eq!( vec![ public_point.as_bytes(), &[encrypted_session_key.len() as u8], encrypted_session_key ], self.decrypt_data.unwrap().0 ); let ciphertext = public_point.as_bytes(); let _ciphertext = if *curve == ECCCurve::Curve25519 { assert_eq!( ciphertext[0], 0x40, "Unexpected shape of Cv25519 encrypted data" ); // Strip trailing 0x40 &ciphertext[1..] } else { // For NIST and brainpool: we decrypt the ciphertext as is ciphertext }; // XXX: imagine a smartcard decrypting `_ciphertext`, here let dec = self.decrypt_data.unwrap().1; // fake smartcard output let shared_secret: [u8; 32] = dec.try_into().expect("must be [u8; 32]"); let decrypted_key: Vec = pgp::crypto::ecdh::derive_session_key( &shared_secret, encrypted_session_key, encrypted_session_key.len(), &(curve.clone(), *alg_sym, *hash), self.public_key.fingerprint().as_bytes(), )?; decrypted_key } _ => unimplemented!(), }; // strip off the leading session key algorithm octet, and the two trailing checksum octets let dec_len = decrypted_key.len(); let (sessionkey, checksum) = ( &decrypted_key[1..dec_len - 2], &decrypted_key[dec_len - 2..], ); // ... check the checksum, while we have it at hand checksum::simple(checksum, sessionkey)?; let session_key_algorithm = decrypted_key[0].into(); Ok((sessionkey.to_vec(), session_key_algorithm)) } } // RSA decryption input to the card // (the card contains the decryption subkey of `tests/unit-tests/hsm/alice-rsa4096.priv`) const MPIS_RSA_DECRYPT: &[&[u8]] = &[&[ 0x60, 0x37, 0x72, 0x21, 0xe7, 0xe2, 0x27, 0x97, 0x4d, 0x6e, 0x66, 0x0f, 0xca, 0x09, 0x5a, 0x19, 0xa9, 0xd2, 0x67, 0xcb, 0x66, 0x15, 0x00, 0xfd, 0xef, 0xe0, 0x0a, 0xa9, 0x4b, 0x38, 0x01, 0x3d, 0x81, 0xca, 0xfc, 0xe2, 0x4d, 0xd1, 0x4e, 0xd0, 0x37, 0xef, 0xff, 0xad, 0x8c, 0xab, 0xb9, 0xa4, 0x27, 0x33, 0x23, 0x0b, 0x49, 0xfd, 0x7a, 0xc6, 0x85, 0x24, 0xbe, 0x31, 0x33, 0xe6, 0x06, 0x04, 0xc1, 0xbb, 0xbb, 0x24, 0x6a, 0x05, 0x75, 0xbd, 0x03, 0xee, 0xc4, 0x45, 0x12, 0xd9, 0xbd, 0xcc, 0x46, 0x36, 0x43, 0x41, 0x9b, 0x6b, 0xc6, 0x98, 0x0b, 0x0b, 0x3c, 0x40, 0xa4, 0x4c, 0xf3, 0xc8, 0x7b, 0x05, 0xac, 0x5e, 0x0c, 0x92, 0x4c, 0x9a, 0xb8, 0xd3, 0xc3, 0x81, 0x2a, 0x60, 0x3b, 0xed, 0xfd, 0x03, 0xdc, 0x2b, 0xc6, 0xfe, 0xe0, 0xe4, 0x97, 0x9c, 0x92, 0xc7, 0x0c, 0x81, 0x1c, 0x86, 0xa9, 0xe2, 0x19, 0x37, 0xf4, 0x6a, 0x6b, 0xa6, 0x5c, 0xab, 0x31, 0xc4, 0x54, 0x22, 0x96, 0x73, 0xb4, 0xaf, 0x09, 0x05, 0xae, 0xc7, 0x18, 0xf7, 0xdd, 0x69, 0x8d, 0xe8, 0x1f, 0xc3, 0xfb, 0xd9, 0x81, 0x9d, 0x7f, 0x03, 0x28, 0xf5, 0xe9, 0x9b, 0x49, 0xc4, 0x75, 0x9b, 0xa4, 0x34, 0x6f, 0x86, 0x2c, 0x3a, 0x5c, 0xb7, 0xe9, 0x31, 0x89, 0x81, 0xdb, 0x59, 0x98, 0xe0, 0x94, 0x5f, 0x59, 0x24, 0x80, 0x34, 0xd6, 0x88, 0x8f, 0x3c, 0x7c, 0x22, 0x14, 0xf7, 0x0c, 0xa5, 0xba, 0xf5, 0x79, 0x66, 0x46, 0x26, 0x94, 0x1f, 0xd5, 0xc7, 0x46, 0xd5, 0x68, 0xbe, 0x07, 0xf1, 0x6b, 0x11, 0xab, 0xc0, 0xeb, 0xd3, 0x67, 0x3e, 0x01, 0xc7, 0x5b, 0x37, 0xcd, 0x6a, 0xb6, 0xfe, 0x7a, 0x20, 0xfc, 0xe2, 0xe8, 0x5e, 0xcb, 0x65, 0x26, 0x48, 0x46, 0x5f, 0x55, 0xba, 0x31, 0xf5, 0x2d, 0xb6, 0xd2, 0xf4, 0xa5, 0xd5, 0xbf, 0xd4, 0x58, 0xf6, 0xc9, 0x81, 0x75, 0x80, 0x10, 0xb8, 0xd2, 0x30, 0xf9, 0xc8, 0x1c, 0x6a, 0x4d, 0xa5, 0x2e, 0x73, 0x7d, 0xde, 0x27, 0xc5, 0x8f, 0xd5, 0x94, 0x3e, 0x78, 0x12, 0x7c, 0xe2, 0x8a, 0xa1, 0x0a, 0xd6, 0xdb, 0x1f, 0x0a, 0xbc, 0xdc, 0x8b, 0x63, 0xfe, 0x2a, 0x84, 0x37, 0x3c, 0x0a, 0x4a, 0x9e, 0xce, 0xab, 0x31, 0x20, 0x9e, 0x73, 0x8a, 0x70, 0x78, 0xe7, 0xe6, 0x26, 0xac, 0xd0, 0xf9, 0x44, 0xd9, 0x3f, 0x19, 0x40, 0x86, 0xae, 0xae, 0x0c, 0x8a, 0x35, 0xf0, 0x8e, 0x92, 0x35, 0xd9, 0x99, 0x70, 0x69, 0x9b, 0x41, 0x17, 0x9c, 0x49, 0xb6, 0xd2, 0xda, 0xa4, 0x95, 0xd6, 0xac, 0x50, 0x09, 0x04, 0xf1, 0x20, 0x5d, 0x29, 0x1b, 0x91, 0xf0, 0x3e, 0x8c, 0x3d, 0x0b, 0xd2, 0xcd, 0xe8, 0xc3, 0xda, 0x39, 0x0c, 0x7e, 0x11, 0x7e, 0x02, 0x7d, 0x10, 0xfe, 0x25, 0xe2, 0xfc, 0x9e, 0x8a, 0x63, 0x2f, 0x3f, 0x1b, 0xb7, 0x92, 0x9d, 0x98, 0x94, 0x67, 0xdb, 0x35, 0x3b, 0xfb, 0x3a, 0x75, 0x1d, 0xe5, 0xa6, 0xd9, 0x9f, 0x7f, 0xcc, 0x20, 0x10, 0x35, 0x50, 0x0b, 0x9e, 0x77, 0x56, 0xe9, 0x9c, 0x44, 0xb8, 0x61, 0x17, 0xa9, 0x21, 0x24, 0xb8, 0x9c, 0xf1, 0xf2, 0xbb, 0xf2, 0xe0, 0x8a, 0x26, 0x6d, 0xc2, 0x4b, 0xb8, 0x11, 0xad, 0xad, 0xaf, 0x8c, 0xb4, 0x55, 0x2d, 0x68, 0xca, 0xb3, 0xdd, 0x3f, 0xfc, 0xdb, 0x4d, 0xe3, 0xfb, 0x2a, 0x74, 0x60, 0xdd, 0xe4, 0xc4, 0xdd, 0x4d, 0x3f, 0xe8, 0xb7, 0x37, 0x3e, 0xd9, 0xe3, 0x52, 0x8b, 0xbb, 0x74, 0x0d, 0xe0, 0x53, 0xab, 0xdf, 0xa7, 0x63, 0x51, 0x65, 0x04, 0x16, 0x4f, 0xc3, 0x96, 0xf6, 0x5d, 0xd2, 0x29, 0x99, 0xa2, 0xaf, 0xb9, 0xaf, 0xcc, 0x2a, 0x70, 0x09, 0x07, 0x15, 0x51, 0x59, 0xe6, 0xdc, 0xa3, ]]; /// RSA decryption result from the card const CARD_RSA_DECRYPTION_RESULT: &[u8] = &[ 9, 135, 233, 39, 94, 28, 235, 241, 139, 120, 210, 180, 7, 213, 200, 169, 175, 213, 183, 101, 96, 132, 5, 183, 198, 5, 231, 19, 50, 146, 25, 72, 229, 16, 210, ]; // ECC decryption input to the card // (the card contains the decryption subkey of `tests/unit-tests/hsm/bob-curve25519.priv`) const MPIS_ECC_DECRYPT: &[&[u8]] = &[ &[ 0x40, 0xac, 0x0b, 0xaa, 0x2d, 0x32, 0x22, 0x57, 0x90, 0x51, 0x27, 0x28, 0x19, 0x2b, 0x4b, 0xbc, 0x56, 0x2f, 0x5b, 0x7d, 0xcf, 0xdb, 0xdf, 0x03, 0xe8, 0x8f, 0x96, 0x5c, 0x2d, 0x37, 0x84, 0xe6, 0x5e, ], &[0x30], &[ 0xb8, 0xef, 0x94, 0x40, 0xb1, 0x67, 0x3d, 0xd5, 0xa7, 0x88, 0x86, 0xfd, 0xd7, 0x17, 0x23, 0x25, 0x2d, 0x62, 0x73, 0x70, 0xe2, 0xc1, 0x10, 0xe5, 0x2a, 0xe2, 0x34, 0x57, 0xe8, 0x65, 0xda, 0xe3, 0x19, 0x80, 0xfe, 0xf3, 0xc8, 0x0d, 0x1e, 0xa2, 0x06, 0x47, 0xd2, 0x30, 0xaa, 0xde, 0xaf, 0x3b, ], ]; /// raw decryption result from the card const CARD_ECC_DECRYPTION_RESULT: &[u8] = &[ 0x45, 0xb5, 0xfc, 0xf2, 0x9d, 0xfe, 0x81, 0x45, 0xfd, 0x7d, 0xc9, 0xbd, 0xe5, 0xb4, 0xf6, 0x9f, 0x17, 0xa3, 0x01, 0xaa, 0x10, 0x77, 0xad, 0xa6, 0x4f, 0x61, 0xf9, 0xe9, 0x29, 0xc1, 0x1e, 0x3b, ]; #[test] fn card_decrypt() { let cases = [ ( // RSA test case "tests/unit-tests/hsm/alice-rsa4096.priv", "tests/unit-tests/hsm/msg-to-alice4096.enc", MPIS_RSA_DECRYPT, CARD_RSA_DECRYPTION_RESULT, ), ( // ECC test case "tests/unit-tests/hsm/bob-curve25519.priv", "tests/unit-tests/hsm/msg-to-bob25519.enc", MPIS_ECC_DECRYPT, CARD_ECC_DECRYPTION_RESULT, ), ]; for case in cases { let (keyfile, msgfile, input, out) = case; let key_file = File::open(keyfile).unwrap(); let (mut x, _) = pgp::composed::signed_key::from_reader_many(key_file).unwrap(); let key: SignedSecretKey = x.next().unwrap().unwrap().try_into().unwrap(); let pubkey: SignedPublicKey = key.into(); let enc_subkey = &pubkey.public_subkeys.first().unwrap().key; // Transform subkey packet into primary key packet // (This is a hack: FakeHsm wants a primary key packet) let as_primary = PublicKey::new( enc_subkey.packet_version(), enc_subkey.version(), enc_subkey.algorithm(), *enc_subkey.created_at(), enc_subkey.expiration(), enc_subkey.public_params().clone(), ) .unwrap(); let mut hsm = FakeHsm::with_public_key(as_primary).unwrap(); hsm.set_fake_decryption_data(input, out); let (message, _headers) = Message::from_armor_single(File::open(msgfile).unwrap()).unwrap(); let Message::Encrypted { esk, edata } = message else { panic!("not encrypted"); }; let values = if let Esk::PublicKeyEncryptedSessionKey(ref k) = esk[0] { k.values().expect("known PKESK version") } else { panic!("whoops") }; let (session_key, session_key_algorithm) = hsm .unlock(String::new, |priv_key| priv_key.decrypt(values)) .unwrap(); let decrypted = edata .decrypt(pgp::PlainSessionKey::V3_4 { key: session_key, sym_alg: session_key_algorithm, }) .unwrap(); if let Message::Literal(data) = decrypted { assert_eq!(data.data(), b"foo bar") } else { panic!() } } } const SIGN_RSA_IN: &[u8] = &[ 0xb4, 0x8f, 0x7e, 0x1a, 0x7e, 0x38, 0x38, 0xad, 0x80, 0xcb, 0xc6, 0x10, 0xd9, 0x10, 0xb0, 0x64, 0xf7, 0x08, 0xa6, 0x7c, 0x64, 0x3c, 0x8e, 0x6c, 0x92, 0x40, 0x75, 0xc4, 0x99, 0xe5, 0xeb, 0x06, ]; const SIGN_RSA_OUT: &[u8] = &[ 0x03, 0x8e, 0x16, 0x3a, 0x5e, 0x27, 0x06, 0x63, 0x45, 0xd6, 0xad, 0x0c, 0xcf, 0xe8, 0xd7, 0x91, 0xc6, 0x20, 0x86, 0x3f, 0x82, 0x63, 0x66, 0x7e, 0x87, 0x7c, 0x5b, 0xd8, 0x9d, 0x9e, 0x50, 0xc0, 0xd3, 0x5f, 0xc8, 0xe0, 0x74, 0x1a, 0xf5, 0xbe, 0xe5, 0xab, 0x2f, 0xde, 0xcc, 0xdb, 0x82, 0x1f, 0xa1, 0x4f, 0xf4, 0xee, 0x1a, 0xa3, 0x45, 0xfb, 0x48, 0x4d, 0x18, 0xd0, 0xf1, 0x50, 0xbd, 0xf4, 0x52, 0xaf, 0x04, 0x0f, 0xd9, 0x2b, 0xf6, 0x88, 0xb8, 0x95, 0xf8, 0x8f, 0xb3, 0xe1, 0xaf, 0x21, 0x5d, 0xd9, 0x6f, 0x1e, 0x86, 0xc8, 0xc1, 0xf9, 0x86, 0x82, 0xdb, 0xc2, 0xa6, 0xec, 0x1b, 0x0e, 0x1f, 0x80, 0x65, 0x4b, 0x83, 0x3a, 0x20, 0x05, 0x8b, 0x83, 0xba, 0x17, 0x90, 0x29, 0x92, 0xc7, 0x28, 0x8d, 0x38, 0x75, 0x98, 0xfc, 0x42, 0x0b, 0x66, 0xa7, 0x0e, 0x86, 0xdc, 0x7e, 0xca, 0x23, 0x0b, 0x45, 0x57, 0x5d, 0xa4, 0x67, 0x95, 0x40, 0xe5, 0x24, 0x5d, 0x52, 0x39, 0xdd, 0x76, 0x9e, 0x66, 0xc8, 0xd6, 0x4e, 0x62, 0x35, 0xea, 0xb6, 0xc0, 0xae, 0x22, 0xcb, 0xfa, 0x6a, 0xb9, 0xd9, 0x1c, 0xfb, 0x64, 0x77, 0x8c, 0x91, 0x8e, 0xa8, 0x12, 0x4c, 0xa3, 0x47, 0xe7, 0xca, 0x8c, 0x22, 0xb7, 0xfd, 0x1f, 0xe7, 0x3d, 0xd4, 0x04, 0x51, 0xd9, 0x33, 0x0e, 0x73, 0x51, 0x70, 0x89, 0x5e, 0x8d, 0xf9, 0x00, 0x00, 0x01, 0x1f, 0x1c, 0x61, 0x85, 0x59, 0xe7, 0xa9, 0xca, 0x34, 0xb8, 0xa8, 0xc9, 0x8f, 0xa2, 0xa1, 0x5b, 0x7f, 0x5a, 0xf1, 0x39, 0x09, 0x46, 0x54, 0x9a, 0xb4, 0xd5, 0xeb, 0x70, 0x9d, 0xed, 0x24, 0x77, 0x30, 0xf8, 0x9a, 0x8f, 0x7b, 0xab, 0x2a, 0x95, 0x24, 0x1d, 0xdd, 0x3e, 0x59, 0x65, 0x8c, 0x82, 0xc4, 0x86, 0x97, 0x7f, 0x07, 0xda, 0xc6, 0xb0, 0xfe, 0x03, 0x32, 0xb8, 0x03, 0x5f, 0x34, 0x9c, 0xb0, 0x63, 0xaa, 0x56, 0x50, 0x1b, 0x2e, 0x23, 0x7b, 0xb9, 0x84, 0x91, 0x07, 0x0a, 0x42, 0x23, 0x58, 0x07, 0x94, 0xbe, 0xca, 0xa1, 0x56, 0xe5, 0x57, 0x76, 0x9f, 0xce, 0xd7, 0xcb, 0xb4, 0xff, 0x78, 0x47, 0x19, 0x37, 0x86, 0x60, 0xdc, 0xf4, 0x81, 0xa7, 0x44, 0x03, 0x54, 0x1f, 0xda, 0xe5, 0xb7, 0x47, 0xe0, 0x8a, 0x37, 0x71, 0x0e, 0xc9, 0xa4, 0x8d, 0xcd, 0x78, 0x1b, 0x0c, 0x6f, 0xed, 0xda, 0xaa, 0x48, 0xa3, 0x5d, 0x3e, 0x61, 0x9c, 0x38, 0x3a, 0x40, 0x99, 0x9b, 0x93, 0x94, 0x06, 0x94, 0xff, 0x40, 0x42, 0xeb, 0x7a, 0xdd, 0x12, 0xea, 0x4e, 0x67, 0x8e, 0xcd, 0xb6, 0xf2, 0xd0, 0x4c, 0x80, 0x35, 0x6a, 0xff, 0x80, 0x2b, 0xc5, 0x5d, 0x25, 0xb3, 0xb9, 0xcf, 0x88, 0xf3, 0x14, 0x41, 0xbc, 0x21, 0x35, 0x08, 0xab, 0xfa, 0x9b, 0x1b, 0x63, 0x91, 0x5d, 0x0b, 0x78, 0xb4, 0x8e, 0x51, 0xc1, 0xd2, 0x3e, 0xa6, 0xfb, 0xe8, 0x86, 0x5e, 0x3a, 0x12, 0x96, 0x03, 0xb9, 0xf4, 0x0c, 0xfe, 0x27, 0x9d, 0x81, 0xbf, 0x71, 0xa1, 0x3c, 0x88, 0xda, 0x36, 0x1b, 0x18, 0xc2, 0xa6, 0x69, 0x32, 0xc8, 0xe7, 0x95, 0xee, 0xf5, 0x68, 0x9d, 0x76, 0xdd, 0x60, 0x25, 0x60, 0x9d, 0x69, 0xe1, 0x84, 0x24, 0x8b, 0xae, 0x77, 0x6b, 0xe6, 0xb7, 0xb1, 0xae, 0x72, 0x90, 0x5f, 0xa0, 0x61, 0x5a, 0x42, 0x09, 0x56, 0x3f, 0xbd, 0xaf, 0xfb, 0x6b, 0x13, 0x5a, 0xc7, 0x91, 0xc8, 0xbf, 0x69, 0x2b, 0xca, 0xa7, 0x74, 0x76, 0xd0, 0xd5, 0x3f, 0x4c, 0x55, 0xc6, 0x01, 0xd8, 0xe6, 0x2a, 0x7f, 0x65, 0xd0, 0x13, 0xc2, 0xd0, 0xc0, 0xb0, 0x1b, 0x10, 0x45, 0x6e, 0xf0, 0x49, 0x04, 0x37, 0x28, 0xf1, 0xf2, 0xe6, 0x8e, 0x77, 0xb4, 0xba, 0x6e, 0xb0, 0x63, 0x75, 0x53, ]; const SIGN_ECC_IN: &[u8] = &[ 0xfa, 0xa2, 0x5a, 0x97, 0x5b, 0xf9, 0x39, 0xfa, 0xe6, 0x62, 0xe1, 0x74, 0x00, 0x58, 0x4b, 0x88, 0x0e, 0xf1, 0x66, 0x73, 0xbd, 0x50, 0x36, 0xc0, 0xd2, 0xd9, 0xa0, 0xb9, 0x03, 0x1f, 0xf7, 0xa9, ]; const SIGN_ECC_OUT: &[u8] = &[ 0x8e, 0x71, 0x95, 0x06, 0x3b, 0x7a, 0x2f, 0x07, 0xa7, 0xe0, 0xa0, 0x6a, 0xcb, 0x2a, 0xc7, 0xb7, 0x63, 0xe8, 0xa6, 0x57, 0xb7, 0x29, 0xb1, 0x8f, 0xb1, 0xab, 0x97, 0xd9, 0x9e, 0x02, 0xce, 0x9a, 0x3a, 0xdb, 0x3e, 0x1e, 0x40, 0x49, 0xb0, 0xb0, 0xbc, 0xed, 0x42, 0xeb, 0xda, 0x2b, 0xb4, 0x7c, 0x0d, 0x67, 0x01, 0xfd, 0x0e, 0x3f, 0x9d, 0x56, 0xff, 0x09, 0x9f, 0x5f, 0x44, 0x38, 0xba, 0x0d, ]; #[test] fn card_sign() { let cases = [ ( // RSA test case "tests/unit-tests/hsm/alice-rsa4096.priv", 1711230710, SIGN_RSA_IN, SIGN_RSA_OUT, ), ( // ECC test case "tests/unit-tests/hsm/bob-curve25519.priv", 1711230918, SIGN_ECC_IN, SIGN_ECC_OUT, ), ]; for case in cases { let (keyfile, sig_creation, input, out) = case; let key_file = File::open(keyfile).unwrap(); let (mut x, _) = pgp::composed::signed_key::from_reader_many(key_file).unwrap(); let key: SignedSecretKey = x.next().unwrap().unwrap().try_into().unwrap(); let pubkey: SignedPublicKey = key.into(); let mut hsm = FakeHsm::with_public_key(pubkey.primary_key.clone()).unwrap(); hsm.set_fake_signing_data(input, out); const DATA: &[u8] = b"Hello World"; // -- use hsm signer let mut config = SignatureConfig::v4( packet::SignatureType::Binary, hsm.public_key().algorithm(), HashAlgorithm::SHA2_256, ); config.hashed_subpackets = vec![ packet::Subpacket::regular(packet::SubpacketData::SignatureCreationTime( DateTime::::from_timestamp(sig_creation, 0).unwrap(), )), packet::Subpacket::regular(packet::SubpacketData::Issuer(hsm.key_id())), ]; let signature = config.sign(&hsm, String::new, DATA).unwrap(); signature.verify(&pubkey, DATA).expect("ok"); } } pgp-0.15.0/tests/indeterminate.asc000064400000000000000000000115451046102023000151650ustar 00000000000000-----BEGIN PGP MESSAGE----- hF4DzfwiGcVT05ISAQdANTzF235y9tzBRbpPH7mr/76IT5DmUTscjqRGUEpFVWkw oXwBT7BzMMg4pbg5MHvPDRyHIpfoBgTG6GrDO7+lh5eVNWo1eEPRCyYgVcPkBiw2 0usB6ON/F+TcT97QM7Zq8GGEKqrgB8nxR23rMJyu1AZ2mBdtZxCgMmlGHpTv0bEe GoGXZlYMyzN+5reP2QGGJV0dpimh1l3ha37O+bSfZzXPs6UJSrJAWOQvExZtiMTi j15B4FfPN0e/d/s6SAoEseJxn2l+hzevjWvzfLob86Vs5fa8y/RQI5DOduEB+3Gf dKTk0nZqQQPKmY/r8xRsQvWp6p+M7WJII3FG9UplIYNwP9dP9lG+7bjXvC+hwA4G Us/BigQT09dZcszwaBr1Q9nbAXs+hirDfE9Epi39809BrLYsvwf200irI4sTMpR3 O0hYU8HMp7tyBet5pnTBhxWFPEpMglbh2WugJ6AdF93TyBvEZ3t4dYrZrL+by4zA DJIpsy5BBL3/4ILI3+D6vft0Q8YLhv2JIdmpTcWMdJdCirxZnXdMxuiYhrA8SHZy OBm43md6opAKMfjiPv7tV7676YLUYf3+XoSgqCGqjZee/7KcINqBx4RTRcJJZfYR xpLCX7N7PIVpHHeTN8/mMlbDFOTO1ALRFwHT47f4XoTOEGbth08q2UhZe0Y4aWKm /nYNvk/bNG800O4CGrSGeFo8E+u2jOOnjVia09aQZXf9stf6VUXXIQ1+BVwx32V8 jP0o6+/7yGKOyNX3q/ZPhvqCS9eRhEuZ4Rk4B6/cHBfNfLgMOS/0twiHfHnxywQY rC05qib2Z3ykNSX8vy7MvRE78uMG3sYRTlHDDaArn10F1TAtm03itdvKoZu5I7E5 /Uka8f8R3r0cLXtwWlAG9Xmm/oRWzGZqeVAPiNigpeSZDApoiUefrPliviCB68oy 6mcuiJRJV/uY6RQccu4R8Q8uwBRtEIY9DSmW1L+bjOULMfk/QDTRne9YK8ExUdbq 3n9YBktY8DY5CWXl3KunhQcMue7TJ6/niigteXW+aAAiz8UI3PNYqFHxi27a5hwd GaFA6TXv/SN3+vBkDefgvORzvBHT6fF4jPkvejp+fT3hgRBB2exuXF4NcRCh4BKj Qo0AZT4fP0+yoLBfUNHjqjYcvnN3XLzokuSDZ9SrfcqMSRV0w7HANzGcpWynZicF O3whJZDrcwGOJzTk+rc2sxHhVDKJAZZ362YBk4z2kdx19yHtnkvV/3oWRc5KWZaW trlPliJqTXqTfsl6vC9K2AMxUedFsflW0KiqGgMIUiuPx4akNef1DEnKauo38WWZ cZUN6YscyHGFyQwkS7JXHBlB60fnWc4c5IXQaQVKR8FXrqugjWujjG9IFFB3SilT APijQ2zbTGisIro1cJp3Hssr8y3vKCfioNcjIH0Fkz70CGGjF6XoeB6sJErDlemT wFm3d91cuEtyf0g0GIJvPfXrBcpcaB85eTrMt6fSdwxi+HinM0oQXq0yewcnXumV IpKuIySkGm3Co8nWhnFsoaS19cEeRiudb65VJTh1ggwBAcvD1WGia3QZ6bvwgnY1 NoHBnOt6/nRgzXyxcfDgTNWNmZb9gPDyvUq+B5oTyzN2RxdGsVqQNeA4oOBCyKhq bzyxjrhvEiDJ1NK2THcN6VgYinURGfP8u15NvHxcQiD1XGAmHCw9WqAIeI8feJjI uaeIyb3bnwoDQFtG82jcdJQunp7L9B6ArJjTmevc4AS7WZWaLBhVBugs23f4hZcR 9+JxVwujPjKIYKHnCTL3cgcBXbqwuWlPL7qtywyjoxdi7y2XOI9wrRlcXlAEi4cP RcvAdFKdxYvdTIP4ZFKdyBrz6ly5Ye+ANQQnCLngAUJ42BgC2xNwaYTOVx6H2W/K cfWfWWsP1BOzqNG33uPhG7ADqGwieG4yP1LzciXQIq/3ch927yj7e/QJC6z0mASn r9EPZvXuaC34vWo3EYMyXkn7gfDdCOeO5VXDfETq7pP11bJRPPkQYq3azfco2i5u WXuSrPced/XakcsEPcCiIQX27A9fAQ2G02Zc3BgBWxt2k+iq3ESCBZVflEFUmzW7 xR4+iYdDzYN9baMbQROtAyFY4Mdd21CUCMSxi6bg2m0kJgGPlQjaEViHI9ILOd65 FCsBLLSj1811kTKPpsMPjcaYerBF5UDTeYvaOHz0N4IoIGa443pgVZRX6Hh24zuP RuhPkgupaorsEVHFYkkK2jbL3TGybme1LHpEM6gWHneNcF/dUcU/bdalPcRqMQ9F PlcAtalko5UaulJJRvQNFTETahTRo3Y6RoDM3WMJ0scTG47GvTZPNVM98wtKPiqP 9haWvTvGWrsi/hZBA40/uQS0DSffDm+Vws45QvubPjTFqh1QY7EKZOHJRfdWhkf7 YxE2zZdN3OqpW2FW874rs/FwhkUNoGb+xfFwroaUApGY2O3lkeRukNloGuFfv5+o SB8me73r0zmSfg11HkIZD2x3atIXSSVqeP8sYV3yIsabApvoYd9T1hA71JMXX/y0 LXLhO2dvpSjGTns/j4kg+BCXKf26x9YSV+MOPVnIHOwZrnbrZZfBQ2IPQMb3EIc8 HmMKPZRiTbaVe0+wparE3BBafMaybcEPhFMD2ze/YpkTUGMM3KD9JDrwNpO4WtYS yBrugbdMjJ3wSf8bmWhsrx5vMbbgTTHCl8TCTempL+FdM67iadwEHBAh0wHaqxmw Wx8N7aYPC3Wz9Z/dOosfY+wk7KCi3q1TmiM1nDHBmUYy8o1IMKDzP4CuXlPHAr0v uNxo4PO8j3K95VOIHNTtASRenNEeUX9XNjIxxD6Klpdns+qHCS5s5MT4b+vdLhN0 E5sIUw70YsNPoVF+nFgiuvriBvFELyEIE5yta1LV/5/7lv5tohvswikV+2g7cFI8 VsuBBdOuDWE96z171xPyh2ua08FplohRAhWaErMUdBjl9i0piWZBpfnlvRqRKuVd 77a4aMn76IkXgRYxYpXSu+LbUloOYbdYJ+SC9a+vxIVdy5f9ARRffCWbjzfY8Dt8 TeVIHUW9DE/tv7NXURhn3yPxJ8Gfc8OGICw1O+tQOVOcJYScMCRdc8GjKzSXZOoI WlnUA9lgthoLT524ANY2+/ZF8PJELSKsrmwdIUNTZOao0L2hS/qFFl18sPoYPIA0 vdIme45sN3qFKGB5RsON+XigRDfUNxg5fndIPcYgE3c+gn65kv8bWF9n9xz1GNz4 WHL+lARy0cHKb0ooxrCvVGZEFBETiJDZ75/DxLA5S/JgiMdd0Tm9vuT1EbFEl39s ibF8oKcwjr7UL81sq4PcCTH0c7yri2pdZ2Lp8IC3D7wwhFp+JJNTw/6QK+vNeyxo 5qsoqqmzmfzOayvdMgfKYH9jGcV9PGu9+34/mq0u+7HzON2O50wvdpTAyVodtZor TxhwGn/R4hRXt2T5hoflQEosy6GPZDpJ5ODP2ZLUkPk69RsyUTrFiUiiuLSeUsyO Sw4kqt+0DNsot/ekRqrC8p42HMUb7F3xqvQOdpNCszRwKeeX0WiEztCvgKR2vtqs 3igKf1fr88ifLUIqXBN8kQmZOsJQ/d372si9+7zzsB6s6dp1xF7iORynOY9W3+ZA rE5ouoZj0DLzT0mKek9aUgWEksAH4P4TcA2A0/p+cXXZmFYQQNz2z+dJfVVcSj0x hxKapyM5byO/SWnFT0Hc4vnnaG+WK/S1QVwY1yC1bKbPqdDusFf2BiXhbNwd8pO8 onjQphsyLcZc5xgorh0gmZTjn+v59ZICx9Iy8u+rTuqgdAqtl0uxFj4zX6ndTfFX hKm1tjvU7MqVKNeyrTcHsZ0tnC6mPCKuEObVtyiIvdYa+oxD9votIOmqmTW/0xcl CFzdv5ASkB0d8c9n+pKPRuPTI5uphHtAOwCgF+KZQQUdhypkf4dulI+x8w7VH/TZ 5DCuR7zJbioWREopj0paXDdrVXpVLrENnfiXZvoSNAgAv9+XT7VJKzRdfuCmA4Ci GDV9qdwo1KJL2r/94AsZxmeMK8+fjh2Z0JNghPlVZV7wt3fxnmWwVRi+S/lJD8j/ /J/6o7v4bAyo+2s3aJbT4G0EUcBREdydsMubh1P3mw5/JMw+aI19/haW4NJ/rPy9 bQXdHcEB1lpFshFBp+PgTG7ZU950iDtwRSO6Yr5o277K/cqE9/46oGyUjn+gnBq0 J/MmwQDH5s+AnWdx14EHB+IjIxWQg3fMjL3G8ssqHiUWzIv2thOG4gUyFlNWx9kW VEF++KFhz/pL+1ktp/VziPaaUzSb/0+mO84nTO616U1DgdxTsWdZk5nD+Edt9Elt Rxv6NodkAtOK+ULm+A2lAEyBHUhcQ+clbEHba+CYTCbfaFyaY3M12UoWVGt+srjQ 0bvC/8GWzBOTGDFGAHp+SuYwMpICLE+rHjzvznplzF1VstZ3pGsisTwdZrxZjVe3 0ThayoNiysXnHFohrA5S28vwDqspfC+d8fYSuWd/PjmIWESTENv6ZhY619tC8TZN O/s4iV0bCzF1vUeinLwO8ExkhWNLrXHROAgw0lcu+QGR0gUlJ2u0LBPX5bPTTfAD S15A34MJjZWcz3ESBua+k3k+bV3gLmphU+hoj5fwHsICZB/Y0TzChPK76P2vqJn+ 4bnfdOceIkSM704V7wxFVvF7Vbi0HXyhbrmb3o5Zx9X8Y5zxZ4FV70x758EJhcJD YxSNkPZEjIngXRAfjAgUaYcZh6cPbrUwf2C98Bk6YT92cYGf86/tjKJ/mYTla8BG 3SAf/9+AuMtDtch3aoS8Aqd22iGu =kFId -----END PGP MESSAGE----- pgp-0.15.0/tests/key-with-password-123.asc000064400000000000000000000050341046102023000162350ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: B5A3 5856 0F60 BFC0 0885 4634 7C91 8F21 C12B 5F5B Comment: bob@example.org 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 yvKV8lJR3Pdw6go= =aYbQ -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/key_test.rs000064400000000000000000001351231046102023000140410ustar 00000000000000#[macro_use] extern crate log; #[macro_use] extern crate pretty_assertions; #[macro_use] extern crate smallvec; use std::fs::File; use std::io::Read; use std::path::Path; use buffer_redux::BufReader; use chrono::{DateTime, Utc}; use num_bigint::BigUint; use num_traits::ToPrimitive; use pgp::composed::signed_key::*; use pgp::composed::Deserializable; use pgp::crypto::ecdsa::SecretKey as ECDSASecretKey; use pgp::crypto::{ ecc_curve::ECCCurve, hash::HashAlgorithm, public_key::PublicKeyAlgorithm, sym::SymmetricKeyAlgorithm, }; use pgp::errors::Error; use pgp::packet::{ KeyFlags, Signature, SignatureType, Subpacket, SubpacketData, UserAttribute, UserId, }; use pgp::ser::Serialize; use pgp::types::{ CompressionAlgorithm, KeyId, KeyVersion, Mpi, PublicParams, S2kParams, SecretKeyRepr, SecretKeyTrait, SecretParams, SignedUser, StringToKey, Version, }; use pgp::{armor, types::PublicKeyTrait}; use rand::thread_rng; use rand::SeedableRng; use rand_chacha::ChaChaRng; use rsa::{ traits::{PrivateKeyParts, PublicKeyParts}, RsaPrivateKey, RsaPublicKey, }; use smallvec::SmallVec; fn read_file + ::std::fmt::Debug>(path: P) -> File { // Open the path in read-only mode, returns `io::Result` match File::open(&path) { // The `description` method of `io::Error` returns a string that // describes the error Err(why) => panic!("couldn't open {path:?}: {why}"), Ok(file) => file, } } fn get_test_key(name: &str) -> File { read_file(Path::new("./tests/openpgp-interop/testcases/keys").join(name)) } #[derive(Debug, Default, PartialEq, Eq, Clone)] struct DumpResult { valid_count: usize, err_count: usize, unimpl_count: usize, total_count: usize, } fn test_parse_dump(i: usize, expected: DumpResult) { let _ = pretty_env_logger::try_init(); let f = read_file(Path::new("./tests/tests/sks-dump/").join(format!("000{i}.pgp"))); let mut actual = DumpResult::default(); for (j, key) in SignedPublicKey::from_bytes_many(f).enumerate() { if j % 1000 == 0 { println!("key {}: {}", i, j); } actual.total_count += 1; let key = key.as_ref().expect("failed to parse key"); // roundtrip { // serialize and check we get the same thing let serialized = key.to_armored_bytes(None.into()).unwrap(); // and parse them again let (key2, _headers) = SignedPublicKey::from_string(std::str::from_utf8(&serialized[..]).unwrap()) .expect("failed to parse round2 - string"); assert_eq!(key, &key2, "string"); // and parse them again (buffered) let (key2, _headers) = SignedPublicKey::from_armor_single(&serialized[..]) .expect("failed to parse round2 - bytes"); assert_eq!(key, &key2, "bytes"); } match key.verify() { // Skip these for now Err(Error::Unimplemented(err)) => { warn!("unimplemented: {}:{} {:?}", i, j, err); actual.unimpl_count += 1; } Err(err) => { warn!( "verification failed: {}:{}: public key {}: {:?}", i, j, hex::encode(key.key_id()), err ); actual.err_count += 1; } // all good Ok(_) => { actual.valid_count += 1; } } } assert_eq!(expected, actual); } macro_rules! parse_dumps { ( $( ($name:ident, $num:expr, $count:expr, $unimpl:expr, $err:expr, $total:expr), )* ) => { $( #[test] #[ignore] fn $name() { test_parse_dump($num, DumpResult { valid_count: $count, unimpl_count: $unimpl, err_count: $err, total_count: $total, }); } )* }; } parse_dumps!( ( test_parse_dumps_0, 0, 17_704, 1, // Hash::Other(4) 3294, 20_999 ), ( test_parse_dumps_1, 1, 17_542, // - Hash::Other(4) // - Elgamal verify 8, 3450, 21_000 ), ( test_parse_dumps_2, 2, 17_583, // - Hash::Other(4) // - Hash::Other(5) // - Elgamal verify 5, 3411, 20_999 ), ( test_parse_dumps_3, 3, 17_651, // - Hash::Other(4) // - Elgamal verify 6, 3341, 20_998 ), ( test_parse_dumps_4, 4, 17_583, // - Elgamal verify 2, 3414, 20_999 ), ( test_parse_dumps_5, 5, 17_609, // - Hash::Other(4) // - Elgamal verify 8, 3382, 20_999 ), ( test_parse_dumps_6, 6, 17_676, // - Elgamal verify 1, 3323, 21_000 ), ( test_parse_dumps_7, 7, 17_688, // - Elgamal verify 3, 3309, 21_000 ), ( test_parse_dumps_8, 8, 17_693, // - Hash::Other(5) // - Elgamal verify 6, 3301, 21_000 ), ( test_parse_dumps_9, 9, 17_546, // - Hash::Other(5) // - Elgamal verify 3, 3451, 21_000 ), ); #[test] fn test_parse_gnupg_v1() { let _ = pretty_env_logger::try_init(); for i in 1..5 { let name = format!("gnupg-v1-00{i}.asc"); let mut file = get_test_key(&name); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); let input = ::std::str::from_utf8(buf.as_slice()).expect("failed to convert to string"); let (pk, headers) = SignedPublicKey::from_string(input).expect("failed to parse key"); match pk.verify() { // Skip these for now Err(Error::Unimplemented(err)) => { warn!("verification failed: {:?}", err); } Err(err) => panic!("{err:?}"), // all good Ok(_) => {} } // serialize and check we get the same thing let serialized = pk.to_armored_bytes(Some(&headers).into()).unwrap(); // and parse them again let (pk2, headers2) = SignedPublicKey::from_armor_single(&serialized[..]).expect("failed to parse round2"); assert_eq!(headers, headers2); assert_eq!(pk, pk2); } } #[test] fn test_parse_openpgp_sample_rsa_private() { let p = Path::new("./tests/openpgp/samplekeys/rsa-primary-auth-only.sec.asc"); let mut file = read_file(p.to_path_buf()); let mut buf = vec![]; file.read_to_end(&mut buf).expect("failed to read file"); let input = ::std::str::from_utf8(buf.as_slice()).expect("failed to convert to string"); let (key, _headers) = SignedSecretKey::from_string(input).expect("failed to parse key"); key.verify().expect("invalid key"); let pkey = key.primary_key; assert_eq!(pkey.version(), KeyVersion::V4); assert_eq!(pkey.algorithm(), PublicKeyAlgorithm::RSA); assert_eq!( pkey.secret_params().checksum(), hex::decode("2c46").expect("failed hex encoding") ); pkey.unlock( || "".to_string(), |unlocked_key| { match unlocked_key { SecretKeyRepr::RSA(k) => { assert_eq!(k.d().bits(), 2044); assert_eq!(k.primes()[0].bits(), 1024); assert_eq!(k.primes()[1].bits(), 1024); // test basic encrypt decrypt let plaintext = vec![2u8; 128]; let mut rng = thread_rng(); let ciphertext = { // TODO: fix this in rust-rsa let k: RsaPrivateKey = (*k).clone(); let pk: RsaPublicKey = k.into(); pk.encrypt( &mut rng, rsa::pkcs1v15::Pkcs1v15Encrypt, plaintext.as_slice(), ) .expect("failed to encrypt") }; let k: &RsaPrivateKey = k; let new_plaintext = k .decrypt(rsa::pkcs1v15::Pkcs1v15Encrypt, ciphertext.as_slice()) .expect("failed to decrypt"); assert_eq!(plaintext, new_plaintext); } _ => panic!("unexpected params type {unlocked_key:?}"), } Ok(()) }, ) .expect("failed to unlock"); let pub_key = pkey.public_key(); assert_eq!(pub_key.key_id(), pkey.key_id()); } #[test] fn test_parse_details() { let _ = pretty_env_logger::try_init(); let file = File::open("./tests/openpgp-interop/testcases/keys/gnupg-v1-003.asc").unwrap(); let (key, _headers) = SignedPublicKey::from_armor_single(file).expect("failed to parse key"); key.verify().expect("invalid key"); assert_eq!( hex::encode(key.primary_key.fingerprint().as_bytes()), "56c65c513a0d1b9cff532d784c073ae0c8445c0c" ); assert_eq!( key.primary_key.key_id().as_ref(), &hex::decode("4c073ae0c8445c0c").unwrap()[..] ); let primary_n = Mpi::from_raw(hex::decode("a54cfa9142fb75265322055b11f750f49af37b64c67ad830ed7443d6c20477b0492ee9090e4cb8b0c2c5d49e87dff5ac801b1aaadb319eee9d3d29b25bd9aa634b126c0e5da4e66b414e9dbdde5dea0e38c5bfe7e5f7fdb9f4c1b1f39ed892dd4e0873a0df66ff46fd9236d291c276ce69fb972f5ef24746b6794a0f70e0694667b9de57353330c732733cc6d5f24cd772c5c7d5bdb77dc0a5b6e9d3ee0372146778cda6144976e33066fc57bfb515ef397b3aa882c0bde02d19f7a32df7b1195cb0f32e6e7455ac199fa434355f0fa43230e5237e9a6e0ff6ad5b21b4d892c6fc3842788ba48b020ee85edd135cff2808780e834b5d94cc2c2b5fa747167a20814589d7f030ee9f8a669737bdb063e6b0b88ab0fd7454c03f69678a1dd99442cfd0bf620bc5b6896cd6e2b51fdecf54c7e6368c11c70f302444ec9d5a17ceaacb4a9ac3c37db3478f8fb04a679f0957a3697e8d90152008927c751b34160c72e757efc85053dd86738931fd351cf134266e436efd64a14b35869040108082847f7f5215628e7f66513809ae0f66ea73d01f5fd965142cdb7860276d4c20faf716c40ae0632d3b180137438cb95257327607038fb3b82f76556e8dd186b77c2f51b0bfdd7552f168f2c4eb90844fdc05cf239a57690225903399783ad3736891edb87745a1180e04741526384045c2de03c463c43b27d5ab7ffd6d0ecccc249f").unwrap()); let pk = key.primary_key; assert_eq!(pk.version(), KeyVersion::V4); assert_eq!(pk.algorithm(), PublicKeyAlgorithm::RSA); match pk.public_params() { PublicParams::RSA { n, e } => { assert_eq!(n, &primary_n); assert_eq!( BigUint::from_bytes_be(e.as_bytes()).to_u64().unwrap(), 0x0001_0001 ); } _ => panic!("wrong public params: {:?}", pk.public_params()), } assert_eq!(pk.created_at().timestamp(), 14_0207_0261); assert_eq!(pk.expiration(), None); // TODO: examine subkey details assert_eq!(key.public_subkeys.len(), 1, "missing subkey"); let issuer = Subpacket::regular(SubpacketData::Issuer( KeyId::from_slice(&[0x4C, 0x07, 0x3A, 0xE0, 0xC8, 0x44, 0x5C, 0x0C]).unwrap(), )); let key_flags: SmallVec<[u8; 1]> = KeyFlags(0x03).into(); let p_sym_algs = smallvec![ SymmetricKeyAlgorithm::AES256, SymmetricKeyAlgorithm::AES192, SymmetricKeyAlgorithm::AES128, SymmetricKeyAlgorithm::CAST5, SymmetricKeyAlgorithm::TripleDES, ]; let p_com_algs = smallvec![ CompressionAlgorithm::ZLIB, CompressionAlgorithm::BZip2, CompressionAlgorithm::ZIP, ]; let p_hash_algs = smallvec![ HashAlgorithm::SHA2_256, HashAlgorithm::SHA1, HashAlgorithm::SHA2_384, HashAlgorithm::SHA2_512, HashAlgorithm::SHA2_224, ]; let sig1 = Signature::v4( Version::Old, SignatureType::CertPositive, PublicKeyAlgorithm::RSA, HashAlgorithm::SHA1, [0x7c, 0x63], vec![Mpi::from_raw(vec![ 0x15, 0xb5, 0x4f, 0xca, 0x11, 0x7f, 0x1b, 0x1d, 0xc0, 0x7a, 0x05, 0x97, 0x25, 0x10, 0x4b, 0x6a, 0x76, 0x12, 0xf8, 0x89, 0x48, 0x76, 0x74, 0xeb, 0x8b, 0x22, 0xcf, 0xeb, 0x95, 0x80, 0x70, 0x97, 0x1b, 0x92, 0x7e, 0x35, 0x8f, 0x5d, 0xc8, 0xae, 0x22, 0x0d, 0x19, 0xdd, 0xd3, 0x38, 0x6c, 0xbb, 0x2f, 0x25, 0xa7, 0xcb, 0x8d, 0x2d, 0x11, 0x6b, 0x05, 0xc5, 0x77, 0xce, 0xa8, 0x86, 0xa0, 0xfc, 0xb5, 0x43, 0x26, 0x70, 0xec, 0x26, 0xdf, 0x56, 0x1c, 0xff, 0xe1, 0xe9, 0x13, 0x72, 0x18, 0xae, 0x7f, 0xf8, 0x1c, 0x0f, 0x5f, 0x2e, 0x37, 0xb5, 0xdf, 0xd9, 0x6b, 0x17, 0x8c, 0x87, 0xc7, 0x30, 0x75, 0x7f, 0x25, 0xb3, 0xbf, 0xfa, 0xcd, 0x93, 0xe6, 0x93, 0x31, 0xba, 0x06, 0x14, 0x91, 0xbf, 0x8a, 0xf2, 0x15, 0x80, 0xac, 0xdd, 0xc9, 0xaf, 0x8e, 0xf7, 0xbd, 0x95, 0x77, 0x3b, 0xb8, 0x02, 0x1a, 0x29, 0x9b, 0x96, 0x01, 0xd9, 0x28, 0x76, 0xa4, 0xb4, 0xf0, 0x2a, 0x18, 0x1b, 0x76, 0x70, 0xa0, 0x5f, 0x39, 0x54, 0xc1, 0x9e, 0x5d, 0x77, 0x1f, 0x43, 0x61, 0x84, 0x0e, 0xed, 0x4e, 0x86, 0x9f, 0x99, 0x57, 0xe1, 0x69, 0x27, 0xd6, 0xfc, 0x0b, 0x46, 0x98, 0x31, 0x89, 0xe5, 0xc8, 0xc6, 0xc9, 0x89, 0x08, 0x49, 0x3a, 0xd2, 0xff, 0x56, 0x2c, 0xe0, 0xf6, 0x7f, 0xb0, 0x72, 0x23, 0xf1, 0x52, 0x3c, 0x5f, 0x8d, 0x81, 0xc4, 0xd0, 0xba, 0xd5, 0x6d, 0x57, 0x71, 0x46, 0xc6, 0x85, 0xe6, 0x35, 0xfa, 0x12, 0x09, 0x8f, 0x30, 0x0d, 0x7e, 0x78, 0xc0, 0x0c, 0xc2, 0xd5, 0x20, 0x3e, 0xd0, 0x03, 0x28, 0x01, 0x06, 0xf2, 0xef, 0x93, 0xf8, 0x09, 0x1d, 0xf8, 0x4f, 0x61, 0xe0, 0xdc, 0x03, 0x4b, 0x70, 0xbd, 0x15, 0x6f, 0xf0, 0x72, 0xeb, 0x93, 0xb2, 0x65, 0x5a, 0x65, 0xea, 0xf5, 0x05, 0xcb, 0x97, 0x89, 0xa3, 0xf7, 0x95, 0xdf, 0x26, 0xae, 0xae, 0x1c, 0x71, 0xfe, 0x8c, 0x83, 0xda, 0x30, 0x69, 0xfd, 0x10, 0x28, 0x22, 0xd7, 0x9d, 0x02, 0xe2, 0x2d, 0xb3, 0x31, 0x34, 0x9c, 0x0f, 0x4a, 0xf6, 0xff, 0x77, 0xeb, 0x64, 0xa1, 0x6e, 0x97, 0x07, 0xbf, 0x66, 0x92, 0xec, 0xce, 0x65, 0xe3, 0x55, 0x73, 0x33, 0x6a, 0xb9, 0xed, 0x5d, 0xdd, 0x36, 0x41, 0x2e, 0xc9, 0xea, 0x1c, 0x3f, 0x9d, 0x0c, 0x95, 0x22, 0xa8, 0x46, 0xcd, 0x25, 0xf1, 0xd4, 0x5d, 0x70, 0x48, 0xca, 0x85, 0x53, 0xe2, 0xcd, 0x2e, 0x45, 0x7f, 0xeb, 0x98, 0x21, 0x95, 0xfa, 0xa9, 0x8a, 0x6b, 0x3e, 0x56, 0x82, 0x4e, 0x16, 0xf6, 0xab, 0x6e, 0xfd, 0x7c, 0x96, 0xf1, 0x15, 0xab, 0x50, 0x80, 0x19, 0xbb, 0x46, 0x98, 0x18, 0x58, 0x4e, 0x98, 0xc5, 0x58, 0x23, 0x41, 0x89, 0xeb, 0xb9, 0x21, 0x74, 0x56, 0xeb, 0xfe, 0x68, 0x5e, 0x79, 0xde, 0x12, 0x07, 0xfb, 0xfa, 0x13, 0xe3, 0x44, 0x33, 0xfb, 0x22, 0xa7, 0x83, 0x37, 0xf0, 0x9f, 0xf8, 0xd7, 0xc2, 0xab, 0x6e, 0x2b, 0x51, 0xda, 0x47, 0xe0, 0x3b, 0x3f, 0xdb, 0x2a, 0x4a, 0x22, 0xb4, 0xfb, 0xa0, 0x32, 0xb6, 0x9d, 0x37, 0xeb, 0x82, 0x3d, 0xbb, 0x2d, 0x8f, 0x13, 0xbf, 0x28, 0xe1, 0x0e, 0x01, 0x6f, 0x7c, 0x6e, 0x52, 0x78, 0x88, 0xb5, 0xf3, 0x28, 0x51, 0x9c, 0x07, 0x1b, 0x29, 0x60, 0xda, 0x27, 0x56, 0xe1, 0x88, 0x97, 0x1c, 0xf3, 0x1d, 0x64, 0x28, 0x14, 0xf6, 0xf7, 0x29, 0x53, 0x95, 0x9a, 0x1e, 0x51, 0x75, 0x03, 0xbd, 0x1f, 0x26, 0x92, 0xda, 0x85, 0x52, 0x71, 0x15, 0x9d, 0x7e, 0xa4, 0x7e, 0xc2, 0xd1, 0xcd, 0xb4, 0x56, 0xb3, 0x9a, 0x92, 0x0c, 0x4c, 0x0e, 0x40, 0x8d, 0xf3, 0x4d, 0xb9, 0x49, 0x6f, 0x55, 0xc6, 0xb9, 0xf5, 0x1a, ])] .into(), vec![ Subpacket::regular(SubpacketData::SignatureCreationTime( DateTime::parse_from_rfc3339("2014-06-06T15:57:41Z") .expect("failed to parse static time") .with_timezone(&Utc), )), Subpacket::regular(SubpacketData::KeyFlags(key_flags.clone())), Subpacket::regular(SubpacketData::PreferredSymmetricAlgorithms( p_sym_algs.clone(), )), Subpacket::regular(SubpacketData::PreferredHashAlgorithms(p_hash_algs.clone())), Subpacket::regular(SubpacketData::PreferredCompressionAlgorithms( p_com_algs.clone(), )), Subpacket::regular(SubpacketData::Features(smallvec![1])), Subpacket::regular(SubpacketData::KeyServerPreferences(smallvec![128])), ], vec![issuer.clone()], ); let u1 = SignedUser::new( UserId::from_str(Version::Old, "john doe (test) "), vec![sig1], ); let sig2 = Signature::v4( Version::Old, SignatureType::CertPositive, PublicKeyAlgorithm::RSA, HashAlgorithm::SHA1, [0xca, 0x6c], vec![Mpi::from_raw(vec![ 0x49, 0xa0, 0xb5, 0x41, 0xbd, 0x33, 0xa8, 0xda, 0xda, 0x6e, 0xb1, 0xe5, 0x28, 0x74, 0x18, 0xee, 0x39, 0xc8, 0x8d, 0xfd, 0x39, 0xe8, 0x3b, 0x09, 0xdc, 0x9d, 0x04, 0x91, 0x5d, 0x66, 0xb8, 0x1d, 0x04, 0x0a, 0x90, 0xe7, 0xa6, 0x84, 0x9b, 0xb1, 0x06, 0x4f, 0x3f, 0xaa, 0xc5, 0x64, 0x53, 0xf8, 0xaf, 0xe1, 0xaa, 0x6f, 0xba, 0x9d, 0xd4, 0xa0, 0x58, 0xc4, 0x39, 0x39, 0xee, 0xb6, 0xcd, 0x7d, 0xd4, 0x04, 0xab, 0xa2, 0x30, 0x3d, 0xab, 0xf5, 0xb1, 0x2c, 0x28, 0xa7, 0xd7, 0xba, 0x59, 0x0c, 0xe9, 0xa2, 0xe9, 0x40, 0x76, 0xcd, 0xce, 0xf5, 0x77, 0x7d, 0xf5, 0x0c, 0x90, 0x8b, 0x13, 0x44, 0xb4, 0xe1, 0x1d, 0xf2, 0x41, 0x71, 0xd6, 0xb0, 0x90, 0xed, 0x97, 0x5c, 0x6b, 0x60, 0x4b, 0xb6, 0xda, 0xb4, 0x19, 0xb5, 0x26, 0x35, 0xbe, 0xed, 0xda, 0x6e, 0x14, 0x91, 0x77, 0x76, 0x52, 0x78, 0xbb, 0xe1, 0xfa, 0x25, 0x34, 0xcb, 0x55, 0x0a, 0x25, 0x61, 0x43, 0x3a, 0x45, 0xae, 0x6b, 0xe9, 0x26, 0xa8, 0x56, 0x62, 0xd4, 0x27, 0x1f, 0xb7, 0x6c, 0xdc, 0xd6, 0x3c, 0x2c, 0x52, 0x6c, 0xae, 0x84, 0x9b, 0xc1, 0x30, 0x15, 0xe8, 0xa1, 0x69, 0x33, 0x9d, 0xe1, 0x3d, 0xba, 0x6f, 0x34, 0xa7, 0x65, 0x98, 0x86, 0x81, 0x7c, 0x08, 0x9c, 0x6a, 0xb7, 0x39, 0x93, 0xe7, 0x93, 0x43, 0x08, 0x83, 0xea, 0x43, 0x95, 0xf2, 0x6c, 0x16, 0x02, 0x1b, 0xb9, 0xbb, 0xe5, 0x69, 0xf1, 0x6a, 0xd0, 0xc5, 0xa6, 0x77, 0x33, 0x42, 0xe1, 0x40, 0x01, 0x2a, 0x92, 0x9d, 0x27, 0xb3, 0x75, 0x2d, 0x67, 0xd4, 0xec, 0x77, 0xc5, 0xaa, 0x49, 0xe3, 0x62, 0x9d, 0x92, 0xaa, 0x74, 0x38, 0xec, 0x72, 0x3c, 0x54, 0x3d, 0xa9, 0x9e, 0x52, 0x6e, 0x58, 0xd5, 0x22, 0x3c, 0x40, 0xaf, 0xc8, 0x25, 0xda, 0x5f, 0x6b, 0xb8, 0x63, 0x43, 0x1d, 0x2d, 0x6c, 0x14, 0x9a, 0xe4, 0x7c, 0xce, 0xc7, 0x27, 0x1f, 0xc2, 0x77, 0xc0, 0x6e, 0x10, 0xfb, 0x79, 0x8b, 0x2e, 0x5a, 0x25, 0x4e, 0x60, 0x41, 0xbb, 0xcf, 0x08, 0x92, 0x24, 0x98, 0x58, 0xec, 0xc5, 0xcc, 0xd5, 0x61, 0xe0, 0x86, 0x3b, 0x9d, 0xad, 0x00, 0x58, 0x81, 0x33, 0x10, 0x17, 0x35, 0x5c, 0x10, 0x66, 0x2b, 0x0d, 0x36, 0x18, 0x76, 0x92, 0x7b, 0xd4, 0xe9, 0x40, 0x22, 0x92, 0x69, 0xea, 0xc3, 0x8f, 0xf2, 0x45, 0x36, 0xa3, 0xa5, 0x70, 0xcd, 0xb9, 0xc2, 0x09, 0x02, 0x4b, 0x3f, 0xa1, 0x78, 0x54, 0xc1, 0xc3, 0xfd, 0xec, 0x97, 0x80, 0xac, 0x4a, 0x83, 0x45, 0x35, 0x0d, 0x6d, 0x73, 0xb8, 0xe9, 0xa0, 0xf0, 0x44, 0x47, 0xa9, 0xd2, 0xb9, 0x25, 0xd1, 0xb2, 0xda, 0xcb, 0x7a, 0x63, 0x2f, 0x46, 0xaf, 0x3e, 0x61, 0x11, 0xfc, 0xe1, 0xfd, 0x88, 0xb4, 0xdb, 0x69, 0xd1, 0x19, 0x3f, 0x48, 0x67, 0x2a, 0xe6, 0xf2, 0x4d, 0x1a, 0xdd, 0x8d, 0xab, 0xd1, 0x79, 0x12, 0xee, 0xb3, 0x21, 0xe8, 0x91, 0xdb, 0x91, 0x47, 0xab, 0x0c, 0x5b, 0x68, 0x60, 0x1a, 0x05, 0x4d, 0xe0, 0xe8, 0x66, 0x63, 0x3d, 0xe9, 0x35, 0xb0, 0x94, 0x66, 0x01, 0x5f, 0x21, 0x1a, 0x74, 0xc6, 0x43, 0xce, 0xc1, 0xf8, 0x96, 0x51, 0x76, 0x20, 0xaa, 0x7b, 0x6e, 0xf0, 0x86, 0x47, 0x41, 0x3c, 0x8a, 0xb1, 0x27, 0x07, 0x20, 0x34, 0xa7, 0xe7, 0x4a, 0x50, 0xed, 0x25, 0xf2, 0xaf, 0xa6, 0x94, 0x72, 0xde, 0x0f, 0x43, 0x74, 0x22, 0x6d, 0x02, 0x7b, 0x6f, 0x5a, 0xe8, 0x4a, 0x93, 0x98, 0xf3, 0xe2, 0xdb, 0xbc, 0x9f, 0xb1, 0x83, 0x92, 0x8b, 0xba, 0x8b, 0xe0, 0xe4, 0x6b, 0x77, 0x0f, 0x35, 0xcb, 0x3f, 0x3e, 0xf5, 0x98, 0x37, 0x99, 0xed, 0x79, 0xd8, 0x76, 0xdf, 0x13, 0x9e, ])] .into(), vec![ Subpacket::regular(SubpacketData::SignatureCreationTime( DateTime::parse_from_rfc3339("2014-06-06T16:21:46Z") .expect("failed to parse static time") .with_timezone(&Utc), )), Subpacket::regular(SubpacketData::KeyFlags(key_flags.clone())), Subpacket::regular(SubpacketData::PreferredSymmetricAlgorithms( p_sym_algs.clone(), )), Subpacket::regular(SubpacketData::PreferredHashAlgorithms(p_hash_algs.clone())), Subpacket::regular(SubpacketData::PreferredCompressionAlgorithms( p_com_algs.clone(), )), Subpacket::regular(SubpacketData::Features(smallvec![1])), Subpacket::regular(SubpacketData::KeyServerPreferences(smallvec![128])), ], vec![issuer.clone()], ); let u2 = SignedUser::new( UserId::from_str(Version::Old, "john doe "), vec![sig2], ); assert_eq!(key.details.users.len(), 2); assert_eq!(key.details.users[0], u1); assert_eq!(key.details.users[1], u2); assert_eq!(key.details.user_attributes.len(), 1); let ua = &key.details.user_attributes[0]; match ua.attr { UserAttribute::Image { ref data, .. } => { assert_eq!(data.len(), 1156); } _ => panic!("not here"), } let sig3 = Signature::v4( Version::Old, SignatureType::CertPositive, PublicKeyAlgorithm::RSA, HashAlgorithm::SHA1, [0x02, 0x0c], vec![Mpi::from_raw(vec![ 0x5b, 0x4b, 0xeb, 0xff, 0x1a, 0x89, 0xc2, 0xe1, 0x80, 0x20, 0x26, 0x3b, 0xf4, 0x4d, 0x2d, 0x46, 0xba, 0x96, 0x78, 0xb2, 0x88, 0xf8, 0xf9, 0xd5, 0xf1, 0x5f, 0x7d, 0x45, 0xeb, 0xbc, 0x25, 0x2e, 0x1b, 0x2f, 0x8e, 0xd4, 0xa9, 0x6e, 0x64, 0xfa, 0x97, 0x09, 0xab, 0xd2, 0xab, 0x50, 0x04, 0x09, 0xa9, 0x33, 0x62, 0x00, 0xb8, 0x38, 0xf5, 0x53, 0xb8, 0xe9, 0x43, 0xed, 0x59, 0x7f, 0x2f, 0xf9, 0x8f, 0xc7, 0xe1, 0xbb, 0x78, 0xdc, 0xec, 0x12, 0x1a, 0xec, 0x17, 0x52, 0x86, 0xba, 0x2a, 0x1f, 0xd5, 0x2a, 0x99, 0x63, 0x1c, 0x2f, 0x28, 0xa1, 0xb2, 0x9c, 0xb9, 0x76, 0x06, 0x06, 0x28, 0xc6, 0xe9, 0xbf, 0xdb, 0x36, 0x87, 0xbe, 0x9e, 0xc7, 0x74, 0x7d, 0x4d, 0x5b, 0x10, 0x5c, 0x46, 0x65, 0x20, 0x76, 0x0b, 0x5c, 0xc3, 0xe8, 0xe1, 0x55, 0xbb, 0xaf, 0x94, 0x6f, 0x44, 0x92, 0xd5, 0xb5, 0x87, 0xc0, 0x42, 0x77, 0x5e, 0xc2, 0x04, 0x7e, 0x3d, 0x32, 0x60, 0x0f, 0x26, 0x5c, 0x71, 0xd9, 0xaa, 0xa3, 0x2f, 0xe0, 0x65, 0xd3, 0xd2, 0xd0, 0x3e, 0x72, 0xd3, 0x7c, 0xbe, 0x71, 0x94, 0xc3, 0xb5, 0x52, 0x1a, 0x9f, 0x72, 0x06, 0xb0, 0x0f, 0xc9, 0xbb, 0x8a, 0xf3, 0xcf, 0xf6, 0x09, 0xd7, 0x63, 0x3d, 0x6b, 0x7c, 0xbc, 0x8b, 0x05, 0x01, 0x1f, 0x22, 0x31, 0xf9, 0x8e, 0x53, 0xc8, 0xb8, 0x7b, 0x9e, 0x96, 0xc2, 0xe5, 0x09, 0xac, 0xa5, 0xf4, 0xb8, 0xdb, 0xea, 0xdd, 0x79, 0x44, 0x17, 0x57, 0xa9, 0x4d, 0xf5, 0xb9, 0x34, 0xcd, 0xc1, 0x3f, 0xeb, 0xe3, 0x6a, 0x80, 0x5c, 0xac, 0x83, 0xcc, 0xf4, 0x7c, 0xbf, 0xac, 0xfd, 0x29, 0xee, 0x1f, 0x34, 0xc0, 0x4a, 0x08, 0x10, 0x24, 0xe7, 0x04, 0x25, 0x3a, 0x7f, 0xff, 0x4b, 0x64, 0xc1, 0xf9, 0x7e, 0xc1, 0xb3, 0xc1, 0x25, 0x0f, 0xf1, 0xb1, 0xf2, 0x66, 0x8d, 0x22, 0x8b, 0x56, 0x6f, 0x51, 0xf2, 0xe4, 0x91, 0x5f, 0xc8, 0xc3, 0x55, 0xa2, 0xc8, 0x08, 0x1e, 0xd8, 0x4f, 0x07, 0x69, 0x25, 0xb1, 0x96, 0xbb, 0x23, 0xe8, 0x7c, 0x5b, 0x4e, 0xe6, 0x0b, 0x32, 0x2b, 0x34, 0xc1, 0x71, 0xee, 0x52, 0xbd, 0xf4, 0xf1, 0x67, 0x98, 0x57, 0xeb, 0x01, 0x32, 0x01, 0x74, 0x49, 0xe5, 0xab, 0xfc, 0x79, 0xfe, 0x8a, 0x7c, 0xad, 0x95, 0xc9, 0xc2, 0x60, 0x81, 0x2b, 0xf3, 0x45, 0x4b, 0x0b, 0xd0, 0xf4, 0xb1, 0x51, 0x75, 0x94, 0xe4, 0x6e, 0xf0, 0x00, 0xb5, 0x51, 0xbd, 0x86, 0x74, 0xdb, 0xbe, 0xb9, 0xaa, 0x06, 0x70, 0x2a, 0xd9, 0x6d, 0x69, 0x9f, 0xf1, 0x9a, 0x17, 0x64, 0xdd, 0x8e, 0xb4, 0xf8, 0x1a, 0x5a, 0xbe, 0xdd, 0x0d, 0x78, 0x9d, 0x8c, 0x16, 0x7d, 0x99, 0xa6, 0xaf, 0xc5, 0x04, 0x3e, 0xd7, 0x35, 0xe8, 0x1a, 0xc2, 0x6a, 0xce, 0x51, 0x38, 0x9a, 0x4c, 0x9c, 0x8b, 0xc3, 0xaa, 0x48, 0x94, 0xda, 0x03, 0xae, 0xca, 0x93, 0x94, 0x70, 0x1a, 0x76, 0x02, 0x0d, 0x21, 0x42, 0xe5, 0x7b, 0x9b, 0x4e, 0x59, 0x06, 0xd8, 0x72, 0xeb, 0xfe, 0x8d, 0x30, 0xfc, 0x77, 0x67, 0x0c, 0x01, 0x46, 0xcf, 0x24, 0x19, 0x9c, 0x63, 0xe3, 0x8f, 0x35, 0xc9, 0x53, 0x0c, 0x70, 0x55, 0x03, 0x3d, 0x67, 0x32, 0xfb, 0x86, 0xd0, 0x8b, 0x61, 0x7f, 0x6f, 0xd4, 0xbc, 0xfd, 0xd6, 0x08, 0x4b, 0xee, 0xa1, 0x0c, 0x6c, 0x84, 0x3b, 0xe1, 0xa8, 0x24, 0x87, 0x17, 0xa8, 0x67, 0xba, 0x03, 0xe7, 0xf7, 0xbb, 0xb4, 0x3d, 0xbb, 0xa0, 0x5e, 0x76, 0xd6, 0x01, 0xe1, 0xa4, 0x9a, 0x14, 0x43, 0xcd, 0x99, 0xa0, 0x2e, 0xa2, 0xda, 0x81, 0xe2, 0x9c, 0xab, 0x22, 0x41, 0x02, 0xcc, 0x2f, 0xca, 0xc5, 0xf7, 0x26, 0x65, 0x7d, 0x0b, 0xcc, 0xab, 0x26, ])] .into(), vec![ Subpacket::regular(SubpacketData::SignatureCreationTime( DateTime::parse_from_rfc3339("2014-06-06T16:05:43Z") .expect("failed to parse static time") .with_timezone(&Utc), )), Subpacket::regular(SubpacketData::KeyFlags(key_flags)), Subpacket::regular(SubpacketData::PreferredSymmetricAlgorithms(p_sym_algs)), Subpacket::regular(SubpacketData::PreferredHashAlgorithms(p_hash_algs)), Subpacket::regular(SubpacketData::PreferredCompressionAlgorithms(p_com_algs)), Subpacket::regular(SubpacketData::Features(smallvec![1])), Subpacket::regular(SubpacketData::KeyServerPreferences(smallvec![128])), ], vec![issuer], ); assert_eq!(ua.signatures, vec![sig3]); } #[test] fn encrypted_private_key() { let p = Path::new("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc"); let mut file = read_file(p.to_path_buf()); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); let input = ::std::str::from_utf8(buf.as_slice()).expect("failed to convert to string"); let (key, _headers) = SignedSecretKey::from_string(input).expect("failed to parse key"); key.verify().expect("invalid key"); let pub_key = key.public_key(); assert_eq!(pub_key.key_id(), key.key_id()); let pp = key.primary_key.secret_params().clone(); match pp { SecretParams::Plain(_) => panic!("should be encrypted"), SecretParams::Encrypted(pp) => { let S2kParams::Cfb { sym_alg, s2k, iv } = pp.string_to_key_params() else { panic!("unexpected s2k param: {:?}", pp); }; assert_eq!( iv, &hex::decode("2271f718af70d3bd9d60c2aed9469b67").unwrap()[..] ); match s2k { StringToKey::IteratedAndSalted { hash_alg, salt, count, } => { assert_eq!(*hash_alg, HashAlgorithm::SHA2_256); assert_eq!(salt, &hex::decode("CB18E77884F2F055").unwrap()[..]); assert_eq!(*count, 96u8); // This is an encoded iteration count } s => panic!("unexpected s2k type {:?}", s), } assert_eq!(sym_alg, &SymmetricKeyAlgorithm::AES128); } } key.unlock( || "test".to_string(), |k| { info!("{:?}", k); match k { SecretKeyRepr::RSA(k) => { assert_eq!(k.e().to_bytes_be(), hex::decode("010001").unwrap().to_vec()); assert_eq!(k.n().to_bytes_be(), hex::decode("9AF89C08A8EA84B5363268BAC8A06821194163CBCEEED2D921F5F3BDD192528911C7B1E515DCE8865409E161DBBBD8A4688C56C1E7DFCF639D9623E3175B1BCA86B1D12AE4E4FBF9A5B7D5493F468DA744F4ACFC4D13AD2D83398FFC20D7DF02DF82F3BC05F92EDC41B3C478638A053726586AAAC57E2B66C04F9775716A0C71").unwrap().to_vec()); assert_eq!(k.d().to_bytes_be(), hex::decode("33DE47E3421E1442CE9BFA9FA1ACC68D657594604FA7719CC91817F78D604B0DA38CD206D9D571621C589E3DF19CA2BB0C5F045EAC2C25AEB2BCE0D00E2E29538F8239F8A499EAF872497809E524A9EDA88E7ECEE78DF722E33DD62C9E204FE0F90DCF6F4247D1F7C8CE3BB3F0A4BAB23CFD95D41BC8A39C22C99D5BC38BC51D").unwrap().to_vec()); assert_eq!(k.primes()[0].to_bytes_be(), hex::decode("C62B8CD033331BFF171188C483B5B87E41A84415A004A83A4109014A671A5A3DA0A467CDB786F0BB75354245DA0DFFF53B6E25A44E28CBFF8CC1AC58A968AF57").unwrap().to_vec()); assert_eq!(k.primes()[1].to_bytes_be(), hex::decode("C831D89F49E642383C115413B2CB5F6EC09012B50C1E8596877E8F7B88C82C8F14FC354C21B6032BEF78B3C5EC92E434BEB2436B12C7C9FEDEFD866678DBED77").unwrap().to_vec()); } _ => panic!("wrong key format"), } Ok(()) }, ).unwrap(); } fn get_test_fingerprint(filename: &str) -> (serde_json::Value, SignedPublicKey) { let mut asc = read_file( Path::new(&format!( "./tests/openpgp-interop/testcases/keys/{filename}.asc" )) .to_path_buf(), ); let json_file = read_file( Path::new(&format!( "./tests/openpgp-interop/testcases/keys/{filename}.json" )) .to_path_buf(), ); let mut asc_string = String::new(); asc.read_to_string(&mut asc_string).unwrap(); let (key, _headers) = SignedPublicKey::from_string(&asc_string).unwrap(); let json: serde_json::Value = serde_json::from_reader(json_file).unwrap(); (json, key) } #[test] fn test_fingerprint_rsa() { let (json, key) = get_test_fingerprint("gnupg-v1-003"); assert_eq!( json["expected_fingerprint"], hex::encode(key.fingerprint().as_bytes()) ); key.verify().expect("invalid key"); } #[test] fn test_fingerprint_dsa() { let (json, key) = get_test_fingerprint("gnupg-v1-001"); assert_eq!( json["expected_fingerprint"], hex::encode(key.fingerprint().as_bytes()) ); } #[test] fn test_fingerprint_ecdsa() { let (json, key) = get_test_fingerprint("e2e-001"); assert_eq!( json["expected_fingerprint"], hex::encode(key.fingerprint().as_bytes()) ); // TODO: signature mismatch // key.verify().expect("invalid key"); } #[test] fn test_fingerprint_ecdh() { let (json, key) = get_test_fingerprint("gnupg-v1-001"); key.verify().expect("invalid key"); assert_eq!( json["expected_subkeys"].as_array().unwrap()[0] .as_object() .unwrap()["expected_fingerprint"], hex::encode(key.public_subkeys[0].key.fingerprint().as_bytes()) ); } #[test] fn test_fingerprint_elgamel() { let (json, key) = get_test_fingerprint("gnupg-v1-001"); assert_eq!( json["expected_subkeys"].as_array().unwrap()[0] .as_object() .unwrap()["expected_fingerprint"], hex::encode(key.public_subkeys[0].key.fingerprint().as_bytes()) ); } fn test_parse_openpgp_key(key: &str, verify: bool, match_raw: bool, pw: &'static str) { let _ = pretty_env_logger::try_init(); let f = read_file(Path::new("./tests/openpgp/").join(key)); let (pk, headers) = from_armor_many(f).unwrap(); let pk: Vec = pk.collect::>().unwrap(); assert!(!pk.is_empty(), "no keys found"); if match_raw { let mut f = read_file(Path::new("./tests/openpgp/").join(key)); let mut orig = String::new(); f.read_to_string(&mut orig).unwrap(); // strip any additional metadata if let Some(pos) = orig.find("----") { orig = orig[pos..].into(); } { let mut dearmor = armor::Dearmor::new(BufReader::new(orig.as_bytes())); let mut orig = Vec::new(); dearmor.read_to_end(&mut orig).unwrap(); let ser = pk.to_bytes().unwrap(); assert_eq!(hex::encode(orig), hex::encode(ser)); } let mut ser = Vec::new(); let typ = match pk[0] { PublicOrSecret::Public(_) => armor::BlockType::PublicKey, PublicOrSecret::Secret(_) => armor::BlockType::PrivateKey, }; armor::write(&pk, typ, &mut ser, Some(&headers), true).unwrap(); let ser_str = std::str::from_utf8(&ser).unwrap(); // normalize line endings let orig = orig.replace("\r\n", "\n").replace('\r', "\n"); let ser_str = ser_str .to_string() .replace("\r\n", "\n") .replace('\r', "\n"); assert_eq!(orig, ser_str); } for parsed in pk { // serialize and check we get the same thing let serialized = parsed.to_armored_bytes(Some(&headers).into()).unwrap(); // println!("{}", ::std::str::from_utf8(&serialized).unwrap()); // and parse them again let (iter2, headers2) = from_armor_many(&serialized[..]).expect("failed to parse round2"); assert_eq!(headers, headers2); assert_eq!(iter2.count(), 1); if verify { parsed.verify().expect("invalid key"); match parsed { PublicOrSecret::Secret(sec) => { sec.unlock(|| pw.to_string(), |_| Ok(())).unwrap(); } PublicOrSecret::Public(_) => { // Nothing todo } } } // assert_eq!(&parsed, parsed2[0].as_ref().unwrap()); } } fn test_parse_openpgp_key_bin(key: &str, verify: bool) { let f = read_file(Path::new("./tests/openpgp/").join(key)); let pk = from_bytes_many(f); for key in pk { let parsed = key.expect("failed to parse key"); if verify { parsed.verify().expect("invalid key"); } // serialize and check we get the same thing let serialized = parsed.to_armored_bytes(None.into()).unwrap(); // and parse them again let parsed2 = from_armor_many(&serialized[..]) .expect("failed to parse round2") .0 .collect::>(); assert_eq!(parsed2.len(), 1); assert_eq!(&parsed, parsed2[0].as_ref().unwrap()); } } macro_rules! openpgp_key_bin { ($name:ident, $path:expr, $verify:expr) => { #[test] fn $name() { test_parse_openpgp_key_bin($path, $verify); } }; } macro_rules! openpgp_key { ($name:ident, $path:expr, $verify:expr, $match_raw:expr) => { #[test] fn $name() { test_parse_openpgp_key($path, $verify, $match_raw, ""); } }; ($name:ident, $path:expr, $verify:expr, $match_raw:expr, $pw:expr) => { #[test] fn $name() { test_parse_openpgp_key($path, $verify, $match_raw, $pw); } }; } openpgp_key!( key_openpgp_samplekeys_e6, "samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_authenticate_only_pub, "samplekeys/authenticate-only.pub.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_authenticate_only_sec, "samplekeys/authenticate-only.sec.asc", false, // secret unlocking doesn't work true, "" ); openpgp_key!( key_openpgp_samplekeys_dda252ebb8ebe1af_1, "samplekeys/dda252ebb8ebe1af-1.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_dda252ebb8ebe1af_2, "samplekeys/dda252ebb8ebe1af-2.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_e2e_p256_1_clr, "samplekeys/e2e-p256-1-clr.asc", false, // signature mismatch false // packet lengths are not minimally encoded ); openpgp_key!( key_openpgp_samplekeys_e2e_p256_1_prt, "samplekeys/e2e-p256-1-prt.asc", false, // signature mismatch false, // packet lengths are not minimally encoded "a" ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_1_pub, "samplekeys/ecc-sample-1-pub.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_1_sec, "samplekeys/ecc-sample-1-sec.asc", true, true, "ecc" ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_2_pub, "samplekeys/ecc-sample-2-pub.asc", true, false // packet lengths are not minimally encoded ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_2_sec, "samplekeys/ecc-sample-2-sec.asc", true, false, // unsigned subkey & userid "ecc" ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_3_pub, "samplekeys/ecc-sample-3-pub.asc", false, // ECDSA P521 is not yet supported false // packet lengths are not minimally encoded ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_3_sec, "samplekeys/ecc-sample-3-sec.asc", false, // ECDSA P521 is not supported yet false, // unsigned subkey & userid "ecc" ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_4_pub, "samplekeys/ecc-sample-4-pub.asc", true, false ); openpgp_key!( key_openpgp_samplekeys_ecc_sample_4_sec, "samplekeys/ecc-sample-4-sec.asc", true, false, "ecc" ); openpgp_key!( key_openpgp_samplekeys_ed25519_cv25519_sample_1, "samplekeys/ed25519-cv25519-sample-1.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_eddsa_sample_1_pub, "samplekeys/eddsa-sample-1-pub.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_eddsa_sample_1_sec, "samplekeys/eddsa-sample-1-sec.asc", true, true, "abc" ); openpgp_key!( key_openpgp_samplekeys_issue2346, "samplekeys/issue2346.gpg", true, true ); openpgp_key_bin!( key_openpgp_samplekeys_no_creation_time, "samplekeys/no-creation-time.gpg", false ); openpgp_key!( key_openpgp_samplekeys_rsa_primary_auth_only_pub, "samplekeys/rsa-primary-auth-only.pub.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_rsa_primary_auth_only_sec, "samplekeys/rsa-primary-auth-only.sec.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_rsa_rsa_sample_1, "samplekeys/rsa-rsa-sample-1.asc", true, true, "ecc" ); openpgp_key!( key_openpgp_samplekeys_silent_running, "samplekeys/silent-running.asc", true, true ); openpgp_key!( key_openpgp_samplekeys_leading_marker, "samplekeys/alice-marker.sec.asc", true, false // marker packet gets dropped during parsing ); // PKCS#1 // openpgp_key!(key_openpgp_samplekeys_ssh_dsa, "samplekeys/ssh-dsa.key", true); // PKCS#1 // openpgp_key!(key_openpgp_samplekeys_ssh_ecdsa, "samplekeys/ssh-ecdsa.key", true); // OpenSSH // openpgp_key!( // key_openpgp_samplekeys_ssh_ed25519, // "samplekeys/ssh-ed25519.key", // true // ); // PKCS#1 // openpgp_key!(key_openpgp_samplekeys_ssh_rsa, "samplekeys/ssh-rsa.key", true); openpgp_key!( key_openpgp_samplekeys_whats_new_in_2_1, "samplekeys/whats-new-in-2.1.asc", false, // Key ID mismatch true ); #[test] fn private_ecc1_verify() { let f = read_file("./tests/openpgp/samplekeys/ecc-sample-1-sec.asc"); let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 1); assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "0BA52DF0BAA59D9C",); sk.unlock( || "ecc".to_string(), |k| { match k { SecretKeyRepr::ECDSA(ref inner_key) => { assert!(matches!(inner_key, ECDSASecretKey::P256(_))); } _ => panic!("invalid key"), } Ok(()) }, ) .unwrap(); let pub_key = sk.public_key(); assert_eq!(pub_key.key_id(), sk.key_id()); } #[test] fn private_ecc2_verify() { let f = read_file("./tests/openpgp/samplekeys/ecc-sample-2-sec.asc"); let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 0); assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "098033880F54719F",); sk.unlock( || "ecc".to_string(), |k| { match k { SecretKeyRepr::ECDSA(ref inner_key) => { assert!(matches!(inner_key, ECDSASecretKey::P384(_))); } _ => panic!("invalid key"), } Ok(()) }, ) .unwrap(); /* * No user IDs, getting public key fails let pub_key = sk.public_key(); assert_eq!(pub_key.key_id(), sk.key_id()); */ } #[test] fn private_ecc3_verify() { let f = read_file("./tests/openpgp/samplekeys/ecc-sample-4-sec.asc"); let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 1); assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "E15A9BB15A23A43F",); sk.unlock( || "ecc".to_string(), |k| { match k { SecretKeyRepr::ECDSA(ref inner_key) => { assert!(matches!(inner_key, ECDSASecretKey::Secp256k1(_))); } _ => panic!("invalid key"), } Ok(()) }, ) .unwrap(); let pub_key = sk.public_key(); assert_eq!(pub_key.key_id(), sk.key_id()); } #[test] fn private_x25519_verify() { let f = read_file("./tests/openpgpjs/x25519.sec.asc"); let (sk, _headers) = SignedSecretKey::from_armor_single(f).expect("failed to parse key"); sk.verify().expect("invalid key"); assert_eq!(sk.secret_subkeys.len(), 1); assert_eq!(hex::encode(sk.key_id()).to_uppercase(), "F25E5F24BB372CFA",); sk.unlock( || "moon".to_string(), |k| { match k { SecretKeyRepr::EdDSA(ref inner_key) => { assert_eq!(inner_key.oid, ECCCurve::Ed25519.oid()); } _ => panic!("invalid key"), } Ok(()) }, ) .unwrap(); let pub_key = sk.public_key(); assert_eq!(pub_key.key_id(), sk.key_id()); } #[test] fn pub_x25519_little_verify() { let f = read_file("./tests/openpgpjs/x25519-little.pub.asc"); let (pk, _headers) = SignedPublicKey::from_armor_single(f).expect("failed to parse key"); pk.verify().expect("invalid key"); assert_eq!(pk.public_subkeys.len(), 1); assert_eq!(hex::encode(pk.key_id()).to_uppercase(), "C062C165CA61C215",); assert_eq!( hex::encode(pk.public_subkeys[0].key_id()).to_uppercase(), "A586D1DD06BD97BC", ); assert_eq!(pk.details.users.len(), 1); assert_eq!(pk.details.users[0].id.id(), "Hi "); } macro_rules! autocrypt_key { ($name:ident, $path:expr, $unlock:expr,) => { #[test] fn $name() { test_parse_autocrypt_key($path, $unlock); } }; } fn test_parse_autocrypt_key(key: &str, unlock: bool) { let _ = pretty_env_logger::try_init(); let f = read_file(Path::new("./tests/autocrypt/").join(key)); let (pk, _headers) = from_armor_many(f).unwrap(); for key in pk { let parsed = key.expect("failed to parse key"); parsed.verify().expect("invalid key"); if unlock { let sk: SignedSecretKey = parsed.clone().try_into().unwrap(); sk.unlock(|| "".to_string(), |_| Ok(())) .expect("failed to unlock key"); let pub_key = sk.public_key(); assert_eq!(pub_key.key_id(), sk.key_id()); } // serialize and check we get the same thing let serialized = parsed.to_armored_bytes(None.into()).unwrap(); println!("{}", ::std::str::from_utf8(&serialized).unwrap()); // and parse them again let parsed2 = from_armor_many(&serialized[..]) .expect("failed to parse round2") .0 .collect::>(); assert_eq!(parsed2.len(), 1); assert_eq!(&parsed, parsed2[0].as_ref().unwrap()); } } autocrypt_key!( key_autocrypt_alice_pub, "alice@autocrypt.example.pub.asc", false, ); autocrypt_key!( key_autocrypt_alice_sec, "alice@autocrypt.example.sec.asc", true, ); autocrypt_key!( key_autocrypt_bob_pub, "bob@autocrypt.example.pub.asc", false, ); autocrypt_key!(key_autocrypt_bob_sec, "bob@autocrypt.example.sec.asc", true,); autocrypt_key!( key_autocrypt_carol_pub, "carol@autocrypt.example.pub.asc", false, ); autocrypt_key!( key_autocrypt_carol_sec, "carol@autocrypt.example.sec.asc", true, ); #[test] fn test_invalid() { let v = (0..64).collect::>(); let k = SignedSecretKey::from_bytes(&v[..]); assert!(k.is_err()); } #[test] fn test_handle_incomplete_packets_end() { let _ = pretty_env_logger::try_init(); let p = Path::new("./tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc"); let mut file = read_file(p.to_path_buf()); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); let input = ::std::str::from_utf8(buf.as_slice()).expect("failed to convert to string"); let (key, _headers) = SignedSecretKey::from_string(input).expect("failed to parse key"); key.verify().expect("invalid key"); // add overflow of "b60ed7" let raw = hex::decode(hex::encode(key.to_bytes().unwrap()) + "b60ed7").unwrap(); let key = SignedSecretKey::from_bytes(&raw[..]).expect("failed"); key.verify().expect("invalid key"); } #[test] fn test_keyid_formatters() { let keyid = KeyId::from_slice(&[0x4C, 0x07, 0x3A, 0xE0, 0xC8, 0x44, 0x5C, 0x0C]).unwrap(); assert_eq!("4C073AE0C8445C0C", format!("{keyid:X}")); assert_eq!("4c073ae0c8445c0c", format!("{keyid:x}")); } #[test] #[ignore] fn test_encrypted_key() { let p = Path::new("./tests/key-with-password-123.asc"); let mut file = read_file(p.to_path_buf()); let mut rng = ChaChaRng::from_seed([0u8; 32]); let mut buf = vec![]; file.read_to_end(&mut buf).unwrap(); let input = ::std::str::from_utf8(buf.as_slice()).expect("failed to convert to string"); let (key, _headers) = SignedSecretKey::from_string(input).expect("failed to parse key"); key.verify().expect("invalid key"); let unsigned_pubkey = key.public_key(); // Incorrect password results in InvalidInput error. let res = unsigned_pubkey .clone() .sign(&mut rng, &key, || "".into()) .err() .unwrap(); assert!(matches!(res, pgp::errors::Error::InvalidInput)); let _signed_key = unsigned_pubkey .sign(&mut rng, &key, || "123".into()) .unwrap(); } pgp-0.15.0/tests/literal-text-signed.asc000064400000000000000000000004251046102023000162150ustar 00000000000000-----BEGIN PGP MESSAGE----- owGbwMvMyCH2yTCUx9/9cR/jabkSzozUnJx8vZKKkpj25IVgjkJ5flFOCi8XL1dH KQujGAeDrJgiy+vW3fGLrUofxk3xS4bpZ2UC6WHg4hSAiWx+xchw8+oD53sbLH7d 07xdIbrYMS4l/W2bqYr94bBixa51OqVLGP5X+XndX6jo7XzA2dLjzeHs70bz3GN3 a1+qmLT7e0hBRi8XAA== =8MwB -----END PGP MESSAGE----- pgp-0.15.0/tests/message_test.rs000064400000000000000000000344671046102023000147060ustar 00000000000000extern crate rand; #[macro_use] extern crate pretty_assertions; extern crate serde_json; #[macro_use] extern crate serde; extern crate pgp; extern crate pretty_env_logger; #[macro_use] extern crate log; use std::fs::File; use std::io::Read; use pgp::composed::{Deserializable, Message, SignedPublicKey, SignedSecretKey}; use pgp::types::PublicKeyTrait; #[derive(Serialize, Deserialize, Debug)] #[serde(rename_all = "camelCase")] struct Testcase { typ: Option, decrypt_key: String, passphrase: String, verify_key: Option, filename: Option, timestamp: Option, textcontent: Option, keyid: Option, } fn test_parse_msg(entry: &str, base_path: &str, is_normalized: bool) { let _ = pretty_env_logger::try_init(); // TODO: verify filename let n = format!("{base_path}/{entry}"); let mut file = File::open(&n).unwrap_or_else(|_| panic!("no file: {}", &n)); let details: Testcase = serde_json::from_reader(&mut file).unwrap(); info!( "Testcase: {}", serde_json::to_string_pretty(&details).unwrap() ); let mut decrypt_key_file = File::open(format!("{}/{}", base_path, details.decrypt_key)).unwrap(); let (decrypt_key, _headers) = SignedSecretKey::from_armor_single(&mut decrypt_key_file) .expect("failed to read decryption key"); decrypt_key.verify().expect("invalid decryption key"); let decrypt_id = hex::encode(decrypt_key.key_id()); info!("decrypt key (ID={})", &decrypt_id); if let Some(id) = &details.keyid { assert_eq!(id, &decrypt_id, "invalid keyid"); } let verify_key = if let Some(verify_key_str) = details.verify_key.clone() { let mut verify_key_file = File::open(format!("{base_path}/{verify_key_str}")).unwrap(); let (verify_key, _headers) = SignedPublicKey::from_armor_single(&mut verify_key_file) .expect("failed to read verification key"); verify_key.verify().expect("invalid verification key"); let verify_id = hex::encode(verify_key.key_id()); info!("verify key (ID={})", &verify_id); Some(verify_key) } else { None }; let file_name = entry.replace(".json", ".asc"); let cipher_file_path = format!("{base_path}/{file_name}"); let mut cipher_file = File::open(&cipher_file_path).unwrap(); let (message, headers) = Message::from_armor_single(&mut cipher_file).expect("failed to parse message"); info!("message: {:?}", &message); match &message { Message::Encrypted { .. } => { let (decrypted, ids) = message .decrypt(|| details.passphrase.clone(), &[&decrypt_key]) .expect("failed to init decryption"); assert_eq!(ids.len(), 1); if let Some(verify_key) = verify_key { decrypted .verify(&verify_key.primary_key) .expect("message verification failed"); } // serialize and check we get the same thing let serialized = decrypted.to_armored_bytes(None.into()).unwrap(); // and parse them again let (decrypted2, _headers) = Message::from_armor_single(&serialized[..]).expect("failed to parse round2"); assert_eq!(decrypted, decrypted2); let raw = match decrypted { Message::Literal(data) => data, Message::Compressed(data) => { let m = Message::from_bytes(data.decompress().unwrap()).unwrap(); // serialize and check we get the same thing let serialized = m.to_armored_bytes(None.into()).unwrap(); // and parse them again let (m2, _headers) = Message::from_armor_single(&serialized[..]) .expect("failed to parse round3"); assert_eq!(m, m2); m.get_literal().unwrap().clone() } _ => panic!("unexpected message type: {decrypted:?}"), }; assert_eq!( ::std::str::from_utf8(raw.data()).unwrap(), details.textcontent.unwrap_or_default() ); } Message::Signed { signature, .. } => { println!("signature: {signature:?}"); } _ => { // TODO: some other checks? panic!("this test should not have anything else?"); } } // serialize and check we get the same thing let serialized = message.to_armored_string(Some(&headers).into()).unwrap(); if is_normalized { let mut cipher_file = File::open(&cipher_file_path).unwrap(); let mut expected_bytes = String::new(); cipher_file.read_to_string(&mut expected_bytes).unwrap(); // normalize read in line endings to unix assert_eq!(serialized, expected_bytes.replace("\r\n", "\n")); } // and parse them again let (message2, headers2) = Message::from_armor_single(serialized.as_bytes()).expect("failed to parse round2"); assert_eq!(headers, headers2); assert_eq!(message, message2); } macro_rules! msg_test { ($name:ident, $pos:expr, $normalized:expr) => { #[test] fn $name() { test_parse_msg( &format!("{}.json", $pos), "./tests/openpgp-interop/testcases/messages", $normalized, ); } }; } // RSA msg_test!(msg_gnupg_v1_001, "gnupg-v1-001", false); // Elgamal // msg_test!(msg_gnupg_v1_002, "gnupg-v1-002", true); // RSA msg_test!(msg_gnupg_v1_003, "gnupg-v1-003", false); msg_test!(msg_gnupg_v1_4_11_001, "gnupg-v1-4-11-001", true); msg_test!(msg_gnupg_v1_4_11_002, "gnupg-v1-4-11-002", false); msg_test!(msg_gnupg_v1_4_11_003, "gnupg-v1-4-11-003", true); msg_test!(msg_gnupg_v1_4_11_004, "gnupg-v1-4-11-004", true); msg_test!(msg_gnupg_v1_4_11_005, "gnupg-v1-4-11-005", true); msg_test!(msg_gnupg_v1_4_11_006, "gnupg-v1-4-11-006", false); msg_test!(msg_gnupg_v2_0_17_001, "gnupg-v2-0-17-001", true); msg_test!(msg_gnupg_v2_0_17_002, "gnupg-v2-0-17-002", false); msg_test!(msg_gnupg_v2_0_17_003, "gnupg-v2-0-17-003", true); msg_test!(msg_gnupg_v2_0_17_004, "gnupg-v2-0-17-004", true); msg_test!(msg_gnupg_v2_0_17_005, "gnupg-v2-0-17-005", true); msg_test!(msg_gnupg_v2_0_17_006, "gnupg-v2-0-17-006", true); // parsing error // ECDH key - nist p256 // msg_test!(msg_gnupg_v2_1_5_001, "gnupg-v2-1-5-001", true); // parsing error // ECDH key - nist p384 // msg_test!(msg_gnupg_v2_1_5_002, "gnupg-v2-1-5-002", true); // parsing error // ECDH key - nist p512 // msg_test!(msg_gnupg_v2_1_5_003, "gnupg-v2-1-5-003", true); msg_test!(msg_gnupg_v2_10_001, "gnupg-v2-10-001", true); msg_test!(msg_gnupg_v2_10_002, "gnupg-v2-10-002", true); msg_test!(msg_gnupg_v2_10_003, "gnupg-v2-10-003", true); msg_test!(msg_gnupg_v2_10_004, "gnupg-v2-10-004", false); msg_test!(msg_gnupg_v2_10_005, "gnupg-v2-10-005", true); msg_test!(msg_gnupg_v2_10_006, "gnupg-v2-10-006", true); msg_test!(msg_gnupg_v2_10_007, "gnupg-v2-10-007", true); // ECDH // msg_test!(msg_e2e_001, "e2e-001", true); // ECDH // msg_test!(msg_e2e_002, "e2e-001", true); msg_test!(msg_pgp_10_0_001, "pgp-10-0-001", false); msg_test!(msg_pgp_10_0_002, "pgp-10-0-002", false); msg_test!(msg_pgp_10_0_003, "pgp-10-0-003", false); msg_test!(msg_pgp_10_0_004, "pgp-10-0-004", false); msg_test!(msg_pgp_10_0_005, "pgp-10-0-005", false); msg_test!(msg_pgp_10_0_006, "pgp-10-0-006", false); msg_test!(msg_pgp_10_0_007, "pgp-10-0-007", false); msg_test!(msg_camellia128_001, "camellia128-001", false); msg_test!(msg_camellia192_001, "camellia192-001", false); msg_test!(msg_camellia256_001, "camellia256-001", false); // ECDH // msg_test!(msg_openkeychain_001, "openkeychain-001", true); msg_test!(msg_openpgp_001, "openpgp-001", false); macro_rules! msg_test_js { ($name:ident, $pos:expr, $normalized:expr) => { #[test] fn $name() { test_parse_msg(&format!("{}.json", $pos), "./tests/openpgpjs", $normalized); } }; } msg_test_js!(msg_openpgpjs_x25519, "x25519", true); #[test] fn msg_partial_body_len() { let mut msg_file = File::open("./tests/partial.asc").unwrap(); Message::from_armor_single(&mut msg_file).expect("failed to parse message"); } #[test] fn msg_regression_01() { let mut msg_file = File::open("./tests/regression-01.asc").unwrap(); Message::from_armor_single(&mut msg_file).expect("failed to parse message"); } #[test] fn msg_large_indeterminate_len() { let _ = pretty_env_logger::try_init(); let mut msg_file = File::open("./tests/indeterminate.asc").unwrap(); let (message, _headers) = Message::from_armor_single(&mut msg_file).expect("failed to parse message"); let mut key_file = File::open("./tests/openpgpjs/x25519.sec.asc").unwrap(); let (decrypt_key, _headers) = SignedSecretKey::from_armor_single(&mut key_file).expect("failed to parse key"); let decrypted = message .decrypt(|| "moon".to_string(), &[&decrypt_key]) .expect("failed to decrypt message") .0; let raw = match decrypted { Message::Literal(data) => data, Message::Compressed(data) => { let m = Message::from_bytes(data.decompress().unwrap()).unwrap(); m.get_literal().unwrap().clone() } _ => panic!("unexpected message type: {decrypted:?}"), }; assert_eq!( ::std::str::from_utf8(raw.data()).unwrap(), "Content-Type: text/plain; charset=us-ascii Autocrypt-Gossip: addr=deltabot@codespeak.net; keydata= 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 I= Autocrypt-Gossip: addr=holger@merlinux.eu; keydata= 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 1CvHBWNRmnPMaFMeSpgJ test1 " ); } #[test] fn msg_literal_signature() { let (pkey, _) = SignedPublicKey::from_armor_single( File::open("./tests/autocrypt/alice@autocrypt.example.pub.asc").unwrap(), ) .unwrap(); let mut msg_file = File::open("./tests/literal-text-signed.asc").unwrap(); let (msg, _) = Message::from_armor_single(&mut msg_file).expect("failed to parse message"); msg.verify(&pkey).unwrap(); } pgp-0.15.0/tests/openpgp/4gb-packet.asc000064400000000000000000000115671046102023000157320ustar 00000000000000ฃBZh61AY&SYœ…ฝลฉv๗๛๊B@"˜D@@€  tU€๕0าชi hะ =DQE€(ข‹ (ข 6zqฯ ฮ8สQ“Uู้:=ฐ@ A2ฟ˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk&รXแ`Kศ จศ%$jA)#˜ ฌ“)ฌ› c…€u/ `@&ฃ ”‘ฉคŽb‚ฒLฆฒl5Žิผ€€@ašŒ‚RFค’9Š ษ2šษฐึ8XR๒A„j2 IJHๆ(+$สk88X` šฟL๗|๖๎พ[ีš4ฟ๛†?—๛ญWใฃง๛฿ ศม๖#3• 4@ zƒC&@H ำ#@ฉ‘  F‡‚Ojžีhะhdะศdฤฆ&††ƒ# zGข0ษˆ ƒ@1 กต#ก‚UM 4š€ b2ะ4 42 €hขAd $B้9œ‚5 ^/xE๏L•๑.+zืูw๎๘'6ี”>ฐำ |5yž’ืWฯธ-๒k๚ู~ข1ฟ„ภC#แ*3)n[ฤnM฿๕\ฐ„ย†X๘I๐y.ภ#~ŽนTยF5งเ‚เบ3H฿Sp 'ขf ว๑J์ZvNkฏ#์C'ัฏG-˜@pI‰7kุ09$œฒŽ~dฮROณํŒnWAล"ศ’Ni๗ๅฐBซmยะ‡bv฿ฏSมปxŸอปE)=๔จBYรณ|c• y7NฮQ†Ÿ9D]mไW์ˆพZbถึ๔ Qzอ#Of"๓[ข2ญz" !@ @$;บqง]ษแB@“š?dpgp-0.15.0/tests/openpgp/README000064400000000000000000000234631046102023000141770ustar 00000000000000# Emacs, this is an -*- org -*- file. * How to run the test suite ** tldr: How to run all tests fast. obj $ make check-all TESTFLAGS=--parallel You can use --parallel=N to request N parallel jobs. Hint: Tuck TESTFLAGS=--parallel in your environment. ** Running individual test suites or tests From your build directory, run obj $ make -C tests/openpgp check to run all tests or obj $ make -C tests/openpgp check TESTS=your-test.scm to run a specific test (or any number of tests separated by spaces). If you want to debug a test, add verbose=1 to see messages printed by spawned programs to their standard error stream, verbose=2 to see what programs are executed, or verbose=3 to see even more program output and exit codes. ** Inspecting the test environment To inspect the environment in which tests are running, or to quickly create keys for debugging or testing, you can start a shell. There is one test that doese just that: obj $ make -C tests/openpgp check TESTS=shell.scm PASS: tests/openpgp/setup.scm Load legacy test environment? [Y/n] y Drop 'batch' from gpg.conf? [Y/n] y Enjoy your test environment. Type 'exit' to exit it, it will be cleaned up after you. ... $ gpg -k Alfa gpg: NOTE: THIS IS A DEVELOPMENT VERSION! gpg: It is only intended for test purposes and should NOT be gpg: used in a production environment or with production keys! gpg: /tmp/gpgscm-20170809T144032-run-tests-PFfybw/trustdb.gpg: trustdb created pub dsa1024 1999-03-08 [SCA] A0FF4590BB6122EDEF6E3C542D727CC768697734 uid [ unknown] Alfa Test (demo key) uid [ unknown] Alpha Test (demo key) uid [ unknown] Alice (demo key) sub elg1024 1999-03-08 [E] PATH is adjusted so that you will use the tools from the build tree. Note that the directory is removed when you exit the shell. ** Passing options to the test driver You can set TESTFLAGS to pass flags to 'run-tests.scm'. For example, to speed up the test suite when bisecting, do obj $ make -C tests/openpgp check TESTFLAGS=--parallel See below for the arguments supported by the driver. ** Calling the test driver directly This is a bit tricky because one needs to manually set some environment variables. We should make that easier. See discussion below. From your build directory, do: obj $ srcdir=/tests/openpgp \ GPGSCM_PATH=/tests/gpgscm:/tests/openpgp \ $(pwd)/tests/gpgscm/gpgscm [gpgscm args] \ run-tests.scm [test suite runner args] *** Arguments supported by the test suite runner The test suite runner supports two modes of operation, '--sequential' and '--parallel'. By default the tests are run in sequential order, each one in a clean environment. You can specify the tests to run as positional arguments relative to srcdir (e.g. just 'version.scm'). Note that you do not have to specify setup.scm and finish.scm, they are executed implicitly. The test suite runner can be executed in any location that the current user can write to. It will create temporary files and directories, but will in general clean up all of them. *** Discussion of the various environment variables **** srcdir Must be set to the source of the openpgp test suite. Used to locate data files. **** GPGSCM_PATH Used to locate the Scheme library as well as code used by the test suite. **** BIN_PREFIX The test suite does not hardcode any paths to tools. If set it is used to locate the tools to test, otherwise the test suite assumes to be run from the build directory. **** GPG_PRESET_PASSPHRASE This tool is not installed by 'make install', hence we need to explicitly override its position. In fact, the location of any tool used by the test suite can be overridden this way. See defs.scm. **** argv[0] run-tests.scm depends on being able to re-exec gpgscm. It uses argv[0] for that. Therefore you must use an absolute path to invoke gpgscm. * How to write tests gpgscm provides a number of functions to aid you in writing tests, as well as bindings to process management abstractions provided by GnuPG. For the Scheme environment provided by TinySCHEME, see the TinySCHEME manual that is included in tests/gpgscm/Manual.txt. For a quick start, please have a look at various tests that are already implemented, e.g. 'encrypt.scm'. ** The test framework The functions info, error, and skip display their first argument and flush the output buffers. error and skip will also terminate the process, signaling that the test failed or should be skipped. (for-each-p msg proc list) will display msg, and call proc with each element of list while displaying the progress appropriately. for-each-p' is similar, but accepts another callback before the 'list' argument to format each item. for-each-p can be safely nested, and the inner progress indicator will be abbreviated using '.'. ** Debugging tests Say you are working on a new test called 'your-test.scm', you can run it on its own using obj $ make -C tests/openpgp check TESTS=your-test.scm but something isn't working as expected. There are several little gadgets that might help. The first one is 'trace', a function that prints the value given to it and evaluates to it. E.g. (trace (+ 2 3)) prints '5' and evaluates to 5. Also, there is an 'assert' macro that aborts the execution if its argument does not evaluate to a trueish value. Feel free to express invariants with it. You can also get an interactive repl by dropping (interactive-repl (current-environment)) anywhere you like. Or, if you want to examine the environment from an operating system shell, use (interactive-shell) ** Interfacing with gpg defs.scm defines several convenience functions. Say you want to parse the colon output from gpg, there is gpg-with-colons that splits the result at newlines and colons, so you can use the result like this: (define (fpr some-key) (list-ref (assoc "fpr" (gpg-with-colons `(--with-fingerprint --list-secret-keys ,some-key))) 9)) Or if you want to count all non-revoked uids for a given key, do (define (count-uids-of-secret-key some-key) (length (filter (lambda (x) (and (string=? "uid" (car x)) (string=? "u" (cadr x)))) (gpg-with-colons `(--with-fingerprint --list-secret-keys ,some-key))))) ** Temporary files (lettmp ) will create and delete temporary files that you can use in . (with-temporary-working-directory ) will create a temporary director, change to that, and clean it up after executing ). make-temporary-file will create a temporary file. You can optionally provide an argument to that function that will serve as tag so you can distinguish the files for debugging. remove-temporary-file will delete a file created using make-temporary-file. ** Monadic transformer and pipe support Tests often perform sequential transformations on files, or connect processes using pipes. To aid you in this, the test framework provides two monadic data structures. (Currently, the implementation mashes the 'bind' operation together with the application of the monad. Also, there is no 'return' operation. I guess all of that could be implemented on top of call/cc, but it isn't at the moment.) *** pipe The pipe monad constructs pipe lines. It consists of a function pipe:do that binds the functions together and manages the execution of the child processes, a family of functions that act as sources, a function to spawn processes, and a family of functions acting as sinks. Sources are pipe:open, pipe:defer, pipe:echo. To spawn a process use pipe:spawn, or the convenience function pipe:gpg. To sink the data use pipe:splice, or pipe:write-to. Example: (pipe:do (pipe:echo "3\n1\n2\n") (pipe:spawn '("/usr/bin/sort")) (pipe:write-to "sorted" (logior O_WRONLY O_CREAT) #o600)) Caveats: Due to the single-threaded nature of gpgscm you cannot use both a source and sink that is implemented in Scheme. pipe:defer and pipe:echo are executing in gpgscm, and so does pipe:splice. *** tr The transformer monad describes sequential file transformations. There is one source function, tr:open. To describe a transformation using some process, use tr:spawn, tr:gpg, or tr:pipe-do. There are several sinks, although sink is not quite the right term, because the data is not consumed, and hence one can use them at any position. The "sinks" are tr:write-to, tr:call-with-content, tr:assert-identity, and tr:assert-weak-identity. A somewhat contrived example demonstrating many functions is: (tr:do (tr:pipe-do (pipe:echo "3\n1\n2\n") (pipe:spawn '("/usr/bin/sort"))) (tr:write-to "reference") (tr:call-with-content (lambda (c) (echo "currently, c contains" (string-length c) "bytes"))) (tr:spawn "" '("/usr/bin/gcc" -x c "-E" -o **out** **in**)) (tr:pipe-do (pipe:spawn '("/bin/grep" -v "#"))) (tr:assert-identity "reference")) Caveats: As a convenience, gpgscm allows one to specify command line arguments as Scheme symbols. Scheme symbols, however, are case-insensitive, and get converted to lower case. Therefore, the -E argument must be given as a string in the example above. Similarly, you need to quote numerical values. ** Process management If you just need to execute a single command, there is (call-with-fds cmdline infd outfd errfd) which executes cmdline with the given file descriptors bound to it, and waits for its completion returning the status code. There is (call cmdline) which is similar, but calls the command with a closed stdin, connecting stdout and stderr to stderr if gpgscm is executed with --verbose. (call-check cmdline) raises an exception if the command does not return 0. (call-popen cmdline input) calls a command, writes input to its stdin, and returns any output from stdout, or raises an exception containing stderr on failure. * Sample messages pgp-0.15.0/tests/openpgp/bug1223-bogus.asc000064400000000000000000000020411046102023000161760ustar 00000000000000Bogus test key for bug 1223 (Designated revoker sigs are not properly merged) Thanks to Daniel Kahn Gillmor for providing the test keys. -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.10 (GNU/Linux) mI0ES+OoSQEEAJUZ/+fC6DXN2X7Wxl4Huud/+i2qP1hcq+Qnbr7hVCKEnn0edYl+ 6xfsKmAMBjl+qTZxPSDSx4r3ciMiIbnvXFtlBAQmji86kqoR6fm9s8BN7LTq7+2/ c2FHVF67D7zES7WgHc4i7CfiZnwXgkLvi5b1jBt+MTAOrFhdobxoy6/XABEBAAGI twQfAQIAIQUCS+OsRRcMgAEAAAAAAAAAAAAAAAAAAAAAAAAAAQIHAAAKCRA0t9EL wQjoOrRXBACBqhigTcj8pJY14AkjV+ZzUbm55kJRDPdU7NQ1PSvczm7HZaL3b8Lr Psa5c5+caVLjsGWkQycQl7lUIGU84KoUfwACQKVVLkqJz8LkL54lLcwkG70+1NH5 xoSNcHHVbYtqDLNeCOq5jEIoXuz44wiWVEfF+/B115PvgwZ63pjH1rRGVGVzdCBL ZXkgRGVtb25zdHJhdGluZyBSZXZva2VyIFRyb3VibGUgKERPIE5PVCBVU0UpIDx0 ZXN0QGV4YW1wbGUubmV0Poi+BBMBAgAoBQJL46hJAhsDBQkACTqABgsJCAcDAgYV CAIJCgsEFgIDAQIeAQIXgAAKCRA0t9ELwQjoOgLpA/9/si2QYmietY9a6VlAmMri mhZeqo6zyn8zrO9RGU7+8jmeb5nVnXw1YmZcw2fiJgI9+tTMkTfomyR6k0EDvcEu 2Mg3USkVnJfrrkPjSL9EajW6VpOUNxlox3ZT1oyEo3OOnVF1gC1reWYfy7Ns9zIB 1leLXbMr86zYdCoXp0Xu4g== =YV5g -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/bug1223-good.asc000064400000000000000000000017451046102023000160210ustar 00000000000000Good test key for bug 1223 (Designated revoker sigs are not properly merged) -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.10 (GNU/Linux) mI0ES+OoSQEEAJUZ/+fC6DXN2X7Wxl4Huud/+i2qP1hcq+Qnbr7hVCKEnn0edYl+ 6xfsKmAMBjl+qTZxPSDSx4r3ciMiIbnvXFtlBAQmji86kqoR6fm9s8BN7LTq7+2/ c2FHVF67D7zES7WgHc4i7CfiZnwXgkLvi5b1jBt+MTAOrFhdobxoy6/XABEBAAGI twQfAQIAIQUCS+OsRRcMgAEO5b6XkoLYC591QPHM0u2U0hc56QIHAAAKCRA0t9EL wQjoOrRXBACBqhigTcj8pJY14AkjV+ZzUbm55kJRDPdU7NQ1PSvczm7HZaL3b8Lr Psa5c5+caVLjsGWkQycQl7lUIGU84KoUfwACQKVVLkqJz8LkL54lLcwkG70+1NH5 xoSNcHHVbYtqDLNeCOq5jEIoXuz44wiWVEfF+/B115PvgwZ63pjH1rRGVGVzdCBL ZXkgRGVtb25zdHJhdGluZyBSZXZva2VyIFRyb3VibGUgKERPIE5PVCBVU0UpIDx0 ZXN0QGV4YW1wbGUubmV0Poi+BBMBAgAoBQJL46hJAhsDBQkACTqABgsJCAcDAgYV CAIJCgsEFgIDAQIeAQIXgAAKCRA0t9ELwQjoOgLpA/9/si2QYmietY9a6VlAmMri mhZeqo6zyn8zrO9RGU7+8jmeb5nVnXw1YmZcw2fiJgI9+tTMkTfomyR6k0EDvcEu 2Mg3USkVnJfrrkPjSL9EajW6VpOUNxlox3ZT1oyEo3OOnVF1gC1reWYfy7Ns9zIB 1leLXbMr86zYdCoXp0Xu4g== =xsEd -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/bug537-test.data.asc000064400000000000000000001710211046102023000167020ustar 00000000000000This is a binary (gzip compressed) file which exhibits a problem with the zlib decryptor. See encr-data.c:decrypt_data for a description of the problem we solved with 1.9.92 (1.4.6). It is not easy to produce such files, but this one works. The source file is also in the BTS under the name check-data-410-1.data. The result of the decryption should yield a file with the SHA-1 hash 4336AE2A528FAE091E73E59E325B588FEE795F9B. -----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.5 (GNU/Linux) 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 qgtkR/1FowOQkyE= =5l5y -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/bug894-test.asc000064400000000000000000001063001046102023000157760ustar 00000000000000Test key for bug 894. segv when importing certain keys with duplicated user id. -----BEGIN PGP PUBLIC KEY BLOCK----- Version: PGP Key Server 0.9.6 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 pjU7TI+1eWg0mAtdAWGWaWFi6/uwUWCQD/G246LSBfQHdZDXFjT61YBvFvEnpb0e Xx4E6RQJ9icBF8ckjWfEu8ghvwHTAqt1qAuWsAFqKgAfYlnOkZZTwG3v//xIALih 2KfiuRD0qPfJF8ScBHvhl21h/jfy96zJEsFadwaVDZ+pV6hsR0Ii02r2S+UGcLYF 7Nhxv9dGm5sjMzo41QF2RjG8RV5ekogAH8f3ysE3BgyqKmeMhKizKR35GvVL9vjj Ia4UhGiUWbCbutpFVMxV1saQ8uG62LVituoTEgruz1CFdnQcEP52X5WTya7Xh0uo ciMF5Sx+9t86j9Aic34MeRaoe42zlfx0p5Hl1KuLkCqBYc3nf3+JAhwEEgECAAYF AkB2VUgACgkQHh0RbLTmcZQkjA//RtBpVxskkKz5uC0hZKQ1pmlYixXItbBL7qwn V9VkY/c1te1IQh5FT0aJKuSA95bFhs1UP0wCuHDLmsGCeYb/Ij/EinEU/4+Qn1Nu LG6PZ1zj+yT6mRJJek2R3cM1XSv/rAYeCP25u19yw/nBI+bSU/r1uZaOJFuy0DVs urMa73k5Mxr3cRceikzTRR+M3CAh264E4HA1AUDr6CAhYxBjjERfH7hwsJL6JMSc nbxgbYFq9S6lJWjFd+Asj/c35K1tON43b+dhd0C6kn+8v09bMTJjrqrjy0v///// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////// //////+IRgQSEQIABgUCPhkNSwAKCRAXOrFG37Nm8m+5AJ971mhmPMA/x/OKCp84 55CgtGndhwCeKztNwbBEIjsZ7oqdqmHchoz4a3SIRgQSEQIABgUCPrZbygAKCRAd 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 AKCV+pcs+/Vww9F1+M5vQ19tfd8t3g== =HtIh -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- Version: PGP Key Server 0.9.6 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 IM4K+97xXMM= =STHU -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/forged-keyring.gpg000064400000000000000000000017121046102023000167230ustar 00000000000000™ Wj?่จอluั}eœzNร{•้รฦฮwยขmีถฐN…ู—ช‰๚ผดรrฅ jชข๒น}ว•$P†4E ๊โ4w๚7œญ๐ ฑLฅฬ*y8R!`ฅ>;็ wภ๒ปูfqภฅ†ปV_ศภน"’ีTะœไY,ใ๛5ํJํ?€๚RะษซHฮด๑ูๅงฅฏฐ๋‘G†cคyฒjq๕จ_QZfrFฬ9`๒mฆVSาWณโฅฌ™ี›ฉNู…็„มœMฐ[“ี›}H&›b๋Š๒๔ิ‚iุT#๊"WำƒG๋ืQ ้mำผv–นื]าื๔9๒ฺเ†ฐลด'Echo Test (demo key) ˆU6ใค € 1Œฎ๚๏mg ณhZ"nA)˜!'ข3ตฬ* šภ”ึ?>@ปฌุฉ8v3งิ2ฐดEve (demo key)ˆU6ใธ € 1Œฎ๚๏m ž8ว๔ƒ|็mฯ$๋ ๕ S?ij žžE”ู“ผ…<ฑเym‰FฐดEchelon (demo key)ˆU6ใธ € 1Œฎ๚๏m^ฆž:•ๆตdYRWPถžœ๊m?ถIตŸqๆ e๓žฅ &!ไฺำ!ฟ๏ฐน 6ใ‘ดฅํ&&b‹k›I4L(g๏ฟฅ๒›%เk\จช6=เ๋`[ไึ"I่ˆ$ ธGใ๊๗ฯTฆG*D@~ศ็ฅธM๓<๛Yถหษ$šช#ˆ‡œsD๊Œ~ิ=–พ|’™MI:เ”@฿D.B๖ซ@ั5Xฝฐชเ๏ื—t๎’ ๆ^ŽูำYคฎ’ช‡:>็4.ํ•h‹Sญ–1ขฟ๐๏อฦฬฒ{ไ๗@ฤ้?†o*พB Zˆๅ™k\ๆท˜'ฦ%ฝŸlิ•Œ้ืงนฒS๋๐*~~๒/๔ฒฟ ๎D๋>  าV๚ 0JM๒™ำๆˆคnŒ๋gยไˆF6ใ‘ 1Œฎ๚๏mึgต!ร.eต|ฌ9ูvใ๐L N)CนI{ยุฏญ~•uยฝS)ฐpgp-0.15.0/tests/openpgp/key-selection/0.asc000064400000000000000000000033451046102023000167160ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBDpPvC8BCACqDbU+2znCURAocNMmcwCSYVl5l4Zbx6jcy9ON7y12Ai7CRSbX 8Nb8kggit02pNFtb1l2NKad7DqR1f/WPqkQjZ6rvFHKEOsupqrUhpQ6dU3H94wuO g4M2PGsaxKAcw24qIoKkTotecLgUFMhduIq7u8kTnalTOW1o/18moVuoVNkDdO4Y I7n/dloVNv5Xkm5bS4VBdvUzJ9gvbqkynud/L6pSFeng0vVJQMN3tVbApcNzhLBs G5Fvf9Rve4V8xTeBYQ+VRO7H9nvaS8YFf07kTwUDS69Vs8qIaLKOQJL3F75CileN K7fb9OC3J4PNF0CDz+e2KkRRF6Q/xS8KXF9rABEBAAG0I0FjZWpsbnUgQWNkaXBy IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEE1ziGUaG3Rm0DtThCgXjg SwuqOFsFAjpPvC8CGwMFCQHhM4AFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ gXjgSwuqOFt7Lgf8DFDVQ4JykT8njX0+JkemSL2UUDH2iVRWkU6tKZPGneEnQGMm iRfSX0im0pFHWxJ0vZsmUNq33Vr2sbvppT8Ti1rBx4TrdZ7PSEIEi1KTVSx6GKjr 2ObCax2u1p+u+tC35GfhV1Y1pUcSZXc45C1o259ivekRJY/fw9DrvR7154S3ygjp lkEM4PC33216XMTqUG1sAWw40aDtKaiyp5J8zqLKXXjCnZsTWdj4uxB7E5WPjaEF ylON/h+Hfw2RMzlYRGTbUu2G/Ma0TiycGJvT78myCpnc5akcKVZu1Wu4VDBqBC1N dVcTzhJ5T4gwFCWHif3/MYqTVBnZSAVURtI3V7kBDQQ6T7wvAQgAuF5JaVAE9/Vv K1U+VSAAhWMGSp6fwezgWdj0rn1GBx3DtqQkYXoLRjTrlBf1qOO6NPbBUi1gz8R+ IQTHsesIXiUSlMige3/HxdSOsbzKipm1SGJedqUz3H03+yfr82NT+QvQmlEGX9k6 goPY9t3r+O3F6ab4mc5NxFKhj2XvbRyf8I9J+3w6zXBWwsgLHacTCa13zGz6B0NH dCk/2B6HTJeIJWpHdALQXp0/JcKWksw0Hsihpdu0QploUSPihZostRUKszOkugeu W0t3fmt6on4fIFWveh9NSVDYIHKVMRU8cl5vRXNNRTsYQOarIvjmoUHv5u+UpZcc iE/7wILNhQARAQABiQE8BBgBCAAmFiEE1ziGUaG3Rm0DtThCgXjgSwuqOFsFAjpP vC8CGwwFCQHhM4AACgkQgXjgSwuqOFv9GAgAkACyK3Km4jFBqw7ah2xMxWCkdpgu DdTi64ra6GyMQk/Lem8DzBO/ER/cavV9lg61qCOy7ecCNs7MhPiWZIod2bcV3JDZ AglnGgTQ+lSpPXFCk3eoRktRsXesgQ1dE30uR9pypEqZ0BYNZZ2G2hRqAnRgUOOI 7THmf/X5w5KPKLlm3zOlGQomFy6lfOR9Zd5/QoKRNmuD9gNfSE+3vBvr+ISQPIev Ch2qeC/N0BP5EoVE4SXp8l2oaaVJLi/Yx2J6vfximeeaBPxsKjuA+GJu6IIhegnY X4kCxWStla+KuN0p0iNUh002pKybISuqyI9vgImH9Nh22Nf7mcRQWflR6A== =nyjX -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/key-selection/1.asc000064400000000000000000000033451046102023000167170ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBDww7w4BCADCvhkDDCAAtDpLCUa2ryPqWxlSSVKdyY9ecqjgEswijsZ+2T6O Xr/50POpLbW9IWvHdvcifXUk1YZg8wLcnVIMwiZsdNSDM3MycoPoNc7pL5MaPGL6 e9u+8HWX6aowOo5st6Y57HUeaKReH1Peb0avoEUIE9l4xqVx41AYrKViS7Zp5p9A 67thNKMisZ8aYutlhmVQB/uDO7XiKal07vjftf6aZazNBC5ZBOj4G+/TLcKMox8h AaUJTkqsJcSCZTc7cMVjikmWItgKm6wIceGTpUGSvvZ3TnWUtgq3ivaMQrpyN3RT tVM5uO2Mh8Uzkq9YWh2V7IT+jGKztrpdPKu3ABEBAAG0I0FjZWpsbnUgQWNkaXBy IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEE3e8b7GbIusjWnO0q6r7Y QOyYsCQFAjww7w4CGwMFCQlmAYAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ 6r7YQOyYsCT0awf+NENO1grzmRfsyl8ODREmUlnnUAaRiZGQ0h+JkooXiwcm/p5O DupjRc5OLluDtnjTLMBwNk5ysX6yqSNTni9qCCpm62PaIopG+r8RyFPp4aRjR1Q3 mbwHkKifLRBxDxeCDKdrqFs7hkVCYOxjyiaEZ2BYogqFDwHFoiE6UwQvwZfpNWex 4Zx8nhoGpcegMMEiGREWCTi0H+zJrYOiVzV2jPQF5lkFkwYMQKNaNQv3L5v2/5AC Nu6Kej+oYcw/EA+o3OXYLxwa+tijfKqUxtndFsQS/lYSUNszxrcm7dOAx52DCMpC 8MNHmwe3qmofO6G9svqG02bIZTdyJBob5nNBD7kBDQQ8MO8OAQgAttn9ru3Ou6+A lAqbV7fAbpdeIF5bHy/QZtLxa2dpG8BTOXDcoMp9MUyKjafHbNr+z5unqqTfduXy oRdJ1D/iXbSpcRkMKRJz4fa+uPNN5SiGzrjxHTcALPG8ctTUvdNrV+Z5VkssU+FW LQD+s5SQWn848kYTacrDL22JshIpekmz3ztDoNGOZxVj2DwF/QXDeaRhXT9ngB3c PY8x7e8yIvmAcg8olt9rKTpkGXZHWAyBpyGzBJkxM+wfiNreGMNUkv41G/R4d1Lv xMlGF05xrBJX9YrV1pRM+EdS4WOs2gvFT3qnBzFAQBZ9nqaLAFVxw0Sl7C+wSQPk 7ZPIKYANFwARAQABiQE8BBgBCAAmFiEE3e8b7GbIusjWnO0q6r7YQOyYsCQFAjww 7w4CGwwFCQlmAYAACgkQ6r7YQOyYsCSDdwf/an06WTTAIwHj8PfXIkywnq3SWfSZ yuRaFaDan9en8xAfyw2smNnrHnTk86CZWL6yPTij6JZYynv4OxtSafIoT9LxT7uX VpEtSBpTnnojlHFivfRYMGJ9k/EXGgb941W2DTbvQqzafc2u4K3u8KnFOgzfEj5B qjYzbt/L2uR2PLOAfYIUYzqTKjdzvSIX2DRvkepHhTwRbCjJrkF/zx0IXFoJeU/k 6tYK6cNNCFTWT0uLJCflAZMtGpf4KDvjlccNts3mZQbEov+Dymj/nZ9JRgjc2heH Pxi5muPMQ8jAc2i4V8vTybozlZ5O/+JkOOOH0ciLpD3buhgYBY309DIVmA== =zVE+ -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/key-selection/2.asc000064400000000000000000000033451046102023000167200ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBD4SIdsBCACqRRWUd9mwgRzVzaDbVLRdNOdyswPYuBKWlHI6Yx0lpfiQK6/X rnRoR18lYJ0wBqImd/BJbjNE4bYaMUd+p7HzYIKzv8/DuvZQgovt9VIBn+a3YyCa hdAaWEz994fjl8U5IGbrrGuV4XXlFATA6S7KX7CgxgiK/jVnRl1NVcTjOSnasU2J LIbh0lawUe0b3HlwT8uFGg/MK3vHGGIalOJRlgeTBAF7zcaTfqoDiAXbbsfaxT4a zB1OTRut1VOGBLWCsr09VCAMyz8awQqF81uG6cuv9swo76SuTiMcMMBfdNw3etVa kLgL4JnsnMGM7c1fx/mfMUIUHYndDVT5LzQjABEBAAG0I0FjZWpsbnUgQWNkaXBy IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEEA/z+3gFAJ92JetLyPTJn Cpapwr8FAj4SIdsCGwMFCQWjmoAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ PTJnCpapwr/bGAgAjGWQ3F9RUpeI3ogLLhGMsXmsOxZX1ptNtjL9HiDsrUY5XCS1 7vZUpRz0/2nscbu7or6Xy8yZtG0vLXwfzeOvHQz/F8tnzruIWBFSAU8WBidxKxmC AUlQWg6bAp0aTxyyVi/r719J6k/G/ZOhjgXM243Ck9HNnY2a0h0ArKzPo56N8Cks caXshdWxIh3M9uJKSxBCxfDTtqPcU7LjNApaUOFphpAPT9ypE/Zw9BZNTVN6vILr I7upnG5PNXybMCDh2XhpXS2E5/rY9Y3/aFKthBws16JMAzBRKMQqWTTC9a8X+4pa KcNtQih3X9eRzj4JBAh6cl5qXIbz+32EzXA8drkBDQQ+EiHbAQgAz017pYsm9Sf0 z5HqOQLx1dwCclzVE5RhvI+qplPT5e9sLG+trbOVpGM6fjWAK/yuxaUJibm/44UX cxsTuR7gpAwc+gvwrF3cG6kmT+g4kZ7/I4EyBMZjM9lhlIk77MCTLXcT9ONr7Pm4 flQO+vM6ZYRFm7DtSHzP2z2Uu9USqgLJumn+V61xQXYj3E2ORczOV3blPVUoI7gl aRnVdveEqrucw+miRWq3clykTdbuP39H2nRgY0KXGbOefWh5dRe2okxL5nlhINGL lOyj9n4jM6fNp9K8jWeg8YJ7tKRsffrrNnIovslNlkXucYAzM2OveP+JxDdtosSK fzWtUSzrmQARAQABiQE8BBgBCAAmFiEEA/z+3gFAJ92JetLyPTJnCpapwr8FAj4S IdsCGwwFCQWjmoAACgkQPTJnCpapwr+p6wf/cO8apRVlpRrI2q92j5DJ0IQsBdUv Srvp3w8UHZad0VkhgT+edbYHN8VS245ckyWoUBB78XEvxayMF1/Mx0N+u1MOM1dY MrAiwbaQnE99yjifwVzZz6wJuJ94MMzWw38j22ZTbIBHPh/4nzSl84sN+KuEcP4f C2h7mat4NDO/VRTf7xWuLInS5yGdDOACwROd85ua4YNxo54s5mcd6BVr4upHd1Hj 0TULgmWvqz49N40VY4GF+38OAC7+DSsdamHVNdTb0fT+KaxTQ0K5BCl+7Oe66CqH RWxaXRUD4YMRh1jdgc+j4D3Sj4xhevu0Kd6+7BWxmxWZKdOCiu9TEDBjrg== =YqE5 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/key-selection/3.asc000064400000000000000000000050061046102023000167150ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBD4SIZsBCADMR5w2TF16C1WaP+EIq+pg3InbyKr3VlGgxl2t/+PcRUmxhOh4 zAs+k/FaKqH+h8JLGT6VlUMqKDqBrHhwVNz5nEYO/HeqaSsHjyNoIr4tS3oJMQWI 0QsRV8cPhlPHXQBS8K2KC7MfTyHIbfagjqakegY9ysZ2N6Qt3I3QSqO0khRHoNtZ x8l/NHA9u8lRJD1OhfOg8gcY9800LPJbdzmyeOK5ezwyvjp6dXKNgXnwkrHQw7pD hGITTRtNsRb0xF9e+1X6KRifk/ppJZjk3Lu8AJEyj6AfHZru6lYfv4LP77IW9Lw2 x7pRwrMNtvffAOGGa4KYiVstgIaPmEm9v2UjABEBAAG0I0FjZWpsbnUgQWNkaXBy IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEEuVvWF1y2M5JENVuhYLgR fmEZztYFAj4SIZsCGwMFCQWjmoAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ YLgRfmEZztapKAf/US2OkiyDX4D7cRrifnbkMj5YdHjiirqgd5Q9nhWIC/Pk494u WDMt0XBeHk8aPp6NjQCMpWu8d9TxLCn43dI2eFRLKSk/9nUb3nPzIrtT8/dPEsvG HEAJKxGMpZLu2UIDIpn2XY+9pS8CB03xVfuAfYrGOmVJS5rr6a592WfCB6XosHO1 S2iKnMWgmo5C2WJaOq0AL5fzI6w1TAYN10KHFdNdimWJZ85WKk3iRXDUF4PJusWt PLPHOgbvAMBHtJHu+09DlcoBRyWRvEzXHoBsgm76kvkLpkP23FhuWexfK6qJ+pZG Ygaw2fGACGi9W7aASaiR5+PcD5WSPaOT2PuyRLkBDQQ+EiGbAQgA0Zt9F5Xhv1wf zdvuXZeEaX/0uq3T/5IXcP0cjMzylWS3caRd8AB6S6+0NZDrAuO8jbzKuBdVb3so zhq2g4uPkzCq9QkLwSJDURAstA/w6yV/h83DhEvmhE5MceY57Ev1g+cF3ec9Sshv MQBPicXw6Umv8fyjmW6LIEXpNeXjz52hyjVk39EzEYFf8+ozC1Ifn5H1NWOnCiBc 5Q4Ud4W26xItyW1bBXWaMR520fotj6wSAX1Al2ynzvZ31RQUgBmm9aiwRKKXC4CW 6E6uDCBKL/Gpebc2Ty8fpJmCFtTByh0M7eeBfCDPTODPS39WjxwxbgIIHMDyXogW D+Por5jYiQARAQABiQE8BBgBCAAmFiEEuVvWF1y2M5JENVuhYLgRfmEZztYFAj4S IZsCGwwFCQWjmoAACgkQYLgRfmEZztbhGAf9GHVPYO7qsZkM5RnPRYAZLQGY9ygP Wac2hX10UVOVFMgd8XVdoRMqj8LHyaf6UrdI6/3lNza2cnleskjxzaNbk9ENhyYs /KSAyL6JbuZhEZ9Cx77RKRfbG+Z5EIrymgG0+HZuS8XZbJTze0kvQc90Avn78rNa ta4VB7U6ID0BwbBq4ikeJFJ2si87ZUiVUbFihVCk39HyJMXdDeUJPELi6Z2Rkmov 0fwB1/QaSCvr41zQ1gCLpWC9x6tbas/4DsI0O2XG5W7XGIBt1NnaHMwgHr1Rw2JU Df6q+bEEiXP4ZsnoeUYi7Q7LU55fn5zsLj8DF2eACSiN+f5emZkZT4wV2bkBDQQ+ 2SXpAQgArTgU5baUzto+s/aEp/z87F7jxeFXTUTgIglHUHvc5oAj59TgZf+6C4t2 uY6DGST3u2XCRs7FK3iZjvzfEVyDYQd8V/Iew8oeHy2aGmWFbDuZa+8RWWGJ8wfv V3pCm+86HIzfbqgJ3B3WnIhMqrBvGSlT0oYDVYIDZDbYYnIYNhF5xo/hH1WB9Ul6 7Mx/KPUTqa2O1Pio7mFy0xFb12+5y5g3PruEG+mM3RLqZug3Z5M3E7gEG2HCnNjQ CzjICJe9wwOzkoKJLogCEZ2iYhl2DcThxWtOu/EaU3b+iothX0HdO3azMc3v3tcX t4q/fLUqmJ+P/HVlJtuPKSwnCHHVzwARAQABiQE8BBgBCAAmFiEEuVvWF1y2M5JE NVuhYLgRfmEZztYFAj7ZJekCGwwFCQPCZwAACgkQYLgRfmEZztZv9wf/Q8HacUDx AUJXfx/BfK/4zgogDfotz9yaFMmJYob2Mx/ny1Gteh551U5byuyoJW3gENg8Ql6v s7uSfLAbk2qXYAdApbo1pcYmb5Rd2oDU3+1JONNHs096ZjJLD2WHxTnzWVLMDsPV cUka+trg8Z1hqw6uGJmu6InggNjZ++1B6aa63Zdu7BudJB/3oWpjXyV7FqU4RtYa sYN/lmGcir0704yfqRbVcP9fU5kYB17qiNJRtblDjImiiFHJ0PSxpmYU3lDIf1Rf AC/HXoUetx9PKV1J8EKMQhV/GFa5FbmBCwXcIEj/Z9YEjSK2t9Pw0k0EuKhl7eHp vlWlPNIJSTq1Bg== =rf5l -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/key-selection/4.asc000064400000000000000000000017051046102023000167200ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBD/KdpABCAD2wlP1kYHldknjyGTnMOUq9r+3/fJR8n4qVt5TRRlDdyfK3ZxM KWStsmkZuK9dMxo4VSOjVeiXdZlHeQU7RlzVPsCNiJ1Qc2HDgHFdmT7eUgOILA12 36bueRUwVPGmrBEecs0TpNRQ5CVFbO7mC6cTLhT9nRMd+W+BSuuZ8Zm98ebaVh3I ml3nPEVhs1UFmIop48RGCt45MZ2mYp77kuAmk8NBJjHy9J4H5UK19r0hla2WY4a3 Z59hh7kFnNFCM/MhPxd6GwkeXzUF7WSnhzRVIkdv81u2AnIHbo1zD0BUp8Rf64Ns 3iFAeB1VuR6ZJpEypHiHUJtYPmr9okEmg8EDABEBAAG0I0FjZWpsbnUgQWNkaXBy IDxhY2RpcHJAZXhhbXBsZS5vcmc+iQFUBBMBCAA+FiEE7Qh+nTOUNAc44gokSJKj z49l66wFAj/KdpACGwMFCQWjmoAFCwkIBwIGFQgJCgsCBBYCAwECHgECF4AACgkQ SJKjz49l66xZ7QgA7dBJsQP09LhkYDIu8cJzRU6tqa2Y8dx0iFaCU8nqD/0q6xJf fs2euwMEPsHWmA1WwGwxZpE/NGEksMSQ8TZSQUwCsURxBIiGww5MBtIGeO3ZzreR Dn0Qhivbiup8ZPtPfFFomoK7ZtWjtGjZ8I5zyYbjT0eEB7P348dkpOtReWDiqGVd taMnVau4OTDqTRo6fvAiVb37zoaWETsPWtq/TymgkqO/LEhzClzG8xJgpSl98cQW BoHz5GDVYeVxPEKAN4DdS7gt0KTUC9ZQUcZP+1wTzFohDd/CeUAl4kTeP0QSJVJ3 QC/WnHk4Y56q8/nngIY6w/wID/R/Cp+plw6F5w== =BA1F -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/mkdemodirs000075500000000000000000000023351046102023000153760ustar 00000000000000#!/bin/sh set -e # We need to use --no-options so that a gpg.conf from an older version # of gpg is not used. GPG="../../g10/gpg --no-options --batch --quiet --no-secmem-warning --allow-secret-key-import" NAMES='Alpha Bravo Charlie Delta Echo Foxtrot Golf Hotel India Juliet Kilo Lima Mike November Oscar Papa Quebec Romeo Sierra Tango Uniform Victor Whisky XRay Yankee Zulu' if [ "$1" = "--clean" ]; then (for i in $NAMES; do [ -d $i ] && rm -r $i done) || true exit 0 fi $GPG --dearmor -o secdemo.gpg --yes ../checks/secdemo.asc $GPG --dearmor -o pubdemo.gpg --yes ../checks/pubdemo.asc [ -f ./tdb.tmp ] && rm ./tdb.tmp GPGDEMO="$GPG --homedir . --trustdb-name ./tdb.tmp --no-default-keyring --keyring pubdemo.gpg --secret-keyring secdemo.gpg" echo -n "Creating:" for name in $NAMES; do echo -n " $name" [ -d $name ] && rm -r $name mkdir $name $GPGDEMO --export-secret-key -o - $name > $name/Secret.gpg $GPG --homedir $name --import $name/Secret.gpg $GPGDEMO --export -o - $name > $name/Public.gpg $GPG --homedir $name --import $name/Public.gpg [ -f $name/pubring.gpg~ ] && rm $name/pubring.gpg~ done echo "." [ -f ./tdb.tmp ] && rm ./tdb.tmp rm pubdemo.gpg secdemo.gpg pgp-0.15.0/tests/openpgp/pgp263-test.pub.asc000064400000000000000000000010641046102023000165630ustar 00000000000000Type Bits/KeyID Date User ID pub 888/A50283F1 2001/11/08 pgp2.6.3-test-key -----BEGIN PGP PUBLIC KEY BLOCK----- Version: 2.6.3a mQB8AzvqRosAAAEDeNMKLJMJQeGC2RG5Nec6R2mzC12N1wGLiYYJCsmSQd1Y8mht A2Sc+4k/q5+l6GHtfqUR/RTCIIudAZUzrQVIMhHDKF+5de9lsE5QxQS1u43QGVCb /9IYrOLOizYQ2pkBtD9LCrf7W2DccMEkpQKD8QAFE7QRcGdwMi42LjMtdGVzdC1r ZXmJAIQDBRA76kaL3HDBJKUCg/EBAZMoA3Yqqdix6B2RAzywi9bKSLqwAFVL+MMw W+BnYeBXF9u+bPpQvtyxgi0vx8F9r84B3HAhZNEjBWODF6vctIQhXhAhXIniDTSj HNzQ/+nbWnebQn18XUV2SdM1PzMOblD+nISte7+WUfWzlD7YUJPkFPw= =b498 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/pgp263-test.sec.asc000064400000000000000000000014041046102023000165450ustar 00000000000000Type Bits/KeyID Date User ID sec 888/A50283F1 2001/11/08 pgp2.6.3-test-key -----BEGIN PGP SECRET KEY BLOCK----- Version: 2.6.3a lQGdAzvqRosAAAEDeNMKLJMJQeGC2RG5Nec6R2mzC12N1wGLiYYJCsmSQd1Y8mht A2Sc+4k/q5+l6GHtfqUR/RTCIIudAZUzrQVIMhHDKF+5de9lsE5QxQS1u43QGVCb /9IYrOLOizYQ2pkBtD9LCrf7W2DccMEkpQKD8QAFEwADd0Kk5aeyFM3zbPgfikkE 7iFg9h2LG3nARmA4wAnCZaQ3CS5zRHCdXOf5KLkm6xFza1yMat4iWx6ULvuuNpIc RmkHccyXYkRi3Hvacd5A9VCNw1UKtCdaCKgacsfplU0s1xYWGZd4J8Jg8boSfW5W gwG8Dc9R20HHno8uD2vfr5rg8ElWvbFyJI/j4eCVAd+NYAGNvB8I3VP38IIYcavh YYcGjrpxbGVRybsBvA9IJltpGaVulxwpeCp5NecCGgoAUsN4Ktf42Pg7HXDlQL6r Xs/YggMztj4NzEgBHXAOLShdKKhDAbEByVSKXZD9A8J+RejXBl6VbuJmD/5qOvph GAPKS3ahPDj8438HyD7yIDLYYVRKfxjWHLubc46Pgui0EXBncDIuNi4zLXRlc3Qt a2V5 =l/aV -----END PGP SECRET KEY BLOCK----- pgp-0.15.0/tests/openpgp/plain-1-pgp.asc000064400000000000000000000025731046102023000160330ustar 00000000000000This is an encrypted version of plain-1 for the PGP test key 0xCB879DE9 using 3DES. -----BEGIN PGP MESSAGE----- Version: GnuPG v1.3.5-cvs (GNU/Linux) hM4DW3oC8MuHnekQAv0U6qlDAA64QS/oZJErr1J77m5Dh7IFen3mAcwOxvL/POqS HQWTFcuFT4LH9asSWgRe6DebJGfscMjMqNPAkhEJtKQQ2jEesn2Bon6SMwah7vkD 9Zap7WKHRlnB/Da1/xQC/ispXY7e5tuejnzoNSAOWFpBn354nvkKGaCfMRNuz3R2 HljH+gXKRa00n2dPmvX9Mr8AI0Q+FoEI2/YW+6aUxmv8b0c2dP6HcL6HUu0Ro2Nl RJNPfYXP20EL/Xrv8LN0Ksnp3YKTWrz5gQKNr3DH5pn1PjFqAKz4JD6rQBpnlh1c 03gLB1OAJWA6+/QNaEQV451GBZW3ul10R/6621/kk0Isdxn/htlD4Jl/jAvFdlQW ULBu1HorZZ5X/IMuMRFwSQkx+H8i0zq+LGr8+rLFVTRuXBrgpeTLWs/f35DDblPp jtPGSs1qql98PfOV1tAr16rGRLAAyNWEgi3yZWUGgq5dfFnRbJX1hrj9waQmq1g0 mn1oB9Ig708xSZqcfFVFNpvIB7nmbFF/WaMnqfL3XmgTe8whKB/f/XYhg+W2d57h EmTcAlC1N6IHY8/7YqtnjitavTIUsi0hPldX0tvrjsaZ7ppSma2epRJhx47jIFjw wXOEByZE+K3pyTSN8KJxParDsqrTWFrL0t8az9W8lWG7YYsxUxk9cwRo5PyEko1M kAKrbDMb+02Iw35yeuxFY33dl7KqpaWy43ksX/ROxX4S0InQywaQejXyt5A1cJN1 t+G0aKdRp40MDKtOkZfFGlUSFZIhB0dxKVfSKJE/SIeYZzROTuyCNe/2wwufxgpa uztUf5ipVnINupiztWGw5c5Wp40ptQ/0K4/35KrZhMoFGR9DtImAPpZocuiFdJDt uqqapxGfJ876S4hFjRAkHSNRsAySul9zFLnIJ+Smk5xsvQZK4yjDwZfSs9b7WPKg 7NCxl5bF5dIbWRYdRBNjHQ4m3LyYmqKzQqALSYT54/9O35B7rb1fOB2SFIuME0QI 5XQq9QsH/f5rW8U6Ixzw1582B8fO1TMRhCqMyXozmsBJoWdCIQTQiVNyrbgLi+ss wKiKq4AymLXFMSpI4TOCc+rKiAdMpLbNO8Ndox5hZEGz+mqg84cgC/rkJc/P03KR uo0+rb5eSfJw9t+uzBXDmFHynayj0CB8wW9iwXknpdlHDo1z =7Otr -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/plain-1.asc000064400000000000000000000026441046102023000152460ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.3.5-cvs (GNU/Linux) hQEOA6urKKJHvid1EAQA0MchGc7vZsjUgxdII4lo/2jRDesMmLDN4U0uOgExvyhD u1OtQBJF8iHgNdDEf8/R3GWhRE94IpVwLqzKTqfVmyKIFd80/Qe4h37TUPpEf8Ex f7WaIBk/9OSDNKOkCwZ5OH9xGaorhBwYiTNJlEEGv5zcDte9ZoLO7WhWFfHp3b0E AJYk/tf3oV4sJSn8AbUa8UC2tAdpNM1Lx+UEuCtxevYRpWeDVDok7/xuaa/wcb39 lKyhUV+FBUH++k59K4GVqykOz02hmFl97O+4bAldgP6cVTm0Gh7jwMcJANzhLW/O MR5birB+HPKOotMIfhggzxsAt6ESrviIlknkGqwKXWog0ukB/npOqQdu1GmvJqoC k6ElA6xZPY5HTF/JLKlLXFfIIKLeuyckKwGDkVNFE7JYPW+dfxcGH9z1KXaNNllY V4OKGQh3+gMaoJSY2X7PsmjC4fvi3g6rr360ATr5f82Mr8GPa3x21XLdIFZ04vTe yE3kwdcarkiT1QQLnOXk/yRBxJwiA5loL9crVdC2WyOV3B3DG33/yas8krw4BYWw DzAgxNtZR4MQXcj83WwoflMo43dYUq3Pk7ZnzKN04O8m9w0gxVxCpXu4ds9emMdJ WS4eNTPUOnzeWttkfYcd3SarK6COi9iBosFT2QF80FwDSlH3XdEo7rD1j6WJ5GeX RbHDvIm9g0xB23S7jmtfdqIHndvPKLmwW2B1VC1mbjcDUo6pyUb31GBd1zFVhT69 ijhiEwBlr8uWxROdwJd/7IVIB/RYHLr5P3M8p08hdEdS1IMQbNEE4Y25fRdcc6g8 fVEAExbG01K1EJhRLxoHzgnAkxDTV2HSwlqbFvKEzUfE+rMHApmSX2lfMvKgueYz JpA7nxuf79Wk17bjNvuVQwokhXpzw7FyPPdD7h4Z30LW0ozvSVgs2tigWCAysIKB 3ZIolchqBoj0ddJgbPXrx09r1oCckEmdj1KtZsci9m+CFA8d22uxXBec0HkEHZpr EHlqEZfNTmqowoDtJ8KT+S8VPsALEyDnrqm3s4i44OwgvsPiKOST1xwk6lIJ5isu fO76RHTQ2jc8z7+sKyNffVugfjYVRj54/8Gj34QkrVo/42rlvg398tpbAbWuNq8w PM//M6eVD4IRDYEGrGOk7prd9mgdbWnOWpasirhr41kePu2vsrIUkJWHmOgdMQDH cSSzI8C5NpafROHAhMsUymcJ5dKksvPubh5IAdgtH+m6yDnNUJT8s6WV1f1RpSsQ L/n3dhti76l0XtfZ7aST8j46B1JPNDx8+r6Xl9IUbSU= =xK46 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/plain-1o.asc000064400000000000000000000032501046102023000154170ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GNUPG v0.3.4 (GNU/Linux) Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/ Comment: Use "gpgm --dearmor" for unpacking PCEtLSBEaWVzIGlzdCBTZWl0ZSAzLCBkb3J0IGlzdCBrZWluZSBTZWl0ZW56YWhsIGFuZ2Vn ZWJlbiwKICAgICBvYmVuIHJlY2h0cyBpc3Qgd2llZGVyIGRlciBTdGVtcGVsIHZvbiBtZWlu ZW0gT3BhIHp1IGZpbmRlbiAtLT4KCjxzZWN0MT5OYW1lIDxxPkdyb98tQmFydGxvZmY8Lz4K CjxwPgpEZXIgTmFtZSA8cS9CYXJ0bG9mZi8gaXN0IHNjaHdlciB6dSBkZXV0ZW4uIE1hbiBo YXQgdmllbGUgTXV0bWHfdW5nZW4KYW5nZXN0ZWxsdCwgdm9uIGRlbmVuIG1hbiBhYmVyIGJp c2xhbmcga2VpbmUgZWluemlnZSBhbHMgdW5iZWRpbmd0CnJpY2h0aWcgZXJrbORyZW4ga2Fu bi4KPGZvbnRpbmZvIHJlbT0ibWl0IExlZXJ6ZWljaGVuIGdlc2NocmllYmVuIj5Vcmt1bmRs aWNoPC8+IHdpcmQgZGFzCkRvcmYgYmlzIHp1ciBSZWZvcm1hdGlvbiBzdGV0cyA8cS9CYXJ0 b3JmLyAoYW5ubyAxMjUzKSB1bmQKPHEvQmFyZG9yZi8gKDEzMDYsIDEzMTgsIDEzMjksIDE0 MjkpIGdlbmFubnQgdW5kIGRhc18gc293b2hsIEtsZWluLQp3aWUgR3Jv32JhcnRsb2ZmLiBF cnN0IDE1ODYgaW0gQmlzY2hvZnNzdGVpbmVyIEp1cmlzZGlrdGlvbmFsYnVjaApoZWnfdCB1 bnNlciBEb3JmIDxxL0JhcnR0ZWxvZmYvIHVuZCBzbyBhdWNoIGluIGRlciDkbHRlc3RlbiBu b2NoCnZvcmhhbmRlbmVuIEtpcmNoZW5yZWNobnVuZyB2b20gSmFocmUgMTY1MS4gTkFjaCBk ZW0gSmFocmUgMTcwMCB3aXJkCmluIGRlbiBVcmt1bmRlbiBiZWdvbm5lbiwgZGVuIHZvbGxl biBOYW1lbiA8cS9Hcm/fLUJhcnRsb2ZmLyB1bmQKPHEvS2xlaW4tQmFydGxvZmYvIHp1IHNj aHJlaWJlbi4KLS0tLS0tLS0tLS0tLS0tLSBbd2VnZW4gZGFzaGVkIGVzY2FwZWQgdGV4dF0K PHA+Ck5pbW10IG1hbiBhbiwgZGHfIGRpZSB1cmt1bmRsaWNoZSwg5Gx0ZXN0ZSBCZXplaWNo bnVuZyBCYXJ0b3JmIGRpZQp1cnNwcvxuZ2xpY2hlIGlzdCB1bmQgbmljaHQgZGllIG11bmRh cnRsaWNoZSBCYXJ0bG9mZiwgc28ga/ZubnRlIGRlcgpOYW1lIGd1dCBnZWRldXRldCB3ZXJk ZW4gYWxzIERvcmYgYW4gZGVyIDxxL0JvcmRlLyBvZGVyIGFtIFJhbmRlCm9kZXIgYW4gZGVy IEdyZW56ZSBlbnR3ZWRlciBkZXMgV2FsZGVzCg== =m1k/ -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/plain-2.asc000064400000000000000000000033651046102023000152500ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.3.5-cvs (GNU/Linux) hQEOA6urKKJHvid1EAP/aYXFOkxPzbBB0SWtyX+yyvZso8i1WJS3pzrHNXcXQSQx xOAfmlCiuXYrjEzlyDAn7k7RLAhUB/ffI58HnbkQ7btWujrHig/V1tQ0j5igR85M 3y2/msWu2c2pyeZnx29LzeoJ2aMVTbMObszlG+TNOuhCNn4unvbShrkFjNK5fi8E AIHiavE77ZPfcaUrXp6FJ6OuhbnJQ8y8CVpH++ddgU6xXK1vByMSsYqiOjfq08gV MzqT1eMVvKhSjl3R6Ktl7j+ErYM4KuIofIZsKc8M3JnoTSrLqWSEBq+DEiaSI58i SMJfzxfKA84bpJyLIjp4bjRIXveYoX8UjEnSNr3xuDIq0ukBoVe6Bx8lBActcwE+ kE7EffSBHUmnm8cvwZan+Ms8t9p9aQEzBxV/LfEXZyk36lK35zCH188iJR+tt9zs rNubkRuOjq9jAcBtrvgjTTO91Ru7z4RCYeMfnX9AauJZFShBNYN46GTIwqMWE9vq B/IYFH9/L2nufcrDQ6u5WxJo0y2FoPqVS4RKEZ4FlKnlT2Op0X1k9w+1nWTtKwQx fPsB+YRSKmVbZOXDeKAIVEyGHgR1Hj6pbo/IeHSJ2DJt5OFu6eLQYjxYjM7BPjPD Gn+lTUvqw5ykYpCcnvpEx25+qHh5HI11Hi0sLKzvB92hhsQ7+lU2D+iAzsMJKdwE u2bCnrZokzZwDBy6NISQ+hoc6NPPezQM4FLN0BB752fa9DYMQo5nEGfPUM7fv51A nUdGOmaDVWY54GQxiYzl0JAT41sQSYlVHcWBCGNAm064y+tsHVjDYcf5uze/3Iuw m/IbRGLBT7x+j2OqMX30yXoeHCg0/M/2c6vIzhdHEsJjTbTr+M4bMii/mB5kSo/7 x5R14Lr0mwnPNDFHG2egqd5uL8985+5BENm7q0pQHKGM5NxkjVSWCpzRgKcSEq5A x4Q2HbhEJNP6ZonnZkDmGM52Eq62eaR7t8+k9px35osfiTiClmVrjsTgl5Kvatk0 oL1aYEwp8OtavoSwidUTk+Xb+cEE09P5bnCFs5Js0e5wdo+/izJ6iBuF+PndTh4i 4ppFmt8/GZ63MKBJu4CZE7QJMVAcmmCrsGRONP2JVgmyaBjrIl5xk9FPXQVY0AJx gl3/jO/QFHYs+dlrQ3aqg8Mm0eZyLmZEYjoNibD8PW0keYiVfTF7EGl4jS2sAboc AOzbuABa+30vIjJRWeW5UdTcLyNK7B2qWk6dqpRn9ps3cwCWUiTIcIRgot4PY+3M 8BL4smyZIP1Fmz/woL7gSVIaJHMExHjYPyRlfo+6Vfy3hh3zdiB9e5xA8QRFKgUb Px5ShU5bBykfvFBJjgKU1XLBKqdklaudf3+v8F3LPIyuO6vTYzOIU9UKAHy9CrA2 kAZ8kgHBTtAjmKuJjASBCZHPepq0G9SaRDQI5g4DXx0LXPX3y5xkwVI6kd0QmsMF UU4ij/xjzIPN/AxBgQI8HKk56FnaX0JKoHm7mqWa+1TzbuvJjio4J/IN9XXzVqb1 YL+mkx607hdW9oJltXLO5eio0pb12v/0YXAQlsrlJJNPCUW5hYFv/vH1rHzR98xx nx4PXElm8VUuhKDxdVi9Ipo8fL9Amu3PwYonzOck3R2W4wwlmcopVQQ= =Ng8B -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/plain-2o.asc000064400000000000000000000044041046102023000154220ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GNUPG v0.3.4 (GNU/Linux) Comment: Get GNUPG from ftp://ftp.guug.de/pub/gcrypt/ Comment: Use "gpgm --dearmor" for unpacking Cgo8c2VjdD5Wb3J3b3J0CjxwPgpEZXIgV2VydCBlaW5lciBPcnRzY2hyb25payBpc3Qgb2Zm ZW5iYXIgdW5kIGJlZGFyZiBrZWluZXIgRXL2cnRlcnVuZy4KTWl0IEF1c2JydWNoIGRlcyBX ZWx0a3JpZWdlc18sIGlubWl0dGVuIGRlciBnZXdhbHRpZ2VuIEdlc2NoZWhuaXNzZSwgZvxo bHRlCmRlciBLbGVydXNfIHVuc2VyZXNfIEVpY2hzX2ZlbGRlc18gZGFzXyBtZWhyIHdpZSBm cvxoZXIgdW5kIHNvCmVyc3Rhcmt0ZSBkYXNfIFN0cmViZW4sIGVpbmUgc29sY2hlIE9ydHNf Z2VzY2hpY2h0ZSB6dSBzY2FoZmZlbiwgdW0KdW5zZXJlbiBOYWNoa29tbWVuIHp1IGJlcmlj aHRlbiwgd2FzXyBhdWNoIGRpZSBrbGVpbnN0ZW4gRPZyZmVyIGluCmRlciBncm/fZW4gWmVp dCBnZWxlaXN0ZXQsIGVybGVidCB1bmQgZXJsaXR0ZW4gaGFiZW4uCjxwPgpVbmQgc28gYmVn YW5uIGF1Y2ggaWNoIGltIERlemVtYmVyIDE5MTQsIGRlbiA/Pz8/Pz8/Pz8KU3RvZmYsIHdv IGltbWVyIGljaCBpaG4gYXVjaCBudXIgc28gc3DkcmxpY2ggZmluZGVuIGtvbm50ZSwgenUK c2FtbWVsbiwgaWNoIGJlZnJhZ3RlIHp1buRjaHN0IGVtc2lnIGRpZSDkbHRlc3RlbiBMZXV0 ZSwKZHVyY2hmb3JzY2h0ZSBzb2Rhbm4gZGFzIGdhbnplIFBmYXJyYXJjaGl2LCBkYXMgU2No dWx6ZW5hcmNoaXYKYmVpZGVyIFBmYXJyZPZyZmVyLCBkYXMgS29tbWlzc2FyaWF0c19hcmNo aXYgenUgSGVpbGlnZW5zdGFkdCwKZW5kbGljaCBhdWNoIDE5MTYgZGFzIFN0YWF0c19hcmNo aXYgenUgTWFnZGVidXJnLiBTZWxic3R2ZXJzdORuZGxpY2gKYXJiZWl0ZXRlIGljaCBhdWNo IGRpZSBlaW5zY2hs5GdpZ2UgTGl0ZXJhdHVyIGR1cmNoLiBHYXIgdmllbGUgWmVpdAp1bmQg TfxoZSBoYXQgZXNfIGdla29zdGV0IHVtIG5hY2ggbWVociBhbHMgOCBKYWhyZW4gZGllIE9y dHNjaHJvbmlrIHZvbgpHcm/fYmFydGxvZmYgdW5kIHZvbSBGaWxpYWxkb3JmIFdpbGJpY2gg Z2Vzb25kZXJ0IHp1IHNjaGFmZmVuLgo8cCB2c3BhY2U9IjJleCI+CjxiZj5Hcm/fYmFydGxv ZmYsPC8+IGRlbiAyMy4gTeRyeiAxOTIzLgo8cCB2c3BhY2U9IjNleCIgYWxpZ249cmlnaHQ+ CjxiZi9OaWtvbGF1cyBH9nJpbmcsLyBQZmFycmVyLgo8L3A+Cgo8IS0tIEhpZXIgZm9sZ3Qg ZWluIFN0ZW1wZWwgdm9uIG1laW5lbSBPcGE6CgkgIFJ1ZC4gS29jaAogICAgIEdyb99iYXJ0 bG9mZi9FaWNoc2ZlbGQKCUFuZ2VyIDE2MQotLT4KPCEtLSBGSVhNRTogaGllciBrb21tdCBl aW5lbiBaaWVybGluaWUgLS0+Cgo8cCB2c3BhY2U9ZmlsbD4gPCEtLSBEZXIgUmVzdCBrYW0g YW0gRW5kZSBkZXIgU2VpdGUgLS0+CjxwIGFsaWduPWNlbnRlcj4gTGl0ZXJhdHVyOiA8L3A+ CjEpIEpvaC4gV29sZjogUG9saXRpc2NoZSBHZXNjaGljaHRlIGRlcyBFaWNoc2YuIEf2dHQu IDE3OTIgdW5kCkz2ZmZsZXIgMTkyMS4gMikgSy4gR2VzY2hpY2h0ZSwgV29sZiAxODE2IEf2 dHQuICAzKSBLbmllYjogR2VzY2guCmRlciBSZWYuIHUuIEdlZ2VucmVmPz8/Cgo8IS0tIEZJ WE1FOiBEZXIgUmVzdCBmZWhsdCBub2NoIC0tPgoKCgoKCgoKCjwvc2VjdD4K =9nnj -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/plain-3.asc000064400000000000000000000011371046102023000152440ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.3.5-cvs (GNU/Linux) hQEOA6urKKJHvid1EAQAreXx68NPUPpiNhqRyM//Y97N8hX5iAWq3WxXTa8D6Hy9 81Jy2wI4IeDhHIoWuXMIX2oVL//V1+LyLkrF/tutBVvqct0TUDUWqb4Ydpfk2l5j FfSybWW1fS4D1e0KVB3Lfj2Y4cCoT/+zyq7jUKQE++qNefPBzeaRWY4qeI6xXF8E AMj01HPe0ZwIBWqiIYv91Q7rGzEZm0ROPilgSQjUvCdsNQGhZpFGTl6uMSU0lmp8 SD2EKv3xGeo2nMPy/Xp4JoYAMW+fjJh+wM6uT84nJgCVaeWyR7HAfF1U4rzqz7DF amPozuwuZiyjoo/wB1irZSl90t5Oa69oMesZtGMvwBN10mMBM0TotT4gjgviv5uY kLjD7DM79xy0drptNypmcVcjnDunM6bSEhTyq/fahdaULTYcwSOTXVMyesNpmLCb ziayleyuSaXPxIqWTgSfkab/W2FGWZvbexYaSaWXmDqsyzs81o0= =JDKF -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/plain-3o.asc000064400000000000000000000004621046102023000154230ustar 00000000000000Stored by G10, because diff/patch have problems with files not having a trailing LF - and this one has none. -----BEGIN PGP ARMORED FILE----- Version: G10 v0.2.6a (Linux) Comment: This is an alpha version! RGllcyBpc3QgZWluZSBlaW5mYWNoZSBaZWlsZSBvaG5lIExGIGFtIEVuZGUu =ZQ6m -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/plain-large.asc000064400000000000000000002505511046102023000162020ustar 00000000000000-----BEGIN PGP MESSAGE----- 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 =3L8L -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/plain-largeo.asc000064400000000000000000010252231046102023000163560ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking IyBIQUNLSU5HICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgIC0qLSBvcmcgLSotCiMrVElUTEU6IEEgSGFja2VyJ3Mg R3VpZGUgdG8gR251UEcKIytURVhUOiBTb21lIG5vdGVzIG9uIEdudVBHIGludGVy bmFscwojK1NUQVJUVVA6IHNob3dhbGwKIytPUFRJT05TOiBeOnt9CgoqIEhvdyB0 byBjb250cmlidXRlCgogIFRoZSBmb2xsb3dpbmcgc3R1ZmYgZXhwbGFpbnMgc29t ZSBiYXNpYyBwcm9jZWR1cmVzIHlvdSBuZWVkIHRvCiAgZm9sbG93IGlmIHlvdSB3 YW50IHRvIGNvbnRyaWJ1dGUgY29kZSBvciBkb2N1bWVudGF0aW9uLgoKKiogTm8g bW9yZSBDaGFuZ2VMb2cgZmlsZXMKCkRvIG5vdCBtb2RpZnkgYW55IG9mIHRoZSBD aGFuZ2VMb2cgZmlsZXMgaW4gR251UEcuICBTdGFydGluZyBvbgpEZWNlbWJlciAx c3QsIDIwMTEgd2UgcHV0IGNoYW5nZSBpbmZvcm1hdGlvbiBvbmx5IGluIHRoZSBH SVQgY29tbWl0CmxvZywgYW5kIGdlbmVyYXRlIGEgdG9wLWxldmVsIENoYW5nZUxv ZyBmaWxlIGZyb20gbG9ncyBhdCAibWFrZSBkaXN0Igp0aW1lLiAgQXMgc3VjaCwg dGhlcmUgYXJlIHN0cmljdCByZXF1aXJlbWVudHMgb24gdGhlIGZvcm0gb2YgdGhl CmNvbW1pdCBsb2cgbWVzc2FnZXMuICBUaGUgb2xkIENoYW5nZUxvZyBmaWxlcyBo YXZlIGFsbCBiZSByZW5hbWVkIHRvCkNoYW5nZUxvZy0yMDExCgoqKiBDb21taXQg bG9nIHJlcXVpcmVtZW50cwoKWW91ciBjb21taXQgbG9nIHNob3VsZCBhbHdheXMg c3RhcnQgd2l0aCBhIG9uZS1saW5lIHN1bW1hcnksIHRoZQpzZWNvbmQgbGluZSBz aG91bGQgYmUgYmxhbmssIGFuZCB0aGUgcmVtYWluaW5nIGxpbmVzIGFyZSB1c3Vh bGx5CkNoYW5nZUxvZy1zdHlsZSBlbnRyaWVzIGZvciBhbGwgYWZmZWN0ZWQgZmls ZXMuICBIb3dldmVyLCBpdCdzIGZpbmUKLS0tIGV2ZW4gcmVjb21tZW5kZWQgLS0t IHRvIHdyaXRlIGEgZmV3IGxpbmVzIG9mIHByb3NlIGRlc2NyaWJpbmcgdGhlCmNo YW5nZSwgd2hlbiB0aGUgc3VtbWFyeSBhbmQgQ2hhbmdlTG9nIGVudHJpZXMgZG9u J3QgZ2l2ZSBlbm91Z2ggb2YKdGhlIGJpZyBwaWN0dXJlLiAgT21pdCB0aGUgbGVh ZGluZyBUQUJzIHRoYXQgeW91IGFyZSBzZWVpbmcgaW4gYQoicmVhbCIgQ2hhbmdl TG9nIGZpbGUsIGJ1dCBrZWVwIHRoZSBtYXhpbXVtIGxpbmUgbGVuZ3RoIGF0IDcy IG9yCnNtYWxsZXIsIHNvIHRoYXQgdGhlIGdlbmVyYXRlZCBDaGFuZ2VMb2cgbGlu ZXMsIGVhY2ggd2l0aCBpdHMgbGVhZGluZwpUQUIsIHdpbGwgbm90IGV4Y2VlZCA4 MCBjb2x1bW5zLiAgSWYgeW91IHdhbnQgdG8gYWRkIHRleHQgd2hpY2ggc2hhbGwK bm90IGJlIGNvcGllZCB0byB0aGUgQ2hhbmdlTG9nLCBzZXBhcmF0ZSBpdCBieSBh IGxpbmUgY29uc2lzdGluZyBvZgp0d28gZGFzaGVzIGF0IHRoZSBiZWdpbiBvZiBh IGxpbmUuCgpUaGUgb25lLWxpbmUgc3VtbWFyeSB1c3VhbGx5IHN0YXJ0cyB3aXRo IGEga2V5d29yZCB0byBpZGVudGlmeSB0aGUKbWFpbmx5IGFmZmVjdGVkIHN1YnN5 c3RlbS4gIElmIG1vcmUgdGhhbiBvbmUga2V5d29yZCBpcyByZXF1aXJlZCB0aGUK YXJlIGRlbGltaXRlZCBieSBhIGNvbW1hIChlLmcuID1zY2QsdzMyOj0pLiBDb21t b25seSBmb3VuZCBrZXl3b3JkcwphcmUKCiAtIGFnZW50ICAgOjogVGhlIGdwZy1h Z2VudCBjb21wb25lbnQKIC0gc3NoICAgICA6OiBUaGUgc3NoLWFnZW50IHBhcnQg b2YgdGhlIGFnZW50CiAtIGNvbW1vbiAgOjogQ29kZSBpbiBjb21tb24KIC0gaW9i dWYgICA6OiBUaGUgSU9CVUYgc3lzdGVtIGluIGNvbW1vbgogLSBncGcgICAgIDo6 IFRoZSBncGcgb3IgZ3BndiBjb21wb25lbnRzCiAtIGdwZ3NtICAgOjogVGhlIGdw Z3NtIGNvbXBvbmVudAogLSBzY2QgICAgIDo6IFRoZSBzY2RhZW1vbiBjb21wb25l bnQKIC0gY2NpZCAgICA6OiBUaGUgQ0NJRCBkcml2ZXIgaW4gc2NkYWVtb24KIC0g ZGlybW5nciA6OiBUaGUgZGlybW5nciBjb21wb25lbnQKIC0gdzMyICAgICA6OiBX aW5kb3dzIHJlbGF0ZWQgY29kZQogLSBwbyAgICAgIDo6IFRyYW5zbGF0aW9ucwog LSBidWlsZCAgIDo6IENoYW5nZXMgdG8gdGhlIGJ1aWxkIHN5c3RlbQogLSBzcGVl ZG8gIDo6IFNwZWVkbyBidWlsZCBzeXN0ZW0gc3BlY2lmaWMgY2hhbmdlcwogLSBk b2MgICAgIDo6IERvY3VtZW50YXRpb24gY2hhbmdlcwoKVHlwbyBmaXhlcyBhbmQg ZG9jdW1lbnRhdGlvbiB1cGRhdGVzIGRvbid0IG5lZWQgYSBDaGFuZ2VMb2cgZW50 cnk7CnRodXMgeW91IHdvdWxkIHVzZSBhIGNvbW1pdCBtZXNzYWdlIGxpa2UKCiMr YmVnaW5fZXhhbXBsZQpGaXggdHlwbyBpbiBhIGNvbW1lbnQKCi0tCiMrZW5kX2V4 YW1wbGUKClRoZSBtYXJrZXIgbGluZSBoZXJlIGlzIGltcG9ydGFudDsgd2l0aG91 dCBpdCB0aGUgZmlyc3QgbGluZSB3b3VsZAphcHBlYXIgaW4gdGhlIENoYW5nZUxv Zy4KCklmIHlvdSBleGNlcHRpb25hbGx5IG5lZWQgdG8gaGF2ZSBsb25nZXIgbGlu ZXMgaW4gYSBjb21taXQgbG9nIHlvdSBtYXkKZG8gdGhpcyBhZnRlciB0aGlzIHNj aXNzb3IgbGluZToKIytiZWdpbl9leGFtcGxlCiMgLS0tLS0tLS0tLS0tLS0tLS0t LS0tLS0tID44IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQojK2VuZF9leGFtcGxl CihoYXNoLCBibGFuaywgMjQgZGFzaGVzLCBibGFuaywgc2Npc3NvciwgYmxhbmss IDI0IGRhc2hlcykuCk5vdGUgdGhhdCBzdWNoIGEgY29tbWVudCB3aWxsIGJlIHJl bW92ZWQgaWYgdGhlIGdpdCBjb21taXQgb3B0aW9uCj0tLWNsZWFudXA9c2Npc3Nv cj0gaXMgdXNlZC4KCgoqKiBMaWNlbnNlIHBvbGljeQoKICBHbnVQRyBpcyBsaWNl bnNlZCB1bmRlciB0aGUgR1BMdjMrIHdpdGggc29tZSBmaWxlcyB1bmRlciBhIG1p eGVkCiAgTEdQTHYzKy9HUEx2MisgbGljZW5zZS4gIEl0IGlzIHRodXMgaW1wb3J0 YW50LCB0aGF0IGFsbCBjb250cmlidXRlZAogIGNvZGUgYWxsb3dzIGZvciBhbiB1 cGRhdGUgb2YgdGhlIGxpY2Vuc2U7IGZvciBleGFtcGxlIHdlIGNhbid0CiAgYWNj ZXB0IGNvZGUgdW5kZXIgdGhlIEdQTHYyKG9ubHkpLgoKICBHbnVQRyB1c2VkIHRv IGhhdmUgYSBzdHJpY3QgcG9saWN5IG9mIHJlcXVpcmluZyBjb3B5cmlnaHQKICBh c3NpZ25tZW50cyB0byB0aGUgRlNGLiAgVG8gYXZvaWQgdGhpcyBtYWpvciBvcmdh bml6YXRpb25hbCBvdmVyaGVhZAogIGFuZCB0byBhbGxvdyBpbmNsdXNpb24gb2Yg Y29kZSwgbm90IGNvcHlyaWdodGVkIGJ5IHRoZSBGU0YsIHRoaXMKICBwb2xpY3kg aGFzIGJlZW4gcmVsYXhlZCBvbiAyMDEzLTAzLTI5LiAgSXQgaXMgbm93IGFsc28g cG9zc2libGUgdG8KICBjb250cmlidXRlIGNvZGUgYnkgYXNzZXJ0aW5nIHRoYXQg dGhlIGNvbnRyaWJ1dGlvbiBpcyBpbiBhY2NvcmRhbmNlCiAgdG8gdGhlICJMaWJn Y3J5cHQgRGV2ZWxvcGVyJ3MgQ2VydGlmaWNhdGUgb2YgT3JpZ2luIiBhcyBmb3Vu ZCBpbiB0aGUKICBmaWxlICJEQ08iLiAgKEV4Y2VwdCBmb3IgYSBzbGlnaHQgd29y ZGluZyBjaGFuZ2UsIHRoaXMgRENPIGlzCiAgaWRlbnRpY2FsIHRvIHRoZSBvbmUg dXNlZCBieSB0aGUgTGludXgga2VybmVsLikKCiAgSWYgeW91IHdhbnQgdG8gY29u dHJpYnV0ZSBjb2RlIG9yIGRvY3VtZW50YXRpb24gdG8gR251UEcgYW5kIHlvdQog IGRpZG4ndCBzaWduIGEgY29weXJpZ2h0IGFzc2lnbm1lbnQgd2l0aCB0aGUgRlNG IGluIHRoZSBwYXN0LCB5b3UKICBuZWVkIHRvIHRha2UgdGhlc2Ugc2ltcGxlIHN0 ZXBzOgoKICAtIERlY2lkZSB3aGljaCBtYWlsIGFkZHJlc3MgeW91IHdhbnQgdG8g dXNlLiAgUGxlYXNlIGhhdmUgeW91ciByZWFsCiAgICBuYW1lIGluIHRoZSBhZGRy ZXNzIGFuZCBub3QgYSBwc2V1ZG9ueW0uICBBbm9ueW1vdXMgY29udHJpYnV0aW9u cwogICAgY2FuIG9ubHkgYmUgZG9uZSBpZiB5b3UgZmluZCBhIHByb3h5IHdobyBj ZXJ0aWZpZXMgZm9yIHlvdS4KCiAgLSBJZiB5b3VyIGVtcGxveWVyIG9yIHNjaG9v bCBtaWdodCBjbGFpbSBvd25lcnNoaXAgb2YgY29kZSB3cml0dGVuCiAgICBieSB5 b3U7IHlvdSBuZWVkIHRvIHRhbGsgdG8gdGhlbSB0byBtYWtlIHN1cmUgdGhhdCB5 b3UgaGF2ZSB0aGUKICAgIHJpZ2h0IHRvIGNvbnRyaWJ1dGUgdW5kZXIgdGhlIERD Ty4KCiAgLSBTZW5kIGFuIE9wZW5QR1Agc2lnbmVkIG1haWwgdG8gdGhlIGdudXBn LWRldmVsQGdudXBnLm9yZyBtYWlsaW5nCiAgICBsaXN0IGZyb20geW91ciBtYWls IGFkZHJlc3MuICBJbmNsdWRlIGEgY29weSBvZiB0aGUgRENPIGFzIGZvdW5kCiAg ICBpbiB0aGUgb2ZmaWNpYWwgbWFzdGVyIGJyYW5jaC4gIEluc2VydCB5b3VyIG5h bWUgYW5kIGVtYWlsIGFkZHJlc3MKICAgIGludG8gdGhlIERDTyBpbiB0aGUgc2Ft ZSB3YXkgeW91IHdhbnQgdG8gdXNlIGl0IGxhdGVyLiAgRXhhbXBsZToKCiAgICAg IFNpZ25lZC1vZmYtYnk6IEpvZSBSLiBIYWNrZXIgPGpvZUBleGFtcGxlLm9yZz4K CiAgICAoSWYgeW91IHJlYWxseSBuZWVkIGl0LCB5b3UgbWF5IHBlcmZvcm0gc2lt cGxlIHRyYW5zZm9ybWF0aW9ucyBvZgogICAgdGhlIG1haWwgYWRkcmVzczogUmVw bGFjaW5nICJAIiBieSAiIGF0ICIgb3IgIi4iIGJ5ICIgZG90ICIuKQoKICAtIFRo YXQncyBpdC4gIEZyb20gbm93IG9uIHlvdSBvbmx5IG5lZWQgdG8gYWRkIGEgIlNp Z25lZC1vZmYtYnk6IgogICAgbGluZSB3aXRoIHlvdXIgbmFtZSBhbmQgbWFpbCBh ZGRyZXNzIHRvIHRoZSBjb21taXQgbWVzc2FnZS4gIEl0IGlzCiAgICByZWNvbW1l bmRlZCB0byBzZW5kIHRoZSBwYXRjaGVzIHVzaW5nIGEgUEdQL01JTUUgc2lnbmVk IG1haWwuCgoqKiBDb2Rpbmcgc3RhbmRhcmRzCgogIFBsZWFzZSBmb2xsb3cgdGhl IEdOVSBjb2Rpbmcgc3RhbmRhcmRzLiAgSWYgeW91IGFyZSBpbiBkb3VidCBjb25z dWx0CiAgdGhlIGV4aXN0aW5nIGNvZGUgYXMgYW4gZXhhbXBsZS4gIERvIG5vIHJl LWluZGVudCBjb2RlIHdpdGhvdXQgYQogIG5lZWQuICBJZiB5b3UgcmVhbGx5IG5l ZWQgdG8gZG8gaXQsIHVzZSBhIHNlcGFyYXRlIGNvbW1pdCBmb3Igc3VjaCBhCiAg Y2hhbmdlLgoKICAtIE9ubHkgY2VydGFpbiBDOTkgZmVhdHVyZXMgbWF5IGJlIHVz ZWQgKHNlZSBiZWxvdyk7IGluIGdlbmVyYWwKICAgIHN0aWNrIHRvIEM5MC4KICAt IFBsZWFzZSBkbyBub3QgdXNlIEMrKyA9Ly89IHN0eWxlIGNvbW1lbnRzLgogIC0g VHJ5IHRvIGZpdCBsaW5lcyBpbnRvIDgwIGNvbHVtbnMuCiAgLSBJZ25vcmUgc2ln bmVkL3Vuc2lnbmVkIHBvaW50ZXIgbWlzbWF0Y2hlcwogIC0gTm8gYXJpdGhtZXRp YyBvbiB2b2lkIHBvaW50ZXJzOyBjYXN0IHRvIGNoYXIqIGZpcnN0LgogIC0gV2Ug dXNlIG91ciBvd24gcHJpbnRmIHN0eWxlIGZ1bmN0aW9ucyBsaWtlID1lc19wcmlu dGY9LCBhbmQKICAgID1lc19hc3ByaW50Zj0gd2hpY2ggaW1wbGVtZW50IG1vc3Qg Qzk5IGZlYXR1cmVzIHdpdGggdGhlIGV4Y2VwdGlvbgogICAgb2YgPXdjaGFyX3Q9 ICh3aGljaCBzaG91bGQgYW55d2F5IG5vdCBiZSB1c2VkKS4gIFBsZWFzZSBhbHdh eXMgdXNlCiAgICB0aGVtIGFuZCBkbyBub3QgcmVzb3J0IHRvIHRob3NlIHByb3Zp ZGVkIGJ5IGxpYmMuICBUaGUgcmF0aW9uYWxlCiAgICBmb3IgdXNpbmcgdGhlbSBp cyB0aGF0IHdlIGtub3cgdGhhdCB0aGUgZm9ybWF0IHNwZWNpZmllcnMgd29yayBv bgogICAgYWxsIHBsYXRmb3JtcyBhbmQgdGhhdCB3ZSBkbyBub3QgbmVlZCB0byBj aGFzZSBwbGF0Zm9ybSBkZXBlbmRlbnQKICAgIGJ1Z3MuCiAgLSBJdCBpcyBjb21t b24gdG8gaGF2ZSBhIGxhYmVsIG5hbWVkICJsZWF2ZSIgZm9yIGEgZnVuY3Rpb24n cwogICAgY2xlYW51cCBhbmQgcmV0dXJuIGNvZGUuICBUaGlzIGhlbHBzIHdpdGgg ZnJlZWluZyBtZW1vcnkgYW5kIGlzIGEKICAgIGNvbnZlbmllbnQgbG9jYXRpb24g dG8gc2V0IGEgYnJlYWtwb2ludCBmb3IgZGVidWdnaW5nLgogIC0gQWx3YXlzIHVz ZSB4ZnJlZSgpIGluc3RlYWQgb2YgZnJlZSgpLiAgSWYgaXQgaXMgbm90IGVhc3kg dG8gc2VlCiAgICB0aGF0IHRoZSBmcmVlZCB2YXJpYWJsZSBpcyBub3QgYW55bW9y ZSB1c2VkLCBleHBsaWNpdGx5IHNldCB0aGUKICAgIHZhcmlhYmxlIHRvIE5VTEwu CiAgLSBJbml0IGZ1bmN0aW9uIGxvY2FsIHZhcmlhYmxlcyBvbmx5IGlmIG5lZWRl ZCBzbyB0aGF0IHRoZSBjb21waWxlcgogICAgY2FuIGRvIGEgYmV0dGVyIGpvYiBp biBkZXRlY3RpbmcgdW5pbml0aWFsaXplZCB2YXJpYWJsZXMgd2hpY2ggbWF5CiAg ICBpbmRpY2F0ZSBhIHByb2JsZW0gd2l0aCB0aGUgY29kZS4KICAtIE5ldmVyIGlu aXQgc3RhdGljIG9yIGZpbGUgbG9jYWwgdmFyaWFibGVzIHRvIDAgdG8gbWFrZSBz dXJlIHRoZXkKICAgIGVuZCB1cCBpbiBCU1MuCiAgLSBVc2UgLS1lbmFibGUtbWFp bnRhaW5lci1tb2RlIHdpdGggY29uZmlndXJlLgoKKioqIEM5OSBsYW5ndWFnZSBm ZWF0dXJlcwoKICBJbiBHbnVQRyAyLngsIGJ1dCAqbm90IGluIDEuNCogYW5kIG5v dCBpbiBtb3N0IGxpYnJhcmllcywgYSBsaW1pdGVkCiAgc2V0IG9mIEM5OSBmZWF0 dXJlcyBtYXkgYmUgdXNlZDoKCiAgLSBWYXJpYWRpYyBtYWNyb3M6CiAgICA6ICNk ZWZpbmUgZm9vKGEsLi4uKSAgYmFyKGEsIF9fVkFfQVJHU19fKQoKICAtIFRoZSBw cmVkZWZpbmVkIG1hY3JvID1fX2Z1bmNfXz06CiAgICA6IGxvZ19kZWJ1ZyAoIiVz OiBQcm9ibGVtIHdpdGggZm9vXG4iLCBfX2Z1bmNfXyk7CgogIC0gVmFyaWFibGUg ZGVjbGFyYXRpb24gaW5zaWRlIGEgZm9yKCk6CiAgICA6IGZvciAoaW50IGkgPSAw OyBpIDwgNTsgKyspCiAgICA6ICAgYmFyIChpKTsKCiAgQWx0aG91Z2ggd2UgdXN1 YWxseSBtYWtlIHVzZSBvZiB0aGUgPXUxNj0sID11MzI9LCBhbmQgPXU2ND0gdHlw ZXMsCiAgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBpbmNsdWRlID08c3RkaW50Lmg+ PSBhbmQgdXNlID1pbnQxNl90PSwKICA9aW50MzJfdD0sID1pbnQ2NF90PSwgPXVp bnQxNl90PSwgPXVpbnQzMl90PSwgYW5kID11aW50NjRfdD0uICBCdXQgZG8KICBu b3QgdXNlID1pbnQ4X3Q9IG9yID11aW50OF90PS4KCioqIENvbW1pdCBsb2cga2V5 d29yZHMKCiAgLSBHbnVQRy1idWctaWQgOjogVmFsdWVzIGFyZSBjb21tYSBvciBz cGFjZSBkZWxpbWl0ZWQgYnVnIG51bWJlcnMKICAgICAgICAgICAgICAgICAgICBm cm9tIGJ1Zy5nbnVwZy5vcmcgcGVydGFpbmluZyB0byB0aGlzIGNvbW1pdC4KICAt IERlYmlhbi1idWctaWQgOjogU2FtZSBhcyBhYm92ZSBidXQgZnJvbSB0aGUgRGVi aWFuIGJ1ZyB0cmFja2VyLgogIC0gQ1ZFLWlkIDo6IENWRSBpZCBudW1iZXIgcGVy dGFpbmluZyB0byB0aGlzIGNvbW1pdC4KICAtIFJlZ3Jlc3Npb24tZHVlLXRvIDo6 IENvbW1pdCBpZCBvZiB0aGUgcmVncmVzc2lvbiBmaXhlZCBieSB0aGlzIGNvbW1p dC4KICAtIEZpeGVzLWNvbW1pdCA6OiBDb21taXQgaWQgdGhpcyBjb21taXQgZml4 ZXMuCiAgLSBSZXBvcnRlZC1ieSA6OiBWYWx1ZSBpcyBhIG5hbWUgb3IgbWFpbCBh ZGRyZXNzIG9mIGEgYnVnIHJlcG9ydGUuCiAgLSBTdWdnZXN0ZWQtYnkgOjogVmFs dWUgaXMgYSBuYW1lIG9yIG1haWwgYWRkcmVzcyBvZiBzb21lb25lIGhvdwogICAg ICAgICAgICAgICAgICAgIHN1Z2dlc3RlZCB0aGlzIGNoYW5nZS4KICAtIENvLWF1 dGhvcmVkLWJ5IDo6IE5hbWUgb3IgbWFpbCBhZGRyZXNzIG9mIGEgY28tYXV0aG9y CiAgLSBTb21lLWNvbW1lbnRzLWJ5IDo6IE5hbWUgb3IgbWFpbCBhZGRyZXNzIG9m IHRoZSBhdXRob3Igb2YKICAgICAgICAgICAgICAgICAgICAgICAgYWRkaXRpb25h bCBjb21tZW50cyAoY29tbWl0IGxvZyBvciBjb2RlKS4KICAtIFByb29mcmVhZC1i eSA6OiBTb21ldGltZXMgdXNlZCBieSB0cmFuc2xhdGlvbiBjb21taXRzLgogIC0g U2lnbmVkLW9mZi1ieSA6OiBOYW1lIG9yIG1haWwgYWRkcmVzcyBvZiB0aGUgZGV2 ZWxvcGVyCgoqIFdpbmRvd3MKKiogSG93IHRvIGJ1aWxkIGFuIGluc3RhbGxlciBm b3IgV2luZG93cwoKICAgWW91ciBiZXN0IGJldCBpcyB0byB1c2UgYSBkZWNlbnQg RGViaWFuIFN5c3RlbSBmb3IgZGV2ZWxvcG1lbnQuCiAgIFlvdSBuZWVkIHRvIGlu c3RhbGwgYSBsb25nIGxpc3Qgb2YgdG9vbHMgZm9yIGJ1aWxkaW5nLiAgVGhpcyBs aXN0CiAgIHN0aWxsIG5lZWRzIHRvIGJlIGNvbXBpbGVkLiAgSG93ZXZlciwgdGhl IGJ1aWxkIHByb2Nlc3Mgd2lsbCBzdG9wCiAgIGlmIGEgdG9vbCBpcyBtaXNzaW5n LiAgR05VIG1ha2UgaXMgcmVxdWlyZWQgKG9uIG5vbiBHTlUgc3lzdGVtcwogICBv ZnRlbiBpbnN0YWxsZWQgYXMgImdtYWtlIikuICBUaGUgaW5zdGFsbGVyIHJlcXVp cmVzIGEgY291cGxlIG9mCiAgIGV4dHJhIHNvZnR3YXJlIHRvIGJlIGF2YWlsYWJs ZSBlaXRoZXIgYXMgdGFyYmFsbHMgb3IgYXMgbG9jYWwgZ2l0CiAgIHJlcG9zaXRv cmllcy4gIEluIGNhc2UgdGhpcyBmaWxlIGhlcmUgaXMgcGFydCBvZiBhIGdudXBn LXczMi0yLioueHoKICAgY29tcGxldGUgdGFyYmFsbCBhcyBkaXN0cmlidXRlZCBm cm9tIHRoZSBzYW1lIHBsYWNlIGFzIGEgYmluYXJ5CiAgIGluc3RhbGxlciwgYWxs IHN1Y2ggdGFyYmFsbHMgYXJlIGFscmVhZHkgaW5jbHVkZWQuCgogICBDZCB0byB0 aGUgR251UEcgc291cmNlIGRpcmVjdG9yeSBhbmQgdXNlIG9uZSBvZiBvbmUgb2Yg dGhlc2UKICAgY29tbWFuZDoKCiAgIC0gSWYgc291cmNlcyBhcmUgaW5jbHVkZWQg KGdudXBnLXczMi0qLnRhci54eikKCiAgICAgbWFrZSAtZiBidWlsZC1hdXgvc3Bl ZWRvLm1rIFdIQVQ9dGhpcyBpbnN0YWxsZXIKCiAgIC0gVG8gYnVpbGQgZnJvbSB0 YXJiYWxscwoKICAgICBtYWtlIC1mIGJ1aWxkLWF1eC9zcGVlZG8ubWsgV0hBVD1y ZWxlYXNlIFRBUkJBTExTPVRBUkRJUiBpbnN0YWxsZXIKCiAgIC0gVG8gYnVpbGQg ZnJvbSBsb2NhbCBHSVQgcmVwb3MKCiAgICAgbWFrZSAtZiBidWlsZC1hdXgvc3Bl ZWRvLm1rIFdIQVQ9Z2l0IFRBUkJBTExTPVRBUkRJUiBpbnN0YWxsZXIKCiAgIE5v dGUgdGhhdCBhbHNvIHlvdSBuZWVkIHRvIHN1cHBseSB0YXJiYWxscyB3aXRoIHN1 cHBvcnRpbmcKICAgbGlicmFyaWVzIGV2ZW4gaWYgeW91IGJ1aWxkIGZyb20gZ2l0 LiAgVGhlIG1ha2VmaWxlIGV4cGVjdHMgb25seQogICB0aGUgY29yZSBHbnVQRyBz b2Z0d2FyZSB0byBiZSBhdmFpbGFibGUgYXMgbG9jYWwgR0lUIHJlcG9zaXRvcmll cy4KICAgc3BlZWRvLm1rIGhhcyB0aGUgdmVyc2lvbnMgb2YgdGhlIHRhcmJhbGxz IGFuZCB0aGUgYnJhbmNoIG5hbWVzIG9mCiAgIHRoZSBnaXQgcmVwb3NpdG9yaWVz LiAgSW4gY2FzZSBvZiBwcm9ibGVtcywgZG9uJ3QgaGVzaXRhdGUgdG8gYXNrCiAg IG9uIHRoZSBnbnVwZy1kZXZlbCBtYWlsaW5nIGZvciBoZWxwLgoKKiBEZWJ1ZyBo aW50cwoKICBTZWUgdGhlIG1hbnVhbCBmb3Igc29tZSBoaW50cy4KCiogU3RhbmRh cmRzCioqIFJGQ3MKCjE0MjMgIFByaXZhY3kgRW5oYW5jZW1lbnQgZm9yIEludGVy bmV0IEVsZWN0cm9uaWMgTWFpbDoKICAgICAgUGFydCBJSUk6IEFsZ29yaXRobXMs IE1vZGVzLCBhbmQgSWRlbnRpZmllcnMuCgoxNDg5ICBSZWdpc3RyYXRpb24gb2Yg YSBDeXJpbGxpYyBDaGFyYWN0ZXIgU2V0LgoKMTc1MCAgUmFuZG9tbmVzcyBSZWNv bW1lbmRhdGlvbnMgZm9yIFNlY3VyaXR5LgoKMTk5MSAgUEdQIE1lc3NhZ2UgRXhj aGFuZ2UgRm9ybWF0cyAob2Jzb2xldGUpCgoyMTQ0ICBUaGUgQ0FTVC0xMjggRW5j cnlwdGlvbiBBbGdvcml0aG0uCgoyMjc5ICBVVEYtOCwgYSB0cmFuc2Zvcm1hdGlv biBmb3JtYXQgb2YgSVNPIDEwNjQ2LgoKMjQ0MCAgT3BlblBHUCAob2Jzb2xldGUp LgoKMzE1NiAgTUlNRSBTZWN1cml0eSB3aXRoIFByZXR0eSBHb29kIFByaXZhY3kg KFBHUCkuCgo0ODgwICBDdXJyZW50IE9wZW5QR1Agc3BlY2lmaWNhdGlvbi4KCjYz MzcgIEVsbGlwdGljIEN1cnZlIENyeXB0b2dyYXBoeSAoRUNDKSBpbiBPcGVuUEdQ CgoqIFZhcmlvdXMgaW5mb3JtYXRpb24KCioqIERpcmVjdG9yeSBMYXlvdXQKCiAg LSAuLwkgICAgICA6OiBSZWFkbWUsIGNvbmZpZ3VyZQogIC0gLi9hZ2VudCAgIDo6 IEdwZy1hZ2VudCBhbmQgcmVsYXRlZCB0b29scwogIC0gLi9kb2MgICAgIDo6IERv Y3VtZW50YXRpb24KICAtIC4vZzEwICAgICA6OiBHcGcgcHJvZ3JhbSBoZXJlIGNh bGxlZCBncGcyCiAgLSAuL3NtICAgICAgOjogR3Bnc20gcHJvZ3JhbQogIC0gLi9q bmxpYiAgIDo6IE5vdCB1c2VkIChmb3JtZXJseSB1c2VkIHV0aWxpdHkgZnVuY3Rp b25zKQogIC0gLi9jb21tb24gIDo6IFV0aWxpdHkgZnVuY3Rpb25zCiAgLSAuL2ti eCAgICAgOjogS2V5Ym94IGxpYnJhcnkKICAtIC4vc2NkICAgICA6OiBTbWFydGNh cmQgZGFlbW9uCiAgLSAuL3NjcmlwdHMgOjogU2NyaXB0cyBuZWVkZWQgYnkgY29u ZmlndXJlIGFuZCBvdGhlcnMKICAtIC4vZGlybW5nciA6OiBUaGUgZGlyZWN0b3J5 IG1hbmFnZXIKCioqIERldGFpbGVkIFJvYWRtYXAKCiAgVGhpcyBsaXN0IG9mIGZp bGVzIGlzIG5vdCB1cCB0byBkYXRlIQoKICAtIGcxMC9ncGcuYyA6OiBNYWluIG1v ZHVsZSB3aXRoIG9wdGlvbiBwYXJzaW5nIGFuZCBhbGwgdGhlIHN0dWZmIHlvdQog ICAgICAgICAgICAgICAgIGhhdmUgdG8gZG8gb24gc3RhcnR1cC4gIEFsc28gaGFz IHRoZSBleGl0IGhhbmRsZXIgYW5kCiAgICAgICAgICAgICAgICAgc29tZSBoZWxw ZXIgZnVuY3Rpb25zLgoKICAtIGcxMC9wYXJzZS1wYWNrZXQuYyA6OgogIC0gZzEw L2J1aWxkLXBhY2tldC5jIDo6CiAgLSBnMTAvZnJlZS1wYWNrZXQuYyA6OiBQYXJz aW5nIGFuZCBjcmVhdGluZyBvZiBPcGVuUEdQIG1lc3NhZ2UgcGFja2V0cy4KCiAg LSBnMTAvZ2V0a2V5LmMgICA6OiBLZXkgc2VsZWN0aW9uIGNvZGUKICAtIGcxMC9w a2NsaXN0LmMgIDo6IEJ1aWxkIGEgbGlzdCBvZiBwdWJsaWMga2V5cwogIC0gZzEw L3NrY2xpc3QuYyAgOjogQnVpbGQgYSBsaXN0IG9mIHNlY3JldCBrZXlzCiAgLSBn MTAva2V5cmluZy5jICA6OiBLZXlyaW5nIGFjY2VzcyBmdW5jdGlvbnMKICAtIGcx MC9rZXlkYi5oICAgIDo6CgogIC0gZzEwL2tleWlkLmMJICA6OiBIZWxwZXIgZnVu Y3Rpb25zIHRvIGdldCB0aGUga2V5aWQsIGZpbmdlcnByaW50IGV0Yy4KCiAgLSBn MTAvdHJ1c3RkYi5jIDo6IFdlYi1vZi1UcnVzdCBjb21wdXRhdGlvbnMKICAtIGcx MC90cnVzdGRiLmggOjoKICAtIGcxMC90ZGJkdW1wLmMgOjogRXhwb3J0L2ltcG9y dC9saXN0IHRoZSB0cnVzdGRiLmdwZwogIC0gZzEwL3RkYmlvLmMgICA6OiBJL08g aGFuZGxpbmcgZm9yIHRoZSB0cnVzdGRiLmdwZwogIC0gZzEwL3RkYmlvLmggICA6 OgoKICAtIGcxMC9jb21wcmVzcy5jIDo6IEZpbHRlciB0byBoYW5kbGUgY29tcHJl c3Npb24KICAtIGcxMC9maWx0ZXIuaCAgIDo6IERlY2xhcmF0aW9ucyBmb3IgYWxs IGZpbHRlciBmdW5jdGlvbnMKICAtIGcxMC9kZWxrZXkuYyAgIDo6IERlbGV0ZSBh IGtleQogIC0gZzEwL2tibm9kZS5jICAgOjogSGVscGVyIGZvciB0aGUga2Jub2Rl X3QgbGlua2VkIGxpc3QKICAtIGcxMC9tYWluLmggICAgIDo6IFByb3RvdHlwZXMg YW5kIHNvbWUgY29uc3RhbnRzCiAgLSBnMTAvbWFpbnByb2MuYyA6OiBNZXNzYWdl IHByb2Nlc3NpbmcKICAtIGcxMC9hcm1vci5jICAgIDo6IEFzY2lpIGFybW9yIGZp bHRlcgogIC0gZzEwL21kZmlsdGVyLmMgOjogRmlsdGVyIHRvIGNhbGN1bGF0ZSBo YXNocwogIC0gZzEwL3RleHRmaWx0ZXIuYyA6OiBGaWx0ZXIgdG8gaGFuZGxlIENS L0xGIGFuZCB0cmFpbGluZyB3aGl0ZSBzcGFjZQogIC0gZzEwL2NpcGhlci5jICAg OjogRW4tL0RlY3J5cHRpb24gZmlsdGVyCiAgLSBnMTAvbWlzYy5jICAgICA6OiBV dGxpdHkgZnVuY3Rpb25zCiAgLSBnMTAvb3B0aW9ucy5oICA6OiBTdHJ1Y3R1cmUg d2l0aCBhbGwgdGhlIGNvbW1hbmQgbGluZSBvcHRpb25zCiAgICAgICAgICAgICAg ICAgICAgICBhbmQgcmVsYXRlZCBjb25zdGFudHMKICAtIGcxMC9vcGVuZmlsZS5j IDo6IENyZWF0ZS9PcGVuIEZpbGVzCiAgLSBnMTAva2V5c2VydmVyLmggOjogS2V5 c2VydmVyIGFjY2VzcyBkaXNwYXRjaGVyLgogIC0gZzEwL3BhY2tldC5oICAgOjog RGVmaW50aW9uIG9mIE9wZW5QR1Agc3RydWN0dXJlcy4KICAtIGcxMC9wYXNzcGhy YXNlLmMgOjogUGFzc3BocmFzZSBoYW5kbGluZyBjb2RlCgogIC0gZzEwL3B1Ymtl eS1lbmMuYyA6OiBQcm9jZXNzIGEgcHVibGljIGtleSBlbmNvZGVkIHBhY2tldC4K ICAtIGcxMC9zZWNrZXktY2VydC5jIDo6IE5vdCBhbnltb3JlIHVzZWQKICAtIGcx MC9zZXNrZXkuYyAgICAgOjogTWFrZSBzZXNzc2lvbiBrZXlzIGV0Yy4KICAtIGcx MC9pbXBvcnQuYyAgICAgOjogSW1wb3J0IGtleXMgaW50byBvdXIga2V5IHN0b3Jh Z2UuCiAgLSBnMTAvZXhwb3J0LmMgICAgIDo6IEV4cG9ydCBrZXlzIHRvIHRoZSBP cGVuUEdQIGZvcm1hdC4KICAtIGcxMC9zaWduLmMgICAgICAgOjogQ3JlYXRlIHNp Z25hdHVyZSBhbmQgb3B0aW9uYWxseSBlbmNyeXB0LgogIC0gZzEwL3BsYWludGV4 dC5jICA6OiBQcm9jZXNzIHBsYWludGV4dCBwYWNrZXRzLgogIC0gZzEwL2RlY3J5 cHQtZGF0YS5jIDo6IERlY3J5cHQgYW4gZW5jcnlwdGVkIGRhdGEgcGFja2V0CiAg LSBnMTAvZW5jcnlwdC5jICAgIDo6IE1haW4gZW5jcnlwdGlvbiBkcml2ZXIKICAt IGcxMC9yZXZva2UuYyAgICAgOjogQ3JlYXRlIHJlY292YXRpb24gY2VydGlmaWNh dGVzLgogIC0gZzEwL2tleWxpc3QuYyAgICA6OiBQcmludCBpbmZvcm1hdGlvbiBh Ym91dCBPcGVuUEdQIGtleXMKICAtIGcxMC9zaWctY2hlY2suYyAgOjogQ2hlY2sg YSBzaWduYXR1cmUKICAtIGcxMC9oZWxwdGV4dC5jICAgOjogU2hvdyBvbmxpbmUg aGVscCB0ZXh0cwogIC0gZzEwL3ZlcmlmeS5jICAgICA6OiBWZXJpZnkgc2lnbmVk IGRhdGEuCiAgLSBnMTAvZGVjcnlwdC5jICAgIDo6IERlY3J5cHQgYW5kIHZlcmlm eSBkYXRhLgogIC0gZzEwL2tleWVkaXQuYyAgICA6OiBFZGl0IHByb3BlcnRpZXMg b2YgYSBrZXkuCiAgLSBnMTAvZGVhcm1vci5jICAgIDo6IEFybW9yIHV0aWxpdHku CiAgLSBnMTAva2V5Z2VuLmMgICAgIDo6IEdlbmVyYXRlIGEga2V5IHBhaXIKCioq IE1lbW9yeSBhbGxvY2F0aW9uCgpVc2Ugb25seSB0aGUgZnVuY3Rpb25zOgoKIC0g eG1hbGxvYwogLSB4bWFsbG9jX3NlY3VyZQogLSB4dHJ5bWFsbG9jCiAtIHh0cnlt YWxsb2Nfc2VjdXJlCiAtIHhjYWxsb2MKIC0geGNhbGxvY19zZWN1cmUKIC0geHRy eWNhbGxvYwogLSB4dHJ5Y2FsbG9jX3NlY3VyZQogLSB4cmVhbGxvYwogLSB4dHJ5 cmVhbGxvYwogLSB4c3RyZHVwCiAtIHh0cnlzdHJkdXAKIC0geGZyZWUKCgpUaGUg KnNlY3VyZSB2ZXJzaW9ucyBhbGxvY2F0ZSBtZW1vcnkgaW4gdGhlIHNlY3VyZSBt ZW1vcnkuICBUaGF0IGlzLApzd2FwcGluZyBvdXQgb2YgdGhpcyBtZW1vcnkgaXMg YXZvaWRlZCBhbmQgaXMgZ2V0cyBvdmVyd3JpdHRlbiBvbgpmcmVlLiAgVXNlIHRo aXMgZm9yIHBhc3NwaHJhc2VzLCBzZXNzaW9uIGtleXMgYW5kIG90aGVyIHNlbnNp dGl2ZQptYXRlcmlhbC4gIFRoaXMgbWVtb3J5IHNldCBhc2lkZSBmb3Igc2VjdXJl IG1lbW9yeSBpcyBsaW5pdGVkIHRvIGEgZmV3CmsuICBJbiBnZW5lcmFsIHRoZSBm dW5jdGlvbiBkb24ndCBwcmludCBhIG1lbWVvcnkgbWVzc2FnZSBhbmQKdGVybWlu YXRlIHRoZSBwcm9jZXNzIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggbWVtb3J5IGF2 YWlsYWJsZS4gIFRoZQoidHJ5IiB2ZXJzaW9ucyBvZiB0aGUgZnVuY3Rpb25zIHJl dHVybiBOVUxMIGluc3RlYWQuCgoqKiBMb2dnaW5nCgogVE9ETwoKKiogT3B0aW9u IHBhcnNpbmcKCkdudVBHIGRvZXMgbm90IHVzZSBnZXRvcHQgb3IgR05VIGdldG9w dCBidXQgZnVuY3Rpb25zIG9mIGl0J3Mgb3duLgpTZWUgdXRpbC9hcmdwYXJzZS5j IGZvciBkZXRhaWxzLiAgVGhlIGFkdmFudGFnZSBvZiB0aGVzZSBmdW5jdGlvbnMg aXMKdGhhdCBpdCBpcyBtb3JlIGVhc3kgdG8gZGlzcGxheSBhbmQgbWFpbnRhaW4g dGhlIGhlbHAgdGV4dHMgZm9yIHRoZQpvcHRpb25zLiAgVGhlIHNhbWUgb3B0aW9u IHRhYmxlIGlzIGFsc28gdXNlZCB0byBwYXJzZSByZXNvdXJjZSBmaWxlcy4KCioq IFdoYXQgaXMgYW4gSU9CVUYKClRoaXMgaXMgdGhlIGRhdGEgc3RydWN0dXJlIHVz ZWQgZm9yIG1vc3QgSS9PIG9mIGdudXBnLiBJdCBpcyBzaW1pbGFyCnRvIFN5c3Rl bcKgViBTdHJlYW1zIGJ1dCBtdWNoIHNpbXBsZXIuICBCZWNhdXNlIE9wZW5QR1Ag bWVzc2FnZXMgYXJlCm5lc3RlZCBpbiBkaWZmZXJlbnQgd2F5czsgdGhlIHVzZSBv ZiBzdWNoIGEgc3lzdGVtIGhhcyBiaWcgYWR2YW50YWdlcy4KSGVyZSBpcyBhbiBl eGFtcGxlLCBob3cgaXQgd29ya3M6IElmIHRoZSBwYXJzZXIgc2VlcyBhIHBhY2tl dCBoZWFkZXIKd2l0aCBhIHBhcnRpYWwgbGVuZ3RoLCBpdCBwdXNoZXMgdGhlIGJs b2NrX2ZpbHRlciBvbnRvIHRoZSBJT0JVRiB0bwpoYW5kbGUgdGhlc2UgcGFydGlh bCBsZW5ndGggcGFja2V0czogZnJvbSBub3cgb24geW91IGRvbid0IGhhdmUgdG8K d29ycnkgYWJvdXQgdGhpcy4gIFdoZW4gaXQgc2VlcyBhIGNvbXByZXNzZWQgcGFj a2V0IGl0IHB1c2hlcyB0aGUKdW5jb21wcmVzcyBmaWx0ZXIgYW5kIHRoZSBuZXh0 IHJlYWQgYnl0ZSBpcyBvbmUgd2hpY2ggaGFzIGFscmVhZHkgYmVlbgp1bmNvbXBy ZXNzZWQgYnkgdGhpcyBmaWx0ZXIuIFNhbWUgZ29lcyBmb3IgZW5jaXBoZXJlZCBw YWNrZXQsCnBsYWludGV4dCBwYWNrZXRzIGFuZCBzbyBvbi4gIFRoZSBmaWxlIGcx MC9lbmNvZGUuYyBtaWdodCBiZSBhIGdvb2QKc3RhcnRpbmcgcG9pbnQgdG8gc2Vl IGhvdyBpdCBpcyB1c2VkIC0gYWN0dWFsbHkgdGhpcyBpcyB0aGUgb3RoZXIgd2F5 Ogpjb25zdHJ1Y3RpbmcgbWVzc2FnZXMgdXNpbmcgcHVzaGVkIGZpbHRlcnMgYnV0 IGl0IG1heSBiZSBlYXNpZXIgdG8KdW5kZXJzdGFuZC4KCgojIGRvYy9ERVRBSUxT ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg LSotIG9yZyAtKi0KIytUSVRMRTogR251UEcgRGV0YWlscwojIEdsb2JhbGx5IGRp c2FibGUgc3VwZXJzY3JpcHRzIGFuZCBzdWJzY3JpcHRzOgojK09QVElPTlM6IF46 e30KIwoKIyBOb3RlOiBUaGlzIGZpbGUgdXNlcyBvcmctbW9kZTsgaXQgc2hvdWxk IGJlIGVhc3kgdG8gcmVhZCBhcyBwbGFpbgojIHRleHQgYnV0IGJlIGF3YXJlIG9m IHNvbWUgbWFya3VwIHBlY3VsaWFyaXRpZXM6IFZlcmJhdGltIGNvZGUgaXMKIyBl bmNsb3NlZCBpbiAjK2JlZ2luLWV4YW1wbGUsICMrZW5kLWV4YW1wbGUgYmxvY2tz IG9yIG1hcmtlZCBieSBhCiMgY29sb24gYXMgdGhlIGZpcnN0IG5vbi13aGl0ZS1z cGFjZSBjaGFyYWN0ZXIsIHdvcmRzIGJyYWNrZXRlZCB3aXRoCiMgZXF1YWwgc2ln bnMgaW5kaWNhdGUgYSBtb25vc3BhY2UgZm9udCwgYW5kIHRoZSB1c3VhbCAvaXRh bGljcy8sCiMgKmJvbGQqLCBhbmQgX3VuZGVybGluZV8gY29udmVudGlvbnMgYXJl IHJlY29nbml6ZWQuCgpUaGlzIGlzIHRoZSBERVRBSUxTIGZpbGUgZm9yIEdudVBH IHdoaWNoIHNwZWNpZmllcyBzb21lIGludGVybmFscyBhbmQKcGFydHMgb2YgdGhl IGV4dGVybmFsIEFQSSBmb3IgR1BHIGFuZCBHUEdTTS4KCiogRm9ybWF0IG9mIHRo ZSBjb2xvbiBsaXN0aW5ncwogIFRoZSBmb3JtYXQgaXMgYSBiYXNlZCBvbiBjb2xv biBzZXBhcmF0ZWQgcmVjb3JkLCBlYWNoIHJlY29kcyBzdGFydHMKICB3aXRoIGEg dGFnIHN0cmluZyBhbmQgZXh0ZW5kcyB0byB0aGUgZW5kIG9mIHRoZSBsaW5lLiAg SGVyZSBpcyBhbgogIGV4YW1wbGU6CiMrYmVnaW5fZXhhbXBsZQokIGdwZyAtLXdp dGgtY29sb25zIC0tbGlzdC1rZXlzIFwKICAgICAgLS13aXRoLWZpbmdlcnByaW50 IC0td2l0aC1maW5nZXJwcmludCB3a0BnbnVwZy5vcmcKcHViOmY6MTAyNDoxNzo2 QzdFRTFCODYyMUNDMDEzOjg5OTgxNzcxNToxMDU1ODk4MjM1OjptOjo6c2NFU0M6 CmZwcjo6Ojo6Ojo6OkVDQUY3NTkwRUIzNDQzQjVDN0NGM0FDQjZDN0VFMUI4NjIx Q0MwMTM6CnVpZDpmOjo6Ojo6OjpXZXJuZXIgS29jaCA8d2tAZzEwY29kZS5jb20+ Ogp1aWQ6Zjo6Ojo6Ojo6V2VybmVyIEtvY2ggPHdrQGdudXBnLm9yZz46CnN1Yjpm OjE1MzY6MTY6MDZBRDIyMkNBREY2QTZFMTo5MTk1Mzc0MTY6MTAzNjE3NzQxNjo6 Ojo6ZToKZnByOjo6Ojo6Ojo6Q0Y4QkNDNEIxOERFMDhGQ0Q4QTE2MTU5MDZBRDIy MkNBREY2QTZFMToKc3ViOnI6MTUzNjoyMDo1Q0UwODZCNUI1QTE4RkY0Ojg5OTgx Nzc4ODoxMDI1OTYxNzg4Ojo6Ojplc2M6CmZwcjo6Ojo6Ojo6OkFCMDU5MzU5QTNC ODFGNDEwRkNGRjk3RjVDRTA4NkI1QjVBMThGRjQ6CiMrZW5kX2V4YW1wbGUKClRo ZSBkb3VibGUgPS0td2l0aC1maW5nZXJwcmludD0gcHJpbnRzIHRoZSBmaW5nZXJw cmludCBmb3IgdGhlIHN1YmtleXMKdG9vLiAgT2xkIHZlcnNpb25zIG9mIGdwZyB1 c2VkIGEgc2xpZ2h0bHkgZGlmZmVyZW50IGZvcm1hdCBhbmQgcmVxdWlyZWQKdGhl IHVzZSBvZiB0aGUgb3B0aW9uID0tLWZpeGVkLWxpc3QtbW9kZT0gdG8gY29uZm9y bSB0byB0aGUgZm9ybWF0CmRlc2NyaWJlZCBoZXJlLgoKKiogRGVzY3JpcHRpb24g b2YgdGhlIGZpZWxkcwoqKiogRmllbGQgMSAtIFR5cGUgb2YgcmVjb3JkCgogICAg LSBwdWIgOjogUHVibGljIGtleQogICAgLSBjcnQgOjogWC41MDkgY2VydGlmaWNh dGUKICAgIC0gY3JzIDo6IFguNTA5IGNlcnRpZmljYXRlIGFuZCBwcml2YXRlIGtl eSBhdmFpbGFibGUKICAgIC0gc3ViIDo6IFN1YmtleSAoc2Vjb25kYXJ5IGtleSkK ICAgIC0gc2VjIDo6IFNlY3JldCBrZXkKICAgIC0gc3NiIDo6IFNlY3JldCBzdWJr ZXkgKHNlY29uZGFyeSBrZXkpCiAgICAtIHVpZCA6OiBVc2VyIGlkIChvbmx5IGZp ZWxkIDEwIGlzIHVzZWQpLgogICAgLSB1YXQgOjogVXNlciBhdHRyaWJ1dGUgKHNh bWUgYXMgdXNlciBpZCBleGNlcHQgZm9yIGZpZWxkIDEwKS4KICAgIC0gc2lnIDo6 IFNpZ25hdHVyZQogICAgLSByZXYgOjogUmV2b2NhdGlvbiBzaWduYXR1cmUKICAg IC0gZnByIDo6IEZpbmdlcnByaW50IChmaW5nZXJwcmludCBpcyBpbiBmaWVsZCAx MCkKICAgIC0gcGtkIDo6IFB1YmxpYyBrZXkgZGF0YSBbKl0KICAgIC0gZ3JwIDo6 IEtleWdyaXAKICAgIC0gcnZrIDo6IFJldm9jYXRpb24ga2V5CiAgICAtIHRydSA6 OiBUcnVzdCBkYXRhYmFzZSBpbmZvcm1hdGlvbiBbKl0KICAgIC0gc3BrIDo6IFNp Z25hdHVyZSBzdWJwYWNrZXQgWypdCiAgICAtIGNmZyA6OiBDb25maWd1cmF0aW9u IGRhdGEgWypdCgogICAgUmVjb3JkcyBtYXJrZWQgd2l0aCBhbiBhc3RlcmlzayBh cmUgZGVzY3JpYmVkIGF0IFtbKlNwZWNpYWwlMjBmaWVsZCUyMGZvcm1hdHNdWypT cGVjaWFsIGZpZWxkc11dLgoKKioqIEZpZWxkIDIgLSBWYWxpZGl0eQoKICAgIFRo aXMgaXMgYSBsZXR0ZXIgZGVzY3JpYmluZyB0aGUgY29tcHV0ZWQgdmFsaWRpdHkg b2YgYSBrZXkuCiAgICBDdXJyZW50bHkgdGhpcyBpcyBhIHNpbmdsZSBsZXR0ZXIs IGJ1dCBiZSBwcmVwYXJlZCB0aGF0IGFkZGl0aW9uYWwKICAgIGluZm9ybWF0aW9u IG1heSBmb2xsb3cgaW4gc29tZSBmdXR1cmUgdmVyc2lvbnMuIE5vdGUgdGhhdCBH bnVQRyA8CiAgICAyLjEgZG9lcyBub3Qgc2V0IHRoaXMgZmllbGQgZm9yIHNlY3Jl dCBrZXkgbGlzdGluZ3MuCgogICAgLSBvIDo6IFVua25vd24gKHRoaXMga2V5IGlz IG5ldyB0byB0aGUgc3lzdGVtKQogICAgLSBpIDo6IFRoZSBrZXkgaXMgaW52YWxp ZCAoZS5nLiBkdWUgdG8gYSBtaXNzaW5nIHNlbGYtc2lnbmF0dXJlKQogICAgLSBk IDo6IFRoZSBrZXkgaGFzIGJlZW4gZGlzYWJsZWQKCSAgIChkZXByZWNhdGVkIC0g dXNlIHRoZSAnRCcgaW4gZmllbGQgMTIgaW5zdGVhZCkKICAgIC0gciA6OiBUaGUg a2V5IGhhcyBiZWVuIHJldm9rZWQKICAgIC0gZSA6OiBUaGUga2V5IGhhcyBleHBp cmVkCiAgICAtIC0gOjogVW5rbm93biB2YWxpZGl0eSAoaS5lLiBubyB2YWx1ZSBh c3NpZ25lZCkKICAgIC0gcSA6OiBVbmRlZmluZWQgdmFsaWRpdHkuICAnLScgYW5k ICdxJyBtYXkgc2FmZWx5IGJlIHRyZWF0ZWQgYXMKICAgICAgICAgICB0aGUgc2Ft ZSB2YWx1ZSBmb3IgbW9zdCBwdXJwb3NlcwogICAgLSBuIDo6IFRoZSBrZXkgaXMg bm90IHZhbGlkCiAgICAtIG0gOjogVGhlIGtleSBpcyBtYXJnaW5hbCB2YWxpZC4K ICAgIC0gZiA6OiBUaGUga2V5IGlzIGZ1bGx5IHZhbGlkCiAgICAtIHUgOjogVGhl IGtleSBpcyB1bHRpbWF0ZWx5IHZhbGlkLiAgVGhpcyBvZnRlbiBtZWFucyB0aGF0 IHRoZQogICAgICAgICAgIHNlY3JldCBrZXkgaXMgYXZhaWxhYmxlLCBidXQgYW55 IGtleSBtYXkgYmUgbWFya2VkIGFzCiAgICAgICAgICAgdWx0aW1hdGVseSB2YWxp ZC4KICAgIC0gdyA6OiBUaGUga2V5IGhhcyBhIHdlbGwga25vd24gcHJpdmF0ZSBw YXJ0LgogICAgLSBzIDo6IFRoZSBrZXkgaGFzIHNwZWNpYWwgdmFsaWRpdHkuICBU aGlzIG1lYW5zIHRoYXQgaXQgbWlnaHQgYmUKICAgICAgICAgICBzZWxmLXNpZ25l ZCBhbmQgZXhwZWN0ZWQgdG8gYmUgdXNlZCBpbiB0aGUgU1RFRUQgc3l0ZW0uCgog ICAgSWYgdGhlIHZhbGlkaXR5IGluZm9ybWF0aW9uIGlzIGdpdmVuIGZvciBhIFVJ RCBvciBVQVQgcmVjb3JkLCBpdAogICAgZGVzY3JpYmVzIHRoZSB2YWxpZGl0eSBj YWxjdWxhdGVkIGJhc2VkIG9uIHRoaXMgdXNlciBJRC4gIElmIGdpdmVuCiAgICBm b3IgYSBrZXkgcmVjb3JkIGl0IGRlc2NyaWJlcyB0aGUgdmFsaWRpdHkgdGFrZW4g ZnJvbSB0aGUgYmVzdAogICAgcmF0ZWQgdXNlciBJRC4KCiAgICBGb3IgWC41MDkg Y2VydGlmaWNhdGVzIGEgJ3UnIGlzIHVzZWQgZm9yIGEgdHJ1c3RlZCByb290CiAg ICBjZXJ0aWZpY2F0ZSAoaS5lLiBmb3IgdGhlIHRydXN0IGFuY2hvcikgYW5kIGFu ICdmJyBmb3IgYWxsIG90aGVyCiAgICB2YWxpZCBjZXJ0aWZpY2F0ZXMuCgoqKiog RmllbGQgMyAtIEtleSBsZW5ndGgKCiAgICBUaGUgbGVuZ3RoIG9mIGtleSBpbiBi aXRzLgoKKioqIEZpZWxkIDQgLSBQdWJsaWMga2V5IGFsZ29yaXRobQoKICAgIFRo ZSB2YWx1ZXMgaGVyZSBhcmUgdGhvc2UgZnJvbSB0aGUgT3BlblBHUCBzcGVjcyBv ciBpZiB0aGV5IGFyZQogICAgZ3JlYXRoZXIgdGhhbiAyNTUgdGhlIGFsZ29yaXRo bSBpZHMgYXMgdXNlZCBieSBMaWJnY3J5cHQuCgoqKiogRmllbGQgNSAtIEtleUlE CgogICAgVGhpcyBpcyB0aGUgNjQgYml0IGtleWlkIGFzIHNwZWNpZmllZCBieSBP cGVuUEdQIGFuZCB0aGUgbGFzdCA2NAogICAgYml0IG9mIHRoZSBTSEEtMSBmaW5n ZXJwcmludCBvZiBhbiBYLjUwOSBjZXJ0aWZjaWF0ZS4KCioqKiBGaWVsZCA2IC0g Q3JlYXRpb24gZGF0ZQoKICAgIFRoZSBjcmVhdGlvbiBkYXRlIG9mIHRoZSBrZXkg aXMgZ2l2ZW4gaW4gVVRDLiAgRm9yIFVJRCBhbmQgVUFUCiAgICByZWNvcmRzLCB0 aGlzIGlzIHVzZWQgZm9yIHRoZSBzZWxmLXNpZ25hdHVyZSBkYXRlLiAgTm90ZSB0 aGF0IHRoZQogICAgZGF0ZSBpcyB1c2FsbHkgcHJpbnRlZCBpbiBzZWNvbmRzIHNp bmNlIGVwb2NoLCBob3dldmVyLCB3ZSBhcmUKICAgIG1pZ3JhdGluZyB0byBhbiBJ U08gODYwMSBmb3JtYXQgKGUuZy4gIjE5NjYwMjA1VDA5MTUwMCIpLiAgVGhpcyBp cwogICAgY3VycmVudGx5IG9ubHkgcmVsZXZhbnQgZm9yIFguNTA5LiAgQSBzaW1w bGUgd2F5IHRvIGRldGVjdCB0aGUgbmV3CiAgICBmb3JtYXQgaXMgdG8gc2NhbiBm b3IgdGhlICdUJy4gIE5vdGUgdGhhdCBvbGQgdmVyc2lvbnMgb2YgZ3BnCiAgICB3 aXRob3V0IHVzaW5nIHRoZSA9LS1maXhlZC1saXN0LW1vZGU9IG9wdGlvbiB1c2Vk IGEgInl5eXktbW0tdHQiCiAgICBmb3JtYXQuCgoqKiogRmllbGQgNyAtIEV4cGly YXRpb24gZGF0ZQoKICAgIEtleSBvciBVSUQvVUFUIGV4cGlyYXRpb24gZGF0ZSBv ciBlbXB0eSBpZiBpdCBkb2VzIG5vdCBleHBpcmUuCgoqKiogRmllbGQgOCAtIENl cnRpZmljYXRlIFMvTiwgVUlEIGhhc2gsIHRydXN0IHNpZ25hdHVyZSBpbmZvCgog ICAgVXNlZCBmb3Igc2VyaWFsIG51bWJlciBpbiBjcnQgcmVjb3Jkcy4gIEZvciBV SUQgYW5kIFVBVCByZWNvcmRzLAogICAgdGhpcyBpcyBhIGhhc2ggb2YgdGhlIHVz ZXIgSUQgY29udGVudHMgdXNlZCB0byByZXByZXNlbnQgdGhhdAogICAgZXhhY3Qg dXNlciBJRC4gIEZvciB0cnVzdCBzaWduYXR1cmVzLCB0aGlzIGlzIHRoZSB0cnVz dCBkZXB0aAogICAgc2VwZXJhdGVkIGJ5IHRoZSB0cnVzdCB2YWx1ZSBieSBhIHNw YWNlLgoKKioqIEZpZWxkIDkgLSAgT3duZXJ0cnVzdAoKICAgIFRoaXMgaXMgb25s eSB1c2VkIG9uIHByaW1hcnkga2V5cy4gIFRoaXMgaXMgYSBzaW5nbGUgbGV0dGVy LCBidXQKICAgIGJlIHByZXBhcmVkIHRoYXQgYWRkaXRpb25hbCBpbmZvcm1hdGlv biBtYXkgZm9sbG93IGluIGZ1dHVyZQogICAgdmVyc2lvbnMuICBGb3IgdHJ1c3Qg c2lnbmF0dXJlcyB3aXRoIGEgcmVndWxhciBleHByZXNzaW9uLCB0aGlzIGlzCiAg ICB0aGUgcmVndWxhciBleHByZXNzaW9uIHZhbHVlLCBxdW90ZWQgYXMgaW4gZmll bGQgMTAuCgoqKiogRmllbGQgMTAgLSBVc2VyLUlECiAgICBUaGUgdmFsdWUgaXMg cXVvdGVkIGxpa2UgYSBDIHN0cmluZyB0byBhdm9pZCBjb250cm9sIGNoYXJhY3Rl cnMKICAgICh0aGUgY29sb24gaXMgcXVvdGVkID1ceDNhPSkuICBGb3IgYSAicHVi IiByZWNvcmQgdGhpcyBmaWVsZCBpcwogICAgbm90IHVzZWQgb24gLS1maXhlZC1s aXN0LW1vZGUuICBBIFVBVCByZWNvcmQgcHV0cyB0aGUgYXR0cmlidXRlCiAgICBz dWJwYWNrZXQgY291bnQgaGVyZSwgYSBzcGFjZSwgYW5kIHRoZW4gdGhlIHRvdGFs IGF0dHJpYnV0ZQogICAgc3VicGFja2V0IHNpemUuICBJbiBncGdzbSB0aGUgaXNz dWVyIG5hbWUgY29tZXMgaGVyZS4gIEEgRlBSCiAgICByZWNvcmQgc3RvcmVzIHRo ZSBmaW5nZXJwcmludCBoZXJlLiAgVGhlIGZpbmdlcnByaW50IG9mIGEKICAgIHJl dm9jYXRpb24ga2V5IGlzIHN0b3JlZCBoZXJlLgoqKiogRmllbGQgMTEgLSBTaWdu YXR1cmUgY2xhc3MKCiAgICBTaWduYXR1cmUgY2xhc3MgYXMgcGVyIFJGQy00ODgw LiAgVGhpcyBpcyBhIDIgZGlnaXQgaGV4bnVtYmVyCiAgICBmb2xsb3dlZCBieSBl aXRoZXIgdGhlIGxldHRlciAneCcgZm9yIGFuIGV4cG9ydGFibGUgc2lnbmF0dXJl IG9yCiAgICB0aGUgbGV0dGVyICdsJyBmb3IgYSBsb2NhbC1vbmx5IHNpZ25hdHVy ZS4gIFRoZSBjbGFzcyBieXRlIG9mIGFuCiAgICByZXZvY2F0aW9uIGtleSBpcyBh bHNvIGdpdmVuIGhlcmUsICd4JyBhbmQgJ2wnIGlzIHVzZWQgdGhlIHNhbWUKICAg IHdheS4gIFRoaXMgZmllbGQgaWYgbm90IHVzZWQgZm9yIFguNTA5LgoKKioqIEZp ZWxkIDEyIC0gS2V5IGNhcGFiaWxpdGllcwoKICAgIFRoZSBkZWZpbmVkIGNhcGFi aWxpdGllcyBhcmU6CgogICAgLSBlIDo6IEVuY3J5cHQKICAgIC0gcyA6OiBTaWdu CiAgICAtIGMgOjogQ2VydGlmeQogICAgLSBhIDo6IEF1dGhlbnRpY2F0aW9uCiAg ICAtID8gOjogVW5rbm93biBjYXBhYmlsaXR5CgogICAgQSBrZXkgbWF5IGhhdmUg YW55IGNvbWJpbmF0aW9uIG9mIHRoZW0gaW4gYW55IG9yZGVyLiAgSW4gYWRkaXRp b24KICAgIHRvIHRoZXNlIGxldHRlcnMsIHRoZSBwcmltYXJ5IGtleSBoYXMgdXBw ZXJjYXNlIHZlcnNpb25zIG9mIHRoZQogICAgbGV0dGVycyB0byBkZW5vdGUgdGhl IF91c2FibGVfIGNhcGFiaWxpdGllcyBvZiB0aGUgZW50aXJlIGtleSwgYW5kCiAg ICBhIHBvdGVudGlhbCBsZXR0ZXIgJ0QnIHRvIGluZGljYXRlIGEgZGlzYWJsZWQg a2V5LgoKKioqIEZpZWxkIDEzIC0gSXNzdWVyIGNlcnRpZmljYXRlIGZpbmdlcnBy aW50IG9yIG90aGVyIGluZm8KCiAgICBVc2VkIGluIEZQUiByZWNvcmRzIGZvciBT L01JTUUga2V5cyB0byBzdG9yZSB0aGUgZmluZ2VycHJpbnQgb2YKICAgIHRoZSBp c3N1ZXIgY2VydGlmaWNhdGUuICBUaGlzIGlzIHVzZWZ1bCB0byBidWlsZCB0aGUg Y2VydGlmaWNhdGUKICAgIHBhdGggYmFzZWQgb24gY2VydGlmaWNhdGVzIHN0b3Jl ZCBpbiB0aGUgbG9jYWwga2V5IGRhdGFiYXNlIGl0IGlzCiAgICBvbmx5IGZpbGxl ZCBpZiB0aGUgaXNzdWVyIGNlcnRpZmljYXRlIGlzIGF2YWlsYWJsZS4gVGhlIHJv b3QgaGFzCiAgICBiZWVuIHJlYWNoZWQgaWYgdGhpcyBpcyB0aGUgc2FtZSBzdHJp bmcgYXMgdGhlIGZpbmdlcnByaW50LiBUaGUKICAgIGFkdmFudGFnZSBvZiB1c2lu ZyB0aGlzIHZhbHVlIGlzIHRoYXQgaXQgaXMgZ3VhcmFudGVlZCB0byBoYXZlCiAg ICBiZWVuIGJlZW4gYnVpbGQgYnkgdGhlIHNhbWUgbG9va3VwIGFsZ29yaXRobSBh cyBncGdzbSB1c2VzLgoKICAgIEZvciAidWlkIiByZWNvcmRzIHRoaXMgZmllbGQg bGlzdHMgdGhlIHByZWZlcmVuY2VzIGluIHRoZSBzYW1lIHdheQogICAgZ3BnJ3Mg LS1lZGl0LWtleSBtZW51IGRvZXMuCgogICAgRm9yICJzaWciIHJlY29yZHMsIHRo aXMgaXMgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBrZXkgdGhhdCBpc3N1ZWQKICAg IHRoZSBzaWduYXR1cmUuICBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IGZpbGxlZCBp biBpZiB0aGUgc2lnbmF0dXJlCiAgICB2ZXJpZmllZCBjb3JyZWN0bHkuICBOb3Rl IGFsc28gdGhhdCBmb3IgdmFyaW91cyB0ZWNobmljYWwgcmVhc29ucywKICAgIHRo aXMgZmluZ2VycHJpbnQgaXMgb25seSBhdmFpbGFibGUgaWYgLS1uby1zaWctY2Fj aGUgaXMgdXNlZC4KCioqKiBGaWVsZCAxNCAtIEZsYWcgZmllbGQKCiAgICBGbGFn IGZpZWxkIHVzZWQgaW4gdGhlIC0tZWRpdCBtZW51IG91dHB1dAoKKioqIEZpZWxk IDE1IC0gUy9OIG9mIGEgdG9rZW4KCiAgICBVc2VkIGluIHNlYy9zc2IgdG8gcHJp bnQgdGhlIHNlcmlhbCBudW1iZXIgb2YgYSB0b2tlbiAoaW50ZXJuYWwKICAgIHBy b3RlY3QgbW9kZSAxMDAyKSBvciBhICcjJyBpZiB0aGF0IGtleSBpcyBhIHNpbXBs ZSBzdHViIChpbnRlcm5hbAogICAgcHJvdGVjdCBtb2RlIDEwMDEpLiAgSWYgdGhl IG9wdGlvbiAtLXdpdGgtc2VjcmV0IGlzIHVzZWQgYW5kIGEKICAgIHNlY3JldCBr ZXkgaXMgYXZhaWxhYmxlIGZvciB0aGUgcHVibGljIGtleSwgYSAnKycgaW5kaWNh dGVzIHRoaXMuCgoqKiogRmllbGQgMTYgLSBIYXNoIGFsZ29yaXRobQoKICAgIEZv ciBzaWcgcmVjb3JkcywgdGhpcyBpcyB0aGUgdXNlZCBoYXNoIGFsZ29yaXRobS4g IEZvciBleGFtcGxlOgogICAgMiA9IFNIQS0xLCA4ID0gU0hBLTI1Ni4KCioqKiBG aWVsZCAxNyAtIEN1cnZlIG5hbWUKCiAgICBGb3IgcHViLCBzdWIsIHNlYywgYW5k IHNzYiByZWNvcmRzIHRoaXMgZmllbGQgaXMgdXNlZCBmb3IgdGhlIEVDQwogICAg Y3VydmUgbmFtZS4KKioqIEZpZWxkIDE4IC0gVE9GVSBQb2xpY3kKCiAgICBUaGlz IGlzIHRoZSBUT0ZVIHBvbGljeS4gIEl0IGlzIGVpdGhlciBnb29kLCBiYWQsIHVu a25vd24sIGFzayBvcgogICAgYXV0by4gIFRoaXMgaXMgb25seSBzaG93cyBmb3Ig dWlkIHJlY29yZHMuCgoqKiBTcGVjaWFsIGZpZWxkcwoKKioqIFBLRCAtIFB1Ymxp YyBrZXkgZGF0YQoKICAgIElmIGZpZWxkIDEgaGFzIHRoZSB0YWcgInBrZCIsIGEg bGlzdGluZyBsb29rcyBsaWtlIHRoaXM6CiMrYmVnaW5fZXhhbXBsZQpwa2Q6MDox MDI0OkI2NjVCMTQzNUY0QzIgLi4uLiBGRjI2QUJCOgogICAgISAgISAgICEtLSB0 aGUgdmFsdWUKICAgICEgICEtLS0tLS0gZm9yIGluZm9ybWF0aW9uIG51bWJlciBv ZiBiaXRzIGluIHRoZSB2YWx1ZQogICAgIS0tLS0tLS0tLSBpbmRleCAoZWcuIERT QSBnb2VzIGZyb20gMCB0byAzOiBwLHEsZyx5KQojK2VuZF9leGFtcGxlCgoqKiog VFJVIC0gVHJ1c3QgZGF0YWJhc2UgaW5mb3JtYXRpb24KICAgIEV4YW1wbGUgZm9y IGEgInRydSIgdHJ1c3QgYmFzZSByZWNvcmQ6CiMrYmVnaW5fZXhhbXBsZQogICAg dHJ1Om86MDoxMTY2Njk3NjU0OjE6MzoxOjUKIytlbmRfZXhhbXBsZQoKICAgIC0g RmllbGQgMiA6OiBSZWFzb24gZm9yIHN0YWxlbmVzcyBvZiB0cnVzdC4gIElmIHRo aXMgZmllbGQgaXMKICAgICAgICAgICAgICAgICBlbXB0eSwgdGhlbiB0aGUgdHJ1 c3RkYiBpcyBub3Qgc3RhbGUuICBUaGlzIGZpZWxkIG1heQogICAgICAgICAgICAg ICAgIGhhdmUgbXVsdGlwbGUgZmxhZ3MgaW4gaXQ6CgogICAgICAgICAgICAgICAg IC0gbyA6OiBUcnVzdGRiIGlzIG9sZAogICAgICAgICAgICAgICAgIC0gdCA6OiBU cnVzdGRiIHdhcyBidWlsdCB3aXRoIGEgZGlmZmVyZW50IHRydXN0IG1vZGVsCiAg ICAgICAgICAgICAgICAgICAgICAgIHRoYW4gdGhlIG9uZSB3ZSBhcmUgdXNpbmcg bm93LgoKICAgIC0gRmllbGQgMyA6OiBUcnVzdCBtb2RlbAoKICAgICAgICAgICAg ICAgICAtIDAgOjogQ2xhc3NpYyB0cnVzdCBtb2RlbCwgYXMgdXNlZCBpbiBQR1Ag Mi54LgogICAgICAgICAgICAgICAgIC0gMSA6OiBQR1AgdHJ1c3QgbW9kZWwsIGFz IHVzZWQgaW4gUEdQIDYgYW5kIGxhdGVyLgogICAgICAgICAgICAgICAgICAgICAg ICBUaGlzIGlzIHRoZSBzYW1lIGFzIHRoZSBjbGFzc2ljIHRydXN0IG1vZGVsLAog ICAgICAgICAgICAgICAgICAgICAgICBleGNlcHQgZm9yIHRoZSBhZGRpdGlvbiBv ZiB0cnVzdCBzaWduYXR1cmVzLgoKICAgICAgICAgICAgICAgICBHbnVQRyBiZWZv cmUgdmVyc2lvbiAxLjQgdXNlZCB0aGUgY2xhc3NpYyB0cnVzdCBtb2RlbAogICAg ICAgICAgICAgICAgIGJ5IGRlZmF1bHQuIEdudVBHIDEuNCBhbmQgbGF0ZXIgdXNl cyB0aGUgUEdQIHRydXN0CiAgICAgICAgICAgICAgICAgbW9kZWwgYnkgZGVmYXVs dC4KCiAgICAtIEZpZWxkIDQgOjogRGF0ZSB0cnVzdGRiIHdhcyBjcmVhdGVkIGlu IHNlY29uZHMgc2luY2UgRXBvY2guCiAgICAtIEZpZWxkIDUgOjogRGF0ZSB0cnVz dGRiIHdpbGwgZXhwaXJlIGluIHNlY29uZHMgc2luY2UgRXBvY2guCiAgICAtIEZp ZWxkIDYgOjogTnVtYmVyIG9mIG1hcmdpbmFsbHkgdHJ1c3RlZCB1c2VycyB0byBp bnRyb2R1Y2UgYSBuZXcKICAgICAgICAgICAgICAgICBrZXkgc2lnbmVyIChncGcn cyBvcHRpb24gLS1tYXJnaW5hbHMtbmVlZGVkKS4KICAgIC0gRmllbGQgNyA6OiBO dW1iZXIgb2YgY29tcGxldGVseSB0cnVzdGVkIHVzZXJzIHRvIGludHJvZHVjZSBh IG5ldwogICAgICAgICAgICAgICAgIGtleSBzaWduZXIuICAoZ3BnJ3Mgb3B0aW9u IC0tY29tcGxldGVzLW5lZWRlZCkKCiAgICAtIEZpZWxkIDggOjogTWF4aW11bSBk ZXB0aCBvZiBhIGNlcnRpZmljYXRpb24gY2hhaW4uIChncGcncyBvcHRpb24KICAg ICAgICAgICAgICAgICAtLW1heC1jZXJ0LWRlcHRoKQoKKioqIFNQSyAtIFNpZ25h dHVyZSBzdWJwYWNrZXQgcmVjb3JkcwoKICAgIC0gRmllbGQgMiA6OiBTdWJwYWNr ZXQgbnVtYmVyIGFzIHBlciBSRkMtNDg4MCBhbmQgbGF0ZXIuCiAgICAtIEZpZWxk IDMgOjogRmxhZ3MgaW4gaGV4LiAgQ3VycmVudGx5IHRoZSBvbmx5IHR3byBiaXRz IGFzc2lnbmVkCiAgICAgICAgICAgICAgICAgYXJlIDEsIHRvIGluZGljYXRlIHRo YXQgdGhlIHN1YnBhY2tldCBjYW1lIGZyb20gdGhlCiAgICAgICAgICAgICAgICAg aGFzaGVkIHBhcnQgb2YgdGhlIHNpZ25hdHVyZSwgYW5kIDIsIHRvIGluZGljYXRl IHRoZQogICAgICAgICAgICAgICAgIHN1YnBhY2tldCB3YXMgbWFya2VkIGNyaXRp Y2FsLgogICAgLSBGaWVsZCA0IDo6IExlbmd0aCBvZiB0aGUgc3VicGFja2V0LiAg Tm90ZSB0aGF0IHRoaXMgaXMgdGhlCiAgICAgICAgICAgICAgICAgbGVuZ3RoIG9m IHRoZSBzdWJwYWNrZXQsIGFuZCBub3QgdGhlIGxlbmd0aCBvZiBmaWVsZAogICAg ICAgICAgICAgICAgIDUgYmVsb3cuICBEdWUgdG8gdGhlIG5lZWQgZm9yICUtZW5j b2RpbmcsIHRoZSBsZW5ndGgKICAgICAgICAgICAgICAgICBvZiBmaWVsZCA1IG1h eSBiZSB1cCB0byAzeCB0aGlzIHZhbHVlLgogICAgLSBGaWVsZCA1IDo6IFRoZSBz dWJwYWNrZXQgZGF0YS4gIFByaW50YWJsZSBBU0NJSSBpcyBzaG93biBhcwogICAg ICAgICAgICAgICAgIEFTQ0lJLCBidXQgb3RoZXIgdmFsdWVzIGFyZSByZW5kZXJl ZCBhcyAlWFggd2hlcmUgWFgKICAgICAgICAgICAgICAgICBpcyB0aGUgaGV4IHZh bHVlIGZvciB0aGUgYnl0ZS4KCioqKiBDRkcgLSBDb25maWd1cmF0aW9uIGRhdGEK CiAgICAtLWxpc3QtY29uZmlnIG91dHB1dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhl IEdudVBHIGNvbmZpZ3VyYXRpb24KICAgIGZvciB0aGUgYmVuZWZpdCBvZiBmcm9u dGVuZHMgb3Igb3RoZXIgcHJvZ3JhbXMgdGhhdCBjYWxsIEdudVBHLgogICAgVGhl cmUgYXJlIHNldmVyYWwgbGlzdC1jb25maWcgaXRlbXMsIGFsbCBjb2xvbiBkZWxp bWl0ZWQgbGlrZSB0aGUKICAgIHJlc3Qgb2YgdGhlIC0td2l0aC1jb2xvbnMgb3V0 cHV0LiAgVGhlIGZpcnN0IGZpZWxkIGlzIGFsd2F5cyAiY2ZnIgogICAgdG8gaW5k aWNhdGUgY29uZmlndXJhdGlvbiBpbmZvcm1hdGlvbi4gIFRoZSBzZWNvbmQgZmll bGQgaXMgb25lIG9mCiAgICAod2l0aCBleGFtcGxlcyk6CgogICAgLSB2ZXJzaW9u IDo6IFRoZSB0aGlyZCBmaWVsZCBjb250YWlucyB0aGUgdmVyc2lvbiBvZiBHbnVQ Ry4KCiAgICAgICAgICAgICAgICAgOiBjZmc6dmVyc2lvbjoxLjMuNQoKICAgIC0g cHVia2V5IDo6IFRoZSB0aGlyZCBmaWVsZCBjb250YWlucyB0aGUgcHVibGljIGtl eSBhbGdvcml0aG1zCiAgICAgICAgICAgICAgICB0aGlzIHZlcnNpb24gb2YgR251 UEcgc3VwcG9ydHMsIHNlcGFyYXRlZCBieQogICAgICAgICAgICAgICAgc2VtaWNv bG9ucy4gIFRoZSBhbGdvcml0aG0gbnVtYmVycyBhcmUgYXMgc3BlY2lmaWVkIGlu CiAgICAgICAgICAgICAgICBSRkMtNDg4MC4gIE5vdGUgdGhhdCBpbiBjb250cmFz dCB0byB0aGUgLS1zdGF0dXMtZmQKICAgICAgICAgICAgICAgIGludGVyZmFjZSB0 aGVzZSBhcmUgX25vdF8gdGhlIExpYmdjcnlwdCBpZGVudGlmaWVycy4KICAgICAg ICAgICAgICAgIFVzaW5nID1wdWJrZXluYW1lPSBwcmludHMgbmFtZXMgaW5zdGVh ZCBvZiBudW1iZXJzLgoKICAgICAgICAgICAgICAgICA6IGNmZzpwdWJrZXk6MTsy OzM7MTY7MTcKCiAgICAtIGNpcGhlciA6OiBUaGUgdGhpcmQgZmllbGQgY29udGFp bnMgdGhlIHN5bW1ldHJpYyBjaXBoZXJzIHRoaXMKICAgICAgICAgICAgICAgIHZl cnNpb24gb2YgR251UEcgc3VwcG9ydHMsIHNlcGFyYXRlZCBieSBzZW1pY29sb25z LgogICAgICAgICAgICAgICAgVGhlIGNpcGhlciBudW1iZXJzIGFyZSBhcyBzcGVj aWZpZWQgaW4gUkZDLTQ4ODAuCiAgICAgICAgICAgICAgICBVc2luZyA9Y2lwaGVy bmFtZT0gcHJpbnRzIG5hbWVzIGluc3RlYWQgb2YgbnVtYmVycy4KCiAgICAgICAg ICAgICAgICAgOiBjZmc6Y2lwaGVyOjI7Mzs0Ozc7ODs5OzEwCgogICAgLSBkaWdl c3QgOjogVGhlIHRoaXJkIGZpZWxkIGNvbnRhaW5zIHRoZSBkaWdlc3QgKGhhc2gp IGFsZ29yaXRobXMKICAgICAgICAgICAgICAgIHRoaXMgdmVyc2lvbiBvZiBHbnVQ RyBzdXBwb3J0cywgc2VwYXJhdGVkIGJ5CiAgICAgICAgICAgICAgICBzZW1pY29s b25zLiAgVGhlIGRpZ2VzdCBudW1iZXJzIGFyZSBhcyBzcGVjaWZpZWQgaW4KICAg ICAgICAgICAgICAgIFJGQy00ODgwLiAgVXNpbmcgPWRpZ2VzdG5hbWU9IHByaW50 cyBuYW1lcyBpbnN0ZWFkIG9mCiAgICAgICAgICAgICAgICBudW1iZXJzLgoKICAg ICAgICAgICAgICAgICA6IGNmZzpkaWdlc3Q6MTsyOzM7ODs5OzEwCgogICAgLSBj b21wcmVzcyA6OiBUaGUgdGhpcmQgZmllbGQgY29udGFpbnMgdGhlIGNvbXByZXNz aW9uIGFsZ29yaXRobXMKICAgICAgICAgICAgICAgICAgdGhpcyB2ZXJzaW9uIG9m IEdudVBHIHN1cHBvcnRzLCBzZXBhcmF0ZWQgYnkKICAgICAgICAgICAgICAgICAg c2VtaWNvbG9ucy4gIFRoZSBhbGdvcml0aG0gbnVtYmVycyBhcmUgYXMgc3BlY2lm aWVkCiAgICAgICAgICAgICAgICAgIGluIFJGQy00ODgwLgoKICAgICAgICAgICAg ICAgICA6IGNmZzpjb21wcmVzczowOzE7MjszCgogICAgLSBncm91cCA6OiBUaGUg dGhpcmQgZmllbGQgY29udGFpbnMgdGhlIG5hbWUgb2YgdGhlIGdyb3VwLCBhbmQg dGhlCiAgICAgICAgICAgICAgIGZvdXJ0aCBmaWVsZCBjb250YWlucyB0aGUgdmFs dWVzIHRoYXQgdGhlIGdyb3VwIGV4cGFuZHMKICAgICAgICAgICAgICAgdG8sIHNl cGFyYXRlZCBieSBzZW1pY29sb25zLgoKICAgICAgICAgICAgICAgRm9yIGV4YW1w bGUsIGEgZ3JvdXAgb2Y6CiAgICAgICAgICAgICAgICAgOiBncm91cCBteW5hbWVz ID0gcGFpZ2UgMHgxMjM0NTY3OCBqb2UgcGF0dGkKICAgICAgICAgICAgICAgd291 bGQgcmVzdWx0IGluOgogICAgICAgICAgICAgICAgIDogY2ZnOmdyb3VwOm15bmFt ZXM6cGF0dGk7am9lOzB4MTIzNDU2Nzg7cGFpZ2UKCiAgICAtIGN1cnZlIDo6IFRo ZSB0aGlyZCBmaWVsZCBjb250YWlucyB0aGUgY3VydmUgbmFtZXMgdGhpcyB2ZXJz aW9uCiAgICAgICAgICAgICAgIG9mIEdudVBHIHN1cHBvcnRzLCBzZXBhcmF0ZWQg Ynkgc2VtaWNvbG9ucy4gVXNpbmcKICAgICAgICAgICAgICAgPWN1cnZlb2lkPSBw cmludHMgT0lEcyBpbnN0ZWFkIG9mIG51bWJlcnMuCgogICAgICAgICAgICAgICAg IDogY2ZnOmN1cnZlOmVkMjU1MTk7bmlzdHAyNTY7bmlzdHAzODQ7bmlzdHA1MjEK CgoqIEZvcm1hdCBvZiB0aGUgLS1zdGF0dXMtZmQgb3V0cHV0CgogIEV2ZXJ5IGxp bmUgaXMgcHJlZml4ZWQgd2l0aCAiW0dOVVBHOl0gIiwgZm9sbG93ZWQgYnkgYSBr ZXl3b3JkIHdpdGgKICB0aGUgdHlwZSBvZiB0aGUgc3RhdHVzIGxpbmUgYW5kIHNv bWUgYXJndW1lbnRzIGRlcGVuZGluZyBvbiB0aGUgdHlwZQogIChtYXliZSBub25l KTsgYW4gYXBwbGljYXRpb24gc2hvdWxkIGFsd2F5cyBiZSBwcmVwYXJlZCB0byBz ZWUgbW9yZQogIGFyZ3VtZW50cyBpbiBmdXR1cmUgdmVyc2lvbnMuCgoqKiBHZW5l cmFsIHN0YXR1cyBjb2RlcwoqKiogTkVXU0lHCiAgICBJcyBpc3N1ZWQgcmlnaHQg YmVmb3JlIGEgc2lnbmF0dXJlIHZlcmlmaWNhdGlvbiBzdGFydHMuICBUaGlzIGlz CiAgICB1c2VmdWwgdG8gZGVmaW5lIGEgY29udGV4dCBmb3IgcGFyc2luZyBFUlJP UiBzdGF0dXMgbWVzc2FnZXMuICBObwogICAgYXJndW1lbnRzIGFyZSBjdXJyZW50 bHkgZGVmaW5lZC4KCioqKiBHT09EU0lHICA8bG9uZ19rZXlpZF9vcl9mcHI+ICA8 dXNlcm5hbWU+CiAgICBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdv b2QuICBGb3IgZWFjaCBzaWduYXR1cmUgb25seSBvbmUKICAgIG9mIHRoZSBjb2Rl cyBHT09EU0lHLCBCQURTSUcsIEVYUFNJRywgRVhQS0VZU0lHLCBSRVZLRVlTSUcg b3IKICAgIEVSUlNJRyB3aWxsIGJlIGVtaXR0ZWQuICBJbiB0aGUgcGFzdCB0aGV5 IHdlcmUgdXNlZCBhcyBhIG1hcmtlcgogICAgZm9yIGEgbmV3IHNpZ25hdHVyZTsg bmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgTkVXU0lHIHN0YXR1cwogICAgaW5zdGVh ZC4gIFRoZSB1c2VybmFtZSBpcyB0aGUgcHJpbWFyeSBvbmUgZW5jb2RlZCBpbiBV VEYtOCBhbmQgJVhYCiAgICBlc2NhcGVkLiBUaGUgZmluZ2VycHJpbnQgbWF5IGJl IHVzZWQgaW5zdGVhZCBvZiB0aGUgbG9uZyBrZXlpZCBpZgogICAgaXQgaXMgYXZh aWxhYmxlLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIENNUyBhbmQgbWlnaHQgZXZl bnR1YWxseQogICAgYWxzbyBiZSBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoqKiog RVhQU0lHICA8bG9uZ19rZXlpZF9vcl9mcHI+ICA8dXNlcm5hbWU+CiAgICBUaGUg c2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdvb2QsIGJ1dCB0aGUgc2lnbmF0 dXJlIGlzCiAgICBleHBpcmVkLiBUaGUgdXNlcm5hbWUgaXMgdGhlIHByaW1hcnkg b25lIGVuY29kZWQgaW4gVVRGLTggYW5kICVYWAogICAgZXNjYXBlZC4gVGhlIGZp bmdlcnByaW50IG1heSBiZSB1c2VkIGluc3RlYWQgb2YgdGhlIGxvbmcga2V5aWQg aWYKICAgIGl0IGlzIGF2YWlsYWJsZS4gIFRoaXMgaXMgdGhlIGNhc2Ugd2l0aCBD TVMgYW5kIG1pZ2h0IGV2ZW50dWFsbHkKICAgIGFsc28gYmUgYXZhaWxhYmxlIGZv ciBPcGVuUEdQLgoKKioqIEVYUEtFWVNJRyAgPGxvbmdfa2V5aWRfb3JfZnByPiA8 dXNlcm5hbWU+CiAgICBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdv b2QsIGJ1dCB0aGUgc2lnbmF0dXJlIHdhcyBtYWRlCiAgICBieSBhbiBleHBpcmVk IGtleS4gVGhlIHVzZXJuYW1lIGlzIHRoZSBwcmltYXJ5IG9uZSBlbmNvZGVkIGlu CiAgICBVVEYtOCBhbmQgJVhYIGVzY2FwZWQuICBUaGUgZmluZ2VycHJpbnQgbWF5 IGJlIHVzZWQgaW5zdGVhZCBvZiB0aGUKICAgIGxvbmcga2V5aWQgaWYgaXQgaXMg YXZhaWxhYmxlLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIENNUyBhbmQKICAgIG1p Z2h0IGV2ZW50dWFsbHkgYWxzbyBiZSBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoq KiogUkVWS0VZU0lHICA8bG9uZ19rZXlpZF9vcl9mcHI+ICA8dXNlcm5hbWU+CiAg ICBUaGUgc2lnbmF0dXJlIHdpdGggdGhlIGtleWlkIGlzIGdvb2QsIGJ1dCB0aGUg c2lnbmF0dXJlIHdhcyBtYWRlCiAgICBieSBhIHJldm9rZWQga2V5LiBUaGUgdXNl cm5hbWUgaXMgdGhlIHByaW1hcnkgb25lIGVuY29kZWQgaW4gVVRGLTgKICAgIGFu ZCAlWFggZXNjYXBlZC4gVGhlIGZpbmdlcnByaW50IG1heSBiZSB1c2VkIGluc3Rl YWQgb2YgdGhlIGxvbmcKICAgIGtleWlkIGlmIGl0IGlzIGF2YWlsYWJsZS4gIFRo aXMgaXMgdGhlIGNhc2Ugd2l0aCBDTVMgYW5kIG1pZ2h0CiAgICBldmVudHVhbGx5 IGFsc28gYmXDsSBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoqKiogQkFEU0lHICA8 bG9uZ19rZXlpZF9vcl9mcHI+ICA8dXNlcm5hbWU+CiAgICBUaGUgc2lnbmF0dXJl IHdpdGggdGhlIGtleWlkIGhhcyBub3QgYmVlbiB2ZXJpZmllZCBva2F5LiAgVGhl CiAgICB1c2VybmFtZSBpcyB0aGUgcHJpbWFyeSBvbmUgZW5jb2RlZCBpbiBVVEYt OCBhbmQgJVhYIGVzY2FwZWQuIFRoZQogICAgZmluZ2VycHJpbnQgbWF5IGJlIHVz ZWQgaW5zdGVhZCBvZiB0aGUgbG9uZyBrZXlpZCBpZiBpdCBpcwogICAgYXZhaWxh YmxlLiAgVGhpcyBpcyB0aGUgY2FzZSB3aXRoIENNUyBhbmQgbWlnaHQgZXZlbnR1 YWxseSBhbHNvIGJlCiAgICBhdmFpbGFibGUgZm9yIE9wZW5QR1AuCgoqKiogRVJS U0lHICA8a2V5aWQ+ICA8cGthbGdvPiA8aGFzaGFsZ28+IDxzaWdfY2xhc3M+IDx0 aW1lPiA8cmM+CiAgICBJdCB3YXMgbm90IHBvc3NpYmxlIHRvIGNoZWNrIHRoZSBz aWduYXR1cmUuICBUaGlzIG1heSBiZSBjYXVzZWQgYnkKICAgIGEgbWlzc2luZyBw dWJsaWMga2V5IG9yIGFuIHVuc3VwcG9ydGVkIGFsZ29yaXRobS4gIEEgUkMgb2Yg NAogICAgaW5kaWNhdGVzIHVua25vd24gYWxnb3JpdGhtLCBhIDkgaW5kaWNhdGVz IGEgbWlzc2luZyBwdWJsaWMKICAgIGtleS4gVGhlIG90aGVyIGZpZWxkcyBnaXZl IG1vcmUgaW5mb3JtYXRpb24gYWJvdXQgdGhpcyBzaWduYXR1cmUuCiAgICBzaWdf Y2xhc3MgaXMgYSAyIGJ5dGUgaGV4LXZhbHVlLiAgVGhlIGZpbmdlcnByaW50IG1h eSBiZSB1c2VkCiAgICBpbnN0ZWFkIG9mIHRoZSBrZXlpZCBpZiBpdCBpcyBhdmFp bGFibGUuICBUaGlzIGlzIHRoZSBjYXNlIHdpdGgKICAgIGdwZ3NtIGFuZCBtaWdo dCBldmVudHVhbGx5IGFsc28gYmUgYXZhaWxhYmxlIGZvciBPcGVuUEdQLgoKICAg IE5vdGUsIHRoYXQgVElNRSBtYXkgZWl0aGVyIGJlIHRoZSBudW1iZXIgb2Ygc2Vj b25kcyBzaW5jZSBFcG9jaCBvcgogICAgYW4gSVNPIDg2MDEgc3RyaW5nLiAgVGhl IGxhdHRlciBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIHByZXNlbmNlIG9mCiAgICB0 aGUgbGV0dGVyICdUJy4KCioqKiBWQUxJRFNJRyA8YXJncz4KCiAgICBUaGUgYXJn cyBhcmU6CgogICAgLSA8ZmluZ2VycHJpbnRfaW5faGV4PgogICAgLSA8c2lnX2Ny ZWF0aW9uX2RhdGU+CiAgICAtIDxzaWctdGltZXN0YW1wPgogICAgLSA8ZXhwaXJl LXRpbWVzdGFtcD4KICAgIC0gPHNpZy12ZXJzaW9uPgogICAgLSA8cmVzZXJ2ZWQ+ CiAgICAtIDxwdWJrZXktYWxnbz4KICAgIC0gPGhhc2gtYWxnbz4KICAgIC0gPHNp Zy1jbGFzcz4KICAgIC0gWyA8cHJpbWFyeS1rZXktZnByPiBdCgogICAgVGhpcyBz dGF0dXMgaW5kaWNhdGVzIHRoYXQgdGhlIHNpZ25hdHVyZSBpcyBjcnlwdG9ncmFw aGljYWxseQogICAgdmFsaWQuIFRoaXMgaXMgc2ltaWxhciB0byBHT09EU0lHLCBF WFBTSUcsIEVYUEtFWVNJRywgb3IgUkVWS0VZU0lHCiAgICAoZGVwZW5kaW5nIG9u IHRoZSBkYXRlIGFuZCB0aGUgc3RhdGUgb2YgdGhlIHNpZ25hdHVyZSBhbmQgc2ln bmluZwogICAga2V5KSBidXQgaGFzIHRoZSBmaW5nZXJwcmludCBhcyB0aGUgYXJn dW1lbnQuIE11bHRpcGxlIHN0YXR1cwogICAgbGluZXMgKFZBTElEU0lHIGFuZCB0 aGUgb3RoZXIgYXBwcm9wcmlhdGUgKlNJRyBzdGF0dXMpIGFyZSBlbWl0dGVkCiAg ICBmb3IgYSB2YWxpZCBzaWduYXR1cmUuICBBbGwgYXJndW1lbnRzIGhlcmUgYXJl IG9uIG9uZSBsb25nIGxpbmUuCiAgICBzaWctdGltZXN0YW1wIGlzIHRoZSBzaWdu YXR1cmUgY3JlYXRpb24gdGltZSBpbiBzZWNvbmRzIGFmdGVyIHRoZQogICAgZXBv Y2guIGV4cGlyZS10aW1lc3RhbXAgaXMgdGhlIHNpZ25hdHVyZSBleHBpcmF0aW9u IHRpbWUgaW4KICAgIHNlY29uZHMgYWZ0ZXIgdGhlIGVwb2NoICh6ZXJvIG1lYW5z ICJkb2VzIG5vdAogICAgZXhwaXJlIikuIHNpZy12ZXJzaW9uLCBwdWJrZXktYWxn bywgaGFzaC1hbGdvLCBhbmQgc2lnLWNsYXNzIChhCiAgICAyLWJ5dGUgaGV4IHZh bHVlKSBhcmUgYWxsIHN0cmFpZ2h0IGZyb20gdGhlIHNpZ25hdHVyZSBwYWNrZXQu CiAgICBQUklNQVJZLUtFWS1GUFIgaXMgdGhlIGZpbmdlcnByaW50IG9mIHRoZSBw cmltYXJ5IGtleSBvciBpZGVudGljYWwKICAgIHRvIHRoZSBmaXJzdCBhcmd1bWVu dC4gIFRoaXMgaXMgdXNlZnVsIHRvIGdldCBiYWNrIHRvIHRoZSBwcmltYXJ5CiAg ICBrZXkgd2l0aG91dCBydW5uaW5nIGdwZyBhZ2FpbiBmb3IgdGhpcyBwdXJwb3Nl LgoKICAgIFRoZSBwcmltYXJ5LWtleS1mcHIgcGFyYW1ldGVyIGlzIHVzZWQgZm9y IE9wZW5QR1AgYW5kIG5vdAogICAgYXZhaWxhYmxlIGZvciBDTVMgc2lnbmF0dXJl cy4gIFRoZSBzaWctdmVyc2lvbiBhcyB3ZWxsIGFzIHRoZSBzaWcKICAgIGNsYXNz IGlzIG5vdCBkZWZpbmVkIGZvciBDTVMgYW5kIGN1cnJlbnRseSBzZXQgdG8gMCBh bmQgMDAuCgogICAgTm90ZSwgdGhhdCAqLVRJTUVTVEFNUCBtYXkgZWl0aGVyIGJl IGEgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UKICAgIEVwb2NoIG9yIGFuIElTTyA4 NjAxIHN0cmluZyB3aGljaCBjYW4gYmUgZGV0ZWN0ZWQgYnkgdGhlIHByZXNlbmNl CiAgICBvZiB0aGUgbGV0dGVyICdUJy4KCioqKiBTSUdfSUQgIDxyYWRpeDY0X3N0 cmluZz4gIDxzaWdfY3JlYXRpb25fZGF0ZT4gIDxzaWctdGltZXN0YW1wPgogICAg VGhpcyBpcyBlbWl0dGVkIG9ubHkgZm9yIHNpZ25hdHVyZXMgb2YgY2xhc3MgMCBv ciAxIHdoaWNoIGhhdmUKICAgIGJlZW4gdmVyaWZpZWQgb2theS4gIFRoZSBzdHJp bmcgaXMgYSBzaWduYXR1cmUgaWQgYW5kIG1heSBiZSB1c2VkCiAgICBpbiBhcHBs aWNhdGlvbnMgdG8gZGV0ZWN0IHJlcGxheSBhdHRhY2tzIG9mIHNpZ25lZCBtZXNz YWdlcy4gIE5vdGUKICAgIHRoYXQgb25seSBETFAgYWxnb3JpdGhtcyBnaXZlIHVu aXF1ZSBpZHMgLSBvdGhlcnMgbWF5IHlpZWxkCiAgICBkdXBsaWNhdGVkIG9uZXMg d2hlbiB0aGV5IGhhdmUgYmVlbiBjcmVhdGVkIGluIHRoZSBzYW1lIHNlY29uZC4K CiAgICBOb3RlLCB0aGF0IFNJRy1USU1FU1RBTVAgbWF5IGVpdGhlciBiZSBhIG51 bWJlciBvZiBzZWNvbmRzIHNpbmNlCiAgICBFcG9jaCBvciBhbiBJU08gODYwMSBz dHJpbmcgd2hpY2ggY2FuIGJlIGRldGVjdGVkIGJ5IHRoZSBwcmVzZW5jZQogICAg b2YgdGhlIGxldHRlciAnVCcuCgoqKiogRU5DX1RPICA8bG9uZ19rZXlpZD4gIDxr ZXl0eXBlPiAgPGtleWxlbmd0aD4KICAgIFRoZSBtZXNzYWdlIGlzIGVuY3J5cHRl ZCB0byB0aGlzIExPTkdfS0VZSUQuICBLRVlUWVBFIGlzIHRoZQogICAgbnVtZXJp Y2FsIHZhbHVlIG9mIHRoZSBwdWJsaWMga2V5IGFsZ29yaXRobSBvciAwIGlmIGl0 IGlzIG5vdAogICAga25vd24sIEtFWUxFTkdUSCBpcyB0aGUgbGVuZ3RoIG9mIHRo ZSBrZXkgb3IgMCBpZiBpdCBpcyBub3Qga25vd24KICAgICh3aGljaCBpcyBjdXJy ZW50bHkgYWx3YXlzIHRoZSBjYXNlKS4gIEdwZyBwcmludHMgdGhpcyBsaW5lCiAg ICBhbHdheXM7IEdwZ3NtIG9ubHkgaWYgaXQga25vd3MgdGhlIGNlcnRpZmljYXRl LgoKKioqIEJFR0lOX0RFQ1JZUFRJT04KICAgIE1hcmsgdGhlIHN0YXJ0IG9mIHRo ZSBhY3R1YWwgZGVjcnlwdGlvbiBwcm9jZXNzLiAgVGhpcyBpcyBhbHNvCiAgICBl bWl0dGVkIHdoZW4gaW4gLS1saXN0LW9ubHkgbW9kZS4KKioqIEVORF9ERUNSWVBU SU9OCiAgICBNYXJrIHRoZSBlbmQgb2YgdGhlIGFjdHVhbCBkZWNyeXB0aW9uIHBy b2Nlc3MuICBUaGlzIGFyZSBhbHNvCiAgICBlbWl0dGVkIHdoZW4gaW4gLS1saXN0 LW9ubHkgbW9kZS4KKioqIERFQ1JZUFRJT05fSU5GTyA8bWRjX21ldGhvZD4gPHN5 bV9hbGdvPgogICAgUHJpbnQgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHN5bW1ldHJp YyBlbmNyeXB0aW9uIGFsZ29yaXRobSBhbmQgdGhlCiAgICBNREMgbWV0aG9kLiAg VGhpcyB3aWxsIGJlIGVtaXR0ZWQgZXZlbiBpZiB0aGUgZGVjcnlwdGlvbiBmYWls cy4KCioqKiBERUNSWVBUSU9OX0ZBSUxFRAogICAgVGhlIHN5bW1ldHJpYyBkZWNy eXB0aW9uIGZhaWxlZCAtIG9uZSByZWFzb24gY291bGQgYmUgYSB3cm9uZwogICAg cGFzc3BocmFzZSBmb3IgYSBzeW1tZXRyaWNhbCBlbmNyeXB0ZWQgbWVzc2FnZS4K CioqKiBERUNSWVBUSU9OX09LQVkKICAgIFRoZSBkZWNyeXB0aW9uIHByb2Nlc3Mg c3VjY2VlZGVkLiAgVGhpcyBtZWFucywgdGhhdCBlaXRoZXIgdGhlCiAgICBjb3Jy ZWN0IHNlY3JldCBrZXkgaGFzIGJlZW4gdXNlZCBvciB0aGUgY29ycmVjdCBwYXNz cGhyYXNlIGZvciBhCiAgICBzeW1tZXRyaWMgZW5jcnlwdGVkIG1lc3NhZ2Ugd2Fz IGdpdmVuLiAgVGhlIHByb2dyYW0gaXRzZWxmIG1heQogICAgcmV0dXJuIGFuIGVy cm9yY29kZSBiZWNhdXNlIGl0IG1heSBub3QgYmUgcG9zc2libGUgdG8gdmVyaWZ5 IGEKICAgIHNpZ25hdHVyZSBmb3Igc29tZSByZWFzb25zLgoKKioqIFNFU1NJT05f S0VZIDxhbGdvPjo8aGV4ZGlnaXRzPgogICAgVGhlIHNlc3Npb24ga2V5IHVzZWQg dG8gZGVjcnlwdCB0aGUgbWVzc2FnZS4gIFRoaXMgbWVzc2FnZSB3aWxsCiAgICBv bmx5IGJlIGVtaXR0ZWQgaWYgdGhlIG9wdGlvbiAtLXNob3ctc2Vzc2lvbi1rZXkg aXMgdXNlZC4gIFRoZQogICAgZm9ybWF0IGlzIHN1aXRhYmxlIHRvIGJlIHBhc3Nl ZCBhcyB2YWx1ZSBmb3IgdGhlIG9wdGlvbgogICAgLS1vdmVycmlkZS1zZXNzaW9u LWtleS4gIEl0IGlzIG5vdCBhbiBpbmRpY2F0aW9uIHRoYXQgdGhlCiAgICBkZWNy eXB0aW9uIHdpbGwgb3IgaGFzIHN1Y2NlZWRlZC4KCioqKiBCRUdJTl9FTkNSWVBU SU9OICA8bWRjX21ldGhvZD4gPHN5bV9hbGdvPgogICAgTWFyayB0aGUgc3RhcnQg b2YgdGhlIGFjdHVhbCBlbmNyeXB0aW9uIHByb2Nlc3MuCgoqKiogRU5EX0VOQ1JZ UFRJT04KICAgIE1hcmsgdGhlIGVuZCBvZiB0aGUgYWN0dWFsIGVuY3J5cHRpb24g cHJvY2Vzcy4KCioqKiBGSUxFX1NUQVJUIDx3aGF0PiA8ZmlsZW5hbWU+CiAgICBT dGFydCBwcm9jZXNzaW5nIGEgZmlsZSA8ZmlsZW5hbWU+LiAgPHdoYXQ+IGluZGlj YXRlcyB0aGUgcGVyZm9ybWVkCiAgICBvcGVyYXRpb246CiAgICAtIDEgOjogdmVy aWZ5CiAgICAtIDIgOjogZW5jcnlwdAogICAgLSAzIDo6IGRlY3J5cHQKCioqKiBG SUxFX0RPTkUKICAgIE1hcmtzIHRoZSBlbmQgb2YgYSBmaWxlIHByb2Nlc3Npbmcg d2hpY2ggaGFzIGJlZW4gc3RhcnRlZAogICAgYnkgRklMRV9TVEFSVC4KCioqKiBC RUdJTl9TSUdOSU5HCiAgICBNYXJrIHRoZSBzdGFydCBvZiB0aGUgYWN0dWFsIHNp Z25pbmcgcHJvY2Vzcy4gVGhpcyBtYXkgYmUgdXNlZCBhcwogICAgYW4gaW5kaWNh dGlvbiB0aGF0IGFsbCByZXF1ZXN0ZWQgc2VjcmV0IGtleXMgYXJlIHJlYWR5IGZv ciB1c2UuCgoqKiogQUxSRUFEWV9TSUdORUQgPGxvbmcta2V5aWQ+CiAgICBXYXJu aW5nOiBUaGlzIGlzIGV4cGVyaW1lbnRhbCBhbmQgbWlnaHQgYmUgcmVtb3ZlZCBh dCBhbnkgdGltZS4KCioqKiBTSUdfQ1JFQVRFRCA8dHlwZT4gPHBrX2FsZ28+IDxo YXNoX2FsZ28+IDxjbGFzcz4gPHRpbWVzdGFtcD4gPGtleWZwcj4KICAgIEEgc2ln bmF0dXJlIGhhcyBiZWVuIGNyZWF0ZWQgdXNpbmcgdGhlc2UgcGFyYW1ldGVycy4K ICAgIFZhbHVlcyBmb3IgdHlwZSA8dHlwZT4gYXJlOgogICAgICAtIEQgOjogZGV0 YWNoZWQKICAgICAgLSBDIDo6IGNsZWFydGV4dAogICAgICAtIFMgOjogc3RhbmRh cmQKICAgIChvbmx5IHRoZSBmaXJzdCBjaGFyYWN0ZXIgc2hvdWxkIGJlIGNoZWNr ZWQpCgogICAgPGNsYXNzPiBhcmUgMiBoZXggZGlnaXRzIHdpdGggdGhlIE9wZW5Q R1Agc2lnbmF0dXJlIGNsYXNzLgoKICAgIE5vdGUsIHRoYXQgVElNRVNUQU1QIG1h eSBlaXRoZXIgYmUgYSBudW1iZXIgb2Ygc2Vjb25kcyBzaW5jZSBFcG9jaAogICAg b3IgYW4gSVNPIDg2MDEgc3RyaW5nIHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBieSB0 aGUgcHJlc2VuY2Ugb2YgdGhlCiAgICBsZXR0ZXIgJ1QnLgoKKioqIE5PVEFUSU9O XwogICAgVGhlcmUgYXJlIGFjdHVhbGx5IHR3byByZWxhdGVkIHN0YXR1cyBjb2Rl cyB0byBjb252ZXkgbm90YXRpb24KICAgIGRhdGE6CgogICAgLSBOT1RBVElPTl9O QU1FIDxuYW1lPgogICAgLSBOT1RBVElPTl9EQVRBIDxzdHJpbmc+CgogICAgPG5h bWU+IGFuZCA8c3RyaW5nPiBhcmUgJVhYIGVzY2FwZWQ7IHRoZSBkYXRhIG1heSBi ZSBzcGxpdCBhbW9uZwogICAgc2V2ZXJhbCBOT1RBVElPTl9EQVRBIGxpbmVzLgoK KioqIFBPTElDWV9VUkwgPHN0cmluZz4KICAgIE5vdGUgdGhhdCBVUkwgaW4gPHN0 cmluZz4gaXMgJVhYIGVzY2FwZWQuCgoqKiogUExBSU5URVhUIDxmb3JtYXQ+IDx0 aW1lc3RhbXA+IDxmaWxlbmFtZT4KICAgIFRoaXMgaW5kaWNhdGVzIHRoZSBmb3Jt YXQgb2YgdGhlIHBsYWludGV4dCB0aGF0IGlzIGFib3V0IHRvIGJlCiAgICB3cml0 dGVuLiAgVGhlIGZvcm1hdCBpcyBhIDEgYnl0ZSBoZXggY29kZSB0aGF0IHNob3dz IHRoZSBmb3JtYXQgb2YKICAgIHRoZSBwbGFpbnRleHQ6IDYyICgnYicpIGlzIGJp bmFyeSBkYXRhLCA3NCAoJ3QnKSBpcyB0ZXh0IGRhdGEgd2l0aAogICAgbm8gY2hh cmFjdGVyIHNldCBzcGVjaWZpZWQsIGFuZCA3NSAoJ3UnKSBpcyB0ZXh0IGRhdGEg ZW5jb2RlZCBpbgogICAgdGhlIFVURi04IGNoYXJhY3RlciBzZXQuICBUaGUgdGlt ZXN0YW1wIGlzIGluIHNlY29uZHMgc2luY2UgdGhlCiAgICBlcG9jaC4gIElmIGEg ZmlsZW5hbWUgaXMgYXZhaWxhYmxlIGl0IGdldHMgcHJpbnRlZCBhcyB0aGUgdGhp cmQKICAgIGFyZ3VtZW50LCBwZXJjZW50LWVzY2FwZWQgYXMgdXN1YWwuCgoqKiog UExBSU5URVhUX0xFTkdUSCA8bGVuZ3RoPgogICAgVGhpcyBpbmRpY2F0ZXMgdGhl IGxlbmd0aCBvZiB0aGUgcGxhaW50ZXh0IHRoYXQgaXMgYWJvdXQgdG8gYmUKICAg IHdyaXR0ZW4uICBOb3RlIHRoYXQgaWYgdGhlIHBsYWludGV4dCBwYWNrZXQgaGFz IHBhcnRpYWwgbGVuZ3RoCiAgICBlbmNvZGluZyBpdCBpcyBub3QgcG9zc2libGUg dG8ga25vdyB0aGUgbGVuZ3RoIGFoZWFkIG9mIHRpbWUuICBJbgogICAgdGhhdCBj YXNlLCB0aGlzIHN0YXR1cyB0YWcgZG9lcyBub3QgYXBwZWFyLgoKKioqIEFUVFJJ QlVURSA8YXJndW1lbnRzPgogICAgVGhlIGxpc3Qgb3IgYXJnZW1udHMgYXJlOgog ICAgLSA8ZnByPgogICAgLSA8b2N0ZXRzPgogICAgLSA8dHlwZT4KICAgIC0gPGlu ZGV4PgogICAgLSA8Y291bnQ+CiAgICAtIDx0aW1lc3RhbXA+CiAgICAtIDxleHBp cmVkYXRlPgogICAgLSA8ZmxhZ3M+CgogICAgVGhpcyBpcyBvbmUgbG9uZyBsaW5l IGlzc3VlZCBmb3IgZWFjaCBhdHRyaWJ1dGUgc3VicGFja2V0IHdoZW4gYW4KICAg IGF0dHJpYnV0ZSBwYWNrZXQgaXMgc2VlbiBkdXJpbmcga2V5IGxpc3RpbmcuICA8 ZnByPiBpcyB0aGUKICAgIGZpbmdlcnByaW50IG9mIHRoZSBrZXkuICA8b2N0ZXRz PiBpcyB0aGUgbGVuZ3RoIG9mIHRoZSBhdHRyaWJ1dGUKICAgIHN1YnBhY2tldC4g IDx0eXBlPiBpcyB0aGUgYXR0cmlidXRlIHR5cGUgKGUuZy4gMSBmb3IgYW4gaW1h Z2UpLgogICAgPGluZGV4PiBhbmQgPGNvdW50PiBpbmRpY2F0ZSB0aGF0IHRoaXMg aXMgdGhlIE4tdGggaW5kZXhlZAogICAgc3VicGFja2V0IG9mIGNvdW50IHRvdGFs IHN1YnBhY2tldHMgaW4gdGhpcyBhdHRyaWJ1dGUgcGFja2V0LgogICAgPHRpbWVz dGFtcD4gYW5kIDxleHBpcmVkYXRlPiBhcmUgZnJvbSB0aGUgc2VsZi1zaWduYXR1 cmUgb24gdGhlCiAgICBhdHRyaWJ1dGUgcGFja2V0LiAgSWYgdGhlIGF0dHJpYnV0 ZSBwYWNrZXQgZG9lcyBub3QgaGF2ZSBhIHZhbGlkCiAgICBzZWxmLXNpZ25hdHVy ZSwgdGhlbiB0aGUgdGltZXN0YW1wIGlzIDAuICA8ZmxhZ3M+IGFyZSBhIGJpdHdp c2UgT1IKICAgIG9mOgogICAgLSAweDAxIDo6IHRoaXMgYXR0cmlidXRlIHBhY2tl dCBpcyBhIHByaW1hcnkgdWlkCiAgICAtIDB4MDIgOjogdGhpcyBhdHRyaWJ1dGUg cGFja2V0IGlzIHJldm9rZWQKICAgIC0gMHgwNCA6OiB0aGlzIGF0dHJpYnV0ZSBw YWNrZXQgaXMgZXhwaXJlZAoKKioqIFNJR19TVUJQQUNLRVQgPHR5cGU+IDxmbGFn cz4gPGxlbj4gPGRhdGE+CiAgICBUaGlzIGluZGljYXRlcyB0aGF0IGEgc2lnbmF0 dXJlIHN1YnBhY2tldCB3YXMgc2Vlbi4gIFRoZSBmb3JtYXQgaXMKICAgIHRoZSBz YW1lIGFzIHRoZSAic3BrIiByZWNvcmQgYWJvdmUuCgoqKiBLZXkgcmVsYXRlZAoq KiogSU5WX1JFQ1AsIElOVl9TR05SCiAgICBUaGUgdHdvIHNpbWlsYXIgc3RhdHVz IGNvZGVzOgoKICAgIC0gSU5WX1JFQ1AgPHJlYXNvbj4gPHJlcXVlc3RlZF9yZWNp cGllbnQ+CiAgICAtIElOVl9TR05SIDxyZWFzb24+IDxyZXF1ZXN0ZWRfc2VuZGVy PgoKICAgIGFyZSBpc3N1ZWQgZm9yIGVhY2ggdW51c2FibGUgcmVjaXBpZW50L3Nl bmRlci4gVGhlIHJlYXNvbnMgY29kZXMKICAgIGN1cnJlbnRseSBpbiB1c2UgYXJl OgoKICAgICAgIC0gIDAgOjogTm8gc3BlY2lmaWMgcmVhc29uIGdpdmVuCiAgICAg ICAtICAxIDo6IE5vdCBGb3VuZAogICAgICAgLSAgMiA6OiBBbWJpZ2lvdXMgc3Bl Y2lmaWNhdGlvbgogICAgICAgLSAgMyA6OiBXcm9uZyBrZXkgdXNhZ2UKICAgICAg IC0gIDQgOjogS2V5IHJldm9rZWQKICAgICAgIC0gIDUgOjogS2V5IGV4cGlyZWQK ICAgICAgIC0gIDYgOjogTm8gQ1JMIGtub3duCiAgICAgICAtICA3IDo6IENSTCB0 b28gb2xkCiAgICAgICAtICA4IDo6IFBvbGljeSBtaXNtYXRjaAogICAgICAgLSAg OSA6OiBOb3QgYSBzZWNyZXQga2V5CiAgICAgICAtIDEwIDo6IEtleSBub3QgdHJ1 c3RlZAogICAgICAgLSAxMSA6OiBNaXNzaW5nIGNlcnRpZmljYXRlCiAgICAgICAt IDEyIDo6IE1pc3NpbmcgaXNzdWVyIGNlcnRpZmljYXRlCiAgICAgICAtIDEzIDo6 IEtleSBkaXNhYmxlZAogICAgICAgLSAxNCA6OiBTeW50YXggZXJyb3IgaW4gc3Bl Y2lmaWNhdGlvbgoKICAgIE5vdGUgdGhhdCBmb3IgaGlzdG9yaWNhbCByZWFzb25z IHRoZSBJTlZfUkVDUCBzdGF0dXMgaXMgYWxzbyB1c2VkCiAgICBmb3IgZ3Bnc20n cyBTSUdORVIgY29tbWFuZCB3aGVyZSBpdCByZWxhdGVzIHRvIHNpZ25lcidzIG9m IGNvdXJzZS4KICAgIE5ld2VyIEdudVBHIHZlcnNpb25zIGFyZSB1c2luZyBJTlZf U0dOUjsgYXBwbGljYXRpb25zIHNob3VsZAogICAgaWdub3JlIHRoZSBJTlZfUkVD UCBkdXJpbmcgdGhlIHNlbmRlcidzIGNvbW1hbmQgcHJvY2Vzc2luZyBvbmNlCiAg ICB0aGV5IGhhdmUgc2VlbiBhbiBJTlZfU0dOUi4gIERpZmZlcmVudCBjb2RlcyBh cmUgdXNlZCBzbyB0aGF0IHRoZXkKICAgIGNhbiBiZSBkaXN0aW5ndWlzaCB3aGls ZSBkb2luZyBhbiBlbmNyeXB0K3NpZ24gb3BlcmF0aW9uLgoqKiogTk9fUkVDUCA8 cmVzZXJ2ZWQ+CiAgICBJc3N1ZWQgaWYgbm8gcmVjaXBpZW50cyBhcmUgdXNhYmxl LgoKKioqIE5PX1NHTlIgPHJlc2VydmVkPgogICAgSXNzdWVkIGlmIG5vIHNlbmRl cnMgYXJlIHVzYWJsZS4KCioqKiBLRVlFWFBJUkVEIDxleHBpcmUtdGltZXN0YW1w PgogICAgVGhlIGtleSBoYXMgZXhwaXJlZC4gIGV4cGlyZS10aW1lc3RhbXAgaXMg dGhlIGV4cGlyYXRpb24gdGltZSBpbgogICAgc2Vjb25kcyBzaW5jZSBFcG9jaC4g IFRoaXMgc3RhdHVzIGxpbmUgaXMgbm90IHZlcnkgdXNlZnVsIGJlY2F1c2UKICAg IGl0IHdpbGwgYWxzbyBiZSBlbWl0dGVkIGZvciBleHBpcmVkIHN1YmtleXMgZXZl biBpZiB0aGlzIHN1YmtleSBpcwogICAgbm90IHVzZWQuICBUbyBjaGVjayB3aGV0 aGVyIGEga2V5IHVzZWQgdG8gc2lnbiBhIG1lc3NhZ2UgaGFzCiAgICBleHBpcmVk LCB0aGUgRVhQS0VZU0lHIHN0YXR1cyBsaW5lIGlzIHRvIGJlIHVzZWQuCgogICAg Tm90ZSwgdGhhdCB0aGUgVElNRVNUQU1QIG1heSBlaXRoZXIgYmUgYSBudW1iZXIg b2Ygc2Vjb25kcyBzaW5jZQogICAgRXBvY2ggb3IgYW4gSVNPIDg2MDEgc3RyaW5n IHdoaWNoIGNhbiBiZSBkZXRlY3RlZCBieSB0aGUgcHJlc2VuY2UKICAgIG9mIHRo ZSBsZXR0ZXIgJ1QnLgoKKioqIEtFWVJFVk9LRUQKICAgIFRoZSB1c2VkIGtleSBo YXMgYmVlbiByZXZva2VkIGJ5IGl0cyBvd25lci4gIE5vIGFyZ3VtZW50cyB5ZXQu CgoqKiogTk9fUFVCS0VZICA8bG9uZyBrZXlpZD4KICAgIFRoZSBwdWJsaWMga2V5 IGlzIG5vdCBhdmFpbGFibGUKCioqKiBOT19TRUNLRVkgIDxsb25nIGtleWlkPgog ICAgVGhlIHNlY3JldCBrZXkgaXMgbm90IGF2YWlsYWJsZQoKKioqIEtFWV9DUkVB VEVEIDx0eXBlPiA8ZmluZ2VycHJpbnQ+IFs8aGFuZGxlPl0KICAgIEEga2V5IGhh cyBiZWVuIGNyZWF0ZWQuICBWYWx1ZXMgZm9yIDx0eXBlPiBhcmU6CiAgICAgIC0g QiA6OiBwcmltYXJ5IGFuZCBzdWJrZXkKICAgICAgLSBQIDo6IHByaW1hcnkKICAg ICAgLSBTIDo6IHN1YmtleQogICAgVGhlIGZpbmdlcnByaW50IGlzIG9uZSBvZiB0 aGUgcHJpbWFyeSBrZXkgZm9yIHR5cGUgQiBhbmQgUCBhbmQgdGhlCiAgICBvbmUg b2YgdGhlIHN1YmtleSBmb3IgUy4gIEhhbmRsZSBpcyBhbiBhcmJpdHJhcnkgbm9u LXdoaXRlc3BhY2UKICAgIHN0cmluZyB1c2VkIHRvIG1hdGNoIGtleSBwYXJhbWV0 ZXJzIGZyb20gYmF0Y2gga2V5IGNyZWF0aW9uIHJ1bi4KCioqKiBLRVlfTk9UX0NS RUFURUQgWzxoYW5kbGU+XQogICAgVGhlIGtleSBmcm9tIGJhdGNoIHJ1biBoYXMg bm90IGJlZW4gY3JlYXRlZCBkdWUgdG8gZXJyb3JzLgoKKioqIFRSVVNUXwogICAg VGhlc2UgYXJlIHNldmVyYWwgc2ltaWxhciBzdGF0dXMgY29kZXM6CgogICAgLSBU UlVTVF9VTkRFRklORUQgPGVycm9yX3Rva2VuPgogICAgLSBUUlVTVF9ORVZFUiAg ICAgPGVycm9yX3Rva2VuPgogICAgLSBUUlVTVF9NQVJHSU5BTCAgWzAgIFs8dmFs aWRhdGlvbl9tb2RlbD5dXQogICAgLSBUUlVTVF9GVUxMWSAgICAgWzAgIFs8dmFs aWRhdGlvbl9tb2RlbD5dXQogICAgLSBUUlVTVF9VTFRJTUFURSAgWzAgIFs8dmFs aWRhdGlvbl9tb2RlbD5dXQoKICAgIEZvciBnb29kIHNpZ25hdHVyZXMgb25lIG9m IHRoZXNlIHN0YXR1cyBsaW5lcyBhcmUgZW1pdHRlZCB0bwogICAgaW5kaWNhdGUg dGhlIHZhbGlkaXR5IG9mIHRoZSBrZXkgdXNlZCB0byBjcmVhdGUgdGhlIHNpZ25h dHVyZS4KICAgIFRoZSBlcnJvciB0b2tlbiB2YWx1ZXMgYXJlIGN1cnJlbnRseSBv bmx5IGVtaXR0ZWQgYnkgZ3Bnc20uCgogICAgVkFMSURBVElPTl9NT0RFTCBkZXNj cmliZXMgdGhlIGFsZ29yaXRobSB1c2VkIHRvIGNoZWNrIHRoZQogICAgdmFsaWRp dHkgb2YgdGhlIGtleS4gIFRoZSBkZWZhdWx0cyBhcmUgdGhlIHN0YW5kYXJkIFdl YiBvZiBUcnVzdAogICAgbW9kZWwgZm9yIGdwZyBhbmQgdGhlIHRoZSBzdGFuZGFy ZCBYLjUwOSBtb2RlbCBmb3IgZ3Bnc20uICBUaGUKICAgIGRlZmluZWQgdmFsdWVz IGFyZQoKICAgICAgIC0gcGdwICAgOjogVGhlIHN0YW5kYXJkIFBHUCBXb1QuCiAg ICAgICAtIHNoZWxsIDo6IFRoZSBzdGFuZGFyZCBYLjUwOSBtb2RlbC4KICAgICAg IC0gY2hhaW4gOjogVGhlIGNoYWluIG1vZGVsLgogICAgICAgLSBzdGVlZCA6OiBU aGUgU1RFRUQgbW9kZWwuCgogICAgTm90ZSB0aGF0IHRoZSB0ZXJtID1UUlVTVF89 IGluIHRoZSBzdGF0dXMgbmFtZXMgaXMgdXNlZCBmb3IKICAgIGhpc3RvcmljIHJl YXNvbnM7IHdlIG5vdyBzcGVhayBvZiB2YWxpZGl0eS4KCioqKiBQS0FfVFJVU1Rf CiAgICBUaGlzIGlzIGlzIG9uZToKCiAgICAtIFBLQV9UUlVTVF9HT09EIDxtYWls Ym94PgogICAgLSBQS0FfVFJVU1RfQkFEICA8bWFpbGJveD4KCiAgICBEZXBlbmRp bmcgb24gdGhlIG91dGNvbWUgb2YgdGhlIFBLQSBjaGVjayBvbmUgb2YgdGhlIGFi b3ZlIHN0YXR1cwogICAgY29kZXMgaXMgZW1pdHRlZCBpbiBhZGRpdGlvbiB0byBh ID1UUlVTVF8qPSBzdGF0dXMuCgoqKiBSZW1vdGUgY29udHJvbAoqKiogR0VUX0JP T0wsIEdFVF9MSU5FLCBHRVRfSElEREVOLCBHT1RfSVQKCiAgICBUaGVzZSBzdGF0 dXMgbGluZSBhcmUgdXNlZCB3aXRoIC0tY29tbWFuZC1mZCBmb3IgaW50ZXJhY3Rp dmUKICAgIGNvbnRyb2wgb2YgdGhlIHByb2Nlc3MuCgoqKiogVVNFUklEX0hJTlQg PGxvbmcgbWFpbiBrZXlpZD4gPHN0cmluZz4KICAgIEdpdmUgYSBoaW50IGFib3V0 IHRoZSB1c2VyIElEIGZvciBhIGNlcnRhaW4ga2V5SUQuCgoqKiogTkVFRF9QQVNT UEhSQVNFIDxsb25nIGtleWlkPiA8bG9uZyBtYWluIGtleWlkPiA8a2V5dHlwZT4g PGtleWxlbmd0aD4KICAgIElzc3VlZCB3aGVuZXZlciBhIHBhc3NwaHJhc2UgaXMg bmVlZGVkLiAgS0VZVFlQRSBpcyB0aGUgbnVtZXJpY2FsCiAgICB2YWx1ZSBvZiB0 aGUgcHVibGljIGtleSBhbGdvcml0aG0gb3IgMCBpZiB0aGlzIGlzIG5vdCBhcHBs aWNhYmxlLAogICAgS0VZTEVOR1RIIGlzIHRoZSBsZW5ndGggb2YgdGhlIGtleSBv ciAwIGlmIGl0IGlzIG5vdCBrbm93biAodGhpcwogICAgaXMgY3VycmVudGx5IGFs d2F5cyB0aGUgY2FzZSkuCgoqKiogTkVFRF9QQVNTUEhSQVNFX1NZTSA8Y2lwaGVy X2FsZ28+IDxzMmtfbW9kZT4gPHMya19oYXNoPgogICAgSXNzdWVkIHdoZW5ldmVy IGEgcGFzc3BocmFzZSBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gaXMgbmVlZGVk LgoKKioqIE5FRURfUEFTU1BIUkFTRV9QSU4gPGNhcmRfdHlwZT4gPGNodm5vPiBb PHNlcmlhbG5vPl0KICAgIElzc3VlZCB3aGVuZXZlciBhIFBJTiBpcyByZXF1ZXN0 ZWQgdG8gdW5sb2NrIGEgY2FyZC4KCioqKiBNSVNTSU5HX1BBU1NQSFJBU0UKICAg IE5vIHBhc3NwaHJhc2Ugd2FzIHN1cHBsaWVkLiAgQW4gYXBwbGljYXRpb24gd2hp Y2ggZW5jb3VudGVycyB0aGlzCiAgICBtZXNzYWdlIG1heSB3YW50IHRvIHN0b3Ag cGFyc2luZyBpbW1lZGlhdGVseSBiZWNhdXNlIHRoZSBuZXh0CiAgICBtZXNzYWdl IHdpbGwgcHJvYmFibHkgYmUgYSBCQURfUEFTU1BIUkFTRS4gIEhvd2V2ZXIsIGlm IHRoZQogICAgYXBwbGljYXRpb24gaXMgYSB3cmFwcGVyIGFyb3VuZCB0aGUga2V5 IGVkaXQgbWVudSBmdW5jdGlvbmFsaXR5IGl0CiAgICBtaWdodCBub3QgbWFrZSBz ZW5zZSB0byBzdG9wIHBhcnNpbmcgYnV0IHNpbXBseSBpZ25vcmluZyB0aGUKICAg IGZvbGxvd2luZyBCQURfUEFTU1BIUkFTRS4KCioqKiBCQURfUEFTU1BIUkFTRSA8 bG9uZyBrZXlpZD4KICAgIFRoZSBzdXBwbGllZCBwYXNzcGhyYXNlIHdhcyB3cm9u ZyBvciBub3QgZ2l2ZW4uICBJbiB0aGUgbGF0dGVyCiAgICBjYXNlIHlvdSBtYXkg aGF2ZSBzZWVuIGEgTUlTU0lOR19QQVNTUEhSQVNFLgoKKioqIEdPT0RfUEFTU1BI UkFTRQogICAgVGhlIHN1cHBsaWVkIHBhc3NwaHJhc2Ugd2FzIGdvb2QgYW5kIHRo ZSBzZWNyZXQga2V5IG1hdGVyaWFsCiAgICBpcyB0aGVyZWZvcmUgdXNhYmxlLgoK KiogSW1wb3J0L0V4cG9ydAoqKiogSU1QT1JUX0NIRUNLIDxsb25nIGtleWlkPiA8 ZmluZ2VycHJpbnQ+IDx1c2VyIElEPgogICAgVGhpcyBzdGF0dXMgaXMgZW1pdHRl ZCBpbiBpbnRlcmFjdGl2ZSBtb2RlIHJpZ2h0IGJlZm9yZQogICAgdGhlICJpbXBv cnQub2theSIgcHJvbXB0LgoKKioqIElNUE9SVEVEICAgPGxvbmcga2V5aWQ+ICA8 dXNlcm5hbWU+CiAgICBUaGUga2V5aWQgYW5kIG5hbWUgb2YgdGhlIHNpZ25hdHVy ZSBqdXN0IGltcG9ydGVkCgoqKiogSU1QT1JUX09LICA8cmVhc29uPiBbPGZpbmdl cnByaW50Pl0KICAgIFRoZSBrZXkgd2l0aCB0aGUgcHJpbWFyeSBrZXkncyBGSU5H RVJQUklOVCBoYXMgYmVlbiBpbXBvcnRlZC4KICAgIFJFQVNPTiBmbGFncyBhcmU6 CgogICAgLSAwIDo6IE5vdCBhY3R1YWxseSBjaGFuZ2VkCiAgICAtIDEgOjogRW50 aXJlbHkgbmV3IGtleS4KICAgIC0gMiA6OiBOZXcgdXNlciBJRHMKICAgIC0gNCA6 OiBOZXcgc2lnbmF0dXJlcwogICAgLSA4IDo6IE5ldyBzdWJrZXlzCiAgICAtIDE2 IDo6IENvbnRhaW5zIHByaXZhdGUga2V5LgoKICAgIFRoZSBmbGFncyBtYXkgYmUg T1JlZC4KCioqKiBJTVBPUlRfUFJPQkxFTSA8cmVhc29uPiBbPGZpbmdlcnByaW50 Pl0KICAgIElzc3VlZCBmb3IgZWFjaCBpbXBvcnQgZmFpbHVyZS4gIFJlYXNvbiBj b2RlcyBhcmU6CgogICAgLSAwIDo6IE5vIHNwZWNpZmljIHJlYXNvbiBnaXZlbi4K ICAgIC0gMSA6OiBJbnZhbGlkIENlcnRpZmljYXRlLgogICAgLSAyIDo6IElzc3Vl ciBDZXJ0aWZpY2F0ZSBtaXNzaW5nLgogICAgLSAzIDo6IENlcnRpZmljYXRlIENo YWluIHRvbyBsb25nLgogICAgLSA0IDo6IEVycm9yIHN0b3JpbmcgY2VydGlmaWNh dGUuCgoqKiogSU1QT1JUX1JFUyA8YXJncz4KICAgIEZpbmFsIHN0YXRpc3RpY3Mg b24gaW1wb3J0IHByb2Nlc3MgKHRoaXMgaXMgb25lIGxvbmcgbGluZSkuIFRoZQog ICAgYXJncyBhcmUgYSBsaXN0IG9mIHVuc2lnbmVkIG51bWJlcnMgc2VwYXJhdGVk IGJ5IHdoaXRlIHNwYWNlOgoKICAgIC0gPGNvdW50PgogICAgLSA8bm9fdXNlcl9p ZD4KICAgIC0gPGltcG9ydGVkPgogICAgLSBhbHdheXMgMCAoZm9ybWVybHkgdXNl ZCBmb3IgdGhlIG51bWJlciBvZiBSU0Ega2V5cykKICAgIC0gPHVuY2hhbmdlZD4K ICAgIC0gPG5fdWlkcz4KICAgIC0gPG5fc3Viaz4KICAgIC0gPG5fc2lncz4KICAg IC0gPG5fcmV2b2M+CiAgICAtIDxzZWNfcmVhZD4KICAgIC0gPHNlY19pbXBvcnRl ZD4KICAgIC0gPHNlY19kdXBzPgogICAgLSA8c2tpcHBlZF9uZXdfa2V5cz4KICAg IC0gPG5vdF9pbXBvcnRlZD4KICAgIC0gPHNraXBwZWRfdjNfa2V5cz4KCioqKiBF WFBPUlRFRCAgPGZpbmdlcnByaW50PgogICAgVGhlIGtleSB3aXRoIDxmaW5nZXJw cmludD4gaGFzIGJlZW4gZXhwb3J0ZWQuICBUaGUgZmluZ2VycHJpbnQgaXMKICAg IHRoZSBmaW5nZXJwcmludCBvZiB0aGUgcHJpbWFyeSBrZXkgZXZlbiBpZiB0aGUg cHJpbWFyeSBrZXkgaGFzCiAgICBiZWVuIHJlcGxhY2VkIGJ5IGEgc3R1YiBrZXkg ZHVyaW5nIHNlY3JldCBrZXkgZXhwb3J0LgoKKioqIEVYUE9SVF9SRVMgPGFyZ3M+ CgogICAgRmluYWwgc3RhdGlzdGljcyBvbiBleHBvcnQgcHJvY2VzcyAodGhpcyBp cyBvbmUgbG9uZyBsaW5lKS4gVGhlCiAgICBhcmdzIGFyZSBhIGxpc3Qgb2YgdW5z aWduZWQgbnVtYmVycyBzZXBhcmF0ZWQgYnkgd2hpdGUgc3BhY2U6CgogICAgLSA8 Y291bnQ+CiAgICAtIDxzZWNyZXRfY291bnQ+CiAgICAtIDxleHBvcnRlZD4KCgoq KiBTbWFydGNhcmQgcmVsYXRlZAoqKiogQ0FSRENUUkwgPHdoYXQ+IFs8c2VyaWFs bm8+XQogICAgVGhpcyBpcyB1c2VkIHRvIGNvbnRyb2wgc21hcnRjYXJkIG9wZXJh dGlvbnMuICBEZWZpbmVkIHZhbHVlcyBmb3IKICAgIFdIQVQgYXJlOgoKICAgICAg LSAxIDo6IFJlcXVlc3QgaW5zZXJ0aW9uIG9mIGEgY2FyZC4gIFNlcmlhbG51bWJl ciBtYXkgYmUgZ2l2ZW4KICAgICAgICAgICAgIHRvIHJlcXVlc3QgYSBzcGVjaWZp YyBjYXJkLiAgVXNlZCBieSBncGcgMS40IHcvbwogICAgICAgICAgICAgc2NkYWVt b24KICAgICAgLSAyIDo6IFJlcXVlc3QgcmVtb3ZhbCBvZiBhIGNhcmQuICBVc2Vk IGJ5IGdwZyAxLjQgdy9vIHNjZGFlbW9uLgogICAgICAtIDMgOjogQ2FyZCB3aXRo IHNlcmlhbG51bWJlciBkZXRlY3RlZAogICAgICAtIDQgOjogTm8gY2FyZCBhdmFp bGFibGUKICAgICAgLSA1IDo6IE5vIGNhcmQgcmVhZGVyIGF2YWlsYWJsZQogICAg ICAtIDYgOjogTm8gY2FyZCBzdXBwb3J0IGF2YWlsYWJsZQogICAgICAtIDcgOjog Q2FyZCBpcyBpbiB0ZXJtaW5hdGlvbiBzdGF0ZQoKKioqIFNDX09QX0ZBSUxVUkUg Wzxjb2RlPl0KICAgIEFuIG9wZXJhdGlvbiBvbiBhIHNtYXJ0Y2FyZCBkZWZpbml0 ZWx5IGZhaWxlZC4gIEN1cnJlbnRseSB0aGVyZSBpcwogICAgbm8gaW5kaWNhdGlv biBvZiB0aGUgYWN0dWFsIGVycm9yIGNvZGUsIGJ1dCBhcHBsaWNhdGlvbiBzaG91 bGQgYmUKICAgIHByZXBhcmVkIHRvIGxhdGVyIGFjY2VwdCBtb3JlIGFyZ3VtZW50 cy4gIERlZmluZWQgdmFsdWVzIGZvcgogICAgPGNvZGU+IGFyZToKCiAgICAgIC0g MCA6OiB1bnNwZWNpZmllZCBlcnJvciAoaWRlbnRpY2FsbHkgdG8gYSBtaXNzaW5n IENPREUpCiAgICAgIC0gMSA6OiBjYW5jZWxlZAogICAgICAtIDIgOjogYmFkIFBJ TgoKKioqIFNDX09QX1NVQ0NFU1MKICAgIEEgc21hcnQgY2FyZCBvcGVyYWlvbiBz dWNjZWVkZWQuICBUaGlzIHN0YXR1cyBpcyBvbmx5IHByaW50ZWQgZm9yCiAgICBj ZXJ0YWluIG9wZXJhdGlvbiBhbmQgaXMgbW9zdGx5IHVzZWZ1bCB0byBjaGVjayB3 aGV0aGVyIGEgUElOCiAgICBjaGFuZ2UgcmVhbGx5IHdvcmtlZC4KCioqIE1pc2Nl bGxhbmVvdXMgc3RhdHVzIGNvZGVzCioqKiBOT0RBVEEgIDx3aGF0PgogICAgTm8g ZGF0YSBoYXMgYmVlbiBmb3VuZC4gIENvZGVzIGZvciBXSEFUIGFyZToKCiAgICAt IDEgOjogTm8gYXJtb3JlZCBkYXRhLgogICAgLSAyIDo6IEV4cGVjdGVkIGEgcGFj a2V0IGJ1dCBkaWQgbm90IGZvdW5kIG9uZS4KICAgIC0gMyA6OiBJbnZhbGlkIHBh Y2tldCBmb3VuZCwgdGhpcyBtYXkgaW5kaWNhdGUgYSBub24gT3BlblBHUAogICAg ICAgICAgIG1lc3NhZ2UuCiAgICAtIDQgOjogU2lnbmF0dXJlIGV4cGVjdGVkIGJ1 dCBub3QgZm91bmQKCiAgICBZb3UgbWF5IHNlZSBtb3JlIHRoYW4gb25lIG9mIHRo ZXNlIHN0YXR1cyBsaW5lcy4KCioqKiBVTkVYUEVDVEVEIDx3aGF0PgogICAgVW5l eHBlY3RlZCBkYXRhIGhhcyBiZWVuIGVuY291bnRlcmVkLiAgQ29kZXMgZm9yIFdI QVQgYXJlOgogICAgLSAwIDo6IE5vdCBmdXJ0aGVyIHNwZWNpZmllZAogICAgLSAx IDo6IENvcnJ1cHRlZCBtZXNzYWdlIHN0cnVjdHVyZQoKKioqIFRSVU5DQVRFRCA8 bWF4bm8+CiAgICBUaGUgb3V0cHV0IHdhcyB0cnVuY2F0ZWQgdG8gTUFYTk8gaXRl bXMuICBUaGlzIHN0YXR1cyBjb2RlIGlzCiAgICBpc3N1ZWQgZm9yIGNlcnRhaW4g ZXh0ZXJuYWwgcmVxdWVzdHMuCgoqKiogRVJST1IgPGVycm9yIGxvY2F0aW9uPiA8 ZXJyb3IgY29kZT4gWzxtb3JlPl0KICAgIFRoaXMgaXMgYSBnZW5lcmljIGVycm9y IHN0YXR1cyBtZXNzYWdlLCBpdCBtaWdodCBiZSBmb2xsb3dlZCBieQogICAgZXJy b3IgbG9jYXRpb24gc3BlY2lmaWMgZGF0YS4gPGVycm9yIGNvZGU+IGFuZCA8ZXJy b3JfbG9jYXRpb24+CiAgICBzaG91bGQgbm90IGNvbnRhaW4gc3BhY2VzLiAgVGhl IGVycm9yIGNvZGUgaXMgYSBlaXRoZXIgYSBzdHJpbmcKICAgIGNvbW1lbmNpbmcg d2l0aCBhIGxldHRlciBvciBzdWNoIGEgc3RyaW5nIHByZWZpeGVkIHdpdGggYQog ICAgbnVtZXJpY2FsIGVycm9yIGNvZGUgYW5kIGFuIHVuZGVyc2NvcmU7IGUuZy46 ICIxNTEwMTEzMjdfRU9GIi4KKioqIFdBUk5JTkcgPGxvY2F0aW9uPiA8ZXJyb3Ig Y29kZT4gWzx0ZXh0Pl0KICAgIFRoaXMgaXMgYSBnZW5lcmljIHdhcm5pbmcgc3Rh dHVzIG1lc3NhZ2UsIGl0IG1pZ2h0IGJlIGZvbGxvd2VkIGJ5CiAgICBlcnJvciBs b2NhdGlvbiBzcGVjaWZpYyBkYXRhLiA8ZXJyb3IgY29kZT4gYW5kIDxsb2NhdGlv bj4KICAgIHNob3VsZCBub3QgY29udGFpbiBzcGFjZXMuICBUaGUgZXJyb3IgY29k ZSBpcyBhIGVpdGhlciBhIHN0cmluZwogICAgY29tbWVuY2luZyB3aXRoIGEgbGV0 dGVyIG9yIHN1Y2ggYSBzdHJpbmcgcHJlZml4ZWQgd2l0aCBhCiAgICBudW1lcmlj YWwgZXJyb3IgY29kZSBhbmQgYW4gdW5kZXJzY29yZTsgZS5nLjogIjE1MTAxMTMy N19FT0YiLgoqKiogU1VDQ0VTUyBbPGxvY2F0aW9uPl0KICAgIFBvc3RpdmUgY29u ZmlybWF0aW9uIHRoYXQgYW4gb3BlcmF0aW9uIHN1Y2NlZWRlZC4gIEl0IGlzIHVz ZWQKICAgIHNpbWlsYXIgdG8gSVNPLUMncyBFWElUX1NVQ0NFU1MuICA8bG9jYXRp b24+IGlzIG9wdGlvbmFsIGJ1dCBpZgogICAgZ2l2ZW4gc2hvdWxkIG5vdCBjb250 YWluIHNwYWNlcy4gIFVzZWQgb25seSB3aXRoIGEgZmV3IGNvbW1hbmRzLgoKKioq IEZBSUxVUkUgPGxvY2F0aW9uPiA8ZXJyb3JfY29kZT4KICAgIFRoaXMgaXMgdGhl IGNvdW50ZXJwYXJ0IHRvIFNVQ0NFU1MgYW5kIHVzZWQgdG8gaW5kaWNhdGUgYSBw cm9ncmFtCiAgICBmYWlsdXJlLiAgSXQgaXMgdXNlZCBzaW1pbGFyIHRvIElTTy1D J3MgRVhJVF9GQUlMVVJFIGJ1dCBhbGxvd3MgdG8KICAgIGNvbnZleSBtb3JlIGlu Zm9ybWF0aW9uLCBpbiBwYXJ0aWN1bGFyIGFuIGdwZy1lcnJvciBlcnJvciBjb2Rl LgogICAgVGhhdCBudW1lcmljYWwgZXJyb3IgY29kZSBtYXkgb3B0aW9uYWxseSBo YXZlIGEgc3VmZml4IG1hZGUgb2YgYW4KICAgIHVuZGVyc2NvcmUgYW5kIGEgc3Ry aW5nIHdpdGggYW4gZXJyb3Igc3ltYm9sIGxpa2UgIjE1MTAxMTMyN19FT0YiLgog ICAgQSBkYXNoIG1heSBiZSB1c2VkIGluc3RlYWQgb2YgPGxvY2F0aW9uPi4KCioq KiBCQURBUk1PUgogICAgVGhlIEFTQ0lJIGFybW9yIGlzIGNvcnJ1cHRlZC4gIE5v IGFyZ3VtZW50cyB5ZXQuCgoqKiogREVMRVRFX1BST0JMRU0gPHJlYXNvbl9jb2Rl PgogICAgRGVsZXRpbmcgYSBrZXkgZmFpbGVkLiAgUmVhc29uIGNvZGVzIGFyZToK ICAgIC0gMSA6OiBObyBzdWNoIGtleQogICAgLSAyIDo6IE11c3QgZGVsZXRlIHNl Y3JldCBrZXkgZmlyc3QKICAgIC0gMyA6OiBBbWJpZ2lvdXMgc3BlY2lmaWNhdGlv bgogICAgLSA0IDo6IEtleSBpcyBzdG9yZWQgb24gYSBzbWFydGNhcmQuCgoqKiog UFJPR1JFU1MgPHdoYXQ+IDxjaGFyPiA8Y3VyPiA8dG90YWw+CiAgICBVc2VkIGJ5 IHRoZSBwcmltZWdlbiBhbmQgUHVibGljIGtleSBmdW5jdGlvbnMgdG8gaW5kaWNh dGUKICAgIHByb2dyZXNzLiAgPGNoYXI+IGlzIHRoZSBjaGFyYWN0ZXIgZGlzcGxh eWVkIHdpdGggbm8gLS1zdGF0dXMtZmQKICAgIGVuYWJsZWQsIHdpdGggdGhlIGxp bmVmZWVkIHJlcGxhY2VkIGJ5IGFuICdYJy4gIDxjdXI+IGlzIHRoZQogICAgY3Vy cmVudCBhbW91bnQgZG9uZSBhbmQgPHRvdGFsPiBpcyBhbW91bnQgdG8gYmUgZG9u ZTsgYSA8dG90YWw+IG9mCiAgICAwIGluZGljYXRlcyB0aGF0IHRoZSB0b3RhbCBh bW91bnQgaXMgbm90IGtub3duLiBUaGUgY29uZGl0aW9uCiAgICAgIDogICAgICAg VE9UQUwgJiYgQ1VSID09IFRPVEFMCiAgICBtYXkgYmUgdXNlZCB0byBkZXRlY3Qg dGhlIGVuZCBvZiBhbiBvcGVyYXRpb24uCgogICAgV2VsbCBrbm93biB2YWx1ZXMg Zm9yIFdIQVQgYXJlOgoKICAgICAgICAgICAtIHBrX2RzYSAgIDo6IERTQSBrZXkg Z2VuZXJhdGlvbgogICAgICAgICAgIC0gcGtfZWxnICAgOjogRWxnYW1hbCBrZXkg Z2VuZXJhdGlvbgogICAgICAgICAgIC0gcHJpbWVnZW4gOjogUHJpbWUgZ2VuZXJh dGlvbgogICAgICAgICAgIC0gbmVlZF9lbnRyb3B5IDo6IFdhaXRpbmcgZm9yIG5l dyBlbnRyb3B5IGluIHRoZSBSTkcKICAgICAgICAgICAtIHRpY2sgOjogR2VuZXJp YyB0aWNrIHdpdGhvdXQgYW55IHNwZWNpYWwgbWVhbmluZyAtIHVzZWZ1bAogICAg ICAgICAgICAgICAgICAgICBmb3IgbGV0dGluZyBjbGllbnRzIGtub3cgdGhhdCB0 aGUgc2VydmVyIGlzIHN0aWxsCiAgICAgICAgICAgICAgICAgICAgIHdvcmtpbmcu CiAgICAgICAgICAgLSBzdGFydGluZ19hZ2VudCA6OiBBIGdwZy1hZ2VudCB3YXMg c3RhcnRlZCBiZWNhdXNlIGl0IGlzIG5vdAogICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgIHJ1bm5pbmcgYXMgYSBkYWVtb24uCiAgICAgICAgICAgLSBsZWFy bmNhcmQgOjogU2VuZCBieSB0aGUgYWdlbnQgYW5kIGdwZ3NtIHdoaWxlIGxlYXJp bmcKICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZGF0YSBvZiBhIHNtYXJ0 Y2FyZC4KICAgICAgICAgICAtIGNhcmRfYnVzeSA6OiBBIHNtYXJ0Y2FyZCBpcyBz dGlsbCB3b3JraW5nCgoqKiogQkFDS1VQX0tFWV9DUkVBVEVEIDxmaW5nZXJwcmlu dD4gPGZuYW1lPgogICAgQSBiYWNrdXAgb2YgYSBrZXkgaWRlbnRpZmllZCBieSA8 ZmluZ2VycHJpbnQ+IGhhcyBiZWVuIHdyaXR0ZSB0bwogICAgdGhlIGZpbGUgPGZu YW1lPjsgPGZuYW1lPiBpcyBwZXJjZW50LWVzY2FwZWQuCgoqKiogTU9VTlRQT0lO VCA8bmFtZT4KICAgIDxuYW1lPiBpcyBhIHBlcmNlbnQtcGx1cyBlc2NhcGVkIGZp bGVuYW1lIGRlc2NyaWJpbmcgdGhlCiAgICBtb3VudHBvaW50IGZvciB0aGUgY3Vy cmVudCBvcGVyYXRpb24gKGUuZy4gdXNlZCBieSAiZzEzIC0tbW91bnQiKS4KICAg IFRoaXMgbWF5IGVpdGhlciBiZSB0aGUgc3BlY2lmaWVkIG1vdW50cG9pbnQgb3Ig b25lIHJhbmRvbWx5CiAgICBjaG9vc2VuIGJ5IGcxMy4KCioqKiBQSU5FTlRSWV9M QVVOQ0hFRCA8cGlkPgogICAgVGhpcyBzdGF0dXMgbGluZSBpcyBlbWl0dGVkIGJ5 IGdwZyB0byBub3RpZnkgYSBjbGllbnQgdGhhdCBhCiAgICBQaW5lbnRyeSBoYXMg YmVlbiBsYXVuY2hlZC4gIDxwaWQ+IGlzIHRoZSBQSUQgb2YgdGhlIFBpbmVudHJ5 LiAgSXQKICAgIG1heSBiZSB1c2VkIHRvIGRpc3BsYXkgYSBoaW50IHRvIHRoZSB1 c2VyIGJ1dCBjYW4ndCBiZSB1c2VkIHRvCiAgICBzeW5jaHJvbml6ZSB3aXRoIFBp bmVudHJ5LiAgTm90ZSB0aGF0IHRoZXJlIGlzIGFsc28gYW4gQXNzdWFuCiAgICBp bnF1aXJ5IGxpbmUgd2l0aCB0aGUgc2FtZSBuYW1lIHVzZWQgaW50ZXJuYWxseSBv ciwgaWYgZW5hYmxlZCwKICAgIHNlbmQgdG8gdGhlIGNsaWVudCBpbnN0ZWFkIG9m IHRoaXMgc3RhdHVzIGxpbmUuICBTdWNoIGFuIGlucXVpcnkKICAgIG1heSBiZSB1 c2VkIHRvIHN5bmMgd2l0aCBQaW5lbnRyeQoKKiogT2Jzb2xldGUgc3RhdHVzIGNv ZGVzCioqKiBTSUdFWFBJUkVECiAgICBSZW1vdmVkIG9uIDIwMTEtMDItMDQuICBU aGlzIGlzIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgS0VZRVhQSVJFRC4KKioqIFJT QV9PUl9JREVBCiAgICBPYnNvbGV0ZS4gIFRoaXMgc3RhdHVzIG1lc3NhZ2UgdXNl ZCB0byBiZSBlbWl0dGVkIGZvciByZXF1ZXN0cyB0bwogICAgdXNlIHRoZSBJREVB IG9yIFJTQSBhbGdvcml0aG1zLiAgSXQgaGFzIGJlZW4gZHJvcHBlZCBmcm9tIEdu dVBHCiAgICAyLjEgYWZ0ZXIgdGhlIHJlc3BlY3RpdmUgcGF0ZW50cyBleHBpcmVk LgoqKiogU0hNX0lORk8sIFNITV9HRVQsIFNITV9HRVRfQk9PTCwgU0hNX0dFVF9I SURERU4KICAgIFRoZXNlIHdlcmUgdXNlZCBmb3IgdGhlIGFuY2llbnQgc2hhcmVk IG1lbW9yeSBiYXNlZCBjby1wcm9jZXNzaW5nLgoqKiogQkVHSU5fU1RSRUFNLCBF TkRfU1RSRUFNCiAgICBVc2VkIHRvIGlzc3VlZCBieSB0aGUgZXhwZXJpbWVudGFs IHBpcGVtb2RlLgoKCiogRm9ybWF0IG9mIHRoZSAtLWF0dHJpYnV0ZS1mZCBvdXRw dXQKCiAgV2hlbiAtLWF0dHJpYnV0ZS1mZCBpcyBzZXQsIGR1cmluZyBrZXkgbGlz dGluZ3MgKC0tbGlzdC1rZXlzLAogIC0tbGlzdC1zZWNyZXQta2V5cykgR251UEcg ZHVtcHMgZWFjaCBhdHRyaWJ1dGUgcGFja2V0IHRvIHRoZSBmaWxlCiAgZGVzY3Jp cHRvciBzcGVjaWZpZWQuICAtLWF0dHJpYnV0ZS1mZCBpcyBpbnRlbmRlZCBmb3Ig dXNlIHdpdGgKICAtLXN0YXR1cy1mZCBhcyBwYXJ0IG9mIHRoZSByZXF1aXJlZCBp bmZvcm1hdGlvbiBpcyBjYXJyaWVkIG9uIHRoZQogIEFUVFJJQlVURSBzdGF0dXMg dGFnIChzZWUgYWJvdmUpLgoKICBUaGUgY29udGVudHMgb2YgdGhlIGF0dHJpYnV0 ZSBkYXRhIGlzIHNwZWNpZmllZCBieSBSRkMgNDg4MC4gIEZvcgogIGNvbnZlbmll bmNlLCBoZXJlIGlzIHRoZSBQaG90byBJRCBmb3JtYXQsIGFzIGl0IGlzIGN1cnJl bnRseSB0aGUKICBvbmx5IGF0dHJpYnV0ZSBkZWZpbmVkOgoKICAtIEJ5dGUgMC0x IDo6IFRoZSBsZW5ndGggb2YgdGhlIGltYWdlIGhlYWRlci4gIER1ZSB0byBhIGhp c3RvcmljYWwKICAgICAgICAgICAgICAgIGFjY2lkZW50IChpLmUuIG9vcHMhKSBi YWNrIGluIHRoZSBOQUkgUEdQIGRheXMsIHRoaXMKICAgICAgICAgICAgICAgIGlz IGEgbGl0dGxlLWVuZGlhbiBudW1iZXIuICBDdXJyZW50bHkgMTYgKDB4MTAgMHgw MCkuCgogIC0gQnl0ZSAyIDo6IFRoZSBpbWFnZSBoZWFkZXIgdmVyc2lvbi4gIEN1 cnJlbnRseSAweDAxLgoKICAtIEJ5dGUgMyA6OiBFbmNvZGluZyBmb3JtYXQuICAw eDAxID09IEpQRUcuCgogIC0gQnl0ZSA0LTE1IDo6IFJlc2VydmVkLCBhbmQgY3Vy cmVudGx5IHVudXNlZC4KCiAgQWxsIG90aGVyIGRhdGEgYWZ0ZXIgdGhpcyBoZWFk ZXIgaXMgcmF3IGltYWdlIChKUEVHKSBkYXRhLgoKCiogVW5hdHRlbmRlZCBrZXkg Z2VuZXJhdGlvbgoKICAgUGxlYXNlIHNlZSB0aGUgR251UEcgbWFudWFsIGZvciBh IGRlc2NyaXB0aW9uLgoKCiogTGF5b3V0IG9mIHRoZSBUcnVzdERCCgogIFRoZSBU cnVzdERCIGlzIGJ1aWx0IGZyb20gZml4ZWQgbGVuZ3RoIHJlY29yZHMsIHdoZXJl IHRoZSBmaXJzdCBieXRlCiAgZGVzY3JpYmVzIHRoZSByZWNvcmQgdHlwZS4gIEFs bCBudW1lcmljIHZhbHVlcyBhcmUgc3RvcmVkIGluIG5ldHdvcmsKICBieXRlIG9y ZGVyLiAgVGhlIGxlbmd0aCBvZiBlYWNoIHJlY29yZCBpcyA0MCBieXRlcy4gIFRo ZSBmaXJzdAogIHJlY29yZCBvZiB0aGUgREIgaXMgYWx3YXlzIG9mIHR5cGUgMSBh bmQgdGhpcyBpcyB0aGUgb25seSByZWNvcmQgb2YKICB0aGlzIHR5cGUuCgogIFRo ZSByZWNvcmQgdHlwZXM6IGRpcmVjdG9yeSgyKSwga2V5KDMpLCB1aWQoNCksIHBy ZWYoNSksIHNpZ3JlYyg2KSwKICBhbmQgc2hhZG93IGRpcmVjdG9yeSg4KSBhcmUg bm90IGFueW1vcmUgdXNlZCBieSB2ZXJzaW9uIDIgb2YgdGhlCiAgVHJ1c3REQi4K CioqIFJlY29yZCB0eXBlIDAKCiAgIFVudXNlZCByZWNvcmQgb3IgZGVsZXRlZCwg Y2FuIGJlIHJldXNlZCBmb3IgYW55IHB1cnBvc2UuICBTdWNoCiAgIHJlY29yZHMg c2hvdWxkIGluIGdlbmVyYWwgbm90IGV4aXN0IGJlY2F1c2UgZGVsZXRlZCByZWNv cmRzIGFyZSBvZgogICB0eXBlIDI1NCBhbmQga2VwdCBpbiBhIGxpbmtlZCBsaXN0 LgoKKiogVmVyc2lvbiBpbmZvIChSRUNUWVBFX1ZFUiwgMSkKCiAgIFZlcnNpb24g aW5mb3JtYXRpb24gZm9yIHRoaXMgVHJ1c3REQi4gIFRoaXMgaXMgYWx3YXlzIHRo ZSBmaXJzdAogICByZWNvcmQgb2YgdGhlIERCIGFuZCB0aGUgb25seSBvbmUgb2Yg dGhpcyB0eXBlLgoKICAgLSAxIHU4IDo6IFJlY29yZCB0eXBlICh2YWx1ZTogMSku CiAgIC0gMyBieXRlIDo6IE1hZ2ljIHZhbHVlICgiZ3BnIikKICAgLSAxIHU4IDo6 IFRydXN0REIgdmVyc2lvbiAodmFsdWU6IDIpLgogICAtIDEgdTggOjogPW1hcmdp bmFscz0uIEhvdyBtYW55IG1hcmdpbmFsIHRydXN0ZWQga2V5cyBhcmUgcmVxdWly ZWQuCiAgIC0gMSB1OCA6OiA9Y29tcGxldGVzPS4gSG93IG1hbnkgY29tcGxldGVs eSB0cnVzdGVkIGtleXMgYXJlCiAgICAgICAgICAgICByZXF1aXJlZC4KICAgLSAx IHU4IDo6ID1tYXhfY2VydF9kZXB0aD0uICBIb3cgZGVlcCBpcyB0aGUgV29UIGV2 YWx1YXRlZC4gIEFsb25nCiAgICAgICAgICAgICB3aXRoID1tYXJnaW5hbHM9IGFu ZCA9Y29tcGxldGVzPSwgdGhpcyB2YWx1ZSBpcyB1c2VkIHRvCiAgICAgICAgICAg ICBjaGVjayB3aGV0aGVyIHRoZSBjYWNoZWQgdmFsaWRpdHkgdmFsdWUgZnJvbSBh IFtGSVhNRQogICAgICAgICAgICAgZGlyXSByZWNvcmQgY2FuIGJlIHVzZWQuCiAg IC0gMSB1OCA6OiA9dHJ1c3RfbW9kZWw9CiAgIC0gMSB1OCA6OiA9bWluX2NlcnRf bGV2ZWw9CiAgIC0gMiBieXRlIDo6IE5vdCB1c2VkCiAgIC0gMSB1MzIgOjogPWNy ZWF0ZWQ9LiBUaW1lc3RhbXAgb2YgdHJ1c3RkYiBjcmVhdGlvbi4KICAgLSAxIHUz MiA6OiA9bmV4dGNoZWNrPS4gVGltZXN0YW1wIG9mIGxhc3QgbW9kaWZpY2F0aW9u IHdoaWNoIG1heQogICAgICAgICAgICAgIGFmZmVjdCB0aGUgdmFsaWRpdHkgb2Yg a2V5cyBpbiB0aGUgdHJ1c3RkYi4gIFRoaXMgdmFsdWUKICAgICAgICAgICAgICBp cyBjaGVja2VkIGFnYWluc3QgdGhlIHZhbGlkaXR5IHRpbWVzdGFtcCBpbiB0aGUg ZGlyCiAgICAgICAgICAgICAgcmVjb3Jkcy4KICAgLSAxIHUzMiA6OiA9cmVzZXJ2 ZWQ9LiAgTm90IHVzZWQuCiAgIC0gMSB1MzIgOjogPXJlc2VydmVkMj0uIE5vdCB1 c2VkLgogICAtIDEgdTMyIDo6ID1maXJzdGZyZWU9LiBOdW1iZXIgb2YgdGhlIHJl Y29yZCB3aXRoIHRoZSBoZWFkIHJlY29yZAogICAgICAgICAgICAgIG9mIHRoZSBS RUNUWVBFX0ZSRUUgbGlua2VkIGxpc3QuCiAgIC0gMSB1MzIgOjogPXJlc2VydmVk Mz0uIE5vdCB1c2VkLgogICAtIDEgdTMyIDo6ID10cnVzdGhhc2h0Ymw9LiBSZWNv cmQgbnVtYmVyIG9mIHRoZSB0cnVzdGhhc2h0YWJsZS4KCgoqKiBIYXNoIHRhYmxl IChSRUNUWVBFX0hUQkwsIDEwKQoKICAgRHVlIHRvIHRoZSBmYWN0IHRoYXQgd2Ug dXNlIGZpbmdlcnByaW50cyB0byBsb29rdXAga2V5cywgd2UgY2FuCiAgIGltcGxl bWVudCBxdWljayBhY2Nlc3MgYnkgc29tZSBzaW1wbGUgaGFzaCBtZXRob2RzLCBh bmQgYXZvaWQgdGhlCiAgIG92ZXJoZWFkIG9mIGdkYm0uICBBIHByb3BlcnR5IG9m IGZpbmdlcnByaW50cyBpcyB0aGF0IHRoZXkgY2FuIGJlCiAgIHVzZWQgZGlyZWN0 bHkgYXMgaGFzaCB2YWx1ZXMuICBXaGF0IHdlIHVzZSBpcyBhIGR5bmFtaWMgbXVs dGlsZXZlbAogICBhcmNoaXRlY3R1cmUsIHdoaWNoIGNvbWJpbmVzIGhhc2ggdGFi bGVzLCByZWNvcmQgbGlzdHMsIGFuZCBsaW5rZWQKICAgbGlzdHMuCgogICBUaGlz IHJlY29yZCBpcyBhIGhhc2ggdGFibGUgb2YgMjU2IGVudHJpZXMgd2l0aCB0aGUg cHJvcGVydHkgdGhhdAogICBhbGwgdGhlc2UgcmVjb3JkcyBhcmUgc3RvcmVkIGNv bnNlY3V0aXZlbHkgdG8gbWFrZSBvbmUgYmlnCiAgIHRhYmxlLiBUaGUgaGFzaCB2 YWx1ZSBpcyBzaW1wbGUgdGhlIDFzdCwgMm5kLCAuLi4gYnl0ZSBvZiB0aGUKICAg ZmluZ2VycHJpbnQgKGRlcGVuZGluZyBvbiB0aGUgaW5kaXJlY3Rpb24gbGV2ZWwp LgoKICAgLSAxIHU4IDo6IFJlY29yZCB0eXBlICh2YWx1ZTogMTApLgogICAtIDEg dTggOjogUmVzZXJ2ZWQKICAgLSBuIHUzMiA6OiA9cmVjbnVtPS4gIEEgdGFibGUg d2l0aCB0aGUgaGFzaCB0YWJsZSBpdGVtcyBmaXR0aW5nIGludG8KICAgICAgICAg ICAgICB0aGlzIHJlY29yZC4gID1uPSBkZXBlbmRzIG9uIHRoZSByZWNvcmQgbGVu Z3RoOgogICAgICAgICAgICAgICRuPShyZWNsZW4tMikvNCQgd2hpY2ggeWllbGRz IDkgZm9yIG91cmUgY3VycmVudCByZWNvcmQKICAgICAgICAgICAgICBsZW5ndGgg b2YgNDAgYnl0ZXMuCgogICBUaGUgdG90YWwgbnVtYmVyIG9mIGhhc2ggdGFibGUg cmVjb3JkcyB0byBmb3JtIHRoZSB0YWJsZSBpczoKICAgJG09KDI1NituLTEpL24k LiAgVGhpcyBpcyAyOSBmb3Igb3VyIHJlY29yZCBsZW5ndGggb2YgNDAuCgogICBU byBsb29rIHVwIGEga2V5IHdlIHVzZSB0aGUgZmlyc3QgYnl0ZSBvZiB0aGUgZmlu Z2VycHJpbnQgdG8gZ2V0CiAgIHRoZSByZWNudW0gZnJvbSB0aGlzIGhhc2ggdGFi bGUgYW5kIHRoZW4gbG9vayB1cCB0aGUgYWRkcmVzc2VkCiAgIHJlY29yZDoKCiAg IC0gSWYgdGhhdCByZWNvcmQgaXMgYW5vdGhlciBoYXNoIHRhYmxlLCB3ZSB1c2Ug Mm5kIGJ5dGUgdG8gaW5kZXgKICAgICB0aGF0IGhhc2ggdGFibGUgYW5kIHNvIG9u OwogICAtIGlmIHRoYXQgcmVjb3JkIGlzIGEgaGFzaCBsaXN0LCB3ZSB3YWxrIGFs bCBlbnRyaWVzIHVudGlsIHdlIGZpbmQKICAgICBhIG1hdGNoaW5nIG9uZTsgb3IK ICAgLSBpZiB0aGF0IHJlY29yZCBpcyBhIGtleSByZWNvcmQsIHdlIGNvbXBhcmUg dGhlIGZpbmdlcnByaW50IHRvCiAgICAgZGVjaWRlIHdoZXRoZXIgaXQgaXMgdGhl IHJlcXVlc3RlZCBrZXk7CgoKKiogSGFzaCBsaXN0IChSRUNUWVBFX0hMU1QsIDEx KQoKICAgU2VlIGhhc2ggdGFibGUgYWJvdmUgb24gaG93IGl0IGlzIHVzZWQuICBJ dCBtYXkgYWxzbyBiZSB1c2VkIGZvcgogICBvdGhlciBwdXJwb3Nlcy4KCiAgIC0g MSB1OCA6OiBSZWNvcmQgdHlwZSAodmFsdWU6IDExKS4KICAgLSAxIHU4IDo6IFJl c2VydmVkLgogICAtIDEgdTMyIDo6ID1uZXh0PS4gIFJlY29yZCBudW1iZXIgb2Yg dGhlIG5leHQgaGFzaCBsaXN0IHJlY29yZCBvciAwCiAgICAgICAgICAgICAgaWYg bm9uZS4KICAgLSBuIHUzMiA6OiA9cm51bT0uICBBcnJheSB3aXRoIHJlY29yZCBu dW1iZXJzIHRvIHZhbHVlcy4gIFdpdGgKICAgICAgICAgICAgICAkbj0ocmVjbGVu LTUpLzUkIGFuZCBvdXIgcmVjb3JkIGxlbmd0aCBvZiA0MCwgbiBpcyA3LgoKKiog VHJ1c3QgcmVjb3JkIChSRUNUWVBFX1RSVVNULCAxMikKCiAgIC0gMSB1OCA6OiBS ZWNvcmQgdHlwZSAodmFsdWU6IDEyKS4KICAgLSAxIHU4IDo6IFJlc2VydmVkLgog ICAtIDIwIGJ5dGUgOjogPWZpbmdlcnByaW50PS4KICAgLSAxIHU4IDo6ID1vd25l cnRydXN0PS4KICAgLSAxIHU4IDo6ID1kZXB0aD0uCiAgIC0gMSB1OCA6OiA9bWlu X293bmVydHJ1c3Q9LgogICAtIDEgYnl0ZSA6OiBOb3QgdXNlZC4KICAgLSAxIHUz MiA6OiA9dmFsaWRsaXN0PS4KICAgLSAxMCBieXRlIDo6IE5vdCB1c2VkLgoKKiog VmFsaWRpdHkgcmVjb3JkIChSRUNUWVBFX1ZBTElELCAxMykKCiAgIC0gMSB1OCA6 OiBSZWNvcmQgdHlwZSAodmFsdWU6IDEzKS4KICAgLSAxIHU4IDo6IFJlc2VydmVk LgogICAtIDIwIGJ5dGUgOjogPW5hbWVoYXNoPS4KICAgLSAxIHU4IDo6ID12YWxp ZGl0eT0KICAgLSAxIHUzMiA6OiA9bmV4dD0uCiAgIC0gMSB1OCA6OiA9ZnVsbF9j b3VudD0uCiAgIC0gMSB1OCA6OiA9bWFyZ2luYWxfY291bnQ9LgogICAtIDExIGJ5 dGUgOjogTm90IHVzZWQuCgoqKiBGcmVlIHJlY29yZCAoUkVDVFlQRV9GUkVFLCAy NTQpCgogICBBbGwgdGhlc2UgcmVjb3JkcyBmb3JtIGEgbGlua2VkIGxpc3Qgb2Yg dW51c2VkIHJlY29yZHMgaW4gdGhlIFRydXN0REIuCgogICAtIDEgdTggOjogUmVj b3JkIHR5cGUgKHZhbHVlOiAyNTQpCiAgIC0gMSB1OCA6OiBSZXNlcnZlZC4KICAg LSAxIHUzMiA6OiA9bmV4dD0uICBSZWNvcmQgbnVtYmVyIG9mIHRoZSBuZXh0IHJj b3JkIG9mIHRoaXMgdHlwZS4KICAgICAgICAgICAgICBUaGUgcmVjb3JkIG51bWJl ciB0byB0aGUgaGVhZCBvZiB0aGlzIGxpbmtlZCBsaXN0IGlzCiAgICAgICAgICAg ICAgc3RvcmVkIGluIHRoZSB2ZXJzaW9uIGluZm8gcmVjb3JkLgoKCiogR05VIGV4 dGVuc2lvbnMgdG8gdGhlIFMySyBhbGdvcml0aG0KCiAgMSBvY3RldCAgLSBTMksg VXNhZ2U6IGVpdGhlciAyNTQgb3IgMjU1LgogIDEgb2N0ZXQgIC0gUzJLIENpcGhl ciBBbGdvOiAwCiAgMSBvY3RldCAgLSBTMksgU3BlY2lmaWVyOiAxMDEKICAzIG9j dGV0cyAtICJHTlUiCiAgMSBvY3RldCAgLSBHTlUgUzJLIEV4dGVuc2lvbiBOdW1i ZXIuCgogIElmIHN1Y2ggYSBHTlUgZXh0ZW5zaW9uIGlzIHVzZWQgbmVpdGhlciBh biBJViBub3IgYW55IGtpbmQgb2YKICBjaGVja3N1bSBpcyB1c2VkLiAgVGhlIGRl ZmluZWQgR05VIFMySyBFeHRlbnNpb24gTnVtYmVycyBhcmU6CgogIC0gMSA6OiBE byBub3Qgc3RvcmUgdGhlIHNlY3JldCBwYXJ0IGF0IGFsbC4gIE5vIHNwZWNpZmlj IGRhdGEKICAgICAgICAgZm9sbG93cy4KCiAgLSAyIDo6IEEgc3R1YiB0byBhY2Nl c3Mgc21hcnRjYXJkcy4gIFRoaXMgZGF0YSBmb2xsb3dzOgogICAgICAgICAtIE9u ZSBvY3RldCB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIGZvbGxvd2luZyBzZXJpYWwg bnVtYmVyLgogICAgICAgICAtIFRoZSBzZXJpYWwgbnVtYmVyLiBSZWdhcmRsZXNz IG9mIHdoYXQgdGhlIGxlbmd0aCBvY3RldAogICAgICAgICAgIGluZGljYXRlcyBu byBtb3JlIHRoYW4gMTYgb2N0ZXRzIGFyZSBzdG9yZWQuCgogIE5vdGUgdGhhdCBn cGcgc3RvcmVzIHRoZSBHTlUgUzJLIEV4dGVuc2lvbiBOdW1iZXIgaW50ZXJuYWxs eSBhcyBhbgogIFMySyBTcGVjaWZpZXIgd2l0aCBhbiBvZmZzZXQgb2YgMTAwMC4K CgoqIEtleXNlcnZlciBoZWxwZXIgbWVzc2FnZSBmb3JtYXQKCiAgVGhlIGtleXNl cnZlciBtYXkgYmUgY29udGFjdGVkIGJ5IGEgVW5peCBEb21haW4gc29ja2V0IG9y IHZpYSBUQ1AuCgogIFRoZSBmb3JtYXQgb2YgYSByZXF1ZXN0IGlzOgojK2JlZ2lu X2V4YW1wbGUKICBjb21tYW5kLXRhZwogICJDb250ZW50LWxlbmd0aDoiIGRpZ2l0 cwogIENSTEYKIytlbmRfZXhhbXBsZQoKICBXaGVyZSBjb21tYW5kLXRhZyBpcwoK IytiZWdpbl9leGFtcGxlCiAgTk9PUAogIEdFVCA8dXNlci1uYW1lPgogIFBVVAog IERFTEVURSA8dXNlci1uYW1lPgojK2VuZF9leGFtcGxlCgpUaGUgZm9ybWF0IG9m IGEgcmVzcG9uc2UgaXM6CgojK2JlZ2luX2V4YW1wbGUKICAiR05VUEcvMS4wIiBz dGF0dXMtY29kZSBzdGF0dXMtdGV4dAogICJDb250ZW50LWxlbmd0aDoiIGRpZ2l0 cwogIENSTEYKIytlbmRfZXhhbXBsZQpmb2xsb3dlZCBieSA8ZGlnaXRzPiBieXRl cyBvZiBkYXRhCgpTdGF0dXMgY29kZXMgYXJlOgoKICAtIDF4eCA6OiBJbmZvcm1h dGlvbmFsIC0gUmVxdWVzdCByZWNlaXZlZCwgY29udGludWluZyBwcm9jZXNzCgog IC0gMnh4IDo6IFN1Y2Nlc3MgLSBUaGUgYWN0aW9uIHdhcyBzdWNjZXNzZnVsbHkg cmVjZWl2ZWQsIHVuZGVyc3Rvb2QsCiAgICAgICAgICAgYW5kIGFjY2VwdGVkCgog IC0gNHh4IDo6IENsaWVudCBFcnJvciAtIFRoZSByZXF1ZXN0IGNvbnRhaW5zIGJh ZCBzeW50YXggb3IgY2Fubm90IGJlCiAgICAgICAgICAgZnVsZmlsbGVkCgogIC0g NXh4IDo6IFNlcnZlciBFcnJvciAtIFRoZSBzZXJ2ZXIgZmFpbGVkIHRvIGZ1bGZp bGwgYW4gYXBwYXJlbnRseQogICAgICAgICAgIHZhbGlkIHJlcXVlc3QKCgoqIE9i amVjdCBpZGVudGlmaWVycwoKICBPSURzIGJlbG93IHRoZSBHbnVQRyBhcmM6Cgoj K2JlZ2luX2V4YW1wbGUKICAxLjMuNi4xLjQuMS4xMTU5MS4yICAgICAgICAgIEdu dVBHCiAgMS4zLjYuMS40LjEuMTE1OTEuMi4xICAgICAgICAgIG5vdGF0aW9uCiAg MS4zLjYuMS40LjEuMTE1OTEuMi4xLjEgICAgICAgICAgcGthQWRkcmVzcwogIDEu My42LjEuNC4xLjExNTkxLjIuMiAgICAgICAgICBYLjUwOSBleHRlbnNpb25zCiAg MS4zLjYuMS40LjEuMTE1OTEuMi4yLjEgICAgICAgICAgc3RhbmRhbG9uZUNlcnRp ZmljYXRlCiAgMS4zLjYuMS40LjEuMTE1OTEuMi4yLjIgICAgICAgICAgd2VsbEtu b3duUHJpdmF0ZUtleQogIDEuMy42LjEuNC4xLjExNTkxLjIuMTIyNDI5NzMgICBp bnZhbGlkIGVuY29kZWQgT0lECiMrZW5kX2V4YW1wbGUKCgoKKiBNaXNjZWxsYW5l b3VzIG5vdGVzCgoqKiB2MyBmaW5nZXJwcmludHMKICAgRm9yIHBhY2tldCB2ZXJz aW9uIDMgd2UgY2FsY3VsYXRlIHRoZSBrZXlpZHMgdGhpcyB3YXk6CiAgICAtIFJT QSA6OiBMb3cgNjQgYml0cyBvZiBuCiAgICAtIEVMR0FNQUwgOjogQnVpbGQgYSB2 MyBwdWJrZXkgcGFja2V0ICh3aXRoIENUQiAweDk5KSBhbmQKICAgICAgICAgICAg ICAgICBjYWxjdWxhdGUgYSBSTUQxNjAgaGFzaCB2YWx1ZSBmcm9tIGl0LiBUaGlz IGlzIHVzZWQKICAgICAgICAgICAgICAgICBhcyB0aGUgZmluZ2VycHJpbnQgYW5k IHRoZSBsb3cgNjQgYml0cyBhcmUgdGhlIGtleWlkLgoKKiogU2ltcGxpZmllZCBy ZXZvY2F0aW9uIGNlcnRpZmljYXRlcwogIFJldm9jYXRpb24gY2VydGlmaWNhdGVz IGNvbnNpc3Qgb25seSBvZiB0aGUgc2lnbmF0dXJlIHBhY2tldDsKICAiLS1pbXBv cnQiIGtub3dzIGhvdyB0byBoYW5kbGUgdGhpcy4gIFRoZSByYXRpb25hbGUgYmVo aW5kIGl0IGlzIHRvCiAga2VlcCB0aGVtIHNtYWxsLgoKKiogRG9jdW1lbnRhdGlv biBvbiBIS1AgKHRoZSBodHRwIGtleXNlcnZlciBwcm90b2NvbCk6CgogICBBIG1p bmltYWxpc3RpYyBIVFRQIHNlcnZlciBvbiBwb3J0IDExMzcxIHJlY29nbml6ZXMg YSBHRVQgZm9yCiAgIC9wa3MvbG9va3VwLiAgVGhlIHN0YW5kYXJkIGh0dHAgVVJM IGVuY29kZWQgcXVlcnkgcGFyYW1ldGVycyBhcmUKICAgdGhpcyAoYWx3YXlzIGtl eT12YWx1ZSk6CgogICAtIG9wPWluZGV4IChsaWtlIHBncCAta3YpLCBvcD12aW5k ZXggKGxpa2UgcGdwIC1rdnYpIGFuZCBvcD1nZXQgKGxpa2UKICAgICBwZ3AgLWt4 YSkKCiAgIC0gc2VhcmNoPTxzdHJpbmdsaXN0Pi4gVGhpcyBpcyBhIGxpc3Qgb2Yg d29yZHMgdGhhdCBtdXN0IG9jY3VyIGluIHRoZSBrZXkuCiAgICAgVGhlIHdvcmRz IGFyZSBkZWxpbWl0ZWQgd2l0aCBzcGFjZSwgcG9pbnRzLCBAIGFuZCBzbyBvbi4g VGhlIGRlbGltaXRlcnMKICAgICBhcmUgbm90IHNlYXJjaGVkIGZvciBhbmQgdGhl IG9yZGVyIG9mIHRoZSB3b3JkcyBkb2Vzbid0IG1hdHRlciAoYnV0IHNlZQogICAg IG5leHQgb3B0aW9uKS4KCiAgIC0gZXhhY3Q9b24uIFRoaXMgc3dpdGNoIHRlbGxz IHRoZSBoa3Agc2VydmVyIHRvIG9ubHkgcmVwb3J0IGV4YWN0IG1hdGNoaW5nCiAg ICAga2V5cyBiYWNrLiBJbiB0aGlzIGNhc2UgdGhlIG9yZGVyIGFuZCB0aGUgImRl bGltaXRlcnMiIGFyZSBpbXBvcnRhbnQuCgogICAtIGZpbmdlcnByaW50PW9uLiBB bHNvIHJlcG9ydHMgdGhlIGZpbmdlcnByaW50cyB3aGVuIHVzZWQgd2l0aCAnaW5k ZXgnIG9yCiAgICAgJ3ZpbmRleCcKCiAgIFRoZSBrZXlzZXJ2ZXIgYWxzbyByZWNv Z25pemVzIGh0dHAtUE9TVHMgdG8gL3Brcy9hZGQuIFVzZSB0aGlzIHRvIHVwbG9h ZAogICBrZXlzLgoKCiAgIEEgYmV0dGVyIHdheSB0byBkbyB0aGlzIHdvdWxkIGJl IGEgcmVxdWVzdCBsaWtlOgoKICAgICAgL3Brcy9sb29rdXAvPGdudXBnX2Zvcm1h dGllcnRlX3VzZXJfaWQ+P29wPTxvcGVyYXRpb24+CgogICBUaGlzIGNhbiBiZSBp bXBsZW1lbnRlZCB1c2luZyBIdXJkJ3MgdHJhbnNsYXRvciBtZWNoYW5pc20uCiAg IEhvd2V2ZXIsIEkgdGhpbmsgdGhlIHdob2xlIGtleSBzZXJ2ZXIgc3R1ZmYgaGFz IHRvIGJlIHJlLXRob3VnaHQ7CiAgIEkgaGF2ZSBzb21lIGlkZWFzIGFuZCBwcm9i YWJseSBjcmVhdGUgYSB3aGl0ZSBwYXBlci4KKiogQWxnb3JpdGhtIG5hbWVzIGZv ciB0aGUgImtleWdlbi5hbGdvIiBwcm9tcHQKCiAgV2hlbiB1c2luZyBhIC0tY29t bWFuZC1mZCBjb250cm9sbGVkIGtleSBnZW5lcmF0aW9uIG9yICJhZGRrZXkiCiAg dGhlcmUgaXMgd2F5IHRvIGtub3cgdGhlIG51bWJlciB0byBlbnRlciBvbiB0aGUg ImtleWdlbi5hbGdvIgogIHByb21wdC4gIFRoZSBkaXNwbGF5ZWQgbnVtYmVycyBh cmUgZm9yIGh1bWFuIHJlY2VwdGlvbiBhbmQgbWF5CiAgY2hhbmdlIHdpdGggcmVs ZWFzZXMuICBUbyBwcm92aWRlIGEgc3RhYmxlIHdheSB0byBlbnRlciBhIGRlc2ly ZWQKICBhbGdvcml0aG0gY2hvaWNlIHRoZSBwcm9tcHQgYWxzbyBhY2NlcHRzIHBy ZWRlZmluZWQgbmFtZXMgZm9yIHRoZQogIGFsZ29yaXRobXMsIHdoaWNoIHdpbGwg bm90IGNoYW5nZS4KCiAgIHwgTmFtZSAgICB8IE5vIHwgRGVzY3JpcHRpb24gICAg ICAgICAgICAgICAgICAgICB8CiAgIHwtLS0tLS0tLS0rLS0tLSstLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS18CiAgIHwgcnNhK3JzYSB8ICAxIHwgUlNB IGFuZCBSU0EgKGRlZmF1bHQpICAgICAgICAgICB8CiAgIHwgZHNhK2VsZyB8ICAy IHwgRFNBIGFuZCBFbGdhbWFsICAgICAgICAgICAgICAgICB8CiAgIHwgZHNhICAg ICB8ICAzIHwgRFNBIChzaWduIG9ubHkpICAgICAgICAgICAgICAgICB8CiAgIHwg cnNhL3MgICB8ICA0IHwgUlNBIChzaWduIG9ubHkpICAgICAgICAgICAgICAgICB8 CiAgIHwgZWxnICAgICB8ICA1IHwgRWxnYW1hbCAoZW5jcnlwdCBvbmx5KSAgICAg ICAgICB8CiAgIHwgcnNhL2UgICB8ICA2IHwgUlNBIChlbmNyeXB0IG9ubHkpICAg ICAgICAgICAgICB8CiAgIHwgZHNhLyogICB8ICA3IHwgRFNBIChzZXQgeW91ciBv d24gY2FwYWJpbGl0aWVzKSB8CiAgIHwgcnNhLyogICB8ICA4IHwgUlNBIChzZXQg eW91ciBvd24gY2FwYWJpbGl0aWVzKSB8CiAgIHwgZWNjK2VjYyB8ICA5IHwgRUND IGFuZCBFQ0MgICAgICAgICAgICAgICAgICAgICB8CiAgIHwgZWNjL3MgICB8IDEw IHwgRUNDIChzaWduIG9ubHkpICAgICAgICAgICAgICAgICB8CiAgIHwgZWNjLyog ICB8IDExIHwgRUNDIChzZXQgeW91ciBvd24gY2FwYWJpbGl0aWVzKSB8CiAgIHwg ZWNjL2UgICB8IDEyIHwgRUNDIChlbmNyeXB0IG9ubHkpICAgICAgICAgICAgICB8 CiAgIHwga2V5Z3JpcCB8IDEzIHwgRXhpc3Rpbmcga2V5ICAgICAgICAgICAgICAg ICAgICB8CgogICBJZiBvbmUgb2YgdGhlICJmb28vKiIgbmFtZXMgYXJlIHVzZWQg YSAia2V5Z2VuLmZsYWdzIiBwcm9tcHQgbmVlZHMKICAgdG8gYmUgYW5zd2VyZWQg YXMgd2VsbC4gIEluc3RlYWQgb2YgdG9nZ2xpbmcgdGhlIHByZWRlZmluZWQgZmxh Z3MsCiAgIGl0IGlzIGFsc28gcG9zc2libGUgdG8gc2V0IHRoZW0gZGlyZWN0OiBV c2UgYSAiPSIgY2hhcmFjdGVyCiAgIGRpcmVjdGx5IGZvbGxvd2VkIGJ5IGEgY29t aW5hdGlvbiBvZiAiYSIgKGZvciBhdXRoZW50aWNhdGlvbiksICJzIgogICAoZm9y IHNpZ25pbmcpLCBvciAiYyIgKGZvciBjZXJ0aWZpY2F0aW9uKS4KQGMgQ29weXJp Z2h0IChDKSAxOTk4LCAxOTk5LCAyMDAwLCAyMDAxLCAyMDAyLCAyMDAzLCAyMDA0 LCAyMDA1LCAyMDA2LCAyMDA3LApAYyAgICAgICAgICAgICAgIDIwMDgsIDIwMDks IDIwMTAgRnJlZSBTb2Z0d2FyZSBGb3VuZGF0aW9uLCBJbmMuCkBjIFRoaXMgaXMg cGFydCBvZiB0aGUgR251UEcgbWFudWFsLgpAYyBGb3IgY29weWluZyBjb25kaXRp b25zLCBzZWUgdGhlIGZpbGUgZ251cGcudGV4aS4KCkBpbmNsdWRlIGRlZnMuaW5j CgpAbm9kZSBJbnZva2luZyBHUEcKQGNoYXB0ZXIgSW52b2tpbmcgR1BHCkBjaW5k ZXggR1BHIGNvbW1hbmQgb3B0aW9ucwpAY2luZGV4IGNvbW1hbmQgb3B0aW9ucwpA Y2luZGV4IG9wdGlvbnMsIEdQRyBjb21tYW5kCgpAbWFjcm8gZ3BnbmFtZQpncGcy CkBlbmQgbWFjcm8KQG1hbnBhZ2UgZ3BnMi4xCkBpZnNldCBtYW52ZXJiCi5CIGdw ZzIKXC0gT3BlblBHUCBlbmNyeXB0aW9uIGFuZCBzaWduaW5nIHRvb2wKQGVuZCBp ZnNldAoKQG1hbnNlY3Qgc3lub3BzaXMKQGlmc2V0IG1hbnZlcmIKLkIgIGdwZzIK LlJCIFsgXC1cLWhvbWVkaXIKLklSIGRpciBdCi5SQiBbIFwtXC1vcHRpb25zCi5J UiBmaWxlIF0KLlJJIFsgb3B0aW9ucyBdCi5JIGNvbW1hbmQKLlJJIFsgYXJncyBd CkBlbmQgaWZzZXQKCgpAbWFuc2VjdCBkZXNjcmlwdGlvbgpAY29tbWFuZHtAZ3Bn bmFtZX0gaXMgdGhlIE9wZW5QR1AgcGFydCBvZiB0aGUgR05VIFByaXZhY3kgR3Vh cmQgKEdudVBHKS4gSXQKaXMgYSB0b29sIHRvIHByb3ZpZGUgZGlnaXRhbCBlbmNy eXB0aW9uIGFuZCBzaWduaW5nIHNlcnZpY2VzIHVzaW5nIHRoZQpPcGVuUEdQIHN0 YW5kYXJkLiBAY29tbWFuZHtAZ3BnbmFtZX0gZmVhdHVyZXMgY29tcGxldGUga2V5 IG1hbmFnZW1lbnQgYW5kCmFsbCBiZWxscyBhbmQgd2hpc3RsZXMgeW91IGNhbiBl eHBlY3QgZnJvbSBhIGRlY2VudCBPcGVuUEdQCmltcGxlbWVudGF0aW9uLgoKSW4g Y29udHJhc3QgdG8gdGhlIHN0YW5kYWxvbmUgY29tbWFuZCBncGcgZnJvbSBHbnVQ RyAxLngsIHdoaWNoIGlzCm1pZ2h0IGJlIGJldHRlciBzdWl0ZWQgZm9yIHNlcnZl ciBhbmQgZW1iZWRkZWQgcGxhdGZvcm1zLCB0aGUgMi54CnZlcnNpb24gaXMgY29t bW9ubHkgaW5zdGFsbGVkIHVuZGVyIHRoZSBuYW1lIEBjb21tYW5ke2dwZzJ9IGFu ZAp0YXJnZXRlZCB0byB0aGUgZGVza3RvcCBhcyBpdCByZXF1aXJlcyBzZXZlcmFs IG90aGVyIG1vZHVsZXMgdG8gYmUKaW5zdGFsbGVkLgoKQG1hbnBhdXNlClRoZSBv bGQgMS54IHZlcnNpb24gd2lsbCBiZSBrZXB0IG1haW50YWluZWQgYW5kIGl0IGlz IHBvc3NpYmxlIHRvCmluc3RhbGwgYm90aCB2ZXJzaW9ucyBvbiB0aGUgc2FtZSBz eXN0ZW0uICBEb2N1bWVudGF0aW9uIGZvciB0aGUgb2xkCkdudVBHIDEueCBjb21t YW5kIGlzIGF2YWlsYWJsZSBhcyBhIG1hbiBwYWdlIGFuZCBhdApAaW5mb3JlZntU b3AsR251UEcgMSxncGd9LgoKQHhyZWZ7T3B0aW9uIEluZGV4fSwgZm9yIGFuIGlu ZGV4IHRvIEBjb21tYW5ke0BncGduYW1lfSdzIGNvbW1hbmRzIGFuZCBvcHRpb25z LgpAbWFuY29udAoKQG1lbnUKKiBHUEcgQ29tbWFuZHM6OiAgICAgICAgICAgIExp c3Qgb2YgYWxsIGNvbW1hbmRzLgoqIEdQRyBPcHRpb25zOjogICAgICAgICAgICAg TGlzdCBvZiBhbGwgb3B0aW9ucy4KKiBHUEcgQ29uZmlndXJhdGlvbjo6ICAgICAg IENvbmZpZ3VyYXRpb24gZmlsZXMuCiogR1BHIEV4YW1wbGVzOjogICAgICAgICAg ICBTb21lIHVzYWdlIGV4YW1wbGVzLgoKRGV2ZWxvcGVyIGluZm9ybWF0aW9uOgoq IFVuYXR0ZW5kZWQgVXNhZ2Ugb2YgR1BHOjogVXNpbmcgQGNvbW1hbmR7Z3BnfSBm cm9tIG90aGVyIHByb2dyYW1zLgpAZW5kIG1lbnUKCkBjICogR1BHIFByb3RvY29s OjogICAgICAgIFRoZSBwcm90b2NvbCB0aGUgc2VydmVyIG1vZGUgdXNlcy4KCgpA YyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBj ICoqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioKQGMg KioqKioqKioqKioqKioqICBDT01NQU5EUyAgKioqKioqKioqKioqKioqKgpAYyAq KioqKioqKioqKioqKiogICAgICAgICAgICAqKioqKioqKioqKioqKioqCkBjICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQG1hbnNl Y3QgY29tbWFuZHMKQG5vZGUgR1BHIENvbW1hbmRzCkBzZWN0aW9uIENvbW1hbmRz CgpDb21tYW5kcyBhcmUgbm90IGRpc3Rpbmd1aXNoZWQgZnJvbSBvcHRpb25zIGV4 Y2VwdCBmb3IgdGhlIGZhY3QgdGhhdApvbmx5IG9uZSBjb21tYW5kIGlzIGFsbG93 ZWQuCgpAY29tbWFuZHtAZ3BnbmFtZX0gbWF5IGJlIHJ1biB3aXRoIG5vIGNvbW1h bmRzLCBpbiB3aGljaCBjYXNlIGl0IHdpbGwKcGVyZm9ybSBhIHJlYXNvbmFibGUg YWN0aW9uIGRlcGVuZGluZyBvbiB0aGUgdHlwZSBvZiBmaWxlIGl0IGlzIGdpdmVu CmFzIGlucHV0IChhbiBlbmNyeXB0ZWQgbWVzc2FnZSBpcyBkZWNyeXB0ZWQsIGEg c2lnbmF0dXJlIGlzIHZlcmlmaWVkLAphIGZpbGUgY29udGFpbmluZyBrZXlzIGlz IGxpc3RlZCkuCgpQbGVhc2UgcmVtZW1iZXIgdGhhdCBvcHRpb24gYXMgd2VsbCBh cyBjb21tYW5kIHBhcnNpbmcgc3RvcHMgYXMgc29vbiBhcwphIG5vbi1vcHRpb24g aXMgZW5jb3VudGVyZWQsIHlvdSBjYW4gZXhwbGljaXRseSBzdG9wIHBhcnNpbmcg YnkKdXNpbmcgdGhlIHNwZWNpYWwgb3B0aW9uIEBvcHRpb257LS19LgoKCkBtZW51 CiogR2VuZXJhbCBHUEcgQ29tbWFuZHM6OiAgICAgICAgQ29tbWFuZHMgbm90IHNw ZWNpZmljIHRvIHRoZSBmdW5jdGlvbmFsaXR5LgoqIE9wZXJhdGlvbmFsIEdQRyBD b21tYW5kczo6ICAgIENvbW1hbmRzIHRvIHNlbGVjdCB0aGUgdHlwZSBvZiBvcGVy YXRpb24uCiogT3BlblBHUCBLZXkgTWFuYWdlbWVudDo6ICAgICAgSG93IHRvIG1h bmFnZSB5b3VyIGtleXMuCkBlbmQgbWVudQoKCkBjICoqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKiAgR0VORVJB TCBDT01NQU5EUyAgKioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCkBub2RlIEdlbmVyYWwgR1BHIENvbW1h bmRzCkBzdWJzZWN0aW9uIENvbW1hbmRzIG5vdCBzcGVjaWZpYyB0byB0aGUgZnVu Y3Rpb24KCkB0YWJsZSBAZ251cGd0YWJvcHQKQGl0ZW0gLS12ZXJzaW9uCkBvcGlu ZGV4IHZlcnNpb24KUHJpbnQgdGhlIHByb2dyYW0gdmVyc2lvbiBhbmQgbGljZW5z aW5nIGluZm9ybWF0aW9uLiAgTm90ZSB0aGF0IHlvdQpjYW5ub3QgYWJicmV2aWF0 ZSB0aGlzIGNvbW1hbmQuCgpAaXRlbSAtLWhlbHAKQGl0ZW14IC1oCkBvcGluZGV4 IGhlbHAKUHJpbnQgYSB1c2FnZSBtZXNzYWdlIHN1bW1hcml6aW5nIHRoZSBtb3N0 IHVzZWZ1bCBjb21tYW5kIGxpbmUgb3B0aW9ucy4KTm90ZSB0aGF0IHlvdSBjYW5u b3QgYWJicmV2aWF0ZSB0aGlzIGNvbW1hbmQuCgpAaXRlbSAtLXdhcnJhbnR5CkBv cGluZGV4IHdhcnJhbnR5ClByaW50IHdhcnJhbnR5IGluZm9ybWF0aW9uLgoKQGl0 ZW0gLS1kdW1wLW9wdGlvbnMKQG9waW5kZXggZHVtcC1vcHRpb25zClByaW50IGEg bGlzdCBvZiBhbGwgYXZhaWxhYmxlIG9wdGlvbnMgYW5kIGNvbW1hbmRzLiAgTm90 ZSB0aGF0IHlvdSBjYW5ub3QKYWJicmV2aWF0ZSB0aGlzIGNvbW1hbmQuCkBlbmQg dGFibGUKCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqCkBjICoqKioqKioqICBPUEVSQVRJT05BTCBDT01NQU5EUyAgKioqKioq KioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKgpAbm9kZSBPcGVyYXRpb25hbCBHUEcgQ29tbWFuZHMKQHN1YnNlY3Rpb24g Q29tbWFuZHMgdG8gc2VsZWN0IHRoZSB0eXBlIG9mIG9wZXJhdGlvbgoKCkB0YWJs ZSBAZ251cGd0YWJvcHQKCkBpdGVtIC0tc2lnbgpAaXRlbXggLXMKQG9waW5kZXgg c2lnbgpNYWtlIGEgc2lnbmF0dXJlLiBUaGlzIGNvbW1hbmQgbWF5IGJlIGNvbWJp bmVkIHdpdGggQG9wdGlvbnstLWVuY3J5cHR9Cihmb3IgYSBzaWduZWQgYW5kIGVu Y3J5cHRlZCBtZXNzYWdlKSwgQG9wdGlvbnstLXN5bW1ldHJpY30gKGZvciBhCnNp Z25lZCBhbmQgc3ltbWV0cmljYWxseSBlbmNyeXB0ZWQgbWVzc2FnZSksIG9yIEBv cHRpb257LS1lbmNyeXB0fSBhbmQKQG9wdGlvbnstLXN5bW1ldHJpY30gdG9nZXRo ZXIgKGZvciBhIHNpZ25lZCBtZXNzYWdlIHRoYXQgbWF5IGJlCmRlY3J5cHRlZCB2 aWEgYSBzZWNyZXQga2V5IG9yIGEgcGFzc3BocmFzZSkuICBUaGUga2V5IHRvIGJl IHVzZWQgZm9yCnNpZ25pbmcgaXMgY2hvc2VuIGJ5IGRlZmF1bHQgb3IgY2FuIGJl IHNldCB3aXRoIHRoZQpAb3B0aW9uey0tbG9jYWwtdXNlcn0gYW5kIEBvcHRpb257 LS1kZWZhdWx0LWtleX0gb3B0aW9ucy4KCkBpdGVtIC0tY2xlYXJzaWduCkBvcGlu ZGV4IGNsZWFyc2lnbgpNYWtlIGEgY2xlYXIgdGV4dCBzaWduYXR1cmUuICBUaGUg Y29udGVudCBpbiBhIGNsZWFyIHRleHQgc2lnbmF0dXJlIGlzCnJlYWRhYmxlIHdp dGhvdXQgYW55IHNwZWNpYWwgc29mdHdhcmUuIE9wZW5QR1Agc29mdHdhcmUgaXMg b25seSBuZWVkZWQKdG8gdmVyaWZ5IHRoZSBzaWduYXR1cmUuICBDbGVhciB0ZXh0 IHNpZ25hdHVyZXMgbWF5IG1vZGlmeSBlbmQtb2YtbGluZQp3aGl0ZXNwYWNlIGZv ciBwbGF0Zm9ybSBpbmRlcGVuZGVuY2UgYW5kIGFyZSBub3QgaW50ZW5kZWQgdG8g YmUKcmV2ZXJzaWJsZS4gIFRoZSBrZXkgdG8gYmUgdXNlZCBmb3Igc2lnbmluZyBp cyBjaG9zZW4gYnkgZGVmYXVsdCBvcgpjYW4gYmUgc2V0IHdpdGggdGhlIEBvcHRp b257LS1sb2NhbC11c2VyfSBhbmQgQG9wdGlvbnstLWRlZmF1bHQta2V5fQpvcHRp b25zLgoKCkBpdGVtIC0tZGV0YWNoLXNpZ24KQGl0ZW14IC1iCkBvcGluZGV4IGRl dGFjaC1zaWduCk1ha2UgYSBkZXRhY2hlZCBzaWduYXR1cmUuCgpAaXRlbSAtLWVu Y3J5cHQKQGl0ZW14IC1lCkBvcGluZGV4IGVuY3J5cHQKRW5jcnlwdCBkYXRhLiBU aGlzIG9wdGlvbiBtYXkgYmUgY29tYmluZWQgd2l0aCBAb3B0aW9uey0tc2lnbn0g KGZvciBhCnNpZ25lZCBhbmQgZW5jcnlwdGVkIG1lc3NhZ2UpLCBAb3B0aW9uey0t c3ltbWV0cmljfSAoZm9yIGEgbWVzc2FnZSB0aGF0Cm1heSBiZSBkZWNyeXB0ZWQg dmlhIGEgc2VjcmV0IGtleSBvciBhIHBhc3NwaHJhc2UpLCBvciBAb3B0aW9uey0t c2lnbn0KYW5kIEBvcHRpb257LS1zeW1tZXRyaWN9IHRvZ2V0aGVyIChmb3IgYSBz aWduZWQgbWVzc2FnZSB0aGF0IG1heSBiZQpkZWNyeXB0ZWQgdmlhIGEgc2VjcmV0 IGtleSBvciBhIHBhc3NwaHJhc2UpLgoKQGl0ZW0gLS1zeW1tZXRyaWMKQGl0ZW14 IC1jCkBvcGluZGV4IHN5bW1ldHJpYwpFbmNyeXB0IHdpdGggYSBzeW1tZXRyaWMg Y2lwaGVyIHVzaW5nIGEgcGFzc3BocmFzZS4gVGhlIGRlZmF1bHQKc3ltbWV0cmlj IGNpcGhlciB1c2VkIGlzIEB2YWx1ZXtHUEdTWU1FTkNBTEdPfSwgYnV0IG1heSBi ZSBjaG9zZW4gd2l0aCB0aGUKQG9wdGlvbnstLWNpcGhlci1hbGdvfSBvcHRpb24u IFRoaXMgb3B0aW9uIG1heSBiZSBjb21iaW5lZCB3aXRoCkBvcHRpb257LS1zaWdu fSAoZm9yIGEgc2lnbmVkIGFuZCBzeW1tZXRyaWNhbGx5IGVuY3J5cHRlZCBtZXNz YWdlKSwKQG9wdGlvbnstLWVuY3J5cHR9IChmb3IgYSBtZXNzYWdlIHRoYXQgbWF5 IGJlIGRlY3J5cHRlZCB2aWEgYSBzZWNyZXQga2V5Cm9yIGEgcGFzc3BocmFzZSks IG9yIEBvcHRpb257LS1zaWdufSBhbmQgQG9wdGlvbnstLWVuY3J5cHR9IHRvZ2V0 aGVyCihmb3IgYSBzaWduZWQgbWVzc2FnZSB0aGF0IG1heSBiZSBkZWNyeXB0ZWQg dmlhIGEgc2VjcmV0IGtleSBvciBhCnBhc3NwaHJhc2UpLgoKQGl0ZW0gLS1zdG9y ZQpAb3BpbmRleCBzdG9yZQpTdG9yZSBvbmx5IChtYWtlIGEgc2ltcGxlIFJGQzE5 OTEgbGl0ZXJhbCBkYXRhIHBhY2tldCkuCgpAaXRlbSAtLWRlY3J5cHQKQGl0ZW14 IC1kCkBvcGluZGV4IGRlY3J5cHQKRGVjcnlwdCB0aGUgZmlsZSBnaXZlbiBvbiB0 aGUgY29tbWFuZCBsaW5lIChvciBTVERJTiBpZiBubyBmaWxlCmlzIHNwZWNpZmll ZCkgYW5kIHdyaXRlIGl0IHRvIFNURE9VVCAob3IgdGhlIGZpbGUgc3BlY2lmaWVk IHdpdGgKQG9wdGlvbnstLW91dHB1dH0pLiBJZiB0aGUgZGVjcnlwdGVkIGZpbGUg aXMgc2lnbmVkLCB0aGUgc2lnbmF0dXJlIGlzIGFsc28KdmVyaWZpZWQuIFRoaXMg Y29tbWFuZCBkaWZmZXJzIGZyb20gdGhlIGRlZmF1bHQgb3BlcmF0aW9uLCBhcyBp dCBuZXZlcgp3cml0ZXMgdG8gdGhlIGZpbGVuYW1lIHdoaWNoIGlzIGluY2x1ZGVk IGluIHRoZSBmaWxlIGFuZCBpdCByZWplY3RzCmZpbGVzIHdoaWNoIGRvbid0IGJl Z2luIHdpdGggYW4gZW5jcnlwdGVkIG1lc3NhZ2UuCgpAaXRlbSAtLXZlcmlmeQpA b3BpbmRleCB2ZXJpZnkKQXNzdW1lIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50IGlz IGEgc2lnbmVkIGZpbGUgYW5kIHZlcmlmeSBpdCB3aXRob3V0CmdlbmVyYXRpbmcg YW55IG91dHB1dC4gIFdpdGggbm8gYXJndW1lbnRzLCB0aGUgc2lnbmF0dXJlIHBh Y2tldCBpcwpyZWFkIGZyb20gU1RESU4uICBJZiBvbmx5IGEgb25lIGFyZ3VtZW50 IGlzIGdpdmVuLCBpdCBpcyBleHBlY3RlZCB0bwpiZSBhIGNvbXBsZXRlIHNpZ25h dHVyZS4KCldpdGggbW9yZSB0aGFuIDEgYXJndW1lbnQsIHRoZSBmaXJzdCBzaG91 bGQgYmUgYSBkZXRhY2hlZCBzaWduYXR1cmUKYW5kIHRoZSByZW1haW5pbmcgZmls ZXMgYWtlIHVwIHRoZSB0aGUgc2lnbmVkIGRhdGEuIFRvIHJlYWQgdGhlIHNpZ25l ZApkYXRhIGZyb20gU1RESU4sIHVzZSBAc2FtcHstfSBhcyB0aGUgc2Vjb25kIGZp bGVuYW1lLiAgRm9yIHNlY3VyaXR5CnJlYXNvbnMgYSBkZXRhY2hlZCBzaWduYXR1 cmUgY2Fubm90IHJlYWQgdGhlIHNpZ25lZCBtYXRlcmlhbCBmcm9tClNURElOIHdp dGhvdXQgZGVub3RpbmcgaXQgaW4gdGhlIGFib3ZlIHdheS4KCk5vdGU6IElmIHRo ZSBvcHRpb24gQG9wdGlvbnstLWJhdGNofSBpcyBub3QgdXNlZCwgQGNvbW1hbmR7 QGdwZ25hbWV9Cm1heSBhc3N1bWUgdGhhdCBhIHNpbmdsZSBhcmd1bWVudCBpcyBh IGZpbGUgd2l0aCBhIGRldGFjaGVkIHNpZ25hdHVyZQphbmQgaXQgd2lsbCB0cnkg dG8gZmluZCBhIG1hdGNoaW5nIGRhdGEgZmlsZSBieSBzdHJpcHBpbmcgY2VydGFp bgpzdWZmaXhlcy4gIFVzaW5nIHRoaXMgaGlzdG9yaWNhbCBmZWF0dXJlIHRvIHZl cmlmeSBhIGRldGFjaGVkCnNpZ25hdHVyZSBpcyBzdHJvbmdseSBkaXNjb3VyYWdl ZDsgYWx3YXlzIHNwZWNpZnkgdGhlIGRhdGEgZmlsZSB0b28uCgpOb3RlOiBXaGVu IHZlcmlmeWluZyBhIGNsZWFydGV4dCBzaWduYXR1cmUsIEBjb21tYW5ke2dwZ30g dmVyaWZpZXMKb25seSB3aGF0IG1ha2VzIHVwIHRoZSBjbGVhcnRleHQgc2lnbmVk IGRhdGEgYW5kIG5vdCBhbnkgZXh0cmEgZGF0YQpvdXRzaWRlIG9mIHRoZSBjbGVh cnRleHQgc2lnbmF0dXJlIG9yIGhlYWRlciBsaW5lcyBmb2xsb3dpbmcgZGlyZWN0 bHkKdGhlIGRhc2ggbWFya2VyIGxpbmUuICBUaGUgb3B0aW9uIEBjb2Rley0tb3V0 cHV0fSBtYXkgYmUgdXNlZCB0byB3cml0ZQpvdXQgdGhlIGFjdHVhbCBzaWduZWQg ZGF0YTsgYnV0IHRoZXJlIGFyZSBvdGhlciBwaXRmYWxscyB3aXRoIHRoaXMKZm9y bWF0IGFzIHdlbGwuICBJdCBpcyBzdWdnZXN0ZWQgdG8gYXZvaWQgY2xlYXJ0ZXh0 IHNpZ25hdHVyZXMgaW4KZmF2b3Igb2YgZGV0YWNoZWQgc2lnbmF0dXJlcy4KCkBp dGVtIC0tbXVsdGlmaWxlCkBvcGluZGV4IG11bHRpZmlsZQpUaGlzIG1vZGlmaWVz IGNlcnRhaW4gb3RoZXIgY29tbWFuZHMgdG8gYWNjZXB0IG11bHRpcGxlIGZpbGVz IGZvcgpwcm9jZXNzaW5nIG9uIHRoZSBjb21tYW5kIGxpbmUgb3IgcmVhZCBmcm9t IFNURElOIHdpdGggZWFjaCBmaWxlbmFtZSBvbgphIHNlcGFyYXRlIGxpbmUuIFRo aXMgYWxsb3dzIGZvciBtYW55IGZpbGVzIHRvIGJlIHByb2Nlc3NlZCBhdApvbmNl LiBAb3B0aW9uey0tbXVsdGlmaWxlfSBtYXkgY3VycmVudGx5IGJlIHVzZWQgYWxv bmcgd2l0aApAb3B0aW9uey0tdmVyaWZ5fSwgQG9wdGlvbnstLWVuY3J5cHR9LCBh bmQgQG9wdGlvbnstLWRlY3J5cHR9LiBOb3RlIHRoYXQKQG9wdGlvbnstLW11bHRp ZmlsZSAtLXZlcmlmeX0gbWF5IG5vdCBiZSB1c2VkIHdpdGggZGV0YWNoZWQgc2ln bmF0dXJlcy4KCkBpdGVtIC0tdmVyaWZ5LWZpbGVzCkBvcGluZGV4IHZlcmlmeS1m aWxlcwpJZGVudGljYWwgdG8gQG9wdGlvbnstLW11bHRpZmlsZSAtLXZlcmlmeX0u CgpAaXRlbSAtLWVuY3J5cHQtZmlsZXMKQG9waW5kZXggZW5jcnlwdC1maWxlcwpJ ZGVudGljYWwgdG8gQG9wdGlvbnstLW11bHRpZmlsZSAtLWVuY3J5cHR9LgoKQGl0 ZW0gLS1kZWNyeXB0LWZpbGVzCkBvcGluZGV4IGRlY3J5cHQtZmlsZXMKSWRlbnRp Y2FsIHRvIEBvcHRpb257LS1tdWx0aWZpbGUgLS1kZWNyeXB0fS4KCkBpdGVtIC0t bGlzdC1rZXlzCkBpdGVteCAtawpAaXRlbXggLS1saXN0LXB1YmxpYy1rZXlzCkBv cGluZGV4IGxpc3Qta2V5cwpMaXN0IGFsbCBrZXlzIGZyb20gdGhlIHB1YmxpYyBr ZXlyaW5ncywgb3IganVzdCB0aGUga2V5cyBnaXZlbiBvbiB0aGUKY29tbWFuZCBs aW5lLgoKQXZvaWQgdXNpbmcgdGhlIG91dHB1dCBvZiB0aGlzIGNvbW1hbmQgaW4g c2NyaXB0cyBvciBvdGhlciBwcm9ncmFtcyBhcwppdCBpcyBsaWtlbHkgdG8gY2hh bmdlIGFzIEdudVBHIGNoYW5nZXMuIFNlZSBAb3B0aW9uey0td2l0aC1jb2xvbnN9 IGZvciBhCm1hY2hpbmUtcGFyc2VhYmxlIGtleSBsaXN0aW5nIGNvbW1hbmQgdGhh dCBpcyBhcHByb3ByaWF0ZSBmb3IgdXNlIGluCnNjcmlwdHMgYW5kIG90aGVyIHBy b2dyYW1zLgoKQGl0ZW0gLS1saXN0LXNlY3JldC1rZXlzCkBpdGVteCAtSwpAb3Bp bmRleCBsaXN0LXNlY3JldC1rZXlzCkxpc3QgYWxsIGtleXMgZnJvbSB0aGUgc2Vj cmV0IGtleXJpbmdzLCBvciBqdXN0IHRoZSBvbmVzIGdpdmVuIG9uIHRoZQpjb21t YW5kIGxpbmUuIEEgQGNvZGV7I30gYWZ0ZXIgdGhlIGxldHRlcnMgQGNvZGV7c2Vj fSBtZWFucyB0aGF0IHRoZQpzZWNyZXQga2V5IGlzIG5vdCB1c2FibGUgKGZvciBl eGFtcGxlLCBpZiBpdCB3YXMgY3JlYXRlZCB2aWEKQG9wdGlvbnstLWV4cG9ydC1z ZWNyZXQtc3Via2V5c30pLgoKQGl0ZW0gLS1saXN0LXNpZ3MKQG9waW5kZXggbGlz dC1zaWdzClNhbWUgYXMgQG9wdGlvbnstLWxpc3Qta2V5c30sIGJ1dCB0aGUgc2ln bmF0dXJlcyBhcmUgbGlzdGVkIHRvby4KVGhpcyBjb21tYW5kIGhhcyB0aGUgc2Ft ZSBlZmZlY3QgYXMKdXNpbmcgQG9wdGlvbnstLWxpc3Qta2V5c30gd2l0aCBAb3B0 aW9uey0td2l0aC1zaWctbGlzdH0uCgpGb3IgZWFjaCBzaWduYXR1cmUgbGlzdGVk LCB0aGVyZSBhcmUgc2V2ZXJhbCBmbGFncyBpbiBiZXR3ZWVuIHRoZSAic2lnIgp0 YWcgYW5kIGtleWlkLiBUaGVzZSBmbGFncyBnaXZlIGFkZGl0aW9uYWwgaW5mb3Jt YXRpb24gYWJvdXQgZWFjaApzaWduYXR1cmUuIEZyb20gbGVmdCB0byByaWdodCwg dGhleSBhcmUgdGhlIG51bWJlcnMgMS0zIGZvciBjZXJ0aWZpY2F0ZQpjaGVjayBs ZXZlbCAoc2VlIEBvcHRpb257LS1hc2stY2VydC1sZXZlbH0pLCAiTCIgZm9yIGEg bG9jYWwgb3IKbm9uLWV4cG9ydGFibGUgc2lnbmF0dXJlIChzZWUgQG9wdGlvbnst LWxzaWduLWtleX0pLCAiUiIgZm9yIGEKbm9uUmV2b2NhYmxlIHNpZ25hdHVyZSAo c2VlIHRoZSBAb3B0aW9uey0tZWRpdC1rZXl9IGNvbW1hbmQgIm5yc2lnbiIpLAoi UCIgZm9yIGEgc2lnbmF0dXJlIHRoYXQgY29udGFpbnMgYSBwb2xpY3kgVVJMIChz ZWUKQG9wdGlvbnstLWNlcnQtcG9saWN5LXVybH0pLCAiTiIgZm9yIGEgc2lnbmF0 dXJlIHRoYXQgY29udGFpbnMgYQpub3RhdGlvbiAoc2VlIEBvcHRpb257LS1jZXJ0 LW5vdGF0aW9ufSksICJYIiBmb3IgYW4gZVhwaXJlZCBzaWduYXR1cmUKKHNlZSBA b3B0aW9uey0tYXNrLWNlcnQtZXhwaXJlfSksIGFuZCB0aGUgbnVtYmVycyAxLTkg b3IgIlQiIGZvciAxMCBhbmQKYWJvdmUgdG8gaW5kaWNhdGUgdHJ1c3Qgc2lnbmF0 dXJlIGxldmVscyAoc2VlIHRoZSBAb3B0aW9uey0tZWRpdC1rZXl9CmNvbW1hbmQg InRzaWduIikuCgpAaXRlbSAtLWNoZWNrLXNpZ3MKQG9waW5kZXggY2hlY2stc2ln cwpTYW1lIGFzIEBvcHRpb257LS1saXN0LXNpZ3N9LCBidXQgdGhlIHNpZ25hdHVy ZXMgYXJlIHZlcmlmaWVkLiAgTm90ZQp0aGF0IGZvciBwZXJmb3JtYW5jZSByZWFz b25zIHRoZSByZXZvY2F0aW9uIHN0YXR1cyBvZiBhIHNpZ25pbmcga2V5IGlzCm5v dCBzaG93bi4KVGhpcyBjb21tYW5kIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMKdXNp bmcgQG9wdGlvbnstLWxpc3Qta2V5c30gd2l0aCBAb3B0aW9uey0td2l0aC1zaWct Y2hlY2t9LgoKVGhlIHN0YXR1cyBvZiB0aGUgdmVyaWZpY2F0aW9uIGlzIGluZGlj YXRlZCBieSBhIGZsYWcgZGlyZWN0bHkgZm9sbG93aW5nCnRoZSAic2lnIiB0YWcg KGFuZCB0aHVzIGJlZm9yZSB0aGUgZmxhZ3MgZGVzY3JpYmVkIGFib3ZlIGZvcgpA b3B0aW9uey0tbGlzdC1zaWdzfSkuICBBICIhIiBpbmRpY2F0ZXMgdGhhdCB0aGUg c2lnbmF0dXJlIGhhcyBiZWVuCnN1Y2Nlc3NmdWxseSB2ZXJpZmllZCwgYSAiLSIg ZGVub3RlcyBhIGJhZCBzaWduYXR1cmUgYW5kIGEgIiUiIGlzIHVzZWQKaWYgYW4g ZXJyb3Igb2NjdXJyZWQgd2hpbGUgY2hlY2tpbmcgdGhlIHNpZ25hdHVyZSAoZS5n LiBhIG5vbiBzdXBwb3J0ZWQKYWxnb3JpdGhtKS4KCkBpdGVtIC0tbG9jYXRlLWtl eXMKQG9waW5kZXggbG9jYXRlLWtleXMKTG9jYXRlIHRoZSBrZXlzIGdpdmVuIGFz IGFyZ3VtZW50cy4gIFRoaXMgY29tbWFuZCBiYXNpY2FsbHkgdXNlcyB0aGUKc2Ft ZSBhbGdvcml0aG0gYXMgdXNlZCB3aGVuIGxvY2F0aW5nIGtleXMgZm9yIGVuY3J5 cHRpb24gb3Igc2lnbmluZyBhbmQKbWF5IHRodXMgYmUgdXNlZCB0byBzZWUgd2hh dCBrZXlzIEBjb21tYW5ke0BncGduYW1lfSBtaWdodCB1c2UuICBJbgpwYXJ0aWN1 bGFyIGV4dGVybmFsIG1ldGhvZHMgYXMgZGVmaW5lZCBieSBAb3B0aW9uey0tYXV0 by1rZXktbG9jYXRlfSBtYXkKYmUgdXNlZCB0byBsb2NhdGUgYSBrZXkuICBPbmx5 IHB1YmxpYyBrZXlzIGFyZSBsaXN0ZWQuCgpAaXRlbSAtLWZpbmdlcnByaW50CkBv cGluZGV4IGZpbmdlcnByaW50Ckxpc3QgYWxsIGtleXMgKG9yIHRoZSBzcGVjaWZp ZWQgb25lcykgYWxvbmcgd2l0aCB0aGVpcgpmaW5nZXJwcmludHMuIFRoaXMgaXMg dGhlIHNhbWUgb3V0cHV0IGFzIEBvcHRpb257LS1saXN0LWtleXN9IGJ1dCB3aXRo CnRoZSBhZGRpdGlvbmFsIG91dHB1dCBvZiBhIGxpbmUgd2l0aCB0aGUgZmluZ2Vy cHJpbnQuIE1heSBhbHNvIGJlCmNvbWJpbmVkIHdpdGggQG9wdGlvbnstLWxpc3Qt c2lnc30gb3IgQG9wdGlvbnstLWNoZWNrLXNpZ3N9LiAgSWYgdGhpcwpjb21tYW5k IGlzIGdpdmVuIHR3aWNlLCB0aGUgZmluZ2VycHJpbnRzIG9mIGFsbCBzZWNvbmRh cnkga2V5cyBhcmUKbGlzdGVkIHRvby4KCkBpdGVtIC0tbGlzdC1wYWNrZXRzCkBv cGluZGV4IGxpc3QtcGFja2V0cwpMaXN0IG9ubHkgdGhlIHNlcXVlbmNlIG9mIHBh Y2tldHMuIFRoaXMgaXMgbWFpbmx5IHVzZWZ1bCBmb3IKZGVidWdnaW5nLiAgV2hl biB1c2VkIHdpdGggb3B0aW9uIEBvcHRpb257LS12ZXJib3NlfSB0aGUgYWN0dWFs IE1QSQp2YWx1ZXMgYXJlIGR1bXBlZCBhbmQgbm90IG9ubHkgdGhlaXIgbGVuZ3Ro cy4KCgpAaXRlbSAtLWNhcmQtZWRpdApAb3BpbmRleCBjYXJkLWVkaXQKUHJlc2Vu dCBhIG1lbnUgdG8gd29yayB3aXRoIGEgc21hcnRjYXJkLiBUaGUgc3ViY29tbWFu ZCAiaGVscCIgcHJvdmlkZXMKYW4gb3ZlcnZpZXcgb24gYXZhaWxhYmxlIGNvbW1h bmRzLiBGb3IgYSBkZXRhaWxlZCBkZXNjcmlwdGlvbiwgcGxlYXNlCnNlZSB0aGUg Q2FyZCBIT1dUTyBhdApodHRwczovL2dudXBnLm9yZy9kb2N1bWVudGF0aW9uL2hv d3Rvcy5odG1sI0dudVBHLWNhcmRIT1dUTyAuCgpAaXRlbSAtLWNhcmQtc3RhdHVz CkBvcGluZGV4IGNhcmQtc3RhdHVzClNob3cgdGhlIGNvbnRlbnQgb2YgdGhlIHNt YXJ0IGNhcmQuCgpAaXRlbSAtLWNoYW5nZS1waW4KQG9waW5kZXggY2hhbmdlLXBp bgpQcmVzZW50IGEgbWVudSB0byBhbGxvdyBjaGFuZ2luZyB0aGUgUElOIG9mIGEg c21hcnRjYXJkLiBUaGlzCmZ1bmN0aW9uYWxpdHkgaXMgYWxzbyBhdmFpbGFibGUg YXMgdGhlIHN1YmNvbW1hbmQgInBhc3N3ZCIgd2l0aCB0aGUKQG9wdGlvbnstLWNh cmQtZWRpdH0gY29tbWFuZC4KCkBpdGVtIC0tZGVsZXRlLWtleXMgQGNvZGV7bmFt ZX0KQGl0ZW14IC0tZGVsZXRlLWtleXMgQGNvZGV7bmFtZX0KUmVtb3ZlIGtleSBm cm9tIHRoZSBwdWJsaWMga2V5cmluZy4gSW4gYmF0Y2ggbW9kZSBlaXRoZXIgQG9w dGlvbnstLXllc30gaXMKcmVxdWlyZWQgb3IgdGhlIGtleSBtdXN0IGJlIHNwZWNp ZmllZCBieSBmaW5nZXJwcmludC4gVGhpcyBpcyBhCnNhZmVndWFyZCBhZ2FpbnN0 IGFjY2lkZW50YWwgZGVsZXRpb24gb2YgbXVsdGlwbGUga2V5cy4KCkBpdGVtIC0t ZGVsZXRlLXNlY3JldC1rZXlzIEBjb2Rle25hbWV9CkBvcGluZGV4IGRlbGV0ZS1z ZWNyZXQta2V5cwpSZW1vdmUga2V5IGZyb20gdGhlIHNlY3JldCBrZXlyaW5nLiBJ biBiYXRjaCBtb2RlIHRoZSBrZXkKbXVzdCBiZSBzcGVjaWZpZWQgYnkgZmluZ2Vy cHJpbnQuCgpAaXRlbSAtLWRlbGV0ZS1zZWNyZXQtYW5kLXB1YmxpYy1rZXkgQGNv ZGV7bmFtZX0KQG9waW5kZXggZGVsZXRlLXNlY3JldC1hbmQtcHVibGljLWtleQpT YW1lIGFzIEBvcHRpb257LS1kZWxldGUta2V5fSwgYnV0IGlmIGEgc2VjcmV0IGtl eSBleGlzdHMsIGl0IHdpbGwgYmUKcmVtb3ZlZCBmaXJzdC4gSW4gYmF0Y2ggbW9k ZSB0aGUga2V5IG11c3QgYmUgc3BlY2lmaWVkIGJ5IGZpbmdlcnByaW50LgoKQGl0 ZW0gLS1leHBvcnQKQG9waW5kZXggZXhwb3J0CkVpdGhlciBleHBvcnQgYWxsIGtl eXMgZnJvbSBhbGwga2V5cmluZ3MgKGRlZmF1bHQga2V5cmluZ3MgYW5kIHRob3Nl CnJlZ2lzdGVyZWQgdmlhIG9wdGlvbiBAb3B0aW9uey0ta2V5cmluZ30pLCBvciBp ZiBhdCBsZWFzdCBvbmUgbmFtZSBpcyBnaXZlbiwKdGhvc2Ugb2YgdGhlIGdpdmVu IG5hbWUuIFRoZSBleHBvcnRlZCBrZXlzIGFyZSB3cml0dGVuIHRvIFNURE9VVCBv ciB0byB0aGUKZmlsZSBnaXZlbiB3aXRoIG9wdGlvbiBAb3B0aW9uey0tb3V0cHV0 fS4gIFVzZSB0b2dldGhlciB3aXRoCkBvcHRpb257LS1hcm1vcn0gdG8gbWFpbCB0 aG9zZSBrZXlzLgoKQGl0ZW0gLS1zZW5kLWtleXMgQGNvZGV7a2V5IElEc30KQG9w aW5kZXggc2VuZC1rZXlzClNpbWlsYXIgdG8gQG9wdGlvbnstLWV4cG9ydH0gYnV0 IHNlbmRzIHRoZSBrZXlzIHRvIGEga2V5c2VydmVyLgpGaW5nZXJwcmludHMgbWF5 IGJlIHVzZWQgaW5zdGVhZCBvZiBrZXkgSURzLiBPcHRpb24gQG9wdGlvbnstLWtl eXNlcnZlcn0KbXVzdCBiZSB1c2VkIHRvIGdpdmUgdGhlIG5hbWUgb2YgdGhpcyBr ZXlzZXJ2ZXIuIERvbid0IHNlbmQgeW91cgpjb21wbGV0ZSBrZXlyaW5nIHRvIGEg a2V5c2VydmVyIC0tLSBzZWxlY3Qgb25seSB0aG9zZSBrZXlzIHdoaWNoIGFyZSBu ZXcKb3IgY2hhbmdlZCBieSB5b3UuICBJZiBubyBrZXkgSURzIGFyZSBnaXZlbiwg QGNvbW1hbmR7Z3BnfSBkb2VzIG5vdGhpbmcuCgpAaXRlbSAtLWV4cG9ydC1zZWNy ZXQta2V5cwpAaXRlbXggLS1leHBvcnQtc2VjcmV0LXN1YmtleXMKQG9waW5kZXgg ZXhwb3J0LXNlY3JldC1rZXlzCkBvcGluZGV4IGV4cG9ydC1zZWNyZXQtc3Via2V5 cwpTYW1lIGFzIEBvcHRpb257LS1leHBvcnR9LCBidXQgZXhwb3J0cyB0aGUgc2Vj cmV0IGtleXMgaW5zdGVhZC4gIFRoZQpleHBvcnRlZCBrZXlzIGFyZSB3cml0dGVu IHRvIFNURE9VVCBvciB0byB0aGUgZmlsZSBnaXZlbiB3aXRoIG9wdGlvbgpAb3B0 aW9uey0tb3V0cHV0fS4gIFRoaXMgY29tbWFuZCBpcyBvZnRlbiB1c2VkIGFsb25n IHdpdGggdGhlIG9wdGlvbgpAb3B0aW9uey0tYXJtb3J9IHRvIGFsbG93IGVhc3kg cHJpbnRpbmcgb2YgdGhlIGtleSBmb3IgcGFwZXIgYmFja3VwOwpob3dldmVyIHRo ZSBleHRlcm5hbCB0b29sIEBjb21tYW5ke3BhcGVya2V5fSBkb2VzIGEgYmV0dGVy IGpvYiBmb3IKY3JlYXRpbmcgYmFja3VwcyBvbiBwYXBlci4gIE5vdGUgdGhhdCBl eHBvcnRpbmcgYSBzZWNyZXQga2V5IGNhbiBiZSBhCnNlY3VyaXR5IHJpc2sgaWYg dGhlIGV4cG9ydGVkIGtleXMgYXJlIHNlbmQgb3ZlciBhbiBpbnNlY3VyZSBjaGFu bmVsLgoKVGhlIHNlY29uZCBmb3JtIG9mIHRoZSBjb21tYW5kIGhhcyB0aGUgc3Bl Y2lhbCBwcm9wZXJ0eSB0byByZW5kZXIgdGhlCnNlY3JldCBwYXJ0IG9mIHRoZSBw cmltYXJ5IGtleSB1c2VsZXNzOyB0aGlzIGlzIGEgR05VIGV4dGVuc2lvbiB0bwpP cGVuUEdQIGFuZCBvdGhlciBpbXBsZW1lbnRhdGlvbnMgY2FuIG5vdCBiZSBleHBl Y3RlZCB0byBzdWNjZXNzZnVsbHkKaW1wb3J0IHN1Y2ggYSBrZXkuICBJdHMgaW50 ZW5kZWQgdXNlIGlzIHRvIGdlbmVyYXRlZCBhIGZ1bGwga2V5IHdpdGgKYW4gYWRk aXRpb25hbCBzaWduaW5nIHN1YmtleSBvbiBhIGRlZGljYXRlZCBtYWNoaW5lIGFu ZCB0aGVuIHVzaW5nCnRoaXMgY29tbWFuZCB0byBleHBvcnQgdGhlIGtleSB3aXRo b3V0IHRoZSBwcmltYXJ5IGtleSB0byB0aGUgbWFpbgptYWNoaW5lLgoKR251UEcg bWF5IGFzayB5b3UgdG8gZW50ZXIgdGhlIHBhc3NwaHJhc2UgZm9yIHRoZSBrZXku ICBUaGlzIGlzCnJlcXVpcmVkIGJlY2F1c2UgdGhlIGludGVybmFsIHByb3RlY3Rp b24gbWV0aG9kIG9mIHRoZSBzZWNyZXQga2V5IGlzCmRpZmZlcmVudCBmcm9tIHRo ZSBvbmUgc3BlY2lmaWVkIGJ5IHRoZSBPcGVuUEdQIHByb3RvY29sLgoKQGl0ZW0g LS1leHBvcnQtc3NoLWtleQpAb3BpbmRleCBleHBvcnQtc3NoLWtleQpUaGlzIGNv bW1hbmQgaXMgdXNlZCB0byBleHBvcnQgYSBrZXkgaW4gdGhlIE9wZW5TU0ggcHVi bGljIGtleSBmb3JtYXQuCkl0IHJlcXVpcmVzIHRoZSBzcGVjaWZpY2F0aW9uIG9m IG9uZSBrZXkgYnkgdGhlIHVzdWFsIG1lYW5zIGFuZApleHBvcnRzIHRoZSBsYXRl c3QgdmFsaWQgc3Via2V5IHdoaWNoIGhhcyBhbiBhdXRoZW50aWNhdGlvbiBjYXBh YmlsaXR5CnRvIFNURE9VVCBvciB0byB0aGUgZmlsZSBnaXZlbiB3aXRoIG9wdGlv biBAb3B0aW9uey0tb3V0cHV0fS4gIFRoYXQKb3V0cHV0IGNhbiBkaXJlY3RseSBi ZSBhZGRlZCB0byBzc2gncyBAZmlsZXthdXRob3JpemVkX2tleX0gZmlsZS4KCkJ5 IHNwZWNpZnlpbmcgdGhlIGtleSB0byBleHBvcnQgdXNpbmcgYSBrZXkgSUQgb3Ig YSBmaW5nZXJwcmludApzdWZmaXhlZCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsg KCEpLCBhIHNwZWNpZmljIHN1YmtleSBvciB0aGUKcHJpbWFyeSBrZXkgY2FuIGJl IGV4cG9ydGVkLiAgVGhpcyBkb2VzIG5vdCBldmVuIHJlcXVpcmUgdGhhdCB0aGUg a2V5CmhhcyB0aGUgYXV0aGVudGljYXRpb24gY2FwYWJpbGl0eSBmbGFnIHNldC4g IFRvIHZpZXcgdGhlIGNhcGFiaWxpdHkKZmxhZ3Mgb2YgYSBrZXkgdXNlIEBjb2Rl ey0tbGlzdC1vcHRpb25zIHNob3ctdXNhZ2V9IGFsb25nIHdpdGggYSBrZXkKbGlz dGluZyBjb21tYW5kLgoKQGl0ZW0gLS1pbXBvcnQKQGl0ZW14IC0tZmFzdC1pbXBv cnQKQG9waW5kZXggaW1wb3J0CkltcG9ydC9tZXJnZSBrZXlzLiBUaGlzIGFkZHMg dGhlIGdpdmVuIGtleXMgdG8gdGhlCmtleXJpbmcuIFRoZSBmYXN0IHZlcnNpb24g aXMgY3VycmVudGx5IGp1c3QgYSBzeW5vbnltLgoKVGhlcmUgYXJlIGEgZmV3IG90 aGVyIG9wdGlvbnMgd2hpY2ggY29udHJvbCBob3cgdGhpcyBjb21tYW5kIHdvcmtz LgpNb3N0IG5vdGFibGUgaGVyZSBpcyB0aGUgQG9wdGlvbnstLWltcG9ydC1vcHRp b25zIG1lcmdlLW9ubHl9IG9wdGlvbgp3aGljaCBkb2VzIG5vdCBpbnNlcnQgbmV3 IGtleXMgYnV0IGRvZXMgb25seSB0aGUgbWVyZ2luZyBvZiBuZXcKc2lnbmF0dXJl cywgdXNlci1JRHMgYW5kIHN1YmtleXMuCgpAaXRlbSAtLXJlY3Yta2V5cyBAY29k ZXtrZXkgSURzfQpAb3BpbmRleCByZWN2LWtleXMKSW1wb3J0IHRoZSBrZXlzIHdp dGggdGhlIGdpdmVuIGtleSBJRHMgZnJvbSBhIGtleXNlcnZlci4gT3B0aW9uCkBv cHRpb257LS1rZXlzZXJ2ZXJ9IG11c3QgYmUgdXNlZCB0byBnaXZlIHRoZSBuYW1l IG9mIHRoaXMga2V5c2VydmVyLgoKQGl0ZW0gLS1yZWZyZXNoLWtleXMKQG9waW5k ZXggcmVmcmVzaC1rZXlzClJlcXVlc3QgdXBkYXRlcyBmcm9tIGEga2V5c2VydmVy IGZvciBrZXlzIHRoYXQgYWxyZWFkeSBleGlzdCBvbiB0aGUKbG9jYWwga2V5cmlu Zy4gVGhpcyBpcyB1c2VmdWwgZm9yIHVwZGF0aW5nIGEga2V5IHdpdGggdGhlIGxh dGVzdApzaWduYXR1cmVzLCB1c2VyIElEcywgZXRjLiBDYWxsaW5nIHRoaXMgd2l0 aCBubyBhcmd1bWVudHMgd2lsbCByZWZyZXNoCnRoZSBlbnRpcmUga2V5cmluZy4g T3B0aW9uIEBvcHRpb257LS1rZXlzZXJ2ZXJ9IG11c3QgYmUgdXNlZCB0byBnaXZl IHRoZQpuYW1lIG9mIHRoZSBrZXlzZXJ2ZXIgZm9yIGFsbCBrZXlzIHRoYXQgZG8g bm90IGhhdmUgcHJlZmVycmVkIGtleXNlcnZlcnMKc2V0IChzZWUgQG9wdGlvbnst LWtleXNlcnZlci1vcHRpb25zIGhvbm9yLWtleXNlcnZlci11cmx9KS4KCkBpdGVt IC0tc2VhcmNoLWtleXMgQGNvZGV7bmFtZXN9CkBvcGluZGV4IHNlYXJjaC1rZXlz ClNlYXJjaCB0aGUga2V5c2VydmVyIGZvciB0aGUgZ2l2ZW4gbmFtZXMuIE11bHRp cGxlIG5hbWVzIGdpdmVuIGhlcmUgd2lsbApiZSBqb2luZWQgdG9nZXRoZXIgdG8g Y3JlYXRlIHRoZSBzZWFyY2ggc3RyaW5nIGZvciB0aGUga2V5c2VydmVyLgpPcHRp b24gQG9wdGlvbnstLWtleXNlcnZlcn0gbXVzdCBiZSB1c2VkIHRvIGdpdmUgdGhl IG5hbWUgb2YgdGhpcwprZXlzZXJ2ZXIuICBLZXlzZXJ2ZXJzIHRoYXQgc3VwcG9y dCBkaWZmZXJlbnQgc2VhcmNoIG1ldGhvZHMgYWxsb3cgdXNpbmcKdGhlIHN5bnRh eCBzcGVjaWZpZWQgaW4gIkhvdyB0byBzcGVjaWZ5IGEgdXNlciBJRCIgYmVsb3cu IE5vdGUgdGhhdApkaWZmZXJlbnQga2V5c2VydmVyIHR5cGVzIHN1cHBvcnQgZGlm ZmVyZW50IHNlYXJjaCBtZXRob2RzLiBDdXJyZW50bHkKb25seSBMREFQIHN1cHBv cnRzIHRoZW0gYWxsLgoKQGl0ZW0gLS1mZXRjaC1rZXlzIEBjb2Rle1VSSXN9CkBv cGluZGV4IGZldGNoLWtleXMKUmV0cmlldmUga2V5cyBsb2NhdGVkIGF0IHRoZSBz cGVjaWZpZWQgVVJJcy4gTm90ZSB0aGF0IGRpZmZlcmVudAppbnN0YWxsYXRpb25z IG9mIEdudVBHIG1heSBzdXBwb3J0IGRpZmZlcmVudCBwcm90b2NvbHMgKEhUVFAs IEZUUCwKTERBUCwgZXRjLikKCkBpdGVtIC0tdXBkYXRlLXRydXN0ZGIKQG9waW5k ZXggdXBkYXRlLXRydXN0ZGIKRG8gdHJ1c3QgZGF0YWJhc2UgbWFpbnRlbmFuY2Uu IFRoaXMgY29tbWFuZCBpdGVyYXRlcyBvdmVyIGFsbCBrZXlzIGFuZApidWlsZHMg dGhlIFdlYiBvZiBUcnVzdC4gVGhpcyBpcyBhbiBpbnRlcmFjdGl2ZSBjb21tYW5k IGJlY2F1c2UgaXQgbWF5CmhhdmUgdG8gYXNrIGZvciB0aGUgIm93bmVydHJ1c3Qi IHZhbHVlcyBmb3Iga2V5cy4gVGhlIHVzZXIgaGFzIHRvIGdpdmUKYW4gZXN0aW1h dGlvbiBvZiBob3cgZmFyIHNoZSB0cnVzdHMgdGhlIG93bmVyIG9mIHRoZSBkaXNw bGF5ZWQga2V5IHRvCmNvcnJlY3RseSBjZXJ0aWZ5IChzaWduKSBvdGhlciBrZXlz LiBHbnVQRyBvbmx5IGFza3MgZm9yIHRoZSBvd25lcnRydXN0CnZhbHVlIGlmIGl0 IGhhcyBub3QgeWV0IGJlZW4gYXNzaWduZWQgdG8gYSBrZXkuIFVzaW5nIHRoZQpA b3B0aW9uey0tZWRpdC1rZXl9IG1lbnUsIHRoZSBhc3NpZ25lZCB2YWx1ZSBjYW4g YmUgY2hhbmdlZCBhdCBhbnkgdGltZS4KCkBpdGVtIC0tY2hlY2stdHJ1c3RkYgpA b3BpbmRleCBjaGVjay10cnVzdGRiCkRvIHRydXN0IGRhdGFiYXNlIG1haW50ZW5h bmNlIHdpdGhvdXQgdXNlciBpbnRlcmFjdGlvbi4gRnJvbSB0aW1lIHRvCnRpbWUg dGhlIHRydXN0IGRhdGFiYXNlIG11c3QgYmUgdXBkYXRlZCBzbyB0aGF0IGV4cGly ZWQga2V5cyBvcgpzaWduYXR1cmVzIGFuZCB0aGUgcmVzdWx0aW5nIGNoYW5nZXMg aW4gdGhlIFdlYiBvZiBUcnVzdCBjYW4gYmUKdHJhY2tlZC4gTm9ybWFsbHksIEdu dVBHIHdpbGwgY2FsY3VsYXRlIHdoZW4gdGhpcyBpcyByZXF1aXJlZCBhbmQgZG8g aXQKYXV0b21hdGljYWxseSB1bmxlc3MgQG9wdGlvbnstLW5vLWF1dG8tY2hlY2st dHJ1c3RkYn0gaXMgc2V0LiBUaGlzCmNvbW1hbmQgY2FuIGJlIHVzZWQgdG8gZm9y Y2UgYSB0cnVzdCBkYXRhYmFzZSBjaGVjayBhdCBhbnkgdGltZS4gVGhlCnByb2Nl c3NpbmcgaXMgaWRlbnRpY2FsIHRvIHRoYXQgb2YgQG9wdGlvbnstLXVwZGF0ZS10 cnVzdGRifSBidXQgaXQKc2tpcHMga2V5cyB3aXRoIGEgbm90IHlldCBkZWZpbmVk ICJvd25lcnRydXN0Ii4KCkZvciB1c2Ugd2l0aCBjcm9uIGpvYnMsIHRoaXMgY29t bWFuZCBjYW4gYmUgdXNlZCB0b2dldGhlciB3aXRoCkBvcHRpb257LS1iYXRjaH0g aW4gd2hpY2ggY2FzZSB0aGUgdHJ1c3QgZGF0YWJhc2UgY2hlY2sgaXMgZG9uZSBv bmx5IGlmCmEgY2hlY2sgaXMgbmVlZGVkLiBUbyBmb3JjZSBhIHJ1biBldmVuIGlu IGJhdGNoIG1vZGUgYWRkIHRoZSBvcHRpb24KQG9wdGlvbnstLXllc30uCgpAYW5j aG9ye29wdGlvbiAtLWV4cG9ydC1vd25lcnRydXN0fQpAaXRlbSAtLWV4cG9ydC1v d25lcnRydXN0CkBvcGluZGV4IGV4cG9ydC1vd25lcnRydXN0ClNlbmQgdGhlIG93 bmVydHJ1c3QgdmFsdWVzIHRvIFNURE9VVC4gVGhpcyBpcyB1c2VmdWwgZm9yIGJh Y2t1cCBwdXJwb3NlcwphcyB0aGVzZSB2YWx1ZXMgYXJlIHRoZSBvbmx5IG9uZXMg d2hpY2ggY2FuJ3QgYmUgcmUtY3JlYXRlZCBmcm9tIGEKY29ycnVwdGVkIHRydXN0 ZGIuICBFeGFtcGxlOgpAYyBtYW46LlJTCkBleGFtcGxlCiAgQGdwZ25hbWV7fSAt LWV4cG9ydC1vd25lcnRydXN0ID4gb3RydXN0LnR4dApAZW5kIGV4YW1wbGUKQGMg bWFuOi5SRQoKCkBpdGVtIC0taW1wb3J0LW93bmVydHJ1c3QKQG9waW5kZXggaW1w b3J0LW93bmVydHJ1c3QKVXBkYXRlIHRoZSB0cnVzdGRiIHdpdGggdGhlIG93bmVy dHJ1c3QgdmFsdWVzIHN0b3JlZCBpbiBAY29kZXtmaWxlc30gKG9yClNURElOIGlm IG5vdCBnaXZlbik7IGV4aXN0aW5nIHZhbHVlcyB3aWxsIGJlIG92ZXJ3cml0dGVu LiAgSW4gY2FzZSBvZiBhCnNldmVyZWx5IGRhbWFnZWQgdHJ1c3RkYiBhbmQgaWYg eW91IGhhdmUgYSByZWNlbnQgYmFja3VwIG9mIHRoZQpvd25lcnRydXN0IHZhbHVl cyAoZS5nLiBpbiB0aGUgZmlsZSBAZmlsZXtvdHJ1c3QudHh0fSwgeW91IG1heSBy ZS1jcmVhdGUKdGhlIHRydXN0ZGIgdXNpbmcgdGhlc2UgY29tbWFuZHM6CkBjIG1h bjouUlMKQGV4YW1wbGUKICBjZCB+Ly5nbnVwZwogIHJtIHRydXN0ZGIuZ3BnCiAg QGdwZ25hbWV7fSAtLWltcG9ydC1vd25lcnRydXN0IDwgb3RydXN0LnR4dApAZW5k IGV4YW1wbGUKQGMgbWFuOi5SRQoKCkBpdGVtIC0tcmVidWlsZC1rZXlkYi1jYWNo ZXMKQG9waW5kZXggcmVidWlsZC1rZXlkYi1jYWNoZXMKV2hlbiB1cGRhdGluZyBm cm9tIHZlcnNpb24gMS4wLjYgdG8gMS4wLjcgdGhpcyBjb21tYW5kIHNob3VsZCBi ZSB1c2VkCnRvIGNyZWF0ZSBzaWduYXR1cmUgY2FjaGVzIGluIHRoZSBrZXlyaW5n LiBJdCBtaWdodCBiZSBoYW5keSBpbiBvdGhlcgpzaXR1YXRpb25zIHRvby4KCkBp dGVtIC0tcHJpbnQtbWQgQGNvZGV7YWxnb30KQGl0ZW14IC0tcHJpbnQtbWRzCkBv cGluZGV4IHByaW50LW1kClByaW50IG1lc3NhZ2UgZGlnZXN0IG9mIGFsZ29yaXRo bSBBTEdPIGZvciBhbGwgZ2l2ZW4gZmlsZXMgb3IgU1RESU4uCldpdGggdGhlIHNl Y29uZCBmb3JtIChvciBhIGRlcHJlY2F0ZWQgIioiIGFzIGFsZ28pIGRpZ2VzdHMg Zm9yIGFsbAphdmFpbGFibGUgYWxnb3JpdGhtcyBhcmUgcHJpbnRlZC4KCkBpdGVt IC0tZ2VuLXJhbmRvbSBAY29kZXswfDF8Mn0gQGNvZGV7Y291bnR9CkBvcGluZGV4 IGdlbi1yYW5kb20KRW1pdCBAdmFye2NvdW50fSByYW5kb20gYnl0ZXMgb2YgdGhl IGdpdmVuIHF1YWxpdHkgbGV2ZWwgMCwgMSBvciAyLiBJZgpAdmFye2NvdW50fSBp cyBub3QgZ2l2ZW4gb3IgemVybywgYW4gZW5kbGVzcyBzZXF1ZW5jZSBvZiByYW5k b20gYnl0ZXMKd2lsbCBiZSBlbWl0dGVkLiAgSWYgdXNlZCB3aXRoIEBvcHRpb257 LS1hcm1vcn0gdGhlIG91dHB1dCB3aWxsIGJlCmJhc2U2NCBlbmNvZGVkLiAgUExF QVNFLCBkb24ndCB1c2UgdGhpcyBjb21tYW5kIHVubGVzcyB5b3Uga25vdyB3aGF0 CnlvdSBhcmUgZG9pbmc7IGl0IG1heSByZW1vdmUgcHJlY2lvdXMgZW50cm9weSBm cm9tIHRoZSBzeXN0ZW0hCgpAaXRlbSAtLWdlbi1wcmltZSBAY29kZXttb2RlfSAg QGNvZGV7Yml0c30KQG9waW5kZXggZ2VuLXByaW1lClVzZSB0aGUgc291cmNlLCBM dWtlIDotKS4gVGhlIG91dHB1dCBmb3JtYXQgaXMgc3RpbGwgc3ViamVjdCB0byBj aGFuZ2UuCgoKQGl0ZW0gLS1lbmFybW9yCkBpdGVtIC0tZGVhcm1vcgpAb3BpbmRl eCBlbmFybW9yCkBvcGluZGV4IGRlYXJtb3IKUGFjayBvciB1bnBhY2sgYW4gYXJi aXRyYXJ5IGlucHV0IGludG8vZnJvbSBhbiBPcGVuUEdQIEFTQ0lJIGFybW9yLgpU aGlzIGlzIGEgR251UEcgZXh0ZW5zaW9uIHRvIE9wZW5QR1AgYW5kIGluIGdlbmVy YWwgbm90IHZlcnkgdXNlZnVsLgoKQGl0ZW0gLS10b2Z1LXNldC1wb2xpY3kgQGNv ZGV7YXV0b3xnb29kfHVua25vd258YmFkfGFza30gIEBjb2Rle2tleS4uLn0KQG9w aW5kZXggdG9mdS1zZXQtcG9saWN5ClNldCB0aGUgVE9GVSBwb2xpY3kgZm9yIGFs bCB0aGUgYmluZGluZ3MgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQKa2V5 cy4gIEZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBtZWFuaW5nIG9mIHRo ZSBwb2xpY2llcywKQHB4cmVme3RydXN0LW1vZGVsLXRvZnV9LiAgVGhlIGtleXMg bWF5IGJlIHNwZWNpZmllZCBlaXRoZXIgYnkgdGhlaXIKZmluZ2VycHJpbnQgKHBy ZWZlcnJlZCkgb3IgdGhlaXIga2V5aWQuCgpAYyBAaXRlbSAtLXNlcnZlcgpAYyBA b3BpbmRleCBzZXJ2ZXIKQGMgUnVuIGdwZyBpbiBzZXJ2ZXIgbW9kZS4gIFRoaXMg ZmVhdHVyZSBpcyBub3QgeWV0IHJlYWR5IGZvciB1c2UgYW5kCkBjIHRodXMgbm90 IGRvY3VtZW50ZWQuCgpAZW5kIHRhYmxlCgoKQGMgKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKgpAYyAqKioqKioqICBLRVkgTUFOR0VN RU5UIENPTU1BTkRTICAqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioKQG5vZGUgT3BlblBHUCBLZXkgTWFuYWdl bWVudApAc3Vic2VjdGlvbiBIb3cgdG8gbWFuYWdlIHlvdXIga2V5cwoKVGhpcyBz ZWN0aW9uIGV4cGxhaW5zIHRoZSBtYWluIGNvbW1hbmRzIGZvciBrZXkgbWFuYWdl bWVudAoKQHRhYmxlIEBnbnVwZ3RhYm9wdAoKQGl0ZW0gLS1xdWljay1nZW4ta2V5 IEBjb2Rle3VzZXItaWR9CkBvcGluZGV4IHF1aWNrLWdlbi1rZXkKVGhpcyBpcyBh IHNpbXBsZSBjb21tYW5kIHRvIGdlbmVyYXRlIGEgc3RhbmRhcmQga2V5IHdpdGgg b25lIHVzZXIgaWQuCkluIGNvbnRyYXN0IHRvIEBvcHRpb257LS1nZW4ta2V5fSB0 aGUga2V5IGlzIGdlbmVyYXRlZCBkaXJlY3RseQp3aXRob3V0IHRoZSBuZWVkIHRv IGFuc3dlciBhIGJ1bmNoIG9mIHByb21wdHMuICBVbmxlc3MgdGhlIG9wdGlvbgpA b3B0aW9uey0teWVzfSBpcyBnaXZlbiwgdGhlIGtleSBjcmVhdGlvbiB3aWxsIGJl IGNhbmNlbGVkIGlmIHRoZQpnaXZlbiB1c2VyIGlkIGFscmVhZHkgZXhpc3RzIGlu IHRoZSBrZXkgcmluZy4KCklmIGludm9rZWQgZGlyZWN0bHkgb24gdGhlIGNvbnNv bGUgd2l0aG91dCBhbnkgc3BlY2lhbCBvcHRpb25zIGFuCmFuc3dlciB0byBhIGBg Q29udGludWU/Jycgc3R5bGUgY29uZmlybWF0aW9uIHByb21wdCBpcyByZXF1aXJl ZC4gIEluCmNhc2UgdGhlIHVzZXIgaWQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGtl eSByaW5nIGEgc2Vjb25kIHByb21wdCB0bwpmb3JjZSB0aGUgY3JlYXRpb24gb2Yg dGhlIGtleSB3aWxsIHNob3cgdXAuCgpJZiB0aGlzIGNvbW1hbmQgaXMgdXNlZCB3 aXRoIEBvcHRpb257LS1iYXRjaH0sCkBvcHRpb257LS1waW5lbnRyeS1tb2RlfSBo YXMgYmVlbiBzZXQgdG8gQGNvZGV7bG9vcGJhY2t9LCBhbmQgb25lIG9mCnRoZSBw YXNzcGhyYXNlIG9wdGlvbnMgKEBvcHRpb257LS1wYXNzcGhyYXNlfSwKQG9wdGlv bnstLXBhc3NwaHJhc2UtZmR9LCBvciBAb3B0aW9ue3Bhc3NwaHJhc2UtZmlsZX0p IGlzIHVzZWQsIHRoZQpzdXBwbGllZCBwYXNzcGhyYXNlIGlzIHVzZWQgZm9yIHRo ZSBuZXcga2V5IGFuZCB0aGUgYWdlbnQgZG9lcyBub3QgYXNrCmZvciBpdC4gIFRv IGNyZWF0ZSBhIGtleSB3aXRob3V0IGFueSBwcm90ZWN0aW9uIEBjb2Rley0tcGFz c3BocmFzZSAnJ30KbWF5IGJlIHVzZWQuCgpAaXRlbSAtLWdlbi1rZXkKQG9waW5k ZXggZ2VuLWtleQpHZW5lcmF0ZSBhIG5ldyBrZXkgcGFpciB1c2luZyB0aGUgY3Vy cmVudCBkZWZhdWx0IHBhcmFtZXRlcnMuICBUaGlzIGlzCnRoZSBzdGFuZGFyZCBj b21tYW5kIHRvIGNyZWF0ZSBhIG5ldyBrZXkuCgpAaXRlbSAtLWZ1bGwtZ2VuLWtl eQpAb3BpbmRleCBnZW4ta2V5CkdlbmVyYXRlIGEgbmV3IGtleSBwYWlyIHdpdGgg ZGlhbG9ncyBmb3IgYWxsIG9wdGlvbnMuICBUaGlzIGlzIGFuCmV4dGVuZGVkIHZl cnNpb24gb2YgQG9wdGlvbnstLWdlbi1rZXl9LgoKVGhlcmUgaXMgYWxzbyBhIGZl YXR1cmUgd2hpY2ggYWxsb3dzIHlvdSB0byBjcmVhdGUga2V5cyBpbiBiYXRjaApt b2RlLiBTZWUgdGhlIHRoZSBtYW51YWwgc2VjdGlvbiBgYFVuYXR0ZW5kZWQga2V5 IGdlbmVyYXRpb24nJyBvbiBob3cKdG8gdXNlIHRoaXMuCgpAaXRlbSAtLWdlbi1y ZXZva2UgQGNvZGV7bmFtZX0KQG9waW5kZXggZ2VuLXJldm9rZQpHZW5lcmF0ZSBh IHJldm9jYXRpb24gY2VydGlmaWNhdGUgZm9yIHRoZSBjb21wbGV0ZSBrZXkuIFRv IHJldm9rZQphIHN1YmtleSBvciBhIHNpZ25hdHVyZSwgdXNlIHRoZSBAb3B0aW9u ey0tZWRpdH0gY29tbWFuZC4KCkBpdGVtIC0tZGVzaWctcmV2b2tlIEBjb2Rle25h bWV9CkBvcGluZGV4IGRlc2lnLXJldm9rZQpHZW5lcmF0ZSBhIGRlc2lnbmF0ZWQg cmV2b2NhdGlvbiBjZXJ0aWZpY2F0ZSBmb3IgYSBrZXkuIFRoaXMgYWxsb3dzIGEK dXNlciAod2l0aCB0aGUgcGVybWlzc2lvbiBvZiB0aGUga2V5aG9sZGVyKSB0byBy ZXZva2Ugc29tZW9uZSBlbHNlJ3MKa2V5LgoKCkBpdGVtIC0tZWRpdC1rZXkKQG9w aW5kZXggZWRpdC1rZXkKUHJlc2VudCBhIG1lbnUgd2hpY2ggZW5hYmxlcyB5b3Ug dG8gZG8gbW9zdCBvZiB0aGUga2V5IG1hbmFnZW1lbnQKcmVsYXRlZCB0YXNrcy4g IEl0IGV4cGVjdHMgdGhlIHNwZWNpZmljYXRpb24gb2YgYSBrZXkgb24gdGhlIGNv bW1hbmQKbGluZS4KCkBjICoqKioqKioqIEJlZ2luIEVkaXQta2V5IE9wdGlvbnMg KioqKioqKioqKgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gdWlkIEBjb2Rle259CiAg QG9waW5kZXgga2V5ZWRpdDp1aWQKICBUb2dnbGUgc2VsZWN0aW9uIG9mIHVzZXIg SUQgb3IgcGhvdG9ncmFwaGljIHVzZXIgSUQgd2l0aCBpbmRleCBAY29kZXtufS4K ICBVc2UgQGNvZGV7Kn0gdG8gc2VsZWN0IGFsbCBhbmQgQGNvZGV7MH0gdG8gZGVz ZWxlY3QgYWxsLgoKICBAaXRlbSBrZXkgQGNvZGV7bn0KICBAb3BpbmRleCBrZXll ZGl0OmtleQogIFRvZ2dsZSBzZWxlY3Rpb24gb2Ygc3Via2V5IHdpdGggaW5kZXgg QGNvZGV7bn0gb3Iga2V5IElEIEBjb2Rle259LgogIFVzZSBAY29kZXsqfSB0byBz ZWxlY3QgYWxsIGFuZCBAY29kZXswfSB0byBkZXNlbGVjdCBhbGwuCgogIEBpdGVt IHNpZ24KICBAb3BpbmRleCBrZXllZGl0OnNpZ24KICBNYWtlIGEgc2lnbmF0dXJl IG9uIGtleSBvZiB1c2VyIEBjb2Rle25hbWV9IElmIHRoZSBrZXkgaXMgbm90IHll dAogIHNpZ25lZCBieSB0aGUgZGVmYXVsdCB1c2VyIChvciB0aGUgdXNlcnMgZ2l2 ZW4gd2l0aCAtdSksIHRoZSBwcm9ncmFtCiAgZGlzcGxheXMgdGhlIGluZm9ybWF0 aW9uIG9mIHRoZSBrZXkgYWdhaW4sIHRvZ2V0aGVyIHdpdGggaXRzCiAgZmluZ2Vy cHJpbnQgYW5kIGFza3Mgd2hldGhlciBpdCBzaG91bGQgYmUgc2lnbmVkLiBUaGlz IHF1ZXN0aW9uIGlzCiAgcmVwZWF0ZWQgZm9yIGFsbCB1c2VycyBzcGVjaWZpZWQg d2l0aAogIC11LgoKICBAaXRlbSBsc2lnbgogIEBvcGluZGV4IGtleWVkaXQ6bHNp Z24KICBTYW1lIGFzICJzaWduIiBidXQgdGhlIHNpZ25hdHVyZSBpcyBtYXJrZWQg YXMgbm9uLWV4cG9ydGFibGUgYW5kIHdpbGwKICB0aGVyZWZvcmUgbmV2ZXIgYmUg dXNlZCBieSBvdGhlcnMuIFRoaXMgbWF5IGJlIHVzZWQgdG8gbWFrZSBrZXlzCiAg dmFsaWQgb25seSBpbiB0aGUgbG9jYWwgZW52aXJvbm1lbnQuCgogIEBpdGVtIG5y c2lnbgogIEBvcGluZGV4IGtleWVkaXQ6bnJzaWduCiAgU2FtZSBhcyAic2lnbiIg YnV0IHRoZSBzaWduYXR1cmUgaXMgbWFya2VkIGFzIG5vbi1yZXZvY2FibGUgYW5k IGNhbgogIHRoZXJlZm9yZSBuZXZlciBiZSByZXZva2VkLgoKICBAaXRlbSB0c2ln bgogIEBvcGluZGV4IGtleWVkaXQ6dHNpZ24KICBNYWtlIGEgdHJ1c3Qgc2lnbmF0 dXJlLiBUaGlzIGlzIGEgc2lnbmF0dXJlIHRoYXQgY29tYmluZXMgdGhlIG5vdGlv bnMKICBvZiBjZXJ0aWZpY2F0aW9uIChsaWtlIGEgcmVndWxhciBzaWduYXR1cmUp LCBhbmQgdHJ1c3QgKGxpa2UgdGhlCiAgInRydXN0IiBjb21tYW5kKS4gSXQgaXMg Z2VuZXJhbGx5IG9ubHkgdXNlZnVsIGluIGRpc3RpbmN0IGNvbW11bml0aWVzCiAg b3IgZ3JvdXBzLgpAZW5kIHRhYmxlCgpAYyBtYW46LlJTCk5vdGUgdGhhdCAibCIg KGZvciBsb2NhbCAvIG5vbi1leHBvcnRhYmxlKSwgIm5yIiAoZm9yIG5vbi1yZXZv Y2FibGUsCmFuZCAidCIgKGZvciB0cnVzdCkgbWF5IGJlIGZyZWVseSBtaXhlZCBh bmQgcHJlZml4ZWQgdG8gInNpZ24iIHRvCmNyZWF0ZSBhIHNpZ25hdHVyZSBvZiBh bnkgdHlwZSBkZXNpcmVkLgpAYyBtYW46LlJFCgpJZiB0aGUgb3B0aW9uIEBvcHRp b257LS1vbmx5LXNpZ24tdGV4dC1pZHN9IGlzIHNwZWNpZmllZCwgdGhlbiBhbnkK bm9uLXRleHQgYmFzZWQgdXNlciBpZHMgKGUuZy4sIHBob3RvIElEcykgd2lsbCBu b3QgYmUgc2VsZWN0ZWQgZm9yCnNpZ25pbmcuCgpAdGFibGUgQGFzaXMKCiAgQGl0 ZW0gZGVsc2lnCiAgQG9waW5kZXgga2V5ZWRpdDpkZWxzaWcKICBEZWxldGUgYSBz aWduYXR1cmUuIE5vdGUgdGhhdCBpdCBpcyBub3QgcG9zc2libGUgdG8gcmV0cmFj dCBhIHNpZ25hdHVyZSwKICBvbmNlIGl0IGhhcyBiZWVuIHNlbmQgdG8gdGhlIHB1 YmxpYyAoaS5lLiB0byBhIGtleXNlcnZlcikuICBJbiB0aGF0IGNhc2UKICB5b3Ug YmV0dGVyIHVzZSBAY29kZXtyZXZzaWd9LgoKICBAaXRlbSByZXZzaWcKICBAb3Bp bmRleCBrZXllZGl0OnJldnNpZwogIFJldm9rZSBhIHNpZ25hdHVyZS4gRm9yIGV2 ZXJ5IHNpZ25hdHVyZSB3aGljaCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkKICBvbmUg b2YgdGhlIHNlY3JldCBrZXlzLCBHbnVQRyBhc2tzIHdoZXRoZXIgYSByZXZvY2F0 aW9uIGNlcnRpZmljYXRlCiAgc2hvdWxkIGJlIGdlbmVyYXRlZC4KCiAgQGl0ZW0g Y2hlY2sKICBAb3BpbmRleCBrZXllZGl0OmNoZWNrCiAgQ2hlY2sgdGhlIHNpZ25h dHVyZXMgb24gYWxsIHNlbGVjdGVkIHVzZXIgSURzLiAgV2l0aCB0aGUgZXh0cmEK ICBvcHRpb24gQGNvZGV7c2VsZnNpZ30gb25seSBzZWxmLXNpZ25hdHVyZXMgYXJl IHNob3duLgoKICBAaXRlbSBhZGR1aWQKICBAb3BpbmRleCBrZXllZGl0OmFkZHVp ZAogIENyZWF0ZSBhbiBhZGRpdGlvbmFsIHVzZXIgSUQuCgogIEBpdGVtIGFkZHBo b3RvCiAgQG9waW5kZXgga2V5ZWRpdDphZGRwaG90bwogIENyZWF0ZSBhIHBob3Rv Z3JhcGhpYyB1c2VyIElELiBUaGlzIHdpbGwgcHJvbXB0IGZvciBhIEpQRUcgZmls ZSB0aGF0CiAgd2lsbCBiZSBlbWJlZGRlZCBpbnRvIHRoZSB1c2VyIElELiBOb3Rl IHRoYXQgYSB2ZXJ5IGxhcmdlIEpQRUcgd2lsbCBtYWtlCiAgZm9yIGEgdmVyeSBs YXJnZSBrZXkuIEFsc28gbm90ZSB0aGF0IHNvbWUgcHJvZ3JhbXMgd2lsbCBkaXNw bGF5IHlvdXIKICBKUEVHIHVuY2hhbmdlZCAoR251UEcpLCBhbmQgc29tZSBwcm9n cmFtcyB3aWxsIHNjYWxlIGl0IHRvIGZpdCBpbiBhCiAgZGlhbG9nIGJveCAoUEdQ KS4KCiAgQGl0ZW0gc2hvd3Bob3RvCiAgQG9waW5kZXgga2V5ZWRpdDpzaG93cGhv dG8KICBEaXNwbGF5IHRoZSBzZWxlY3RlZCBwaG90b2dyYXBoaWMgdXNlciBJRC4K CiAgQGl0ZW0gZGVsdWlkCiAgQG9waW5kZXgga2V5ZWRpdDpkZWx1aWQKICBEZWxl dGUgYSB1c2VyIElEIG9yIHBob3RvZ3JhcGhpYyB1c2VyIElELiAgTm90ZSB0aGF0 IGl0IGlzIG5vdAogIHBvc3NpYmxlIHRvIHJldHJhY3QgYSB1c2VyIGlkLCBvbmNl IGl0IGhhcyBiZWVuIHNlbmQgdG8gdGhlIHB1YmxpYwogIChpLmUuIHRvIGEga2V5 c2VydmVyKS4gIEluIHRoYXQgY2FzZSB5b3UgYmV0dGVyIHVzZSBAY29kZXtyZXZ1 aWR9LgoKICBAaXRlbSByZXZ1aWQKICBAb3BpbmRleCBrZXllZGl0OnJldnVpZAog IFJldm9rZSBhIHVzZXIgSUQgb3IgcGhvdG9ncmFwaGljIHVzZXIgSUQuCgogIEBp dGVtIHByaW1hcnkKICBAb3BpbmRleCBrZXllZGl0OnByaW1hcnkKICBGbGFnIHRo ZSBjdXJyZW50IHVzZXIgaWQgYXMgdGhlIHByaW1hcnkgb25lLCByZW1vdmVzIHRo ZSBwcmltYXJ5IHVzZXIKICBpZCBmbGFnIGZyb20gYWxsIG90aGVyIHVzZXIgaWRz IGFuZCBzZXRzIHRoZSB0aW1lc3RhbXAgb2YgYWxsIGFmZmVjdGVkCiAgc2VsZi1z aWduYXR1cmVzIG9uZSBzZWNvbmQgYWhlYWQuIE5vdGUgdGhhdCBzZXR0aW5nIGEg cGhvdG8gdXNlciBJRAogIGFzIHByaW1hcnkgbWFrZXMgaXQgcHJpbWFyeSBvdmVy IG90aGVyIHBob3RvIHVzZXIgSURzLCBhbmQgc2V0dGluZyBhCiAgcmVndWxhciB1 c2VyIElEIGFzIHByaW1hcnkgbWFrZXMgaXQgcHJpbWFyeSBvdmVyIG90aGVyIHJl Z3VsYXIgdXNlcgogIElEcy4KCiAgQGl0ZW0ga2V5c2VydmVyCiAgQG9waW5kZXgg a2V5ZWRpdDprZXlzZXJ2ZXIKICBTZXQgYSBwcmVmZXJyZWQga2V5c2VydmVyIGZv ciB0aGUgc3BlY2lmaWVkIHVzZXIgSUQocykuIFRoaXMgYWxsb3dzCiAgb3RoZXIg dXNlcnMgdG8ga25vdyB3aGVyZSB5b3UgcHJlZmVyIHRoZXkgZ2V0IHlvdXIga2V5 IGZyb20uIFNlZQogIEBvcHRpb257LS1rZXlzZXJ2ZXItb3B0aW9ucyBob25vci1r ZXlzZXJ2ZXItdXJsfSBmb3IgbW9yZSBvbiBob3cgdGhpcwogIHdvcmtzLiAgU2V0 dGluZyBhIHZhbHVlIG9mICJub25lIiByZW1vdmVzIGFuIGV4aXN0aW5nIHByZWZl cnJlZAogIGtleXNlcnZlci4KCiAgQGl0ZW0gbm90YXRpb24KICBAb3BpbmRleCBr ZXllZGl0Om5vdGF0aW9uCiAgU2V0IGEgbmFtZT12YWx1ZSBub3RhdGlvbiBmb3Ig dGhlIHNwZWNpZmllZCB1c2VyIElEKHMpLiBTZWUKICBAb3B0aW9uey0tY2VydC1u b3RhdGlvbn0gZm9yIG1vcmUgb24gaG93IHRoaXMgd29ya3MuIFNldHRpbmcgYSB2 YWx1ZSBvZgogICJub25lIiByZW1vdmVzIGFsbCBub3RhdGlvbnMsIHNldHRpbmcg YSBub3RhdGlvbiBwcmVmaXhlZCB3aXRoIGEgbWludXMKICBzaWduICgtKSByZW1v dmVzIHRoYXQgbm90YXRpb24sIGFuZCBzZXR0aW5nIGEgbm90YXRpb24gbmFtZSAo d2l0aG91dCB0aGUKICA9dmFsdWUpIHByZWZpeGVkIHdpdGggYSBtaW51cyBzaWdu IHJlbW92ZXMgYWxsIG5vdGF0aW9ucyB3aXRoIHRoYXQgbmFtZS4KCiAgQGl0ZW0g cHJlZgogIEBvcGluZGV4IGtleWVkaXQ6cHJlZgogIExpc3QgcHJlZmVyZW5jZXMg ZnJvbSB0aGUgc2VsZWN0ZWQgdXNlciBJRC4gVGhpcyBzaG93cyB0aGUgYWN0dWFs CiAgcHJlZmVyZW5jZXMsIHdpdGhvdXQgaW5jbHVkaW5nIGFueSBpbXBsaWVkIHBy ZWZlcmVuY2VzLgoKICBAaXRlbSBzaG93cHJlZgogIEBvcGluZGV4IGtleWVkaXQ6 c2hvd3ByZWYKICBNb3JlIHZlcmJvc2UgcHJlZmVyZW5jZXMgbGlzdGluZyBmb3Ig dGhlIHNlbGVjdGVkIHVzZXIgSUQuIFRoaXMgc2hvd3MKICB0aGUgcHJlZmVyZW5j ZXMgaW4gZWZmZWN0IGJ5IGluY2x1ZGluZyB0aGUgaW1wbGllZCBwcmVmZXJlbmNl cyBvZiAzREVTCiAgKGNpcGhlciksIFNIQS0xIChkaWdlc3QpLCBhbmQgVW5jb21w cmVzc2VkIChjb21wcmVzc2lvbikgaWYgdGhleSBhcmUKICBub3QgYWxyZWFkeSBp bmNsdWRlZCBpbiB0aGUgcHJlZmVyZW5jZSBsaXN0LiBJbiBhZGRpdGlvbiwgdGhl CiAgcHJlZmVycmVkIGtleXNlcnZlciBhbmQgc2lnbmF0dXJlIG5vdGF0aW9ucyAo aWYgYW55KSBhcmUgc2hvd24uCgogIEBpdGVtIHNldHByZWYgQGNvZGV7c3RyaW5n fQogIEBvcGluZGV4IGtleWVkaXQ6c2V0cHJlZgogIFNldCB0aGUgbGlzdCBvZiB1 c2VyIElEIHByZWZlcmVuY2VzIHRvIEBjb2Rle3N0cmluZ30gZm9yIGFsbCAob3Ig anVzdAogIHRoZSBzZWxlY3RlZCkgdXNlciBJRHMuIENhbGxpbmcgc2V0cHJlZiB3 aXRoIG5vIGFyZ3VtZW50cyBzZXRzIHRoZQogIHByZWZlcmVuY2UgbGlzdCB0byB0 aGUgZGVmYXVsdCAoZWl0aGVyIGJ1aWx0LWluIG9yIHNldCB2aWEKICBAb3B0aW9u ey0tZGVmYXVsdC1wcmVmZXJlbmNlLWxpc3R9KSwgYW5kIGNhbGxpbmcgc2V0cHJl ZiB3aXRoICJub25lIgogIGFzIHRoZSBhcmd1bWVudCBzZXRzIGFuIGVtcHR5IHBy ZWZlcmVuY2UgbGlzdC4gVXNlIEBjb21tYW5ke0BncGduYW1lCiAgLS12ZXJzaW9u fSB0byBnZXQgYSBsaXN0IG9mIGF2YWlsYWJsZSBhbGdvcml0aG1zLiBOb3RlIHRo YXQgd2hpbGUgeW91CiAgY2FuIGNoYW5nZSB0aGUgcHJlZmVyZW5jZXMgb24gYW4g YXR0cmlidXRlIHVzZXIgSUQgKGFrYSAicGhvdG8gSUQiKSwKICBHbnVQRyBkb2Vz IG5vdCBzZWxlY3Qga2V5cyB2aWEgYXR0cmlidXRlIHVzZXIgSURzIHNvIHRoZXNl IHByZWZlcmVuY2VzCiAgd2lsbCBub3QgYmUgdXNlZCBieSBHbnVQRy4KCiAgV2hl biBzZXR0aW5nIHByZWZlcmVuY2VzLCB5b3Ugc2hvdWxkIGxpc3QgdGhlIGFsZ29y aXRobXMgaW4gdGhlIG9yZGVyCiAgd2hpY2ggeW91J2QgbGlrZSB0byBzZWUgdGhl bSB1c2VkIGJ5IHNvbWVvbmUgZWxzZSB3aGVuIGVuY3J5cHRpbmcgYQogIG1lc3Nh Z2UgdG8geW91ciBrZXkuICBJZiB5b3UgZG9uJ3QgaW5jbHVkZSAzREVTLCBpdCB3 aWxsIGJlCiAgYXV0b21hdGljYWxseSBhZGRlZCBhdCB0aGUgZW5kLiAgTm90ZSB0 aGF0IHRoZXJlIGFyZSBtYW55IGZhY3RvcnMgdGhhdAogIGdvIGludG8gY2hvb3Np bmcgYW4gYWxnb3JpdGhtIChmb3IgZXhhbXBsZSwgeW91ciBrZXkgbWF5IG5vdCBi ZSB0aGUKICBvbmx5IHJlY2lwaWVudCksIGFuZCBzbyB0aGUgcmVtb3RlIE9wZW5Q R1AgYXBwbGljYXRpb24gYmVpbmcgdXNlZCB0bwogIHNlbmQgdG8geW91IG1heSBv ciBtYXkgbm90IGZvbGxvdyB5b3VyIGV4YWN0IGNob3NlbiBvcmRlciBmb3IgYSBn aXZlbgogIG1lc3NhZ2UuICBJdCB3aWxsLCBob3dldmVyLCBvbmx5IGNob29zZSBh biBhbGdvcml0aG0gdGhhdCBpcyBwcmVzZW50CiAgb24gdGhlIHByZWZlcmVuY2Ug bGlzdCBvZiBldmVyeSByZWNpcGllbnQga2V5LiAgU2VlIGFsc28gdGhlCiAgSU5U RVJPUEVSQUJJTElUWSBXSVRIIE9USEVSIE9QRU5QR1AgUFJPR1JBTVMgc2VjdGlv biBiZWxvdy4KCiAgQGl0ZW0gYWRka2V5CiAgQG9waW5kZXgga2V5ZWRpdDphZGRr ZXkKICBBZGQgYSBzdWJrZXkgdG8gdGhpcyBrZXkuCgogIEBpdGVtIGFkZGNhcmRr ZXkKICBAb3BpbmRleCBrZXllZGl0OmFkZGNhcmRrZXkKICBHZW5lcmF0ZSBhIHN1 YmtleSBvbiBhIGNhcmQgYW5kIGFkZCBpdCB0byB0aGlzIGtleS4KCiAgQGl0ZW0g a2V5dG9jYXJkCiAgQG9waW5kZXgga2V5ZWRpdDprZXl0b2NhcmQKICBUcmFuc2Zl ciB0aGUgc2VsZWN0ZWQgc2VjcmV0IHN1YmtleSAob3IgdGhlIHByaW1hcnkga2V5 IGlmIG5vIHN1YmtleQogIGhhcyBiZWVuIHNlbGVjdGVkKSB0byBhIHNtYXJ0Y2Fy ZC4gVGhlIHNlY3JldCBrZXkgaW4gdGhlIGtleXJpbmcgd2lsbAogIGJlIHJlcGxh Y2VkIGJ5IGEgc3R1YiBpZiB0aGUga2V5IGNvdWxkIGJlIHN0b3JlZCBzdWNjZXNz ZnVsbHkgb24gdGhlCiAgY2FyZCBhbmQgeW91IHVzZSB0aGUgc2F2ZSBjb21tYW5k IGxhdGVyLiBPbmx5IGNlcnRhaW4ga2V5IHR5cGVzIG1heSBiZQogIHRyYW5zZmVy cmVkIHRvIHRoZSBjYXJkLiBBIHN1YiBtZW51IGFsbG93cyB5b3UgdG8gc2VsZWN0 IG9uIHdoYXQgY2FyZAogIHRvIHN0b3JlIHRoZSBrZXkuIE5vdGUgdGhhdCBpdCBp cyBub3QgcG9zc2libGUgdG8gZ2V0IHRoYXQga2V5IGJhY2sKICBmcm9tIHRoZSBj YXJkIC0gaWYgdGhlIGNhcmQgZ2V0cyBicm9rZW4geW91ciBzZWNyZXQga2V5IHdp bGwgYmUgbG9zdAogIHVubGVzcyB5b3UgaGF2ZSBhIGJhY2t1cCBzb21ld2hlcmUu CgogIEBpdGVtIGJrdXB0b2NhcmQgQGNvZGV7ZmlsZX0KICBAb3BpbmRleCBrZXll ZGl0OmJrdXB0b2NhcmQKICBSZXN0b3JlIHRoZSBnaXZlbiBmaWxlIHRvIGEgY2Fy ZC4gVGhpcyBjb21tYW5kIG1heSBiZSB1c2VkIHRvIHJlc3RvcmUgYQogIGJhY2t1 cCBrZXkgKGFzIGdlbmVyYXRlZCBkdXJpbmcgY2FyZCBpbml0aWFsaXphdGlvbikg dG8gYSBuZXcgY2FyZC4gSW4KICBhbG1vc3QgYWxsIGNhc2VzIHRoaXMgd2lsbCBi ZSB0aGUgZW5jcnlwdGlvbiBrZXkuIFlvdSBzaG91bGQgdXNlIHRoaXMKICBjb21t YW5kIG9ubHkgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBwdWJsaWMga2V5IGFuZCBt YWtlIHN1cmUgdGhhdCB0aGUKICBmaWxlIGdpdmVuIGFzIGFyZ3VtZW50IGlzIGlu ZGVlZCB0aGUgYmFja3VwIHRvIHJlc3RvcmUuIFlvdSBzaG91bGQgdGhlbgogIHNl bGVjdCAyIHRvIHJlc3RvcmUgYXMgZW5jcnlwdGlvbiBrZXkuICBZb3Ugd2lsbCBm aXJzdCBiZSBhc2tlZCB0byBlbnRlcgogIHRoZSBwYXNzcGhyYXNlIG9mIHRoZSBi YWNrdXAga2V5IGFuZCB0aGVuIGZvciB0aGUgQWRtaW4gUElOIG9mIHRoZSBjYXJk LgoKICBAaXRlbSBkZWxrZXkKICBAb3BpbmRleCBrZXllZGl0OmRlbGtleQogIFJl bW92ZSBhIHN1YmtleSAoc2Vjb25kYXJ5IGtleSkuIE5vdGUgdGhhdCBpdCBpcyBu b3QgcG9zc2libGUgdG8gcmV0cmFjdAogIGEgc3Via2V5LCBvbmNlIGl0IGhhcyBi ZWVuIHNlbmQgdG8gdGhlIHB1YmxpYyAoaS5lLiB0byBhIGtleXNlcnZlcikuICBJ bgogIHRoYXQgY2FzZSB5b3UgYmV0dGVyIHVzZSBAY29kZXtyZXZrZXl9LgoKICBA aXRlbSByZXZrZXkKICBAb3BpbmRleCBrZXllZGl0OnJldmtleQogIFJldm9rZSBh IHN1YmtleS4KCiAgQGl0ZW0gZXhwaXJlCiAgQG9waW5kZXgga2V5ZWRpdDpleHBp cmUKICBDaGFuZ2UgdGhlIGtleSBvciBzdWJrZXkgZXhwaXJhdGlvbiB0aW1lLiBJ ZiBhIHN1YmtleSBpcyBzZWxlY3RlZCwgdGhlCiAgZXhwaXJhdGlvbiB0aW1lIG9m IHRoaXMgc3Via2V5IHdpbGwgYmUgY2hhbmdlZC4gV2l0aCBubyBzZWxlY3Rpb24s IHRoZQogIGtleSBleHBpcmF0aW9uIG9mIHRoZSBwcmltYXJ5IGtleSBpcyBjaGFu Z2VkLgoKICBAaXRlbSB0cnVzdAogIEBvcGluZGV4IGtleWVkaXQ6dHJ1c3QKICBD aGFuZ2UgdGhlIG93bmVyIHRydXN0IHZhbHVlIGZvciB0aGUga2V5LiBUaGlzIHVw ZGF0ZXMgdGhlIHRydXN0LWRiCiAgaW1tZWRpYXRlbHkgYW5kIG5vIHNhdmUgaXMg cmVxdWlyZWQuCgogIEBpdGVtIGRpc2FibGUKICBAaXRlbXggZW5hYmxlCiAgQG9w aW5kZXgga2V5ZWRpdDpkaXNhYmxlCiAgQG9waW5kZXgga2V5ZWRpdDplbmFibGUK ICBEaXNhYmxlIG9yIGVuYWJsZSBhbiBlbnRpcmUga2V5LiBBIGRpc2FibGVkIGtl eSBjYW4gbm90IG5vcm1hbGx5IGJlCiAgdXNlZCBmb3IgZW5jcnlwdGlvbi4KCiAg QGl0ZW0gYWRkcmV2b2tlcgogIEBvcGluZGV4IGtleWVkaXQ6YWRkcmV2b2tlcgog IEFkZCBhIGRlc2lnbmF0ZWQgcmV2b2tlciB0byB0aGUga2V5LiBUaGlzIHRha2Vz IG9uZSBvcHRpb25hbCBhcmd1bWVudDoKICAic2Vuc2l0aXZlIi4gSWYgYSBkZXNp Z25hdGVkIHJldm9rZXIgaXMgbWFya2VkIGFzIHNlbnNpdGl2ZSwgaXQgd2lsbAog IG5vdCBiZSBleHBvcnRlZCBieSBkZWZhdWx0IChzZWUgZXhwb3J0LW9wdGlvbnMp LgoKICBAaXRlbSBwYXNzd2QKICBAb3BpbmRleCBrZXllZGl0OnBhc3N3ZAogIENo YW5nZSB0aGUgcGFzc3BocmFzZSBvZiB0aGUgc2VjcmV0IGtleS4KCiAgQGl0ZW0g dG9nZ2xlCiAgQG9waW5kZXgga2V5ZWRpdDp0b2dnbGUKICBUaGlzIGlzIGR1bW15 IGNvbW1hbmQgd2hpY2ggZXhpc3RzIG9ubHkgZm9yIGJhY2t3YXJkIGNvbXBhdGli aWxpdHkuCgogIEBpdGVtIGNsZWFuCiAgQG9waW5kZXgga2V5ZWRpdDpjbGVhbgog IENvbXBhY3QgKGJ5IHJlbW92aW5nIGFsbCBzaWduYXR1cmVzIGV4Y2VwdCB0aGUg c2VsZnNpZykgYW55IHVzZXIgSUQKICB0aGF0IGlzIG5vIGxvbmdlciB1c2FibGUg KGUuZy4gcmV2b2tlZCwgb3IgZXhwaXJlZCkuIFRoZW4sIHJlbW92ZSBhbnkKICBz aWduYXR1cmVzIHRoYXQgYXJlIG5vdCB1c2FibGUgYnkgdGhlIHRydXN0IGNhbGN1 bGF0aW9ucy4KICBTcGVjaWZpY2FsbHksIHRoaXMgcmVtb3ZlcyBhbnkgc2lnbmF0 dXJlIHRoYXQgZG9lcyBub3QgdmFsaWRhdGUsIGFueQogIHNpZ25hdHVyZSB0aGF0 IGlzIHN1cGVyc2VkZWQgYnkgYSBsYXRlciBzaWduYXR1cmUsIHJldm9rZWQgc2ln bmF0dXJlcywKICBhbmQgc2lnbmF0dXJlcyBpc3N1ZWQgYnkga2V5cyB0aGF0IGFy ZSBub3QgcHJlc2VudCBvbiB0aGUga2V5cmluZy4KCiAgQGl0ZW0gbWluaW1pemUK ICBAb3BpbmRleCBrZXllZGl0Om1pbmltaXplCiAgTWFrZSB0aGUga2V5IGFzIHNt YWxsIGFzIHBvc3NpYmxlLiBUaGlzIHJlbW92ZXMgYWxsIHNpZ25hdHVyZXMgZnJv bQogIGVhY2ggdXNlciBJRCBleGNlcHQgZm9yIHRoZSBtb3N0IHJlY2VudCBzZWxm LXNpZ25hdHVyZS4KCiAgQGl0ZW0gY3Jvc3MtY2VydGlmeQogIEBvcGluZGV4IGtl eWVkaXQ6Y3Jvc3MtY2VydGlmeQogIEFkZCBjcm9zcy1jZXJ0aWZpY2F0aW9uIHNp Z25hdHVyZXMgdG8gc2lnbmluZyBzdWJrZXlzIHRoYXQgbWF5IG5vdAogIGN1cnJl bnRseSBoYXZlIHRoZW0uIENyb3NzLWNlcnRpZmljYXRpb24gc2lnbmF0dXJlcyBw cm90ZWN0IGFnYWluc3QgYQogIHN1YnRsZSBhdHRhY2sgYWdhaW5zdCBzaWduaW5n IHN1YmtleXMuIFNlZQogIEBvcHRpb257LS1yZXF1aXJlLWNyb3NzLWNlcnRpZmlj YXRpb259LiAgQWxsIG5ldyBrZXlzIGdlbmVyYXRlZCBoYXZlCiAgdGhpcyBzaWdu YXR1cmUgYnkgZGVmYXVsdCwgc28gdGhpcyBvcHRpb24gaXMgb25seSB1c2VmdWwg dG8gYnJpbmcKICBvbGRlciBrZXlzIHVwIHRvIGRhdGUuCgogIEBpdGVtIHNhdmUK ICBAb3BpbmRleCBrZXllZGl0OnNhdmUKICBTYXZlIGFsbCBjaGFuZ2VzIHRvIHRo ZSBrZXkgcmluZ3MgYW5kIHF1aXQuCgogIEBpdGVtIHF1aXQKICBAb3BpbmRleCBr ZXllZGl0OnF1aXQKICBRdWl0IHRoZSBwcm9ncmFtIHdpdGhvdXQgdXBkYXRpbmcg dGhlCiAga2V5IHJpbmdzLgpAZW5kIHRhYmxlCgpAYyBtYW46LlJTClRoZSBsaXN0 aW5nIHNob3dzIHlvdSB0aGUga2V5IHdpdGggaXRzIHNlY29uZGFyeSBrZXlzIGFu ZCBhbGwgdXNlcgppZHMuICBUaGUgcHJpbWFyeSB1c2VyIGlkIGlzIGluZGljYXRl ZCBieSBhIGRvdCwgYW5kIHNlbGVjdGVkIGtleXMgb3IKdXNlciBpZHMgYXJlIGlu ZGljYXRlZCBieSBhbiBhc3Rlcmlzay4gIFRoZSB0cnVzdAp2YWx1ZSBpcyBkaXNw bGF5ZWQgd2l0aCB0aGUgcHJpbWFyeSBrZXk6IHRoZSBmaXJzdCBpcyB0aGUgYXNz aWduZWQgb3duZXIKdHJ1c3QgYW5kIHRoZSBzZWNvbmQgaXMgdGhlIGNhbGN1bGF0 ZWQgdHJ1c3QgdmFsdWUuIExldHRlcnMgYXJlIHVzZWQgZm9yCnRoZSB2YWx1ZXM6 CkBjIG1hbjouUkUKCkB0YWJsZSBAYXNpcwoKICBAaXRlbSAtCiAgTm8gb3duZXJ0 cnVzdCBhc3NpZ25lZCAvIG5vdCB5ZXQgY2FsY3VsYXRlZC4KCiAgQGl0ZW0gZQog IFRydXN0CiAgY2FsY3VsYXRpb24gaGFzIGZhaWxlZDsgcHJvYmFibHkgZHVlIHRv IGFuIGV4cGlyZWQga2V5LgoKICBAaXRlbSBxCiAgTm90IGVub3VnaCBpbmZvcm1h dGlvbiBmb3IgY2FsY3VsYXRpb24uCgogIEBpdGVtIG4KICBOZXZlciB0cnVzdCB0 aGlzIGtleS4KCiAgQGl0ZW0gbQogIE1hcmdpbmFsbHkgdHJ1c3RlZC4KCiAgQGl0 ZW0gZgogIEZ1bGx5IHRydXN0ZWQuCgogIEBpdGVtIHUKICBVbHRpbWF0ZWx5IHRy dXN0ZWQuCgpAZW5kIHRhYmxlCkBjICoqKioqKioqIEVuZCBFZGl0LWtleSBPcHRp b25zICoqKioqKioqKioKCkBpdGVtIC0tc2lnbi1rZXkgQGNvZGV7bmFtZX0KQG9w aW5kZXggc2lnbi1rZXkKU2lnbnMgYSBwdWJsaWMga2V5IHdpdGggeW91ciBzZWNy ZXQga2V5LiBUaGlzIGlzIGEgc2hvcnRjdXQgdmVyc2lvbiBvZgp0aGUgc3ViY29t bWFuZCAic2lnbiIgZnJvbSBAb3B0aW9uey0tZWRpdH0uCgpAaXRlbSAtLWxzaWdu LWtleSBAY29kZXtuYW1lfQpAb3BpbmRleCBsc2lnbi1rZXkKU2lnbnMgYSBwdWJs aWMga2V5IHdpdGggeW91ciBzZWNyZXQga2V5IGJ1dCBtYXJrcyBpdCBhcwpub24t ZXhwb3J0YWJsZS4gVGhpcyBpcyBhIHNob3J0Y3V0IHZlcnNpb24gb2YgdGhlIHN1 YmNvbW1hbmQgImxzaWduIgpmcm9tIEBvcHRpb257LS1lZGl0LWtleX0uCgpAaXRl bSAtLXF1aWNrLXNpZ24ta2V5IEBjb2Rle2Zwcn0gW0Bjb2Rle25hbWVzfV0KQGl0 ZW14IC0tcXVpY2stbHNpZ24ta2V5IEBjb2Rle2Zwcn0gW0Bjb2Rle25hbWVzfV0K QG9waW5kZXggcXVpY2stc2lnbi1rZXkKQG9waW5kZXggcXVpY2stbHNpZ24ta2V5 CkRpcmVjdGx5IHNpZ24gYSBrZXkgZnJvbSB0aGUgcGFzc3BocmFzZSB3aXRob3V0 IGFueSBmdXJ0aGVyIHVzZXIKaW50ZXJhY3Rpb24uICBUaGUgQGNvZGV7ZnByfSBt dXN0IGJlIHRoZSB2ZXJpZmllZCBwcmltYXJ5IGZpbmdlcnByaW50Cm9mIGEga2V5 IGluIHRoZSBsb2NhbCBrZXlyaW5nLiBJZiBubyBAY29kZXtuYW1lc30gYXJlIGdp dmVuLCBhbGwKdXNlZnVsIHVzZXIgaWRzIGFyZSBzaWduZWQ7IHdpdGggZ2l2ZW4g W0Bjb2Rle25hbWVzfV0gb25seSB1c2VmdWwgdXNlcgppZHMgbWF0Y2hpbmcgb25l IG9mIHRoZXNlcyBuYW1lcyBhcmUgc2lnbmVkLiAgVGhlIGNvbW1hbmQKQG9wdGlv bnstLXF1aWNrLWxzaWduLWtleX0gbWFya3MgdGhlIHNpZ25hdHVyZXMgYXMgbm9u LWV4cG9ydGFibGUuICBJZgpzdWNoIGEgbm9uLWV4cG9ydGFibGUgc2lnbmF0dXJl IGFscmVhZHkgZXhpc3RzIHRoZQpAb3B0aW9uey0tcXVpY2stc2lnbi1rZXl9IHR1 cm5zIGl0IGludG8gYSBleHBvcnRhYmxlIHNpZ25hdHVyZS4KClRoaXMgY29tbWFu ZCB1c2VzIHJlYXNvbmFibGUgZGVmYXVsdHMgYW5kIHRodXMgZG9lcyBub3QgcHJv dmlkZSB0aGUKZnVsbCBmbGV4aWJpbGl0eSBvZiB0aGUgInNpZ24iIHN1YmNvbW1h bmQgZnJvbSBAb3B0aW9uey0tZWRpdC1rZXl9LgpJdHMgaW50ZW5kZWQgdXNlIGlz IHRvIGhlbHAgdW5hdHRlbmRlZCBrZXkgc2lnbmluZyBieSB1dGlsaXppbmcgYSBs aXN0Cm9mIHZlcmlmaWVkIGZpbmdlcnByaW50cy4KCkBpdGVtIC0tcXVpY2stYWRk dWlkICBAdmFye3VzZXItaWR9IEB2YXJ7bmV3LXVzZXItaWR9CkBvcGluZGV4IHF1 aWNrLWFkZHVpZApUaGlzIGNvbW1hbmQgYWRkcyBhIG5ldyB1c2VyIGlkIHRvIGFu IGV4aXN0aW5nIGtleS4gIEluIGNvbnRyYXN0IHRvCnRoZSBpbnRlcmFjdGl2ZSBz dWItY29tbWFuZCBAY29kZXthZGR1aWR9IG9mIEBvcHRpb257LS1lZGl0LWtleX0g dGhlCkB2YXJ7bmV3LXVzZXItaWR9IGlzIGFkZGVkIHZlcmJhdGltIHdpdGggb25s eSBsZWFkaW5nIGFuZCB0cmFpbGluZwp3aGl0ZSBzcGFjZSByZW1vdmVkLCBpdCBp cyBleHBlY3RlZCB0byBiZSBVVEYtOCBlbmNvZGVkLCBhbmQgbm8gY2hlY2tzCm9u IGl0cyBmb3JtIGFyZSBhcHBsaWVkLgoKQGl0ZW0gLS1wYXNzd2QgQHZhcnt1c2Vy X2lkfQpAb3BpbmRleCBwYXNzd2QKQ2hhbmdlIHRoZSBwYXNzcGhyYXNlIG9mIHRo ZSBzZWNyZXQga2V5IGJlbG9uZ2luZyB0byB0aGUgY2VydGlmaWNhdGUKc3BlY2lm aWVkIGFzIEB2YXJ7dXNlcl9pZH0uICBUaGlzIGlzIGEgc2hvcnRjdXQgZm9yIHRo ZSBzdWItY29tbWFuZApAY29kZXtwYXNzd2R9IG9mIHRoZSBlZGl0IGtleSBtZW51 LgoKQGVuZCB0YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqICAgICAgICAgICAgKioq KioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKiogIE9QVElPTlMgICAqKioq KioqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioq KioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKgpAbWFuc2VjdCBvcHRpb25zCkBub2RlIEdQRyBPcHRpb25zCkBz ZWN0aW9uIE9wdGlvbiBTdW1tYXJ5CgpAY29tbWFuZHtAZ3BnbmFtZX0gZmVhdHVy ZXMgYSBidW5jaCBvZiBvcHRpb25zIHRvIGNvbnRyb2wgdGhlIGV4YWN0CmJlaGF2 aW91ciBhbmQgdG8gY2hhbmdlIHRoZSBkZWZhdWx0IGNvbmZpZ3VyYXRpb24uCgpA bWVudQoqIEdQRyBDb25maWd1cmF0aW9uIE9wdGlvbnM6OiAgIEhvdyB0byBjaGFu Z2UgdGhlIGNvbmZpZ3VyYXRpb24uCiogR1BHIEtleSByZWxhdGVkIE9wdGlvbnM6 OiAgICAgS2V5IHJlbGF0ZWQgb3B0aW9ucy4KKiBHUEcgSW5wdXQgYW5kIE91dHB1 dDo6ICAgICAgICBJbnB1dCBhbmQgT3V0cHV0LgoqIE9wZW5QR1AgT3B0aW9uczo6 ICAgICAgICAgICAgIE9wZW5QR1AgcHJvdG9jb2wgc3BlY2lmaWMgb3B0aW9ucy4K KiBDb21wbGlhbmNlIE9wdGlvbnM6OiAgICAgICAgICBDb21wbGlhbmNlIG9wdGlv bnMuCiogR1BHIEVzb3RlcmljIE9wdGlvbnM6OiAgICAgICAgRG9pbmcgdGhpbmdz IG9uZSB1c3VhbGx5IGRvbid0IHdhbnQgdG8gZG8uCiogRGVwcmVjYXRlZCBPcHRp b25zOjogICAgICAgICAgRGVwcmVjYXRlZCBvcHRpb25zLgpAZW5kIG1lbnUKCkxv bmcgb3B0aW9ucyBjYW4gYmUgcHV0IGluIGFuIG9wdGlvbnMgZmlsZSAoZGVmYXVs dAoifi8uZ251cGcvZ3BnLmNvbmYiKS4gU2hvcnQgb3B0aW9uIG5hbWVzIHdpbGwg bm90IHdvcmsgLSBmb3IgZXhhbXBsZSwKImFybW9yIiBpcyBhIHZhbGlkIG9wdGlv biBmb3IgdGhlIG9wdGlvbnMgZmlsZSwgd2hpbGUgImEiIGlzIG5vdC4gRG8gbm90 CndyaXRlIHRoZSAyIGRhc2hlcywgYnV0IHNpbXBseSB0aGUgbmFtZSBvZiB0aGUg b3B0aW9uIGFuZCBhbnkgcmVxdWlyZWQKYXJndW1lbnRzLiBMaW5lcyB3aXRoIGEg aGFzaCAoJyMnKSBhcyB0aGUgZmlyc3Qgbm9uLXdoaXRlLXNwYWNlCmNoYXJhY3Rl ciBhcmUgaWdub3JlZC4gQ29tbWFuZHMgbWF5IGJlIHB1dCBpbiB0aGlzIGZpbGUg dG9vLCBidXQgdGhhdCBpcwpub3QgZ2VuZXJhbGx5IHVzZWZ1bCBhcyB0aGUgY29t bWFuZCB3aWxsIGV4ZWN1dGUgYXV0b21hdGljYWxseSB3aXRoCmV2ZXJ5IGV4ZWN1 dGlvbiBvZiBncGcuCgpQbGVhc2UgcmVtZW1iZXIgdGhhdCBvcHRpb24gcGFyc2lu ZyBzdG9wcyBhcyBzb29uIGFzIGEgbm9uLW9wdGlvbiBpcwplbmNvdW50ZXJlZCwg eW91IGNhbiBleHBsaWNpdGx5IHN0b3AgcGFyc2luZyBieSB1c2luZyB0aGUgc3Bl Y2lhbCBvcHRpb24KQG9wdGlvbnstLX0uCgpAYyAqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqCkBjICoqKioqKioqICBDT05GSUdVUkFU SU9OIE9QVElPTlMgICoqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKgpAbm9kZSBHUEcgQ29uZmlndXJhdGlvbiBP cHRpb25zCkBzdWJzZWN0aW9uIEhvdyB0byBjaGFuZ2UgdGhlIGNvbmZpZ3VyYXRp b24KClRoZXNlIG9wdGlvbnMgYXJlIHVzZWQgdG8gY2hhbmdlIHRoZSBjb25maWd1 cmF0aW9uIGFuZCBhcmUgdXN1YWxseSBmb3VuZAppbiB0aGUgb3B0aW9uIGZpbGUu CgpAdGFibGUgQGdudXBndGFib3B0CgpAaXRlbSAtLWRlZmF1bHQta2V5IEB2YXJ7 bmFtZX0KQG9waW5kZXggZGVmYXVsdC1rZXkKVXNlIEB2YXJ7bmFtZX0gYXMgdGhl IGRlZmF1bHQga2V5IHRvIHNpZ24gd2l0aC4gSWYgdGhpcyBvcHRpb24gaXMgbm90 CnVzZWQsIHRoZSBkZWZhdWx0IGtleSBpcyB0aGUgZmlyc3Qga2V5IGZvdW5kIGlu IHRoZSBzZWNyZXQga2V5cmluZy4KTm90ZSB0aGF0IEBvcHRpb257LXV9IG9yIEBv cHRpb257LS1sb2NhbC11c2VyfSBvdmVycmlkZXMgdGhpcyBvcHRpb24uClRoaXMg b3B0aW9uIG1heSBiZSBnaXZlbiBtdWx0aXBsZSB0aW1lcy4gIEluIHRoaXMgY2Fz ZSwgdGhlIGxhc3Qga2V5CmZvciB3aGljaCBhIHNlY3JldCBrZXkgaXMgYXZhaWxh YmxlIGlzIHVzZWQuICBJZiB0aGVyZSBpcyBubyBzZWNyZXQKa2V5IGF2YWlsYWJs ZSBmb3IgYW55IG9mIHRoZSBzcGVjaWZpZWQgdmFsdWVzLCBHbnVQRyB3aWxsIG5v dCBlbWl0IGFuCmVycm9yIG1lc3NhZ2UgYnV0IGNvbnRpbnVlIGFzIGlmIHRoaXMg b3B0aW9uIHdhc24ndCBnaXZlbi4KCkBpdGVtIC0tZGVmYXVsdC1yZWNpcGllbnQg QHZhcntuYW1lfQpAb3BpbmRleCBkZWZhdWx0LXJlY2lwaWVudApVc2UgQHZhcntu YW1lfSBhcyBkZWZhdWx0IHJlY2lwaWVudCBpZiBvcHRpb24gQG9wdGlvbnstLXJl Y2lwaWVudH0gaXMKbm90IHVzZWQgYW5kIGRvbid0IGFzayBpZiB0aGlzIGlzIGEg dmFsaWQgb25lLiBAdmFye25hbWV9IG11c3QgYmUKbm9uLWVtcHR5LgoKQGl0ZW0g LS1kZWZhdWx0LXJlY2lwaWVudC1zZWxmCkBvcGluZGV4IGRlZmF1bHQtcmVjaXBp ZW50LXNlbGYKVXNlIHRoZSBkZWZhdWx0IGtleSBhcyBkZWZhdWx0IHJlY2lwaWVu dCBpZiBvcHRpb24gQG9wdGlvbnstLXJlY2lwaWVudH0gaXMgbm90CnVzZWQgYW5k IGRvbid0IGFzayBpZiB0aGlzIGlzIGEgdmFsaWQgb25lLiBUaGUgZGVmYXVsdCBr ZXkgaXMgdGhlIGZpcnN0Cm9uZSBmcm9tIHRoZSBzZWNyZXQga2V5cmluZyBvciB0 aGUgb25lIHNldCB3aXRoIEBvcHRpb257LS1kZWZhdWx0LWtleX0uCgpAaXRlbSAt LW5vLWRlZmF1bHQtcmVjaXBpZW50CkBvcGluZGV4IG5vLWRlZmF1bHQtcmVjaXBp ZW50ClJlc2V0IEBvcHRpb257LS1kZWZhdWx0LXJlY2lwaWVudH0gYW5kIEBvcHRp b257LS1kZWZhdWx0LXJlY2lwaWVudC1zZWxmfS4KCkBpdGVtIC12LCAtLXZlcmJv c2UKQG9waW5kZXggdmVyYm9zZQpHaXZlIG1vcmUgaW5mb3JtYXRpb24gZHVyaW5n IHByb2Nlc3NpbmcuIElmIHVzZWQKdHdpY2UsIHRoZSBpbnB1dCBkYXRhIGlzIGxp c3RlZCBpbiBkZXRhaWwuCgpAaXRlbSAtLW5vLXZlcmJvc2UKQG9waW5kZXggbm8t dmVyYm9zZQpSZXNldCB2ZXJib3NlIGxldmVsIHRvIDAuCgpAaXRlbSAtcSwgLS1x dWlldApAb3BpbmRleCBxdWlldApUcnkgdG8gYmUgYXMgcXVpZXQgYXMgcG9zc2li bGUuCgpAaXRlbSAtLWJhdGNoCkBpdGVteCAtLW5vLWJhdGNoCkBvcGluZGV4IGJh dGNoCkBvcGluZGV4IG5vLWJhdGNoClVzZSBiYXRjaCBtb2RlLiAgTmV2ZXIgYXNr LCBkbyBub3QgYWxsb3cgaW50ZXJhY3RpdmUgY29tbWFuZHMuCkBvcHRpb257LS1u by1iYXRjaH0gZGlzYWJsZXMgdGhpcyBvcHRpb24uICBOb3RlIHRoYXQgZXZlbiB3 aXRoIGEKZmlsZW5hbWUgZ2l2ZW4gb24gdGhlIGNvbW1hbmQgbGluZSwgZ3BnIG1p Z2h0IHN0aWxsIG5lZWQgdG8gcmVhZCBmcm9tClNURElOIChpbiBwYXJ0aWN1bGFy IGlmIGdwZyBmaWd1cmVzIHRoYXQgdGhlIGlucHV0IGlzIGEKZGV0YWNoZWQgc2ln bmF0dXJlIGFuZCBubyBkYXRhIGZpbGUgaGFzIGJlZW4gc3BlY2lmaWVkKS4gIFRo dXMgaWYgeW91CmRvIG5vdCB3YW50IHRvIGZlZWQgZGF0YSB2aWEgU1RESU4sIHlv dSBzaG91bGQgY29ubmVjdCBTVERJTiB0bwpAZmlsZXsvZGV2L251bGx9LgoKQGl0 ZW0gLS1uby10dHkKQG9waW5kZXggbm8tdHR5Ck1ha2Ugc3VyZSB0aGF0IHRoZSBU VFkgKHRlcm1pbmFsKSBpcyBuZXZlciB1c2VkIGZvciBhbnkgb3V0cHV0LgpUaGlz IG9wdGlvbiBpcyBuZWVkZWQgaW4gc29tZSBjYXNlcyBiZWNhdXNlIEdudVBHIHNv bWV0aW1lcyBwcmludHMKd2FybmluZ3MgdG8gdGhlIFRUWSBldmVuIGlmIEBvcHRp b257LS1iYXRjaH0gaXMgdXNlZC4KCkBpdGVtIC0teWVzCkBvcGluZGV4IHllcwpB c3N1bWUgInllcyIgb24gbW9zdCBxdWVzdGlvbnMuCgpAaXRlbSAtLW5vCkBvcGlu ZGV4IG5vCkFzc3VtZSAibm8iIG9uIG1vc3QgcXVlc3Rpb25zLgoKCkBpdGVtIC0t bGlzdC1vcHRpb25zIEBjb2Rle3BhcmFtZXRlcnN9CkBvcGluZGV4IGxpc3Qtb3B0 aW9ucwpUaGlzIGlzIGEgc3BhY2Ugb3IgY29tbWEgZGVsaW1pdGVkIHN0cmluZyB0 aGF0IGdpdmVzIG9wdGlvbnMgdXNlZCB3aGVuCmxpc3Rpbmcga2V5cyBhbmQgc2ln bmF0dXJlcyAodGhhdCBpcywgQG9wdGlvbnstLWxpc3Qta2V5c30sCkBvcHRpb257 LS1saXN0LXNpZ3N9LCBAb3B0aW9uey0tbGlzdC1wdWJsaWMta2V5c30sCkBvcHRp b257LS1saXN0LXNlY3JldC1rZXlzfSwgYW5kIHRoZSBAb3B0aW9uey0tZWRpdC1r ZXl9IGZ1bmN0aW9ucykuCk9wdGlvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGEg QG9wdGlvbntuby19IChhZnRlciB0aGUgdHdvIGRhc2hlcykgdG8KZ2l2ZSB0aGUg b3Bwb3NpdGUgbWVhbmluZy4gIFRoZSBvcHRpb25zIGFyZToKCkB0YWJsZSBAYXNp cwoKICBAaXRlbSBzaG93LXBob3RvcwogIEBvcGluZGV4IGxpc3Qtb3B0aW9uczpz aG93LXBob3RvcwogIENhdXNlcyBAb3B0aW9uey0tbGlzdC1rZXlzfSwgQG9wdGlv bnstLWxpc3Qtc2lnc30sCiAgQG9wdGlvbnstLWxpc3QtcHVibGljLWtleXN9LCBh bmQgQG9wdGlvbnstLWxpc3Qtc2VjcmV0LWtleXN9IHRvCiAgZGlzcGxheSBhbnkg cGhvdG8gSURzIGF0dGFjaGVkIHRvIHRoZSBrZXkuICBEZWZhdWx0cyB0byBuby4g U2VlIGFsc28KICBAb3B0aW9uey0tcGhvdG8tdmlld2VyfS4gIERvZXMgbm90IHdv cmsgd2l0aCBAb3B0aW9uey0td2l0aC1jb2xvbnN9OgogIHNlZSBAb3B0aW9uey0t YXR0cmlidXRlLWZkfSBmb3IgdGhlIGFwcHJvcHJpYXRlIHdheSB0byBnZXQgcGhv dG8gZGF0YQogIGZvciBzY3JpcHRzIGFuZCBvdGhlciBmcm9udGVuZHMuCgogIEBp dGVtIHNob3ctdXNhZ2UKICBAb3BpbmRleCBsaXN0LW9wdGlvbnM6c2hvdy11c2Fn ZQogIFNob3cgdXNhZ2UgaW5mb3JtYXRpb24gZm9yIGtleXMgYW5kIHN1YmtleXMg aW4gdGhlIHN0YW5kYXJkIGtleQogIGxpc3RpbmcuICBUaGlzIGlzIGEgbGlzdCBv ZiBsZXR0ZXJzIGluZGljYXRpbmcgdGhlIGFsbG93ZWQgdXNhZ2UgZm9yIGEKICBr ZXkgKEBjb2Rle0V9PWVuY3J5cHRpb24sIEBjb2Rle1N9PXNpZ25pbmcsIEBjb2Rl e0N9PWNlcnRpZmljYXRpb24sCiAgQGNvZGV7QX09YXV0aGVudGljYXRpb24pLiAg RGVmYXVsdHMgdG8gbm8uCgogIEBpdGVtIHNob3ctcG9saWN5LXVybHMKICBAb3Bp bmRleCBsaXN0LW9wdGlvbnM6c2hvdy1wb2xpY3ktdXJscwogIFNob3cgcG9saWN5 IFVSTHMgaW4gdGhlIEBvcHRpb257LS1saXN0LXNpZ3N9IG9yIEBvcHRpb257LS1j aGVjay1zaWdzfQogIGxpc3RpbmdzLiAgRGVmYXVsdHMgdG8gbm8uCgogIEBpdGVt IHNob3ctbm90YXRpb25zCiAgQGl0ZW14IHNob3ctc3RkLW5vdGF0aW9ucwogIEBp dGVteCBzaG93LXVzZXItbm90YXRpb25zCiAgQG9waW5kZXggbGlzdC1vcHRpb25z OnNob3ctbm90YXRpb25zCiAgQG9waW5kZXggbGlzdC1vcHRpb25zOnNob3ctc3Rk LW5vdGF0aW9ucwogIEBvcGluZGV4IGxpc3Qtb3B0aW9uczpzaG93LXVzZXItbm90 YXRpb25zCiAgU2hvdyBhbGwsIElFVEYgc3RhbmRhcmQsIG9yIHVzZXItZGVmaW5l ZCBzaWduYXR1cmUgbm90YXRpb25zIGluIHRoZQogIEBvcHRpb257LS1saXN0LXNp Z3N9IG9yIEBvcHRpb257LS1jaGVjay1zaWdzfSBsaXN0aW5ncy4gRGVmYXVsdHMg dG8gbm8uCgogIEBpdGVtIHNob3cta2V5c2VydmVyLXVybHMKICBAb3BpbmRleCBs aXN0LW9wdGlvbnM6c2hvdy1rZXlzZXJ2ZXItdXJscwogIFNob3cgYW55IHByZWZl cnJlZCBrZXlzZXJ2ZXIgVVJMIGluIHRoZSBAb3B0aW9uey0tbGlzdC1zaWdzfSBv cgogIEBvcHRpb257LS1jaGVjay1zaWdzfSBsaXN0aW5ncy4gRGVmYXVsdHMgdG8g bm8uCgogIEBpdGVtIHNob3ctdWlkLXZhbGlkaXR5CiAgQG9waW5kZXggbGlzdC1v cHRpb25zOnNob3ctdWlkLXZhbGlkaXR5CiAgRGlzcGxheSB0aGUgY2FsY3VsYXRl ZCB2YWxpZGl0eSBvZiB1c2VyIElEcyBkdXJpbmcga2V5IGxpc3RpbmdzLgogIERl ZmF1bHRzIHRvIHllcy4KCiAgQGl0ZW0gc2hvdy11bnVzYWJsZS11aWRzCiAgQG9w aW5kZXggbGlzdC1vcHRpb25zOnNob3ctdW51c2FibGUtdWlkcwogIFNob3cgcmV2 b2tlZCBhbmQgZXhwaXJlZCB1c2VyIElEcyBpbiBrZXkgbGlzdGluZ3MuIERlZmF1 bHRzIHRvIG5vLgoKICBAaXRlbSBzaG93LXVudXNhYmxlLXN1YmtleXMKICBAb3Bp bmRleCBsaXN0LW9wdGlvbnM6c2hvdy11bnVzYWJsZS1zdWJrZXlzCiAgU2hvdyBy ZXZva2VkIGFuZCBleHBpcmVkIHN1YmtleXMgaW4ga2V5IGxpc3RpbmdzLiBEZWZh dWx0cyB0byBuby4KCiAgQGl0ZW0gc2hvdy1rZXlyaW5nCiAgQG9waW5kZXggbGlz dC1vcHRpb25zOnNob3cta2V5cmluZwogIERpc3BsYXkgdGhlIGtleXJpbmcgbmFt ZSBhdCB0aGUgaGVhZCBvZiBrZXkgbGlzdGluZ3MgdG8gc2hvdyB3aGljaAogIGtl eXJpbmcgYSBnaXZlbiBrZXkgcmVzaWRlcyBvbi4gRGVmYXVsdHMgdG8gbm8uCgog IEBpdGVtIHNob3ctc2lnLWV4cGlyZQogIEBvcGluZGV4IGxpc3Qtb3B0aW9uczpz aG93LXNpZy1leHBpcmUKICBTaG93IHNpZ25hdHVyZSBleHBpcmF0aW9uIGRhdGVz IChpZiBhbnkpIGR1cmluZyBAb3B0aW9uey0tbGlzdC1zaWdzfSBvcgogIEBvcHRp b257LS1jaGVjay1zaWdzfSBsaXN0aW5ncy4gRGVmYXVsdHMgdG8gbm8uCgogIEBp dGVtIHNob3ctc2lnLXN1YnBhY2tldHMKICBAb3BpbmRleCBsaXN0LW9wdGlvbnM6 c2hvdy1zaWctc3VicGFja2V0cwogIEluY2x1ZGUgc2lnbmF0dXJlIHN1YnBhY2tl dHMgaW4gdGhlIGtleSBsaXN0aW5nLiBUaGlzIG9wdGlvbiBjYW4gdGFrZSBhbgog IG9wdGlvbmFsIGFyZ3VtZW50IGxpc3Qgb2YgdGhlIHN1YnBhY2tldHMgdG8gbGlz dC4gSWYgbm8gYXJndW1lbnQgaXMKICBwYXNzZWQsIGxpc3QgYWxsIHN1YnBhY2tl dHMuIERlZmF1bHRzIHRvIG5vLiBUaGlzIG9wdGlvbiBpcyBvbmx5CiAgbWVhbmlu Z2Z1bCB3aGVuIHVzaW5nIEBvcHRpb257LS13aXRoLWNvbG9uc30gYWxvbmcgd2l0 aAogIEBvcHRpb257LS1saXN0LXNpZ3N9IG9yIEBvcHRpb257LS1jaGVjay1zaWdz fS4KCkBlbmQgdGFibGUKCkBpdGVtIC0tdmVyaWZ5LW9wdGlvbnMgQGNvZGV7cGFy YW1ldGVyc30KQG9waW5kZXggdmVyaWZ5LW9wdGlvbnMKVGhpcyBpcyBhIHNwYWNl IG9yIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgdGhhdCBnaXZlcyBvcHRpb25zIHVz ZWQgd2hlbgp2ZXJpZnlpbmcgc2lnbmF0dXJlcy4gT3B0aW9ucyBjYW4gYmUgcHJl cGVuZGVkIHdpdGggYSBgbm8tJyB0byBnaXZlCnRoZSBvcHBvc2l0ZSBtZWFuaW5n LiBUaGUgb3B0aW9ucyBhcmU6CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gc2hvdy1w aG90b3MKICBAb3BpbmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXBob3RvcwogIERp c3BsYXkgYW55IHBob3RvIElEcyBwcmVzZW50IG9uIHRoZSBrZXkgdGhhdCBpc3N1 ZWQgdGhlIHNpZ25hdHVyZS4KICBEZWZhdWx0cyB0byBuby4gU2VlIGFsc28gQG9w dGlvbnstLXBob3RvLXZpZXdlcn0uCgogIEBpdGVtIHNob3ctcG9saWN5LXVybHMK ICBAb3BpbmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXBvbGljeS11cmxzCiAgU2hv dyBwb2xpY3kgVVJMcyBpbiB0aGUgc2lnbmF0dXJlIGJlaW5nIHZlcmlmaWVkLiBE ZWZhdWx0cyB0byB5ZXMuCgogIEBpdGVtIHNob3ctbm90YXRpb25zCiAgQGl0ZW14 IHNob3ctc3RkLW5vdGF0aW9ucwogIEBpdGVteCBzaG93LXVzZXItbm90YXRpb25z CiAgQG9waW5kZXggdmVyaWZ5LW9wdGlvbnM6c2hvdy1ub3RhdGlvbnMKICBAb3Bp bmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXN0ZC1ub3RhdGlvbnMKICBAb3BpbmRl eCB2ZXJpZnktb3B0aW9uczpzaG93LXVzZXItbm90YXRpb25zCiAgU2hvdyBhbGws IElFVEYgc3RhbmRhcmQsIG9yIHVzZXItZGVmaW5lZCBzaWduYXR1cmUgbm90YXRp b25zIGluIHRoZQogIHNpZ25hdHVyZSBiZWluZyB2ZXJpZmllZC4gRGVmYXVsdHMg dG8gSUVURiBzdGFuZGFyZC4KCiAgQGl0ZW0gc2hvdy1rZXlzZXJ2ZXItdXJscwog IEBvcGluZGV4IHZlcmlmeS1vcHRpb25zOnNob3cta2V5c2VydmVyLXVybHMKICBT aG93IGFueSBwcmVmZXJyZWQga2V5c2VydmVyIFVSTCBpbiB0aGUgc2lnbmF0dXJl IGJlaW5nIHZlcmlmaWVkLgogIERlZmF1bHRzIHRvIHllcy4KCiAgQGl0ZW0gc2hv dy11aWQtdmFsaWRpdHkKICBAb3BpbmRleCB2ZXJpZnktb3B0aW9uczpzaG93LXVp ZC12YWxpZGl0eQogIERpc3BsYXkgdGhlIGNhbGN1bGF0ZWQgdmFsaWRpdHkgb2Yg dGhlIHVzZXIgSURzIG9uIHRoZSBrZXkgdGhhdCBpc3N1ZWQKICB0aGUgc2lnbmF0 dXJlLiBEZWZhdWx0cyB0byB5ZXMuCgogIEBpdGVtIHNob3ctdW51c2FibGUtdWlk cwogIEBvcGluZGV4IHZlcmlmeS1vcHRpb25zOnNob3ctdW51c2FibGUtdWlkcwog IFNob3cgcmV2b2tlZCBhbmQgZXhwaXJlZCB1c2VyIElEcyBkdXJpbmcgc2lnbmF0 dXJlIHZlcmlmaWNhdGlvbi4KICBEZWZhdWx0cyB0byBuby4KCiAgQGl0ZW0gc2hv dy1wcmltYXJ5LXVpZC1vbmx5CiAgQG9waW5kZXggdmVyaWZ5LW9wdGlvbnM6c2hv dy1wcmltYXJ5LXVpZC1vbmx5CiAgU2hvdyBvbmx5IHRoZSBwcmltYXJ5IHVzZXIg SUQgZHVyaW5nIHNpZ25hdHVyZSB2ZXJpZmljYXRpb24uICBUaGF0IGlzCiAgYWxs IHRoZSBBS0EgbGluZXMgYXMgd2VsbCBhcyBwaG90byBJZHMgYXJlIG5vdCBzaG93 biB3aXRoIHRoZSBzaWduYXR1cmUKICB2ZXJpZmljYXRpb24gc3RhdHVzLgoKICBA aXRlbSBwa2EtbG9va3VwcwogIEBvcGluZGV4IHZlcmlmeS1vcHRpb25zOnBrYS1s b29rdXBzCiAgRW5hYmxlIFBLQSBsb29rdXBzIHRvIHZlcmlmeSBzZW5kZXIgYWRk cmVzc2VzLiBOb3RlIHRoYXQgUEtBIGlzIGJhc2VkCiAgb24gRE5TLCBhbmQgc28g ZW5hYmxpbmcgdGhpcyBvcHRpb24gbWF5IGRpc2Nsb3NlIGluZm9ybWF0aW9uIG9u IHdoZW4KICBhbmQgd2hhdCBzaWduYXR1cmVzIGFyZSB2ZXJpZmllZCBvciB0byB3 aG9tIGRhdGEgaXMgZW5jcnlwdGVkLiBUaGlzCiAgaXMgc2ltaWxhciB0byB0aGUg IndlYiBidWciIGRlc2NyaWJlZCBmb3IgdGhlIGF1dG8ta2V5LXJldHJpZXZlCiAg ZmVhdHVyZS4KCiAgQGl0ZW0gcGthLXRydXN0LWluY3JlYXNlCiAgQG9waW5kZXgg dmVyaWZ5LW9wdGlvbnM6cGthLXRydXN0LWluY3JlYXNlCiAgUmFpc2UgdGhlIHRy dXN0IGluIGEgc2lnbmF0dXJlIHRvIGZ1bGwgaWYgdGhlIHNpZ25hdHVyZSBwYXNz ZXMgUEtBCiAgdmFsaWRhdGlvbi4gVGhpcyBvcHRpb24gaXMgb25seSBtZWFuaW5n ZnVsIGlmIHBrYS1sb29rdXBzIGlzIHNldC4KQGVuZCB0YWJsZQoKQGl0ZW0gLS1l bmFibGUtbGFyZ2UtcnNhCkBpdGVteCAtLWRpc2FibGUtbGFyZ2UtcnNhCkBvcGlu ZGV4IGVuYWJsZS1sYXJnZS1yc2EKQG9waW5kZXggZGlzYWJsZS1sYXJnZS1yc2EK V2l0aCAtLWdlbi1rZXkgYW5kIC0tYmF0Y2gsIGVuYWJsZSB0aGUgY3JlYXRpb24g b2YgbGFyZ2VyIFJTQSBzZWNyZXQKa2V5cyB0aGFuIGlzIGdlbmVyYWxseSByZWNv bW1lbmRlZCAodXAgdG8gODE5MiBiaXRzKS4gIFRoZXNlIGxhcmdlCmtleXMgYXJl IG1vcmUgZXhwZW5zaXZlIHRvIHVzZSwgYW5kIHRoZWlyIHNpZ25hdHVyZXMgYW5k CmNlcnRpZmljYXRpb25zIGFyZSBhbHNvIGxhcmdlci4KCkBpdGVtIC0tZW5hYmxl LWRzYTIKQGl0ZW14IC0tZGlzYWJsZS1kc2EyCkBvcGluZGV4IGVuYWJsZS1kc2Ey CkBvcGluZGV4IGRpc2FibGUtZHNhMgpFbmFibGUgaGFzaCB0cnVuY2F0aW9uIGZv ciBhbGwgRFNBIGtleXMgZXZlbiBmb3Igb2xkIERTQSBLZXlzIHVwIHRvCjEwMjQg Yml0LiAgVGhpcyBpcyBhbHNvIHRoZSBkZWZhdWx0IHdpdGggQG9wdGlvbnstLW9w ZW5wZ3B9LiAgTm90ZQp0aGF0IG9sZGVyIHZlcnNpb25zIG9mIEdudVBHIGFsc28g cmVxdWlyZWQgdGhpcyBmbGFnIHRvIGFsbG93IHRoZQpnZW5lcmF0aW9uIG9mIERT QSBsYXJnZXIgdGhhbiAxMDI0IGJpdC4KCkBpdGVtIC0tcGhvdG8tdmlld2VyIEBj b2Rle3N0cmluZ30KQG9waW5kZXggcGhvdG8tdmlld2VyClRoaXMgaXMgdGhlIGNv bW1hbmQgbGluZSB0aGF0IHNob3VsZCBiZSBydW4gdG8gdmlldyBhIHBob3RvIElE LiAiJWkiCndpbGwgYmUgZXhwYW5kZWQgdG8gYSBmaWxlbmFtZSBjb250YWluaW5n IHRoZSBwaG90by4gIiVJIiBkb2VzIHRoZQpzYW1lLCBleGNlcHQgdGhlIGZpbGUg d2lsbCBub3QgYmUgZGVsZXRlZCBvbmNlIHRoZSB2aWV3ZXIgZXhpdHMuCk90aGVy IGZsYWdzIGFyZSAiJWsiIGZvciB0aGUga2V5IElELCAiJUsiIGZvciB0aGUgbG9u ZyBrZXkgSUQsICIlZiIKZm9yIHRoZSBrZXkgZmluZ2VycHJpbnQsICIldCIgZm9y IHRoZSBleHRlbnNpb24gb2YgdGhlIGltYWdlIHR5cGUKKGUuZy4gImpwZyIpLCAi JVQiIGZvciB0aGUgTUlNRSB0eXBlIG9mIHRoZSBpbWFnZSAoZS5nLiAiaW1hZ2Uv anBlZyIpLAoiJXYiIGZvciB0aGUgc2luZ2xlLWNoYXJhY3RlciBjYWxjdWxhdGVk IHZhbGlkaXR5IG9mIHRoZSBpbWFnZSBiZWluZwp2aWV3ZWQgKGUuZy4gImYiKSwg IiVWIiBmb3IgdGhlIGNhbGN1bGF0ZWQgdmFsaWRpdHkgYXMgYSBzdHJpbmcgKGUu Zy4KImZ1bGwiKSwgIiVVIiBmb3IgYSBiYXNlMzIgZW5jb2RlZCBoYXNoIG9mIHRo ZSB1c2VyIElELAphbmQgIiUlIiBmb3IgYW4gYWN0dWFsIHBlcmNlbnQgc2lnbi4g SWYgbmVpdGhlciAlaSBvciAlSSBhcmUgcHJlc2VudCwKdGhlbiB0aGUgcGhvdG8g d2lsbCBiZSBzdXBwbGllZCB0byB0aGUgdmlld2VyIG9uIHN0YW5kYXJkIGlucHV0 LgoKVGhlIGRlZmF1bHQgdmlld2VyIGlzICJ4bG9hZGltYWdlIC1mb3JrIC1xdWll dCAtdGl0bGUgJ0tleUlEIDB4JWsnClNURElOIi4gTm90ZSB0aGF0IGlmIHlvdXIg aW1hZ2Ugdmlld2VyIHByb2dyYW0gaXMgbm90IHNlY3VyZSwgdGhlbgpleGVjdXRp bmcgaXQgZnJvbSBHbnVQRyBkb2VzIG5vdCBtYWtlIGl0IHNlY3VyZS4KCkBpdGVt IC0tZXhlYy1wYXRoIEBjb2Rle3N0cmluZ30KQG9waW5kZXggZXhlYy1wYXRoClNl dHMgYSBsaXN0IG9mIGRpcmVjdG9yaWVzIHRvIHNlYXJjaCBmb3IgcGhvdG8gdmll d2VycyBhbmQga2V5c2VydmVyCmhlbHBlcnMuIElmIG5vdCBwcm92aWRlZCwga2V5 c2VydmVyIGhlbHBlcnMgdXNlIHRoZSBjb21waWxlZC1pbgpkZWZhdWx0IGRpcmVj dG9yeSwgYW5kIHBob3RvIHZpZXdlcnMgdXNlIHRoZSAkUEFUSCBlbnZpcm9ubWVu dAp2YXJpYWJsZS4KTm90ZSwgdGhhdCBvbiBXMzIgc3lzdGVtIHRoaXMgdmFsdWUg aXMgaWdub3JlZCB3aGVuIHNlYXJjaGluZyBmb3IKa2V5c2VydmVyIGhlbHBlcnMu CgpAaXRlbSAtLWtleXJpbmcgQGNvZGV7ZmlsZX0KQG9waW5kZXgga2V5cmluZwpB ZGQgQGNvZGV7ZmlsZX0gdG8gdGhlIGN1cnJlbnQgbGlzdCBvZiBrZXlyaW5ncy4g SWYgQGNvZGV7ZmlsZX0gYmVnaW5zCndpdGggYSB0aWxkZSBhbmQgYSBzbGFzaCwg dGhlc2UgYXJlIHJlcGxhY2VkIGJ5IHRoZSAkSE9NRSBkaXJlY3RvcnkuIElmCnRo ZSBmaWxlbmFtZSBkb2VzIG5vdCBjb250YWluIGEgc2xhc2gsIGl0IGlzIGFzc3Vt ZWQgdG8gYmUgaW4gdGhlIEdudVBHCmhvbWUgZGlyZWN0b3J5ICgifi8uZ251cGci IGlmIEBvcHRpb257LS1ob21lZGlyfSBvciAkR05VUEdIT01FIGlzIG5vdAp1c2Vk KS4KCk5vdGUgdGhhdCB0aGlzIGFkZHMgYSBrZXlyaW5nIHRvIHRoZSBjdXJyZW50 IGxpc3QuIElmIHRoZSBpbnRlbnQgaXMgdG8KdXNlIHRoZSBzcGVjaWZpZWQga2V5 cmluZyBhbG9uZSwgdXNlIEBvcHRpb257LS1rZXlyaW5nfSBhbG9uZyB3aXRoCkBv cHRpb257LS1uby1kZWZhdWx0LWtleXJpbmd9LgoKQGl0ZW0gLS1zZWNyZXQta2V5 cmluZyBAY29kZXtmaWxlfQpAb3BpbmRleCBzZWNyZXQta2V5cmluZwpUaGlzIGlz IGFuIG9ic29sZXRlIG9wdGlvbiBhbmQgaWdub3JlZC4gIEFsbCBzZWNyZXQga2V5 cyBhcmUgc3RvcmVkIGluCnRoZSBAZmlsZXtwcml2YXRlLWtleXMtdjEuZH0gZGly ZWN0b3J5IGJlbG93IHRoZSBHbnVQRyBob21lIGRpcmVjdG9yeS4KCkBpdGVtIC0t cHJpbWFyeS1rZXlyaW5nIEBjb2Rle2ZpbGV9CkBvcGluZGV4IHByaW1hcnkta2V5 cmluZwpEZXNpZ25hdGUgQGNvZGV7ZmlsZX0gYXMgdGhlIHByaW1hcnkgcHVibGlj IGtleXJpbmcuIFRoaXMgbWVhbnMgdGhhdApuZXdseSBpbXBvcnRlZCBrZXlzICh2 aWEgQG9wdGlvbnstLWltcG9ydH0gb3Iga2V5c2VydmVyCkBvcHRpb257LS1yZWN2 LWZyb219KSB3aWxsIGdvIHRvIHRoaXMga2V5cmluZy4KCkBpdGVtIC0tdHJ1c3Rk Yi1uYW1lIEBjb2Rle2ZpbGV9CkBvcGluZGV4IHRydXN0ZGItbmFtZQpVc2UgQGNv ZGV7ZmlsZX0gaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCB0cnVzdGRiLiBJZiBAY29k ZXtmaWxlfSBiZWdpbnMKd2l0aCBhIHRpbGRlIGFuZCBhIHNsYXNoLCB0aGVzZSBh cmUgcmVwbGFjZWQgYnkgdGhlICRIT01FIGRpcmVjdG9yeS4gSWYKdGhlIGZpbGVu YW1lIGRvZXMgbm90IGNvbnRhaW4gYSBzbGFzaCwgaXQgaXMgYXNzdW1lZCB0byBi ZSBpbiB0aGUgR251UEcKaG9tZSBkaXJlY3RvcnkgKEBmaWxle34vLmdudXBnfSBp ZiBAb3B0aW9uey0taG9tZWRpcn0gb3IgJEdOVVBHSE9NRSBpcwpub3QgdXNlZCku CgpAaW5jbHVkZSBvcHQtaG9tZWRpci50ZXhpCgoKQGl0ZW0gLS1kaXNwbGF5LWNo YXJzZXQgQGNvZGV7bmFtZX0KQG9waW5kZXggZGlzcGxheS1jaGFyc2V0ClNldCB0 aGUgbmFtZSBvZiB0aGUgbmF0aXZlIGNoYXJhY3RlciBzZXQuIFRoaXMgaXMgdXNl ZCB0byBjb252ZXJ0CnNvbWUgaW5mb3JtYXRpb25hbCBzdHJpbmdzIGxpa2UgdXNl ciBJRHMgdG8gdGhlIHByb3BlciBVVEYtOCBlbmNvZGluZy4KTm90ZSB0aGF0IHRo aXMgaGFzIG5vdGhpbmcgdG8gZG8gd2l0aCB0aGUgY2hhcmFjdGVyIHNldCBvZiBk YXRhIHRvIGJlCmVuY3J5cHRlZCBvciBzaWduZWQ7IEdudVBHIGRvZXMgbm90IHJl Y29kZSB1c2VyLXN1cHBsaWVkIGRhdGEuIElmCnRoaXMgb3B0aW9uIGlzIG5vdCB1 c2VkLCB0aGUgZGVmYXVsdCBjaGFyYWN0ZXIgc2V0IGlzIGRldGVybWluZWQgZnJv bQp0aGUgY3VycmVudCBsb2NhbGUuIEEgdmVyYm9zaXR5IGxldmVsIG9mIDMgc2hv d3MgdGhlIGNob3NlbiBzZXQuClZhbGlkIHZhbHVlcyBmb3IgQGNvZGV7bmFtZX0g YXJlOgoKQHRhYmxlIEBhc2lzCgogIEBpdGVtIGlzby04ODU5LTEKICBAb3BpbmRl eCBkaXNwbGF5LWNoYXJzZXQ6aXNvLTg4NTktMQogIFRoaXMgaXMgdGhlIExhdGlu IDEgc2V0LgoKICBAaXRlbSBpc28tODg1OS0yCiAgQG9waW5kZXggZGlzcGxheS1j aGFyc2V0Omlzby04ODU5LTIKICBUaGUgTGF0aW4gMiBzZXQuCgogIEBpdGVtIGlz by04ODU5LTE1CiAgQG9waW5kZXggZGlzcGxheS1jaGFyc2V0Omlzby04ODU5LTE1 CiAgVGhpcyBpcyBjdXJyZW50bHkgYW4gYWxpYXMgZm9yCiAgdGhlIExhdGluIDEg c2V0LgoKICBAaXRlbSBrb2k4LXIKICBAb3BpbmRleCBkaXNwbGF5LWNoYXJzZXQ6 a29pOC1yCiAgVGhlIHVzdWFsIFJ1c3NpYW4gc2V0IChyZmMxNDg5KS4KCiAgQGl0 ZW0gdXRmLTgKICBAb3BpbmRleCBkaXNwbGF5LWNoYXJzZXQ6dXRmLTgKICBCeXBh c3MgYWxsIHRyYW5zbGF0aW9ucyBhbmQgYXNzdW1lCiAgdGhhdCB0aGUgT1MgdXNl cyBuYXRpdmUgVVRGLTggZW5jb2RpbmcuCkBlbmQgdGFibGUKCkBpdGVtIC0tdXRm OC1zdHJpbmdzCkBpdGVteCAtLW5vLXV0Zjgtc3RyaW5ncwpAb3BpbmRleCB1dGY4 LXN0cmluZ3MKQXNzdW1lIHRoYXQgY29tbWFuZCBsaW5lIGFyZ3VtZW50cyBhcmUg Z2l2ZW4gYXMgVVRGOCBzdHJpbmdzLiBUaGUKZGVmYXVsdCAoQG9wdGlvbnstLW5v LXV0Zjgtc3RyaW5nc30pIGlzIHRvIGFzc3VtZSB0aGF0IGFyZ3VtZW50cyBhcmUK ZW5jb2RlZCBpbiB0aGUgY2hhcmFjdGVyIHNldCBhcyBzcGVjaWZpZWQgYnkKQG9w dGlvbnstLWRpc3BsYXktY2hhcnNldH0uIFRoZXNlIG9wdGlvbnMgYWZmZWN0IGFs bCBmb2xsb3dpbmcKYXJndW1lbnRzLiBCb3RoIG9wdGlvbnMgbWF5IGJlIHVzZWQg bXVsdGlwbGUgdGltZXMuCgpAYW5jaG9ye2dwZy1vcHRpb24gLS1vcHRpb25zfQpA aXRlbSAtLW9wdGlvbnMgQGNvZGV7ZmlsZX0KQG9waW5kZXggb3B0aW9ucwpSZWFk IG9wdGlvbnMgZnJvbSBAY29kZXtmaWxlfSBhbmQgZG8gbm90IHRyeSB0byByZWFk IHRoZW0gZnJvbSB0aGUKZGVmYXVsdCBvcHRpb25zIGZpbGUgaW4gdGhlIGhvbWVk aXIgKHNlZSBAb3B0aW9uey0taG9tZWRpcn0pLiBUaGlzCm9wdGlvbiBpcyBpZ25v cmVkIGlmIHVzZWQgaW4gYW4gb3B0aW9ucyBmaWxlLgoKQGl0ZW0gLS1uby1vcHRp b25zCkBvcGluZGV4IG5vLW9wdGlvbnMKU2hvcnRjdXQgZm9yIEBvcHRpb257LS1v cHRpb25zIC9kZXYvbnVsbH0uIFRoaXMgb3B0aW9uIGlzIGRldGVjdGVkCmJlZm9y ZSBhbiBhdHRlbXB0IHRvIG9wZW4gYW4gb3B0aW9uIGZpbGUuICBVc2luZyB0aGlz IG9wdGlvbiB3aWxsIGFsc28KcHJldmVudCB0aGUgY3JlYXRpb24gb2YgYSBAZmls ZXt+Ly5nbnVwZ30gaG9tZWRpci4KCkBpdGVtIC16IEBjb2Rle259CkBpdGVteCAt LWNvbXByZXNzLWxldmVsIEBjb2Rle259CkBpdGVteCAtLWJ6aXAyLWNvbXByZXNz LWxldmVsIEBjb2Rle259CkBvcGluZGV4IGNvbXByZXNzLWxldmVsCkBvcGluZGV4 IGJ6aXAyLWNvbXByZXNzLWxldmVsClNldCBjb21wcmVzc2lvbiBsZXZlbCB0byBA Y29kZXtufSBmb3IgdGhlIFpJUCBhbmQgWkxJQiBjb21wcmVzc2lvbgphbGdvcml0 aG1zLiBUaGUgZGVmYXVsdCBpcyB0byB1c2UgdGhlIGRlZmF1bHQgY29tcHJlc3Np b24gbGV2ZWwgb2YgemxpYgoobm9ybWFsbHkgNikuIEBvcHRpb257LS1iemlwMi1j b21wcmVzcy1sZXZlbH0gc2V0cyB0aGUgY29tcHJlc3Npb24gbGV2ZWwKZm9yIHRo ZSBCWklQMiBjb21wcmVzc2lvbiBhbGdvcml0aG0gKGRlZmF1bHRpbmcgdG8gNiBh cyB3ZWxsKS4gVGhpcyBpcyBhCmRpZmZlcmVudCBvcHRpb24gZnJvbSBAb3B0aW9u ey0tY29tcHJlc3MtbGV2ZWx9IHNpbmNlIEJaSVAyIHVzZXMgYQpzaWduaWZpY2Fu dCBhbW91bnQgb2YgbWVtb3J5IGZvciBlYWNoIGFkZGl0aW9uYWwgY29tcHJlc3Np b24gbGV2ZWwuCkBvcHRpb257LXp9IHNldHMgYm90aC4gQSB2YWx1ZSBvZiAwIGZv ciBAY29kZXtufSBkaXNhYmxlcyBjb21wcmVzc2lvbi4KCkBpdGVtIC0tYnppcDIt ZGVjb21wcmVzcy1sb3dtZW0KQG9waW5kZXggYnppcDItZGVjb21wcmVzcy1sb3dt ZW0KVXNlIGEgZGlmZmVyZW50IGRlY29tcHJlc3Npb24gbWV0aG9kIGZvciBCWklQ MiBjb21wcmVzc2VkIGZpbGVzLiBUaGlzCmFsdGVybmF0ZSBtZXRob2QgdXNlcyBh IGJpdCBtb3JlIHRoYW4gaGFsZiB0aGUgbWVtb3J5LCBidXQgYWxzbyBydW5zCmF0 IGhhbGYgdGhlIHNwZWVkLiBUaGlzIGlzIHVzZWZ1bCB1bmRlciBleHRyZW1lIGxv dyBtZW1vcnkKY2lyY3Vtc3RhbmNlcyB3aGVuIHRoZSBmaWxlIHdhcyBvcmlnaW5h bGx5IGNvbXByZXNzZWQgYXQgYSBoaWdoCkBvcHRpb257LS1iemlwMi1jb21wcmVz cy1sZXZlbH0uCgoKQGl0ZW0gLS1tYW5nbGUtZG9zLWZpbGVuYW1lcwpAaXRlbXgg LS1uby1tYW5nbGUtZG9zLWZpbGVuYW1lcwpAb3BpbmRleCBtYW5nbGUtZG9zLWZp bGVuYW1lcwpAb3BpbmRleCBuby1tYW5nbGUtZG9zLWZpbGVuYW1lcwpPbGRlciB2 ZXJzaW9uIG9mIFdpbmRvd3MgY2Fubm90IGhhbmRsZSBmaWxlbmFtZXMgd2l0aCBt b3JlIHRoYW4gb25lCmRvdC4gQG9wdGlvbnstLW1hbmdsZS1kb3MtZmlsZW5hbWVz fSBjYXVzZXMgR251UEcgdG8gcmVwbGFjZSAocmF0aGVyCnRoYW4gYWRkIHRvKSB0 aGUgZXh0ZW5zaW9uIG9mIGFuIG91dHB1dCBmaWxlbmFtZSB0byBhdm9pZCB0aGlz CnByb2JsZW0uIFRoaXMgb3B0aW9uIGlzIG9mZiBieSBkZWZhdWx0IGFuZCBoYXMg bm8gZWZmZWN0IG9uIG5vbi1XaW5kb3dzCnBsYXRmb3Jtcy4KCkBpdGVtIC0tYXNr LWNlcnQtbGV2ZWwKQGl0ZW14IC0tbm8tYXNrLWNlcnQtbGV2ZWwKQG9waW5kZXgg YXNrLWNlcnQtbGV2ZWwKV2hlbiBtYWtpbmcgYSBrZXkgc2lnbmF0dXJlLCBwcm9t cHQgZm9yIGEgY2VydGlmaWNhdGlvbiBsZXZlbC4gSWYgdGhpcwpvcHRpb24gaXMg bm90IHNwZWNpZmllZCwgdGhlIGNlcnRpZmljYXRpb24gbGV2ZWwgdXNlZCBpcyBz ZXQgdmlhCkBvcHRpb257LS1kZWZhdWx0LWNlcnQtbGV2ZWx9LiBTZWUgQG9wdGlv bnstLWRlZmF1bHQtY2VydC1sZXZlbH0gZm9yCmluZm9ybWF0aW9uIG9uIHRoZSBz cGVjaWZpYyBsZXZlbHMgYW5kIGhvdyB0aGV5IGFyZQp1c2VkLiBAb3B0aW9uey0t bm8tYXNrLWNlcnQtbGV2ZWx9IGRpc2FibGVzIHRoaXMgb3B0aW9uLiBUaGlzIG9w dGlvbgpkZWZhdWx0cyB0byBuby4KCkBpdGVtIC0tZGVmYXVsdC1jZXJ0LWxldmVs IEBjb2Rle259CkBvcGluZGV4IGRlZmF1bHQtY2VydC1sZXZlbApUaGUgZGVmYXVs dCB0byB1c2UgZm9yIHRoZSBjaGVjayBsZXZlbCB3aGVuIHNpZ25pbmcgYSBrZXku CgowIG1lYW5zIHlvdSBtYWtlIG5vIHBhcnRpY3VsYXIgY2xhaW0gYXMgdG8gaG93 IGNhcmVmdWxseSB5b3UgdmVyaWZpZWQKdGhlIGtleS4KCjEgbWVhbnMgeW91IGJl bGlldmUgdGhlIGtleSBpcyBvd25lZCBieSB0aGUgcGVyc29uIHdobyBjbGFpbXMg dG8gb3duCml0IGJ1dCB5b3UgY291bGQgbm90LCBvciBkaWQgbm90IHZlcmlmeSB0 aGUga2V5IGF0IGFsbC4gVGhpcyBpcwp1c2VmdWwgZm9yIGEgInBlcnNvbmEiIHZl cmlmaWNhdGlvbiwgd2hlcmUgeW91IHNpZ24gdGhlIGtleSBvZiBhCnBzZXVkb255 bW91cyB1c2VyLgoKMiBtZWFucyB5b3UgZGlkIGNhc3VhbCB2ZXJpZmljYXRpb24g b2YgdGhlIGtleS4gRm9yIGV4YW1wbGUsIHRoaXMKY291bGQgbWVhbiB0aGF0IHlv dSB2ZXJpZmllZCB0aGUga2V5IGZpbmdlcnByaW50IGFuZCBjaGVja2VkIHRoZQp1 c2VyIElEIG9uIHRoZSBrZXkgYWdhaW5zdCBhIHBob3RvIElELgoKMyBtZWFucyB5 b3UgZGlkIGV4dGVuc2l2ZSB2ZXJpZmljYXRpb24gb2YgdGhlIGtleS4gRm9yIGV4 YW1wbGUsIHRoaXMKY291bGQgbWVhbiB0aGF0IHlvdSB2ZXJpZmllZCB0aGUga2V5 IGZpbmdlcnByaW50IHdpdGggdGhlIG93bmVyIG9mIHRoZQprZXkgaW4gcGVyc29u LCBhbmQgdGhhdCB5b3UgY2hlY2tlZCwgYnkgbWVhbnMgb2YgYSBoYXJkIHRvIGZv cmdlCmRvY3VtZW50IHdpdGggYSBwaG90byBJRCAoc3VjaCBhcyBhIHBhc3Nwb3J0 KSB0aGF0IHRoZSBuYW1lIG9mIHRoZSBrZXkKb3duZXIgbWF0Y2hlcyB0aGUgbmFt ZSBpbiB0aGUgdXNlciBJRCBvbiB0aGUga2V5LCBhbmQgZmluYWxseSB0aGF0IHlv dQp2ZXJpZmllZCAoYnkgZXhjaGFuZ2Ugb2YgZW1haWwpIHRoYXQgdGhlIGVtYWls IGFkZHJlc3Mgb24gdGhlIGtleQpiZWxvbmdzIHRvIHRoZSBrZXkgb3duZXIuCgpO b3RlIHRoYXQgdGhlIGV4YW1wbGVzIGdpdmVuIGFib3ZlIGZvciBsZXZlbHMgMiBh bmQgMyBhcmUganVzdCB0aGF0OgpleGFtcGxlcy4gSW4gdGhlIGVuZCwgaXQgaXMg dXAgdG8geW91IHRvIGRlY2lkZSBqdXN0IHdoYXQgImNhc3VhbCIKYW5kICJleHRl bnNpdmUiIG1lYW4gdG8geW91LgoKVGhpcyBvcHRpb24gZGVmYXVsdHMgdG8gMCAo bm8gcGFydGljdWxhciBjbGFpbSkuCgpAaXRlbSAtLW1pbi1jZXJ0LWxldmVsCkBv cGluZGV4IG1pbi1jZXJ0LWxldmVsCldoZW4gYnVpbGRpbmcgdGhlIHRydXN0IGRh dGFiYXNlLCB0cmVhdCBhbnkgc2lnbmF0dXJlcyB3aXRoIGEKY2VydGlmaWNhdGlv biBsZXZlbCBiZWxvdyB0aGlzIGFzIGludmFsaWQuIERlZmF1bHRzIHRvIDIsIHdo aWNoCmRpc3JlZ2FyZHMgbGV2ZWwgMSBzaWduYXR1cmVzLiBOb3RlIHRoYXQgbGV2 ZWwgMCAibm8gcGFydGljdWxhcgpjbGFpbSIgc2lnbmF0dXJlcyBhcmUgYWx3YXlz IGFjY2VwdGVkLgoKQGl0ZW0gLS10cnVzdGVkLWtleSBAY29kZXtsb25nIGtleSBJ RH0KQG9waW5kZXggdHJ1c3RlZC1rZXkKQXNzdW1lIHRoYXQgdGhlIHNwZWNpZmll ZCBrZXkgKHdoaWNoIG11c3QgYmUgZ2l2ZW4KYXMgYSBmdWxsIDggYnl0ZSBrZXkg SUQpIGlzIGFzIHRydXN0d29ydGh5IGFzIG9uZSBvZgp5b3VyIG93biBzZWNyZXQg a2V5cy4gVGhpcyBvcHRpb24gaXMgdXNlZnVsIGlmIHlvdQpkb24ndCB3YW50IHRv IGtlZXAgeW91ciBzZWNyZXQga2V5cyAob3Igb25lIG9mIHRoZW0pCm9ubGluZSBi dXQgc3RpbGwgd2FudCB0byBiZSBhYmxlIHRvIGNoZWNrIHRoZSB2YWxpZGl0eSBv ZiBhIGdpdmVuCnJlY2lwaWVudCdzIG9yIHNpZ25hdG9yJ3Mga2V5LgoKQGl0ZW0g LS10cnVzdC1tb2RlbCBAY29kZXtwZ3B8Y2xhc3NpY3x0b2Z1fHRvZnUrcGdwfGRp cmVjdHxhbHdheXN8YXV0b30KQG9waW5kZXggdHJ1c3QtbW9kZWwKU2V0IHdoYXQg dHJ1c3QgbW9kZWwgR251UEcgc2hvdWxkIGZvbGxvdy4gVGhlIG1vZGVscyBhcmU6 CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gcGdwCiAgQG9waW5kZXggdHJ1c3QtbW9k ZTpwZ3AKICBUaGlzIGlzIHRoZSBXZWIgb2YgVHJ1c3QgY29tYmluZWQgd2l0aCB0 cnVzdCBzaWduYXR1cmVzIGFzIHVzZWQgaW4gUEdQCiAgNS54IGFuZCBsYXRlci4g VGhpcyBpcyB0aGUgZGVmYXVsdCB0cnVzdCBtb2RlbCB3aGVuIGNyZWF0aW5nIGEg bmV3CiAgdHJ1c3QgZGF0YWJhc2UuCgogIEBpdGVtIGNsYXNzaWMKICBAb3BpbmRl eCB0cnVzdC1tb2RlOmNsYXNzaWMKICBUaGlzIGlzIHRoZSBzdGFuZGFyZCBXZWIg b2YgVHJ1c3QgYXMgaW50cm9kdWNlZCBieSBQR1AgMi4KCiAgQGl0ZW0gdG9mdQog IEBvcGluZGV4IHRydXN0LW1vZGU6dG9mdQogIEBhbmNob3J7dHJ1c3QtbW9kZWwt dG9mdX0KICBUT0ZVIHN0YW5kcyBmb3IgVHJ1c3QgT24gRmlyc3QgVXNlLiAgSW4g dGhpcyB0cnVzdCBtb2RlbCwgdGhlIGZpcnN0CiAgdGltZSBhIGtleSBpcyBzZWVu LCBpdCBpcyBtZW1vcml6ZWQuICBJZiBsYXRlciBhbm90aGVyIGtleSBpcyBzZWVu CiAgd2l0aCBhIHVzZXIgaWQgd2l0aCB0aGUgc2FtZSBlbWFpbCBhZGRyZXNzLCBh IHdhcm5pbmcgaXMgZGlzcGxheWVkCiAgaW5kaWNhdGluZyB0aGF0IHRoZXJlIGlz IGEgY29uZmxpY3QgYW5kIHRoYXQgdGhlIGtleSBtaWdodCBiZSBhCiAgZm9yZ2Vy eSBhbmQgYW4gYXR0ZW1wdCBhdCBhIG1hbi1pbi10aGUtbWlkZGxlIGF0dGFjay4K CiAgQmVjYXVzZSBhIHBvdGVudGlhbCBhdHRhY2tlciBpcyBhYmxlIHRvIGNvbnRy b2wgdGhlIGVtYWlsIGFkZHJlc3MKICBhbmQgdGhlcmVieSBjaXJjdW12ZW50IHRo ZSBjb25mbGljdCBkZXRlY3Rpb24gYWxnb3JpdGhtIGJ5IHVzaW5nIGFuCiAgZW1h aWwgYWRkcmVzcyB0aGF0IGlzIHNpbWlsYXIgaW4gYXBwZWFyYW5jZSB0byBhIHRy dXN0ZWQgZW1haWwKICBhZGRyZXNzLCB3aGVuZXZlciBhIG1lc3NhZ2UgaXMgdmVy aWZpZWQsIHN0YXRpc3RpY3MgYWJvdXQgdGhlIG51bWJlcgogIG9mIG1lc3NhZ2Vz IHNpZ25lZCB3aXRoIHRoZSBrZXkgYXJlIHNob3duLiAgSW4gdGhpcyB3YXksIGEg dXNlciBjYW4KICBlYXNpbHkgaWRlbnRpZnkgYXR0YWNrcyB1c2luZyBmYWtlIGtl eXMgZm9yIHJlZ3VsYXIgY29ycmVzcG9uZGVudHMuCgogIFdoZW4gY29tcGFyZWQg d2l0aCB0aGUgV2ViIG9mIFRydXN0LCBUT0ZVIG9mZmVycyBzaWduaWZpY2FudGx5 CiAgd2Vha2VyIHNlY3VyaXR5IGd1YXJhbnRlZXMuICBJbiBwYXJ0aWN1bGFyLCBU T0ZVIG9ubHkgaGVscHMgZW5zdXJlCiAgY29uc2lzdGVuY3kgKHRoYXQgaXMsIHRo YXQgdGhlIGJpbmRpbmcgYmV0d2VlbiBhIGtleSBhbmQgZW1haWwKICBhZGRyZXNz IGRvZXNuJ3QgY2hhbmdlKS4gIEEgbWFqb3IgYWR2YW50YWdlIG9mIFRPRlUgaXMg dGhhdCBpdAogIHJlcXVpcmVzIGxpdHRsZSBtYWludGVuYW5jZSB0byB1c2UgY29y cmVjdGx5LiAgVG8gdXNlIHRoZSB3ZWIgb2YKICB0cnVzdCBwcm9wZXJseSwgeW91 IG5lZWQgdG8gYWN0aXZlbHkgc2lnbiBrZXlzIGFuZCBtYXJrIHVzZXJzIGFzCiAg dHJ1c3RlZCBpbnRyb2R1Y2Vycy4gIFRoaXMgaXMgYSB0aW1lLWNvbnN1bWluZyBw cm9jZXNzIGFuZCBhbmVjZG90YWwKICBldmlkZW5jZSBzdWdnZXN0cyB0aGF0IGV2 ZW4gc2VjdXJpdHktY29uc2Npb3VzIHVzZXJzIHJhcmVseSB0YWtlIHRoZQogIHRp bWUgdG8gZG8gdGhpcyB0aG9yb3VnaGx5IGFuZCBpbnN0ZWFkIHJlbHkgb24gYW4g YWQtaG9jIFRPRlUKICBwcm9jZXNzLgoKICBJbiB0aGUgVE9GVSBtb2RlbCwgcG9s aWNpZXMgYXJlIGFzc29jaWF0ZWQgd2l0aCBiaW5kaW5ncyBiZXR3ZWVuCiAga2V5 cyBhbmQgZW1haWwgYWRkcmVzc2VzICh3aGljaCBhcmUgZXh0cmFjdGVkIGZyb20g dXNlciBpZHMgYW5kCiAgbm9ybWFsaXplZCkuICBUaGVyZSBhcmUgZml2ZSBwb2xp Y2llcywgd2hpY2ggY2FuIGJlIHNldCBtYW51YWxseQogIHVzaW5nIHRoZSBAb3B0 aW9uey0tdG9mdS1wb2xpY3l9IG9wdGlvbi4gIFRoZSBkZWZhdWx0IHBvbGljeSBj YW4gYmUKICBzZXQgdXNpbmcgdGhlIEBvcHRpb257LS10b2Z1LWRlZmF1bHQtcG9s aWN5fSBwb2xpY3kuCgogIFRoZSBUT0ZVIHBvbGljaWVzIGFyZTogQGNvZGV7YXV0 b30sIEBjb2Rle2dvb2R9LCBAY29kZXt1bmtub3dufSwKICBAY29kZXtiYWR9IGFu ZCBAY29kZXthc2t9LiAgVGhlIEBjb2Rle2F1dG99IHBvbGljeSBpcyB1c2VkIGJ5 CiAgZGVmYXVsdCAodW5sZXNzIG92ZXJyaWRkZW4gYnkgQG9wdGlvbnstLXRvZnUt ZGVmYXVsdC1wb2xpY3l9KSBhbmQKICBtYXJrcyBhIGJpbmRpbmcgYXMgbWFyZ2lu YWxseSB0cnVzdGVkLiAgVGhlIEBjb2Rle2dvb2R9LAogIEBjb2Rle3Vua25vd259 IGFuZCBAY29kZXtiYWR9IHBvbGljaWVzIG1hcmsgYSBiaW5kaW5nIGFzIGZ1bGx5 CiAgdHJ1c3RlZCwgYXMgaGF2aW5nIHVua25vd24gdHJ1c3Qgb3IgYXMgaGF2aW5n IHRydXN0IG5ldmVyLAogIHJlc3BlY3RpdmVseS4gIFRoZSBAY29kZXt1bmtub3du fSBwb2xpY3kgaXMgdXNlZnVsIGZvciBqdXN0IHVzaW5nCiAgVE9GVSB0byBkZXRl Y3QgY29uZmxpY3RzLCBidXQgdG8gbmV2ZXIgYXNzaWduIHBvc2l0aXZlIHRydXN0 IHRvIGEKICBiaW5kaW5nLiAgVGhlIGZpbmFsIHBvbGljeSwgQGNvZGV7YXNrfSBw cm9tcHRzIHRoZSB1c2VyIHRvIGluZGljYXRlCiAgdGhlIGJpbmRpbmcncyB0cnVz dC4gIElmIGJhdGNoIG1vZGUgaXMgZW5hYmxlZCAob3IgaW5wdXQgaXMKICBpbmFw cHJvcHJpYXRlIGluIHRoZSBjb250ZXh0KSwgdGhlbiB0aGUgdXNlciBpcyBub3Qg cHJvbXB0ZWQgYW5kIHRoZQogIEBjb2Rle3VuZGVmaW5lZH0gdHJ1c3QgbGV2ZWwg aXMgcmV0dXJuZWQuCgogIEBpdGVtIHRvZnUrcGdwCiAgQG9waW5kZXggdHJ1c3Qt bW9kZTp0b2Z1K3BncAogIFRoaXMgdHJ1c3QgbW9kZWwgY29tYmluZXMgVE9GVSB3 aXRoIHRoZSBXZWIgb2YgVHJ1c3QuICBUaGlzIGlzIGRvbmUKICBieSBjb21wdXRp bmcgdGhlIHRydXN0IGxldmVsIGZvciBlYWNoIG1vZGVsIGFuZCB0aGVuIHRha2lu ZyB0aGUKICBtYXhpbXVtIHRydXN0IGxldmVsIHdoZXJlIHRoZSB0cnVzdCBsZXZl bHMgYXJlIG9yZGVyZWQgYXMgZm9sbG93czoKICBAY29kZXt1bmtub3duIDwgdW5k ZWZpbmVkIDwgbWFyZ2luYWwgPCBmdWxseSA8IHVsdGltYXRlIDwgZXhwaXJlZCA8 CiAgbmV2ZXJ9LgoKICBCeSBzZXR0aW5nIEBvcHRpb257LS10b2Z1LWRlZmF1bHQt cG9saWN5PXVua25vd259LCB0aGlzIG1vZGVsIGNhbiBiZQogIHVzZWQgdG8gaW1w bGVtZW50IHRoZSB3ZWIgb2YgdHJ1c3Qgd2l0aCBUT0ZVJ3MgY29uZmxpY3QgZGV0 ZWN0aW9uCiAgYWxnb3JpdGhtLCBidXQgd2l0aG91dCBpdHMgYXNzaWdubWVudCBv ZiBwb3NpdGl2ZSB0cnVzdCB2YWx1ZXMsCiAgd2hpY2ggc29tZSBzZWN1cml0eS1j b25zY2lvdXMgdXNlcnMgZG9uJ3QgbGlrZS4KCiAgQGl0ZW0gZGlyZWN0CiAgQG9w aW5kZXggdHJ1c3QtbW9kZTpkaXJlY3QKICBLZXkgdmFsaWRpdHkgaXMgc2V0IGRp cmVjdGx5IGJ5IHRoZSB1c2VyIGFuZCBub3QgY2FsY3VsYXRlZCB2aWEgdGhlCiAg V2ViIG9mIFRydXN0LgoKICBAaXRlbSBhbHdheXMKICBAb3BpbmRleCB0cnVzdC1t b2RlOmFsd2F5cwogIFNraXAga2V5IHZhbGlkYXRpb24gYW5kIGFzc3VtZSB0aGF0 IHVzZWQga2V5cyBhcmUgYWx3YXlzIGZ1bGx5CiAgdmFsaWQuIFlvdSBnZW5lcmFs bHkgd29uJ3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBhcmUgdXNpbmcgc29tZQogIGV4 dGVybmFsIHZhbGlkYXRpb24gc2NoZW1lLiBUaGlzIG9wdGlvbiBhbHNvIHN1cHBy ZXNzZXMgdGhlCiAgIlt1bmNlcnRhaW5dIiB0YWcgcHJpbnRlZCB3aXRoIHNpZ25h dHVyZSBjaGVja3Mgd2hlbiB0aGVyZSBpcyBubwogIGV2aWRlbmNlIHRoYXQgdGhl IHVzZXIgSUQgaXMgYm91bmQgdG8gdGhlIGtleS4gIE5vdGUgdGhhdCB0aGlzCiAg dHJ1c3QgbW9kZWwgc3RpbGwgZG9lcyBub3QgYWxsb3cgdGhlIHVzZSBvZiBleHBp cmVkLCByZXZva2VkLCBvcgogIGRpc2FibGVkIGtleXMuCgogIEBpdGVtIGF1dG8K ICBAb3BpbmRleCB0cnVzdC1tb2RlOmF1dG8KICBTZWxlY3QgdGhlIHRydXN0IG1v ZGVsIGRlcGVuZGluZyBvbiB3aGF0ZXZlciB0aGUgaW50ZXJuYWwgdHJ1c3QKICBk YXRhYmFzZSBzYXlzLiBUaGlzIGlzIHRoZSBkZWZhdWx0IG1vZGVsIGlmIHN1Y2gg YSBkYXRhYmFzZSBhbHJlYWR5CiAgZXhpc3RzLgpAZW5kIHRhYmxlCgpAaXRlbSAt LWF1dG8ta2V5LWxvY2F0ZSBAY29kZXtwYXJhbWV0ZXJzfQpAaXRlbXggLS1uby1h dXRvLWtleS1sb2NhdGUKQG9waW5kZXggYXV0by1rZXktbG9jYXRlCkdudVBHIGNh biBhdXRvbWF0aWNhbGx5IGxvY2F0ZSBhbmQgcmV0cmlldmUga2V5cyBhcyBuZWVk ZWQgdXNpbmcgdGhpcwpvcHRpb24uIFRoaXMgaGFwcGVucyB3aGVuIGVuY3J5cHRp bmcgdG8gYW4gZW1haWwgYWRkcmVzcyAoaW4gdGhlCiJ1c2VyQEBleGFtcGxlLmNv bSIgZm9ybSksIGFuZCB0aGVyZSBhcmUgbm8gdXNlckBAZXhhbXBsZS5jb20ga2V5 cyBvbgp0aGUgbG9jYWwga2V5cmluZy4gIFRoaXMgb3B0aW9uIHRha2VzIGFueSBu dW1iZXIgb2YgdGhlIGZvbGxvd2luZwptZWNoYW5pc21zLCBpbiB0aGUgb3JkZXIg dGhleSBhcmUgdG8gYmUgdHJpZWQ6CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gY2Vy dAogIExvY2F0ZSBhIGtleSB1c2luZyBETlMgQ0VSVCwgYXMgc3BlY2lmaWVkIGlu IHJmYzQzOTguCgogIEBpdGVtIHBrYQogIExvY2F0ZSBhIGtleSB1c2luZyBETlMg UEtBLgoKICBAaXRlbSBkYW5lCiAgTG9jYXRlIGEga2V5IHVzaW5nIERBTkUsIGFz IHNwZWNpZmllZAogIGluIGRyYWZ0LWlldGYtZGFuZS1vcGVucGdwa2V5LTA1LnR4 dC4KCiAgQGl0ZW0gbGRhcAogIFVzaW5nIEROUyBTZXJ2aWNlIERpc2NvdmVyeSwg Y2hlY2sgdGhlIGRvbWFpbiBpbiBxdWVzdGlvbiBmb3IgYW55IExEQVAKICBrZXlz ZXJ2ZXJzIHRvIHVzZS4gIElmIHRoaXMgZmFpbHMsIGF0dGVtcHQgdG8gbG9jYXRl IHRoZSBrZXkgdXNpbmcgdGhlCiAgUEdQIFVuaXZlcnNhbCBtZXRob2Qgb2YgY2hl Y2tpbmcgQHNhbXB7bGRhcDovL2tleXMuKHRoZWRvbWFpbil9LgoKICBAaXRlbSBr ZXlzZXJ2ZXIKICBMb2NhdGUgYSBrZXkgdXNpbmcgd2hhdGV2ZXIga2V5c2VydmVy IGlzIGRlZmluZWQgdXNpbmcgdGhlCiAgQG9wdGlvbnstLWtleXNlcnZlcn0gb3B0 aW9uLgoKICBAaXRlbSBrZXlzZXJ2ZXItVVJMCiAgSW4gYWRkaXRpb24sIGEga2V5 c2VydmVyIFVSTCBhcyB1c2VkIGluIHRoZSBAb3B0aW9uey0ta2V5c2VydmVyfSBv cHRpb24KICBtYXkgYmUgdXNlZCBoZXJlIHRvIHF1ZXJ5IHRoYXQgcGFydGljdWxh ciBrZXlzZXJ2ZXIuCgogIEBpdGVtIGxvY2FsCiAgTG9jYXRlIHRoZSBrZXkgdXNp bmcgdGhlIGxvY2FsIGtleXJpbmdzLiAgVGhpcyBtZWNoYW5pc20gYWxsb3dzIHRv CiAgc2VsZWN0IHRoZSBvcmRlciBhIGxvY2FsIGtleSBsb29rdXAgaXMgZG9uZS4g IFRodXMgdXNpbmcKICBAc2FtcHstLWF1dG8ta2V5LWxvY2F0ZSBsb2NhbH0gaXMg aWRlbnRpY2FsIHRvCiAgQG9wdGlvbnstLW5vLWF1dG8ta2V5LWxvY2F0ZX0uCgog IEBpdGVtIG5vZGVmYXVsdAogIFRoaXMgZmxhZyBkaXNhYmxlcyB0aGUgc3RhbmRh cmQgbG9jYWwga2V5IGxvb2t1cCwgZG9uZSBiZWZvcmUgYW55IG9mIHRoZQogIG1l Y2hhbmlzbXMgZGVmaW5lZCBieSB0aGUgQG9wdGlvbnstLWF1dG8ta2V5LWxvY2F0 ZX0gYXJlIHRyaWVkLiAgVGhlCiAgcG9zaXRpb24gb2YgdGhpcyBtZWNoYW5pc20g aW4gdGhlIGxpc3QgZG9lcyBub3QgbWF0dGVyLiAgSXQgaXMgbm90CiAgcmVxdWly ZWQgaWYgQGNvZGV7bG9jYWx9IGlzIGFsc28gdXNlZC4KCiAgQGl0ZW0gY2xlYXIK ICBDbGVhciBhbGwgZGVmaW5lZCBtZWNoYW5pc21zLiAgVGhpcyBpcyB1c2VmdWwg dG8gb3ZlcnJpZGUKICBtZWNoYW5pc21zIGdpdmVuIGluIGEgY29uZmlnIGZpbGUu CgpAZW5kIHRhYmxlCgpAaXRlbSAtLWtleWlkLWZvcm1hdCBAY29kZXtzaG9ydHww eHNob3J0fGxvbmd8MHhsb25nfQpAb3BpbmRleCBrZXlpZC1mb3JtYXQKU2VsZWN0 IGhvdyB0byBkaXNwbGF5IGtleSBJRHMuICJzaG9ydCIgaXMgdGhlIHRyYWRpdGlv bmFsIDgtY2hhcmFjdGVyCmtleSBJRC4gImxvbmciIGlzIHRoZSBtb3JlIGFjY3Vy YXRlIChidXQgbGVzcyBjb252ZW5pZW50KQoxNi1jaGFyYWN0ZXIga2V5IElELiBB ZGQgYW4gIjB4IiB0byBlaXRoZXIgdG8gaW5jbHVkZSBhbiAiMHgiIGF0IHRoZQpi ZWdpbm5pbmcgb2YgdGhlIGtleSBJRCwgYXMgaW4gMHg5OTI0MjU2MC4gIE5vdGUg dGhhdCB0aGlzIG9wdGlvbiBpcwppZ25vcmVkIGlmIHRoZSBvcHRpb24gLS13aXRo LWNvbG9ucyBpcyB1c2VkLgoKQGl0ZW0gLS1rZXlzZXJ2ZXIgQGNvZGV7bmFtZX0K QG9waW5kZXgga2V5c2VydmVyClRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQgLSBw bGVhc2UgdXNlIHRoZSBAb3B0aW9uey0ta2V5c2VydmVyfSBpbgpAZmlsZXtkaXJt bmdyLmNvbmZ9IGluc3RlYWQuCgpVc2UgQGNvZGV7bmFtZX0gYXMgeW91ciBrZXlz ZXJ2ZXIuIFRoaXMgaXMgdGhlIHNlcnZlciB0aGF0CkBvcHRpb257LS1yZWN2LWtl eXN9LCBAb3B0aW9uey0tc2VuZC1rZXlzfSwgYW5kIEBvcHRpb257LS1zZWFyY2gt a2V5c30Kd2lsbCBjb21tdW5pY2F0ZSB3aXRoIHRvIHJlY2VpdmUga2V5cyBmcm9t LCBzZW5kIGtleXMgdG8sIGFuZCBzZWFyY2ggZm9yCmtleXMgb24uIFRoZSBmb3Jt YXQgb2YgdGhlIEBjb2Rle25hbWV9IGlzIGEgVVJJOgpgc2NoZW1lOlsvL11rZXlz ZXJ2ZXJuYW1lWzpwb3J0XScgVGhlIHNjaGVtZSBpcyB0aGUgdHlwZSBvZiBrZXlz ZXJ2ZXI6CiJoa3AiIGZvciB0aGUgSFRUUCAob3IgY29tcGF0aWJsZSkga2V5c2Vy dmVycywgImxkYXAiIGZvciB0aGUgTERBUAprZXlzZXJ2ZXJzLCBvciAibWFpbHRv IiBmb3IgdGhlIEdyYWZmIGVtYWlsIGtleXNlcnZlci4gTm90ZSB0aGF0IHlvdXIK cGFydGljdWxhciBpbnN0YWxsYXRpb24gb2YgR251UEcgbWF5IGhhdmUgb3RoZXIg a2V5c2VydmVyIHR5cGVzCmF2YWlsYWJsZSBhcyB3ZWxsLiBLZXlzZXJ2ZXIgc2No ZW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZS4gQWZ0ZXIgdGhlCmtleXNlcnZlciBu YW1lLCBvcHRpb25hbCBrZXlzZXJ2ZXIgY29uZmlndXJhdGlvbiBvcHRpb25zIG1h eSBiZQpwcm92aWRlZC4gVGhlc2UgYXJlIHRoZSBzYW1lIGFzIHRoZSBnbG9iYWwg QG9wdGlvbnstLWtleXNlcnZlci1vcHRpb25zfQpmcm9tIGJlbG93LCBidXQgYXBw bHkgb25seSB0byB0aGlzIHBhcnRpY3VsYXIga2V5c2VydmVyLgoKTW9zdCBrZXlz ZXJ2ZXJzIHN5bmNocm9uaXplIHdpdGggZWFjaCBvdGhlciwgc28gdGhlcmUgaXMg Z2VuZXJhbGx5IG5vCm5lZWQgdG8gc2VuZCBrZXlzIHRvIG1vcmUgdGhhbiBvbmUg c2VydmVyLiBUaGUga2V5c2VydmVyCkBjb2Rle2hrcDovL2tleXMuZ251cGcubmV0 fSB1c2VzIHJvdW5kIHJvYmluIEROUyB0byBnaXZlIGEgZGlmZmVyZW50CmtleXNl cnZlciBlYWNoIHRpbWUgeW91IHVzZSBpdC4KCkBpdGVtIC0ta2V5c2VydmVyLW9w dGlvbnMgQGNvZGV7bmFtZT12YWx1ZX0KQG9waW5kZXgga2V5c2VydmVyLW9wdGlv bnMKVGhpcyBpcyBhIHNwYWNlIG9yIGNvbW1hIGRlbGltaXRlZCBzdHJpbmcgdGhh dCBnaXZlcyBvcHRpb25zIGZvciB0aGUKa2V5c2VydmVyLiBPcHRpb25zIGNhbiBi ZSBwcmVmaXhlZCB3aXRoIGEgYG5vLScgdG8gZ2l2ZSB0aGUgb3Bwb3NpdGUKbWVh bmluZy4gVmFsaWQgaW1wb3J0LW9wdGlvbnMgb3IgZXhwb3J0LW9wdGlvbnMgbWF5 IGJlIHVzZWQgaGVyZSBhcwp3ZWxsIHRvIGFwcGx5IHRvIGltcG9ydGluZyAoQG9w dGlvbnstLXJlY3Yta2V5fSkgb3IgZXhwb3J0aW5nCihAb3B0aW9uey0tc2VuZC1r ZXl9KSBhIGtleSBmcm9tIGEga2V5c2VydmVyLiBXaGlsZSBub3QgYWxsIG9wdGlv bnMKYXJlIGF2YWlsYWJsZSBmb3IgYWxsIGtleXNlcnZlciB0eXBlcywgc29tZSBj b21tb24gb3B0aW9ucyBhcmU6CgpAdGFibGUgQGFzaXMKCiAgQGl0ZW0gaW5jbHVk ZS1yZXZva2VkCiAgV2hlbiBzZWFyY2hpbmcgZm9yIGEga2V5IHdpdGggQG9wdGlv bnstLXNlYXJjaC1rZXlzfSwgaW5jbHVkZSBrZXlzIHRoYXQKICBhcmUgbWFya2Vk IG9uIHRoZSBrZXlzZXJ2ZXIgYXMgcmV2b2tlZC4gTm90ZSB0aGF0IG5vdCBhbGwg a2V5c2VydmVycwogIGRpZmZlcmVudGlhdGUgYmV0d2VlbiByZXZva2VkIGFuZCB1 bnJldm9rZWQga2V5cywgYW5kIGZvciBzdWNoCiAga2V5c2VydmVycyB0aGlzIG9w dGlvbiBpcyBtZWFuaW5nbGVzcy4gTm90ZSBhbHNvIHRoYXQgbW9zdCBrZXlzZXJ2 ZXJzIGRvCiAgbm90IGhhdmUgY3J5cHRvZ3JhcGhpYyB2ZXJpZmljYXRpb24gb2Yg a2V5IHJldm9jYXRpb25zLCBhbmQgc28gdHVybmluZwogIHRoaXMgb3B0aW9uIG9m ZiBtYXkgcmVzdWx0IGluIHNraXBwaW5nIGtleXMgdGhhdCBhcmUgaW5jb3JyZWN0 bHkgbWFya2VkCiAgYXMgcmV2b2tlZC4KCiAgQGl0ZW0gaW5jbHVkZS1kaXNhYmxl ZAogIFdoZW4gc2VhcmNoaW5nIGZvciBhIGtleSB3aXRoIEBvcHRpb257LS1zZWFy Y2gta2V5c30sIGluY2x1ZGUga2V5cyB0aGF0CiAgYXJlIG1hcmtlZCBvbiB0aGUg a2V5c2VydmVyIGFzIGRpc2FibGVkLiBOb3RlIHRoYXQgdGhpcyBvcHRpb24gaXMg bm90CiAgdXNlZCB3aXRoIEhLUCBrZXlzZXJ2ZXJzLgoKICBAaXRlbSBhdXRvLWtl eS1yZXRyaWV2ZQogIFRoaXMgb3B0aW9uIGVuYWJsZXMgdGhlIGF1dG9tYXRpYyBy ZXRyaWV2aW5nIG9mIGtleXMgZnJvbSBhIGtleXNlcnZlcgogIHdoZW4gdmVyaWZ5 aW5nIHNpZ25hdHVyZXMgbWFkZSBieSBrZXlzIHRoYXQgYXJlIG5vdCBvbiB0aGUg bG9jYWwKICBrZXlyaW5nLgoKICBOb3RlIHRoYXQgdGhpcyBvcHRpb24gbWFrZXMg YSAid2ViIGJ1ZyIgbGlrZSBiZWhhdmlvciBwb3NzaWJsZS4KICBLZXlzZXJ2ZXIg b3BlcmF0b3JzIGNhbiBzZWUgd2hpY2gga2V5cyB5b3UgcmVxdWVzdCwgc28gYnkg c2VuZGluZyB5b3UKICBhIG1lc3NhZ2Ugc2lnbmVkIGJ5IGEgYnJhbmQgbmV3IGtl eSAod2hpY2ggeW91IG5hdHVyYWxseSB3aWxsIG5vdCBoYXZlCiAgb24geW91ciBs b2NhbCBrZXlyaW5nKSwgdGhlIG9wZXJhdG9yIGNhbiB0ZWxsIGJvdGggeW91ciBJ UCBhZGRyZXNzIGFuZAogIHRoZSB0aW1lIHdoZW4geW91IHZlcmlmaWVkIHRoZSBz aWduYXR1cmUuCgogIEBpdGVtIGhvbm9yLWtleXNlcnZlci11cmwKICBXaGVuIHVz aW5nIEBvcHRpb257LS1yZWZyZXNoLWtleXN9LCBpZiB0aGUga2V5IGluIHF1ZXN0 aW9uIGhhcyBhIHByZWZlcnJlZAogIGtleXNlcnZlciBVUkwsIHRoZW4gdXNlIHRo YXQgcHJlZmVycmVkIGtleXNlcnZlciB0byByZWZyZXNoIHRoZSBrZXkKICBmcm9t LiBJbiBhZGRpdGlvbiwgaWYgYXV0by1rZXktcmV0cmlldmUgaXMgc2V0LCBhbmQg dGhlIHNpZ25hdHVyZQogIGJlaW5nIHZlcmlmaWVkIGhhcyBhIHByZWZlcnJlZCBr ZXlzZXJ2ZXIgVVJMLCB0aGVuIHVzZSB0aGF0IHByZWZlcnJlZAogIGtleXNlcnZl ciB0byBmZXRjaCB0aGUga2V5IGZyb20uIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBp bnRyb2R1Y2VzIGEKICAid2ViIGJ1ZyI6IFRoZSBjcmVhdG9yIG9mIHRoZSBrZXkg Y2FuIHNlZSB3aGVuIHRoZSBrZXlzIGlzCiAgcmVmcmVzaGVkLiAgVGh1cyB0aGlz IG9wdGlvbiBpcyBub3QgZW5hYmxlZCBieSBkZWZhdWx0LgoKICBAaXRlbSBob25v ci1wa2EtcmVjb3JkCiAgSWYgYXV0by1rZXktcmV0cmlldmUgaXMgc2V0LCBhbmQg dGhlIHNpZ25hdHVyZSBiZWluZyB2ZXJpZmllZCBoYXMgYQogIFBLQSByZWNvcmQs IHRoZW4gdXNlIHRoZSBQS0EgaW5mb3JtYXRpb24gdG8gZmV0Y2ggdGhlIGtleS4g RGVmYXVsdHMKICB0byAieWVzIi4KCiAgQGl0ZW0gaW5jbHVkZS1zdWJrZXlzCiAg V2hlbiByZWNlaXZpbmcgYSBrZXksIGluY2x1ZGUgc3Via2V5cyBhcyBwb3RlbnRp YWwgdGFyZ2V0cy4gTm90ZSB0aGF0CiAgdGhpcyBvcHRpb24gaXMgbm90IHVzZWQg d2l0aCBIS1Aga2V5c2VydmVycywgYXMgdGhleSBkbyBub3Qgc3VwcG9ydAogIHJl dHJpZXZpbmcga2V5cyBieSBzdWJrZXkgaWQuCgogIEBpdGVtIHRpbWVvdXQKICBU ZWxsIHRoZSBrZXlzZXJ2ZXIgaGVscGVyIHByb2dyYW0gaG93IGxvbmcgKGluIHNl Y29uZHMpIHRvIHRyeSBhbmQKICBwZXJmb3JtIGEga2V5c2VydmVyIGFjdGlvbiBi ZWZvcmUgZ2l2aW5nIHVwLiBOb3RlIHRoYXQgcGVyZm9ybWluZwogIG11bHRpcGxl IGFjdGlvbnMgYXQgdGhlIHNhbWUgdGltZSB1c2VzIHRoaXMgdGltZW91dCB2YWx1 ZSBwZXIgYWN0aW9uLgogIEZvciBleGFtcGxlLCB3aGVuIHJldHJpZXZpbmcgbXVs dGlwbGUga2V5cyB2aWEgQG9wdGlvbnstLXJlY3Yta2V5c30sIHRoZQogIHRpbWVv dXQgYXBwbGllcyBzZXBhcmF0ZWx5IHRvIGVhY2gga2V5IHJldHJpZXZhbCwgYW5k IG5vdCB0byB0aGUKICBAb3B0aW9uey0tcmVjdi1rZXlzfSBjb21tYW5kIGFzIGEg d2hvbGUuIERlZmF1bHRzIHRvIDMwIHNlY29uZHMuCgogIEBpdGVtIGh0dHAtcHJv eHk9QGNvZGV7dmFsdWV9CiAgVGhpcyBvcHRpb25zIGlzIGRlcHJlY2F0ZWQuCiAg U2V0IHRoZSBwcm94eSB0byB1c2UgZm9yIEhUVFAgYW5kIEhLUCBrZXlzZXJ2ZXJz LgogIFRoaXMgb3ZlcnJpZGVzIGFueSBwcm94eSBkZWZpbmVkIGluIEBmaWxle2Rp cm1uZ3IuY29uZn0uCgogIEBpdGVtIHZlcmJvc2UKICBUaGlzIG9wdGlvbiBoYXMg bm8gbW9yZSBmdW5jdGlvbiBzaW5jZSBHbnVQRyAyLjEuICBVc2UgdGhlCiAgQGNv ZGV7ZGlybW5ncn0gY29uZmlndXJhdGlvbiBvcHRpb25zIGluc3RlYWQuCgogIEBp dGVtIGRlYnVnCiAgVGhpcyBvcHRpb24gaGFzIG5vIG1vcmUgZnVuY3Rpb24gc2lu Y2UgR251UEcgMi4xLiAgVXNlIHRoZQogIEBjb2Rle2Rpcm1uZ3J9IGNvbmZpZ3Vy YXRpb24gb3B0aW9ucyBpbnN0ZWFkLgoKICBAaXRlbSBjaGVjay1jZXJ0CiAgVGhp cyBvcHRpb24gaGFzIG5vIG1vcmUgZnVuY3Rpb24gc2luY2UgR251UEcgMi4xLiAg VXNlIHRoZQogIEBjb2Rle2Rpcm1uZ3J9IGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBp bnN0ZWFkLgoKICBAaXRlbSBjYS1jZXJ0LWZpbGUKICBUaGlzIG9wdGlvbiBoYXMg bm8gbW9yZSBmdW5jdGlvbiBzaW5jZSBHbnVQRyAyLjEuICBVc2UgdGhlCiAgQGNv ZGV7ZGlybW5ncn0gY29uZmlndXJhdGlvbiBvcHRpb25zIGluc3RlYWQuCgpAZW5k IHRhYmxlCgpAaXRlbSAtLWNvbXBsZXRlcy1uZWVkZWQgQGNvZGV7bn0KQG9waW5k ZXggY29tcGxpYW50LW5lZWRlZApOdW1iZXIgb2YgY29tcGxldGVseSB0cnVzdGVk IHVzZXJzIHRvIGludHJvZHVjZSBhIG5ldwprZXkgc2lnbmVyIChkZWZhdWx0cyB0 byAxKS4KCkBpdGVtIC0tbWFyZ2luYWxzLW5lZWRlZCBAY29kZXtufQpAb3BpbmRl eCBtYXJnaW5hbHMtbmVlZGVkCk51bWJlciBvZiBtYXJnaW5hbGx5IHRydXN0ZWQg dXNlcnMgdG8gaW50cm9kdWNlIGEgbmV3CmtleSBzaWduZXIgKGRlZmF1bHRzIHRv IDMpCgpAaXRlbSAtLXRvZnUtZGVmYXVsdC1wb2xpY3kgQGNvZGV7YXV0b3xnb29k fHVua25vd258YmFkfGFza30KQG9waW5kZXggdG9mdS1kZWZhdWx0LXBvbGljeQpU aGUgZGVmYXVsdCBUT0ZVIHBvbGljeSAoZGVmYXVsdHMgdG8gQGNvZGV7YXV0b30p LiAgRm9yIG1vcmUKaW5mb3JtYXRpb24gYWJvdXQgdGhlIG1lYW5pbmcgb2YgdGhp cyBvcHRpb24sIEB4cmVme3RydXN0LW1vZGVsLXRvZnV9LgoKQGl0ZW0gLS10b2Z1 LWRiLWZvcm1hdCBAY29kZXthdXRvfHNwbGl0fGZsYXR9CkBvcGluZGV4IHRvZnUt ZGVmYXVsdC1wb2xpY3kKVGhlIGZvcm1hdCBmb3IgdGhlIFRPRlUgREIuCgpUaGUg c3BsaXQgZmlsZSBmb3JtYXQgc3BsaXRzIHRoZSBkYXRhIGFjcm9zcyBtYW55IERC cyB1bmRlciB0aGUKQGNvZGV7dG9mdS5kfSBkaXJlY3RvcnkgKG9uZSBwZXIgZW1h aWwgYWRkcmVzcyBhbmQgb25lIHBlciBrZXkpLiAgVGhpcwptYWtlcyBpdCBlYXNp ZXIgdG8gYXV0b21hdGljYWxseSBzeW5jaHJvbml6ZSB0aGUgZGF0YSB1c2luZyBh IHRvb2wKc3VjaCBhcyBVbmlzb24gKEB1cmx7aHR0cHM6Ly93d3cuY2lzLnVwZW5u LmVkdS9+YmNwaWVyY2UvdW5pc29uL30pLApzaW5jZSB0aGUgaW5kaXZpZHVhbCBm aWxlcyBjaGFuZ2UgcmFyZWx5LgoKVGhlIGZsYXQgZmlsZSBmb3JtYXQga2VlcHMg YWxsIG9mIHRoZSBkYXRhIGluIHRoZSBzaW5nbGUgZmlsZQpAY29kZXt0b2Z1LmRi fS4gIFRoaXMgZm9ybWF0IHJlc3VsdHMgaW4gYmV0dGVyIHBlcmZvcm1hbmNlLgoK SWYgc2V0IHRvIGF1dG8gKHdoaWNoIGlzIHRoZSBkZWZhdWx0KSwgR251UEcgd2ls bCBmaXJzdCBjaGVjayBmb3IgdGhlCmV4aXN0ZW5jZSBvZiBAY29kZXt0b2Z1LmR9 IGFuZCBAY29kZXt0b2Z1LmRifS4gIElmIG9uZSBvZiB0aGVzZQpleGlzdHMsIHRo ZSBjb3JyZXNwb25kaW5nIGZvcm1hdCBpcyB1c2VkLiAgSWYgbmVpdGhlciBvciBi b3RoIG9mIHRoZXNlCmV4aXN0LCB0aGVuIEdudVBHIGRlZmF1bHRzIHRvIHRoZSBA Y29kZXtzcGxpdH0gZm9ybWF0LiAgSW4gdGhlIGxhdHRlcgpjYXNlLCBhIHdhcm5p bmcgaXMgZW1pdHRlZC4KCkBpdGVtIC0tbWF4LWNlcnQtZGVwdGggQGNvZGV7bn0K QG9waW5kZXggbWF4LWNlcnQtZGVwdGgKTWF4aW11bSBkZXB0aCBvZiBhIGNlcnRp ZmljYXRpb24gY2hhaW4gKGRlZmF1bHQgaXMgNSkuCgpAaXRlbSAtLW5vLXNpZy1j YWNoZQpAb3BpbmRleCBuby1zaWctY2FjaGUKRG8gbm90IGNhY2hlIHRoZSB2ZXJp ZmljYXRpb24gc3RhdHVzIG9mIGtleSBzaWduYXR1cmVzLgpDYWNoaW5nIGdpdmVz IGEgbXVjaCBiZXR0ZXIgcGVyZm9ybWFuY2UgaW4ga2V5IGxpc3RpbmdzLiBIb3dl dmVyLCBpZgp5b3Ugc3VzcGVjdCB0aGF0IHlvdXIgcHVibGljIGtleXJpbmcgaXMg bm90IHNhdmUgYWdhaW5zdCB3cml0ZQptb2RpZmljYXRpb25zLCB5b3UgY2FuIHVz ZSB0aGlzIG9wdGlvbiB0byBkaXNhYmxlIHRoZSBjYWNoaW5nLiBJdApwcm9iYWJs eSBkb2VzIG5vdCBtYWtlIHNlbnNlIHRvIGRpc2FibGUgaXQgYmVjYXVzZSBhbGwg a2luZCBvZiBkYW1hZ2UKY2FuIGJlIGRvbmUgaWYgc29tZW9uZSBlbHNlIGhhcyB3 cml0ZSBhY2Nlc3MgdG8geW91ciBwdWJsaWMga2V5cmluZy4KCkBpdGVtIC0tYXV0 by1jaGVjay10cnVzdGRiCkBpdGVteCAtLW5vLWF1dG8tY2hlY2stdHJ1c3RkYgpA b3BpbmRleCBhdXRvLWNoZWNrLXRydXN0ZGIKSWYgR251UEcgZmVlbHMgdGhhdCBp dHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIFdlYiBvZiBUcnVzdCBoYXMgdG8gYmUK dXBkYXRlZCwgaXQgYXV0b21hdGljYWxseSBydW5zIHRoZSBAb3B0aW9uey0tY2hl Y2stdHJ1c3RkYn0gY29tbWFuZAppbnRlcm5hbGx5LiAgVGhpcyBtYXkgYmUgYSB0 aW1lIGNvbnN1bWluZwpwcm9jZXNzLiBAb3B0aW9uey0tbm8tYXV0by1jaGVjay10 cnVzdGRifSBkaXNhYmxlcyB0aGlzIG9wdGlvbi4KCkBpdGVtIC0tdXNlLWFnZW50 CkBpdGVteCAtLW5vLXVzZS1hZ2VudApAb3BpbmRleCB1c2UtYWdlbnQKVGhpcyBp cyBkdW1teSBvcHRpb24uIEBjb21tYW5ke0BncGduYW1lfSBhbHdheXMgcmVxdWly ZXMgdGhlIGFnZW50LgoKQGl0ZW0gLS1ncGctYWdlbnQtaW5mbwpAb3BpbmRleCBn cGctYWdlbnQtaW5mbwpUaGlzIGlzIGR1bW15IG9wdGlvbi4gSXQgaGFzIG5vIGVm ZmVjdCB3aGVuIHVzZWQgd2l0aCBAY29tbWFuZHtncGcyfS4KCgpAaXRlbSAtLWFn ZW50LXByb2dyYW0gQHZhcntmaWxlfQpAb3BpbmRleCBhZ2VudC1wcm9ncmFtClNw ZWNpZnkgYW4gYWdlbnQgcHJvZ3JhbSB0byBiZSB1c2VkIGZvciBzZWNyZXQga2V5 IG9wZXJhdGlvbnMuICBUaGUKZGVmYXVsdCB2YWx1ZSBpcyBkZXRlcm1pbmVkIGJ5 IHJ1bm5pbmcgQGNvbW1hbmR7Z3BnY29uZn0gd2l0aCB0aGUKb3B0aW9uIEBvcHRp b257LS1saXN0LWRpcnN9LiAgTm90ZSB0aGF0IHRoZSBwaXBlIHN5bWJvbCAoQGNv ZGV7fH0pIGlzCnVzZWQgZm9yIGEgcmVncmVzc2lvbiB0ZXN0IHN1aXRlIGhhY2sg YW5kIG1heSB0aHVzIG5vdCBiZSB1c2VkIGluIHRoZQpmaWxlIG5hbWUuCgpAaXRl bSAtLWRpcm1uZ3ItcHJvZ3JhbSBAdmFye2ZpbGV9CkBvcGluZGV4IGRpcm1uZ3It cHJvZ3JhbQpTcGVjaWZ5IGEgZGlybW5nciBwcm9ncmFtIHRvIGJlIHVzZWQgZm9y IGtleXNlcnZlciBhY2Nlc3MuICBUaGUKZGVmYXVsdCB2YWx1ZSBpcyBAZmlsZXtA dmFsdWV7QklORElSfS9kaXJtbmdyfS4gIFRoaXMgaXMgb25seSB1c2VkIGFzIGEK ZmFsbGJhY2sgd2hlbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgQGNvZGV7RElS TU5HUl9JTkZPfSBpcyBub3Qgc2V0IG9yCmEgcnVubmluZyBkaXJtbmdyIGNhbm5v dCBiZSBjb25uZWN0ZWQuCgpAaXRlbSAtLW5vLWF1dG9zdGFydApAb3BpbmRleCBu by1hdXRvc3RhcnQKRG8gbm90IHN0YXJ0IHRoZSBncGctYWdlbnQgb3IgdGhlIGRp cm1uZ3IgaWYgaXQgaGFzIG5vdCB5ZXQgYmVlbgpzdGFydGVkIGFuZCBpdHMgc2Vy dmljZSBpcyByZXF1aXJlZC4gIFRoaXMgb3B0aW9uIGlzIG1vc3RseSB1c2VmdWwg b24KbWFjaGluZXMgd2hlcmUgdGhlIGNvbm5lY3Rpb24gdG8gZ3BnLWFnZW50IGhh cyBiZWVuIHJlZGlyZWN0ZWQgdG8KYW5vdGhlciBtYWNoaW5lcy4gIElmIGRpcm1u Z3IgaXMgcmVxdWlyZWQgb24gdGhlIHJlbW90ZSBtYWNoaW5lLCBpdAptYXkgYmUg c3RhcnRlZCBtYW51YWxseSB1c2luZyBAY29tbWFuZHtncGdjb25mIC0tbGF1bmNo IGRpcm1uZ3J9LgoKQGl0ZW0gLS1sb2NrLW9uY2UKQG9waW5kZXggbG9jay1vbmNl CkxvY2sgdGhlIGRhdGFiYXNlcyB0aGUgZmlyc3QgdGltZSBhIGxvY2sgaXMgcmVx dWVzdGVkCmFuZCBkbyBub3QgcmVsZWFzZSB0aGUgbG9jayB1bnRpbCB0aGUgcHJv Y2Vzcwp0ZXJtaW5hdGVzLgoKQGl0ZW0gLS1sb2NrLW11bHRpcGxlCkBvcGluZGV4 IGxvY2stbXVsdGlwbGUKUmVsZWFzZSB0aGUgbG9ja3MgZXZlcnkgdGltZSBhIGxv Y2sgaXMgbm8gbG9uZ2VyCm5lZWRlZC4gVXNlIHRoaXMgdG8gb3ZlcnJpZGUgYSBw cmV2aW91cyBAb3B0aW9uey0tbG9jay1vbmNlfQpmcm9tIGEgY29uZmlnIGZpbGUu CgpAaXRlbSAtLWxvY2stbmV2ZXIKQG9waW5kZXggbG9jay1uZXZlcgpEaXNhYmxl IGxvY2tpbmcgZW50aXJlbHkuIFRoaXMgb3B0aW9uIHNob3VsZCBiZSB1c2VkIG9u bHkgaW4gdmVyeQpzcGVjaWFsIGVudmlyb25tZW50cywgd2hlcmUgaXQgY2FuIGJl IGFzc3VyZWQgdGhhdCBvbmx5IG9uZSBwcm9jZXNzCmlzIGFjY2Vzc2luZyB0aG9z ZSBmaWxlcy4gQSBib290YWJsZSBmbG9wcHkgd2l0aCBhIHN0YW5kLWFsb25lCmVu Y3J5cHRpb24gc3lzdGVtIHdpbGwgcHJvYmFibHkgdXNlIHRoaXMuIEltcHJvcGVy IHVzYWdlIG9mIHRoaXMKb3B0aW9uIG1heSBsZWFkIHRvIGRhdGEgYW5kIGtleSBj b3JydXB0aW9uLgoKQGl0ZW0gLS1leGl0LW9uLXN0YXR1cy13cml0ZS1lcnJvcgpA b3BpbmRleCBleGl0LW9uLXN0YXR1cy13cml0ZS1lcnJvcgpUaGlzIG9wdGlvbiB3 aWxsIGNhdXNlIHdyaXRlIGVycm9ycyBvbiB0aGUgc3RhdHVzIEZEIHRvIGltbWVk aWF0ZWx5CnRlcm1pbmF0ZSB0aGUgcHJvY2Vzcy4gVGhhdCBzaG91bGQgaW4gZmFj dCBiZSB0aGUgZGVmYXVsdCBidXQgaXQgbmV2ZXIKd29ya2VkIHRoaXMgd2F5IGFu ZCB0aHVzIHdlIG5lZWQgYW4gb3B0aW9uIHRvIGVuYWJsZSB0aGlzLCBzbyB0aGF0 IHRoZQpjaGFuZ2Ugd29uJ3QgYnJlYWsgYXBwbGljYXRpb25zIHdoaWNoIGNsb3Nl IHRoZWlyIGVuZCBvZiBhIHN0YXR1cyBmZApjb25uZWN0ZWQgcGlwZSB0b28gZWFy bHkuIFVzaW5nIHRoaXMgb3B0aW9uIGFsb25nIHdpdGgKQG9wdGlvbnstLWVuYWJs ZS1wcm9ncmVzcy1maWx0ZXJ9IG1heSBiZSB1c2VkIHRvIGNsZWFubHkgY2FuY2Vs IGxvbmcKcnVubmluZyBncGcgb3BlcmF0aW9ucy4KCkBpdGVtIC0tbGltaXQtY2Fy ZC1pbnNlcnQtdHJpZXMgQGNvZGV7bn0KQG9waW5kZXggbGltaXQtY2FyZC1pbnNl cnQtdHJpZXMKV2l0aCBAY29kZXtufSBncmVhdGVyIHRoYW4gMCB0aGUgbnVtYmVy IG9mIHByb21wdHMgYXNraW5nIHRvIGluc2VydCBhCnNtYXJ0Y2FyZCBnZXRzIGxp bWl0ZWQgdG8gTi0xLiBUaHVzIHdpdGggYSB2YWx1ZSBvZiAxIGdwZyB3b24ndCBh dAphbGwgYXNrIHRvIGluc2VydCBhIGNhcmQgaWYgbm9uZSBoYXMgYmVlbiBpbnNl cnRlZCBhdCBzdGFydHVwLiBUaGlzCm9wdGlvbiBpcyB1c2VmdWwgaW4gdGhlIGNv bmZpZ3VyYXRpb24gZmlsZSBpbiBjYXNlIGFuIGFwcGxpY2F0aW9uIGRvZXMKbm90 IGtub3cgYWJvdXQgdGhlIHNtYXJ0Y2FyZCBzdXBwb3J0IGFuZCB3YWl0cyBhZCBp bmZpbml0dW0gZm9yIGFuCmluc2VydGVkIGNhcmQuCgpAaXRlbSAtLW5vLXJhbmRv bS1zZWVkLWZpbGUKQG9waW5kZXggbm8tcmFuZG9tLXNlZWQtZmlsZQpHbnVQRyB1 c2VzIGEgZmlsZSB0byBzdG9yZSBpdHMgaW50ZXJuYWwgcmFuZG9tIHBvb2wgb3Zl ciBpbnZvY2F0aW9ucy4KVGhpcyBtYWtlcyByYW5kb20gZ2VuZXJhdGlvbiBmYXN0 ZXI7IGhvd2V2ZXIgc29tZXRpbWVzIHdyaXRlIG9wZXJhdGlvbnMKYXJlIG5vdCBk ZXNpcmVkLiBUaGlzIG9wdGlvbiBjYW4gYmUgdXNlZCB0byBhY2hpZXZlIHRoYXQg d2l0aCB0aGUgY29zdCBvZgpzbG93ZXIgcmFuZG9tIGdlbmVyYXRpb24uCgpAaXRl bSAtLW5vLWdyZWV0aW5nCkBvcGluZGV4IG5vLWdyZWV0aW5nClN1cHByZXNzIHRo ZSBpbml0aWFsIGNvcHlyaWdodCBtZXNzYWdlLgoKQGl0ZW0gLS1uby1zZWNtZW0t d2FybmluZwpAb3BpbmRleCBuby1zZWNtZW0td2FybmluZwpTdXBwcmVzcyB0aGUg d2FybmluZyBhYm91dCAidXNpbmcgaW5zZWN1cmUgbWVtb3J5Ii4KCkBpdGVtIC0t bm8tcGVybWlzc2lvbi13YXJuaW5nCkBvcGluZGV4IHBlcm1pc3Npb24td2Fybmlu ZwpTdXBwcmVzcyB0aGUgd2FybmluZyBhYm91dCB1bnNhZmUgZmlsZSBhbmQgaG9t ZSBkaXJlY3RvcnkgKEBvcHRpb257LS1ob21lZGlyfSkKcGVybWlzc2lvbnMuIE5v dGUgdGhhdCB0aGUgcGVybWlzc2lvbiBjaGVja3MgdGhhdCBHbnVQRyBwZXJmb3Jt cyBhcmUKbm90IGludGVuZGVkIHRvIGJlIGF1dGhvcml0YXRpdmUsIGJ1dCByYXRo ZXIgdGhleSBzaW1wbHkgd2FybiBhYm91dApjZXJ0YWluIGNvbW1vbiBwZXJtaXNz aW9uIHByb2JsZW1zLiBEbyBub3QgYXNzdW1lIHRoYXQgdGhlIGxhY2sgb2YgYQp3 YXJuaW5nIG1lYW5zIHRoYXQgeW91ciBzeXN0ZW0gaXMgc2VjdXJlLgoKTm90ZSB0 aGF0IHRoZSB3YXJuaW5nIGZvciB1bnNhZmUgQG9wdGlvbnstLWhvbWVkaXJ9IHBl cm1pc3Npb25zIGNhbm5vdCBiZQpzdXBwcmVzc2VkIGluIHRoZSBncGcuY29uZiBm aWxlLCBhcyB0aGlzIHdvdWxkIGFsbG93IGFuIGF0dGFja2VyIHRvCnBsYWNlIGFu IHVuc2FmZSBncGcuY29uZiBmaWxlIGluIHBsYWNlLCBhbmQgdXNlIHRoaXMgZmls ZSB0byBzdXBwcmVzcwp3YXJuaW5ncyBhYm91dCBpdHNlbGYuIFRoZSBAb3B0aW9u ey0taG9tZWRpcn0gcGVybWlzc2lvbnMgd2FybmluZyBtYXkgb25seSBiZQpzdXBw cmVzc2VkIG9uIHRoZSBjb21tYW5kIGxpbmUuCgpAaXRlbSAtLW5vLW1kYy13YXJu aW5nCkBvcGluZGV4IG5vLW1kYy13YXJuaW5nClN1cHByZXNzIHRoZSB3YXJuaW5n IGFib3V0IG1pc3NpbmcgTURDIGludGVncml0eSBwcm90ZWN0aW9uLgoKQGl0ZW0g LS1yZXF1aXJlLXNlY21lbQpAaXRlbXggLS1uby1yZXF1aXJlLXNlY21lbQpAb3Bp bmRleCByZXF1aXJlLXNlY21lbQpSZWZ1c2UgdG8gcnVuIGlmIEdudVBHIGNhbm5v dCBnZXQgc2VjdXJlIG1lbW9yeS4gRGVmYXVsdHMgdG8gbm8KKGkuZS4gcnVuLCBi dXQgZ2l2ZSBhIHdhcm5pbmcpLgoKCkBpdGVtIC0tcmVxdWlyZS1jcm9zcy1jZXJ0 aWZpY2F0aW9uCkBpdGVteCAtLW5vLXJlcXVpcmUtY3Jvc3MtY2VydGlmaWNhdGlv bgpAb3BpbmRleCByZXF1aXJlLWNyb3NzLWNlcnRpZmljYXRpb24KV2hlbiB2ZXJp ZnlpbmcgYSBzaWduYXR1cmUgbWFkZSBmcm9tIGEgc3Via2V5LCBlbnN1cmUgdGhh dCB0aGUgY3Jvc3MKY2VydGlmaWNhdGlvbiAiYmFjayBzaWduYXR1cmUiIG9uIHRo ZSBzdWJrZXkgaXMgcHJlc2VudCBhbmQgdmFsaWQuICBUaGlzCnByb3RlY3RzIGFn YWluc3QgYSBzdWJ0bGUgYXR0YWNrIGFnYWluc3Qgc3Via2V5cyB0aGF0IGNhbiBz aWduLgpEZWZhdWx0cyB0byBAb3B0aW9uey0tcmVxdWlyZS1jcm9zcy1jZXJ0aWZp Y2F0aW9ufSBmb3IKQGNvbW1hbmR7QGdwZ25hbWV9LgoKQGl0ZW0gLS1leHBlcnQK QGl0ZW14IC0tbm8tZXhwZXJ0CkBvcGluZGV4IGV4cGVydApBbGxvdyB0aGUgdXNl ciB0byBkbyBjZXJ0YWluIG5vbnNlbnNpY2FsIG9yICJzaWxseSIgdGhpbmdzIGxp a2UKc2lnbmluZyBhbiBleHBpcmVkIG9yIHJldm9rZWQga2V5LCBvciBjZXJ0YWlu IHBvdGVudGlhbGx5IGluY29tcGF0aWJsZQp0aGluZ3MgbGlrZSBnZW5lcmF0aW5n IHVudXN1YWwga2V5IHR5cGVzLiBUaGlzIGFsc28gZGlzYWJsZXMgY2VydGFpbgp3 YXJuaW5nIG1lc3NhZ2VzIGFib3V0IHBvdGVudGlhbGx5IGluY29tcGF0aWJsZSBh Y3Rpb25zLiBBcyB0aGUgbmFtZQppbXBsaWVzLCB0aGlzIG9wdGlvbiBpcyBmb3Ig ZXhwZXJ0cyBvbmx5LiBJZiB5b3UgZG9uJ3QgZnVsbHkKdW5kZXJzdGFuZCB0aGUg aW1wbGljYXRpb25zIG9mIHdoYXQgaXQgYWxsb3dzIHlvdSB0byBkbywgbGVhdmUg dGhpcwpvZmYuIEBvcHRpb257LS1uby1leHBlcnR9IGRpc2FibGVzIHRoaXMgb3B0 aW9uLgoKQGVuZCB0YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioKQGMgKioqKioqKiogIEtFWSBSRUxBVEVEIE9QVElP TlMgICoqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqCkBub2RlIEdQRyBLZXkgcmVsYXRlZCBPcHRpb25zCkBz dWJzZWN0aW9uIEtleSByZWxhdGVkIG9wdGlvbnMKCkB0YWJsZSBAZ251cGd0YWJv cHQKCkBpdGVtIC0tcmVjaXBpZW50IEB2YXJ7bmFtZX0KQGl0ZW14IC1yCkBvcGlu ZGV4IHJlY2lwaWVudApFbmNyeXB0IGZvciB1c2VyIGlkIEB2YXJ7bmFtZX0uIElm IHRoaXMgb3B0aW9uIG9yCkBvcHRpb257LS1oaWRkZW4tcmVjaXBpZW50fSBpcyBu b3Qgc3BlY2lmaWVkLCBHbnVQRyBhc2tzIGZvciB0aGUgdXNlci1pZAp1bmxlc3Mg QG9wdGlvbnstLWRlZmF1bHQtcmVjaXBpZW50fSBpcyBnaXZlbi4KCkBpdGVtIC0t aGlkZGVuLXJlY2lwaWVudCBAdmFye25hbWV9CkBpdGVteCAtUgpAb3BpbmRleCBo aWRkZW4tcmVjaXBpZW50CkVuY3J5cHQgZm9yIHVzZXIgSUQgQHZhcntuYW1lfSwg YnV0IGhpZGUgdGhlIGtleSBJRCBvZiB0aGlzIHVzZXIncwprZXkuIFRoaXMgb3B0 aW9uIGhlbHBzIHRvIGhpZGUgdGhlIHJlY2VpdmVyIG9mIHRoZSBtZXNzYWdlIGFu ZCBpcyBhCmxpbWl0ZWQgY291bnRlcm1lYXN1cmUgYWdhaW5zdCB0cmFmZmljIGFu YWx5c2lzLiBJZiB0aGlzIG9wdGlvbiBvcgpAb3B0aW9uey0tcmVjaXBpZW50fSBp cyBub3Qgc3BlY2lmaWVkLCBHbnVQRyBhc2tzIGZvciB0aGUgdXNlciBJRCB1bmxl c3MKQG9wdGlvbnstLWRlZmF1bHQtcmVjaXBpZW50fSBpcyBnaXZlbi4KCkBpdGVt IC0tZW5jcnlwdC10byBAY29kZXtuYW1lfQpAb3BpbmRleCBlbmNyeXB0LXRvClNh bWUgYXMgQG9wdGlvbnstLXJlY2lwaWVudH0gYnV0IHRoaXMgb25lIGlzIGludGVu ZGVkIGZvciB1c2UgaW4gdGhlCm9wdGlvbnMgZmlsZSBhbmQgbWF5IGJlIHVzZWQg d2l0aCB5b3VyIG93biB1c2VyLWlkIGFzIGFuCiJlbmNyeXB0LXRvLXNlbGYiLiBU aGVzZSBrZXlzIGFyZSBvbmx5IHVzZWQgd2hlbiB0aGVyZSBhcmUgb3RoZXIKcmVj aXBpZW50cyBnaXZlbiBlaXRoZXIgYnkgdXNlIG9mIEBvcHRpb257LS1yZWNpcGll bnR9IG9yIGJ5IHRoZSBhc2tlZAp1c2VyIGlkLiAgTm8gdHJ1c3QgY2hlY2tpbmcg aXMgcGVyZm9ybWVkIGZvciB0aGVzZSB1c2VyIGlkcyBhbmQgZXZlbgpkaXNhYmxl ZCBrZXlzIGNhbiBiZSB1c2VkLgoKQGl0ZW0gLS1oaWRkZW4tZW5jcnlwdC10byBA Y29kZXtuYW1lfQpAb3BpbmRleCBoaWRkZW4tZW5jcnlwdC10bwpTYW1lIGFzIEBv cHRpb257LS1oaWRkZW4tcmVjaXBpZW50fSBidXQgdGhpcyBvbmUgaXMgaW50ZW5k ZWQgZm9yIHVzZSBpbiB0aGUKb3B0aW9ucyBmaWxlIGFuZCBtYXkgYmUgdXNlZCB3 aXRoIHlvdXIgb3duIHVzZXItaWQgYXMgYSBoaWRkZW4KImVuY3J5cHQtdG8tc2Vs ZiIuIFRoZXNlIGtleXMgYXJlIG9ubHkgdXNlZCB3aGVuIHRoZXJlIGFyZSBvdGhl cgpyZWNpcGllbnRzIGdpdmVuIGVpdGhlciBieSB1c2Ugb2YgQG9wdGlvbnstLXJl Y2lwaWVudH0gb3IgYnkgdGhlIGFza2VkIHVzZXIgaWQuCk5vIHRydXN0IGNoZWNr aW5nIGlzIHBlcmZvcm1lZCBmb3IgdGhlc2UgdXNlciBpZHMgYW5kIGV2ZW4gZGlz YWJsZWQKa2V5cyBjYW4gYmUgdXNlZC4KCkBpdGVtIC0tZW5jcnlwdC10by1kZWZh dWx0LWtleQpAb3BpbmRleCBlbmNyeXB0LXRvLWRlZmF1bHQta2V5CklmIHRoZSBk ZWZhdWx0IHNlY3JldCBrZXkgaXMgdGFrZW4gZnJvbSBAb3B0aW9uey0tZGVmYXVs dC1rZXl9LCB0aGVuCmFsc28gZW5jcnlwdCB0byB0aGF0IGtleS4KCkBpdGVtIC0t bm8tZW5jcnlwdC10bwpAb3BpbmRleCBuby1lbmNyeXB0LXRvCkRpc2FibGUgdGhl IHVzZSBvZiBhbGwgQG9wdGlvbnstLWVuY3J5cHQtdG99IGFuZApAb3B0aW9uey0t aGlkZGVuLWVuY3J5cHQtdG99IGtleXMuCgpAaXRlbSAtLWdyb3VwIEBjb2Rle25h bWU9dmFsdWUxIH0KQG9waW5kZXggZ3JvdXAKU2V0cyB1cCBhIG5hbWVkIGdyb3Vw LCB3aGljaCBpcyBzaW1pbGFyIHRvIGFsaWFzZXMgaW4gZW1haWwgcHJvZ3JhbXMu CkFueSB0aW1lIHRoZSBncm91cCBuYW1lIGlzIGEgcmVjaXBpZW50IChAb3B0aW9u ey1yfSBvcgpAb3B0aW9uey0tcmVjaXBpZW50fSksIGl0IHdpbGwgYmUgZXhwYW5k ZWQgdG8gdGhlIHZhbHVlcwpzcGVjaWZpZWQuIE11bHRpcGxlIGdyb3VwcyB3aXRo IHRoZSBzYW1lIG5hbWUgYXJlIGF1dG9tYXRpY2FsbHkgbWVyZ2VkCmludG8gYSBz aW5nbGUgZ3JvdXAuCgpUaGUgdmFsdWVzIGFyZSBAY29kZXtrZXkgSURzfSBvciBm aW5nZXJwcmludHMsIGJ1dCBhbnkga2V5IGRlc2NyaXB0aW9uCmlzIGFjY2VwdGVk LiBOb3RlIHRoYXQgYSB2YWx1ZSB3aXRoIHNwYWNlcyBpbiBpdCB3aWxsIGJlIHRy ZWF0ZWQgYXMKdHdvIGRpZmZlcmVudCB2YWx1ZXMuIE5vdGUgYWxzbyB0aGVyZSBp cyBvbmx5IG9uZSBsZXZlbCBvZiBleHBhbnNpb24KLS0tIHlvdSBjYW5ub3QgbWFr ZSBhbiBncm91cCB0aGF0IHBvaW50cyB0byBhbm90aGVyIGdyb3VwLiBXaGVuIHVz ZWQKZnJvbSB0aGUgY29tbWFuZCBsaW5lLCBpdCBtYXkgYmUgbmVjZXNzYXJ5IHRv IHF1b3RlIHRoZSBhcmd1bWVudCB0bwp0aGlzIG9wdGlvbiB0byBwcmV2ZW50IHRo ZSBzaGVsbCBmcm9tIHRyZWF0aW5nIGl0IGFzIG11bHRpcGxlCmFyZ3VtZW50cy4K CkBpdGVtIC0tdW5ncm91cCBAY29kZXtuYW1lfQpAb3BpbmRleCB1bmdyb3VwClJl bW92ZSBhIGdpdmVuIGVudHJ5IGZyb20gdGhlIEBvcHRpb257LS1ncm91cH0gbGlz dC4KCkBpdGVtIC0tbm8tZ3JvdXBzCkBvcGluZGV4IG5vLWdyb3VwcwpSZW1vdmUg YWxsIGVudHJpZXMgZnJvbSB0aGUgQG9wdGlvbnstLWdyb3VwfSBsaXN0LgoKQGl0 ZW0gLS1sb2NhbC11c2VyIEB2YXJ7bmFtZX0KQGl0ZW14IC11CkBvcGluZGV4IGxv Y2FsLXVzZXIKVXNlIEB2YXJ7bmFtZX0gYXMgdGhlIGtleSB0byBzaWduIHdpdGgu IE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBvdmVycmlkZXMKQG9wdGlvbnstLWRlZmF1 bHQta2V5fS4KCkBpdGVtIC0tdHJ5LXNlY3JldC1rZXkgQHZhcntuYW1lfQpAb3Bp bmRleCB0cnktc2VjcmV0LWtleQpGb3IgaGlkZGVuIHJlY2lwaWVudHMgR1BHIG5l ZWRzIHRvIGtub3cgdGhlIGtleXMgdG8gdXNlIGZvciB0cmlhbApkZWNyeXB0aW9u LiAgVGhlIGtleSBzZXQgd2l0aCBAb3B0aW9uey0tZGVmYXVsdC1rZXl9IGlzIGFs d2F5cyB0cmllZApmaXJzdCwgYnV0IHRoaXMgaXMgb2Z0ZW4gbm90IHN1ZmZpY2ll bnQuICBUaGlzIG9wdGlvbiBhbGxvd3MgdG8gc2V0IG1vcmUKa2V5cyB0byBiZSB1 c2VkIGZvciB0cmlhbCBkZWNyeXB0aW9uLiAgQWx0aG91Z2ggYW55IHZhbGlkIHVz ZXItaWQKc3BlY2lmaWNhdGlvbiBtYXkgYmUgdXNlZCBmb3IgQHZhcntuYW1lfSBp dCBtYWtlcyBzZW5zZSB0byB1c2UgYXQgbGVhc3QKdGhlIGxvbmcga2V5aWQgdG8g YXZvaWQgYW1iaWd1aXRpZXMuICBOb3RlIHRoYXQgZ3BnLWFnZW50IG1pZ2h0IHBv cCB1cCBhCnBpbmVudHJ5IGZvciBhIGxvdCBrZXlzIHRvIGRvIHRoZSB0cmlhbCBk ZWNyeXB0aW9uLiAgSWYgeW91IHdhbnQgdG8gc3RvcAphbGwgZnVydGhlciB0cmlh bCBkZWNyeXB0aW9uIHlvdSBtYXkgdXNlIGNsb3NlLXdpbmRvdyBidXR0b24gaW5z dGVhZCBvZgp0aGUgY2FuY2VsIGJ1dHRvbi4KCkBpdGVtIC0tdHJ5LWFsbC1zZWNy ZXRzCkBvcGluZGV4IHRyeS1hbGwtc2VjcmV0cwpEb24ndCBsb29rIGF0IHRoZSBr ZXkgSUQgYXMgc3RvcmVkIGluIHRoZSBtZXNzYWdlIGJ1dCB0cnkgYWxsIHNlY3Jl dAprZXlzIGluIHR1cm4gdG8gZmluZCB0aGUgcmlnaHQgZGVjcnlwdGlvbiBrZXku IFRoaXMgb3B0aW9uIGZvcmNlcyB0aGUKYmVoYXZpb3VyIGFzIHVzZWQgYnkgYW5v bnltb3VzIHJlY2lwaWVudHMgKGNyZWF0ZWQgYnkgdXNpbmcKQG9wdGlvbnstLXRo cm93LWtleWlkc30gb3IgQG9wdGlvbnstLWhpZGRlbi1yZWNpcGllbnR9KSBhbmQg bWlnaHQgY29tZQpoYW5keSBpbiBjYXNlIHdoZXJlIGFuIGVuY3J5cHRlZCBtZXNz YWdlIGNvbnRhaW5zIGEgYm9ndXMga2V5IElELgoKQGl0ZW0gLS1za2lwLWhpZGRl bi1yZWNpcGllbnRzCkBpdGVteCAtLW5vLXNraXAtaGlkZGVuLXJlY2lwaWVudHMK QG9waW5kZXggc2tpcC1oaWRkZW4tcmVjaXBpZW50cwpAb3BpbmRleCBuby1za2lw LWhpZGRlbi1yZWNpcGllbnRzCkR1cmluZyBkZWNyeXB0aW9uIHNraXAgYWxsIGFu b255bW91cyByZWNpcGllbnRzLiAgVGhpcyBvcHRpb24gaGVscHMgaW4KdGhlIGNh c2UgdGhhdCBwZW9wbGUgdXNlIHRoZSBoaWRkZW4gcmVjaXBpZW50cyBmZWF0dXJl IHRvIGhpZGUgdGhlcmUKb3duIGVuY3J5cHQtdG8ga2V5IGZyb20gb3RoZXJzLiAg SWYgb25lc2VsZiBoYXMgbWFueSBzZWNyZXQga2V5cyB0aGlzCm1heSBsZWFkIHRv IGEgbWFqb3IgYW5ub3lhbmNlIGJlY2F1c2UgYWxsIGtleXMgYXJlIHRyaWVkIGlu IHR1cm4gdG8KZGVjcnlwdCBzb21ldGhpbmcgd2hpY2ggd2FzIG5vdCByZWFsbHkg aW50ZW5kZWQgZm9yIGl0LiAgVGhlIGRyYXdiYWNrCm9mIHRoaXMgb3B0aW9uIGlz IHRoYXQgaXQgaXMgY3VycmVudGx5IG5vdCBwb3NzaWJsZSB0byBkZWNyeXB0IGEK bWVzc2FnZSB3aGljaCBpbmNsdWRlcyByZWFsIGFub255bW91cyByZWNpcGllbnRz LgoKCkBlbmQgdGFibGUKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioKQGMgKioqKioqKiogIElOUFVUIEFORCBPVVRQVVQgICoq KioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqCkBub2RlIEdQRyBJbnB1dCBhbmQgT3V0cHV0CkBzdWJzZWN0 aW9uIElucHV0IGFuZCBPdXRwdXQKCkB0YWJsZSBAZ251cGd0YWJvcHQKCkBpdGVt IC0tYXJtb3IKQGl0ZW14IC1hCkBvcGluZGV4IGFybW9yCkNyZWF0ZSBBU0NJSSBh cm1vcmVkIG91dHB1dC4gIFRoZSBkZWZhdWx0IGlzIHRvIGNyZWF0ZSB0aGUgYmlu YXJ5Ck9wZW5QR1AgZm9ybWF0LgoKQGl0ZW0gLS1uby1hcm1vcgpAb3BpbmRleCBu by1hcm1vcgpBc3N1bWUgdGhlIGlucHV0IGRhdGEgaXMgbm90IGluIEFTQ0lJIGFy bW9yZWQgZm9ybWF0LgoKQGl0ZW0gLS1vdXRwdXQgQHZhcntmaWxlfQpAaXRlbXgg LW8gQHZhcntmaWxlfQpAb3BpbmRleCBvdXRwdXQKV3JpdGUgb3V0cHV0IHRvIEB2 YXJ7ZmlsZX0uCgpAaXRlbSAtLW1heC1vdXRwdXQgQGNvZGV7bn0KQG9waW5kZXgg bWF4LW91dHB1dApUaGlzIG9wdGlvbiBzZXRzIGEgbGltaXQgb24gdGhlIG51bWJl ciBvZiBieXRlcyB0aGF0IHdpbGwgYmUgZ2VuZXJhdGVkCndoZW4gcHJvY2Vzc2lu ZyBhIGZpbGUuIFNpbmNlIE9wZW5QR1Agc3VwcG9ydHMgdmFyaW91cyBsZXZlbHMg b2YKY29tcHJlc3Npb24sIGl0IGlzIHBvc3NpYmxlIHRoYXQgdGhlIHBsYWludGV4 dCBvZiBhIGdpdmVuIG1lc3NhZ2UgbWF5IGJlCnNpZ25pZmljYW50bHkgbGFyZ2Vy IHRoYW4gdGhlIG9yaWdpbmFsIE9wZW5QR1AgbWVzc2FnZS4gV2hpbGUgR251UEcK d29ya3MgcHJvcGVybHkgd2l0aCBzdWNoIG1lc3NhZ2VzLCB0aGVyZSBpcyBvZnRl biBhIGRlc2lyZSB0byBzZXQgYQptYXhpbXVtIGZpbGUgc2l6ZSB0aGF0IHdpbGwg YmUgZ2VuZXJhdGVkIGJlZm9yZSBwcm9jZXNzaW5nIGlzIGZvcmNlZCB0bwpzdG9w IGJ5IHRoZSBPUyBsaW1pdHMuIERlZmF1bHRzIHRvIDAsIHdoaWNoIG1lYW5zICJu byBsaW1pdCIuCgpAaXRlbSAtLWltcG9ydC1vcHRpb25zIEBjb2Rle3BhcmFtZXRl cnN9CkBvcGluZGV4IGltcG9ydC1vcHRpb25zClRoaXMgaXMgYSBzcGFjZSBvciBj b21tYSBkZWxpbWl0ZWQgc3RyaW5nIHRoYXQgZ2l2ZXMgb3B0aW9ucyBmb3IKaW1w b3J0aW5nIGtleXMuIE9wdGlvbnMgY2FuIGJlIHByZXBlbmRlZCB3aXRoIGEgYG5v LScgdG8gZ2l2ZSB0aGUKb3Bwb3NpdGUgbWVhbmluZy4gVGhlIG9wdGlvbnMgYXJl OgoKQHRhYmxlIEBhc2lzCgogIEBpdGVtIGltcG9ydC1sb2NhbC1zaWdzCiAgQWxs b3cgaW1wb3J0aW5nIGtleSBzaWduYXR1cmVzIG1hcmtlZCBhcyAibG9jYWwiLiBU aGlzIGlzIG5vdAogIGdlbmVyYWxseSB1c2VmdWwgdW5sZXNzIGEgc2hhcmVkIGtl eXJpbmcgc2NoZW1lIGlzIGJlaW5nIHVzZWQuCiAgRGVmYXVsdHMgdG8gbm8uCgog IEBpdGVtIGtlZXAtb3duZXJ0cnVzdAogIE5vcm1hbGx5IHBvc3NpYmxlIHN0aWxs IGV4aXN0aW5nIG93bmVydHJ1c3QgdmFsdWVzIG9mIGEga2V5IGFyZQogIGNsZWFy ZWQgaWYgYSBrZXkgaXMgaW1wb3J0ZWQuICBUaGlzIGlzIGluIGdlbmVyYWwgZGVz aXJhYmxlIHNvIHRoYXQKICBhIGZvcm1lcmx5IGRlbGV0ZWQga2V5IGRvZXMgbm90 IGF1dG9tYXRpY2FsbHkgZ2FpbiBhbiBvd25lcnRydXN0CiAgdmFsdWVzIG1lcmVs eSBkdWUgdG8gaW1wb3J0LiAgT24gdGhlIG90aGVyIGhhbmQgaXQgaXMgc29tZXRp bWVzCiAgbmVjZXNzYXJ5IHRvIHJlLWltcG9ydCBhIHRydXN0ZWQgc2V0IG9mIGtl eXMgYWdhaW4gYnV0IGtlZXBpbmcKICBhbHJlYWR5IGFzc2lnbmVkIG93bmVydHJ1 c3QgdmFsdWVzLiAgVGhpcyBjYW4gYmUgYWNoaXZlZCBieSB1c2luZwogIHRoaXMg b3B0aW9uLgoKICBAaXRlbSByZXBhaXItcGtzLXN1YmtleS1idWcKICBEdXJpbmcg aW1wb3J0LCBhdHRlbXB0IHRvIHJlcGFpciB0aGUgZGFtYWdlIGNhdXNlZCBieSB0 aGUgUEtTIGtleXNlcnZlcgogIGJ1ZyAocHJlIHZlcnNpb24gMC45LjYpIHRoYXQg bWFuZ2xlcyBrZXlzIHdpdGggbXVsdGlwbGUgc3Via2V5cy4gTm90ZQogIHRoYXQg dGhpcyBjYW5ub3QgY29tcGxldGVseSByZXBhaXIgdGhlIGRhbWFnZWQga2V5IGFz IHNvbWUgY3J1Y2lhbCBkYXRhCiAgaXMgcmVtb3ZlZCBieSB0aGUga2V5c2VydmVy LCBidXQgaXQgZG9lcyBhdCBsZWFzdCBnaXZlIHlvdSBiYWNrIG9uZQogIHN1Ymtl eS4gRGVmYXVsdHMgdG8gbm8gZm9yIHJlZ3VsYXIgQG9wdGlvbnstLWltcG9ydH0g YW5kIHRvIHllcyBmb3IKICBrZXlzZXJ2ZXIgQG9wdGlvbnstLXJlY3Yta2V5c30u CgogIEBpdGVtIG1lcmdlLW9ubHkKICBEdXJpbmcgaW1wb3J0LCBhbGxvdyBrZXkg dXBkYXRlcyB0byBleGlzdGluZyBrZXlzLCBidXQgZG8gbm90IGFsbG93CiAgYW55 IG5ldyBrZXlzIHRvIGJlIGltcG9ydGVkLiBEZWZhdWx0cyB0byBuby4KCiAgQGl0 ZW0gaW1wb3J0LWNsZWFuCiAgQWZ0ZXIgaW1wb3J0LCBjb21wYWN0IChyZW1vdmUg YWxsIHNpZ25hdHVyZXMgZXhjZXB0IHRoZQogIHNlbGYtc2lnbmF0dXJlKSBhbnkg dXNlciBJRHMgZnJvbSB0aGUgbmV3IGtleSB0aGF0IGFyZSBub3QgdXNhYmxlLgog IFRoZW4sIHJlbW92ZSBhbnkgc2lnbmF0dXJlcyBmcm9tIHRoZSBuZXcga2V5IHRo YXQgYXJlIG5vdCB1c2FibGUuCiAgVGhpcyBpbmNsdWRlcyBzaWduYXR1cmVzIHRo YXQgd2VyZSBpc3N1ZWQgYnkga2V5cyB0aGF0IGFyZSBub3QgcHJlc2VudAogIG9u IHRoZSBrZXlyaW5nLiBUaGlzIG9wdGlvbiBpcyB0aGUgc2FtZSBhcyBydW5uaW5n IHRoZSBAb3B0aW9uey0tZWRpdC1rZXl9CiAgY29tbWFuZCAiY2xlYW4iIGFmdGVy IGltcG9ydC4gRGVmYXVsdHMgdG8gbm8uCgogIEBpdGVtIGltcG9ydC1taW5pbWFs CiAgSW1wb3J0IHRoZSBzbWFsbGVzdCBrZXkgcG9zc2libGUuIFRoaXMgcmVtb3Zl cyBhbGwgc2lnbmF0dXJlcyBleGNlcHQKICB0aGUgbW9zdCByZWNlbnQgc2VsZi1z aWduYXR1cmUgb24gZWFjaCB1c2VyIElELiBUaGlzIG9wdGlvbiBpcyB0aGUKICBz YW1lIGFzIHJ1bm5pbmcgdGhlIEBvcHRpb257LS1lZGl0LWtleX0gY29tbWFuZCAi bWluaW1pemUiIGFmdGVyIGltcG9ydC4KICBEZWZhdWx0cyB0byBuby4KQGVuZCB0 YWJsZQoKQGl0ZW0gLS1leHBvcnQtb3B0aW9ucyBAY29kZXtwYXJhbWV0ZXJzfQpA b3BpbmRleCBleHBvcnQtb3B0aW9ucwpUaGlzIGlzIGEgc3BhY2Ugb3IgY29tbWEg ZGVsaW1pdGVkIHN0cmluZyB0aGF0IGdpdmVzIG9wdGlvbnMgZm9yCmV4cG9ydGlu ZyBrZXlzLiBPcHRpb25zIGNhbiBiZSBwcmVwZW5kZWQgd2l0aCBhIGBuby0nIHRv IGdpdmUgdGhlCm9wcG9zaXRlIG1lYW5pbmcuIFRoZSBvcHRpb25zIGFyZToKCkB0 YWJsZSBAYXNpcwoKICBAaXRlbSBleHBvcnQtbG9jYWwtc2lncwogIEFsbG93IGV4 cG9ydGluZyBrZXkgc2lnbmF0dXJlcyBtYXJrZWQgYXMgImxvY2FsIi4gVGhpcyBp cyBub3QKICBnZW5lcmFsbHkgdXNlZnVsIHVubGVzcyBhIHNoYXJlZCBrZXlyaW5n IHNjaGVtZSBpcyBiZWluZyB1c2VkLgogIERlZmF1bHRzIHRvIG5vLgoKICBAaXRl bSBleHBvcnQtYXR0cmlidXRlcwogIEluY2x1ZGUgYXR0cmlidXRlIHVzZXIgSURz IChwaG90byBJRHMpIHdoaWxlIGV4cG9ydGluZy4gVGhpcyBpcwogIHVzZWZ1bCB0 byBleHBvcnQga2V5cyBpZiB0aGV5IGFyZSBnb2luZyB0byBiZSB1c2VkIGJ5IGFu IE9wZW5QR1AKICBwcm9ncmFtIHRoYXQgZG9lcyBub3QgYWNjZXB0IGF0dHJpYnV0 ZSB1c2VyIElEcy4gRGVmYXVsdHMgdG8geWVzLgoKICBAaXRlbSBleHBvcnQtc2Vu c2l0aXZlLXJldmtleXMKICBJbmNsdWRlIGRlc2lnbmF0ZWQgcmV2b2tlciBpbmZv cm1hdGlvbiB0aGF0IHdhcyBtYXJrZWQgYXMKICAic2Vuc2l0aXZlIi4gRGVmYXVs dHMgdG8gbm8uCgogIEBjIFNpbmNlIEdudVBHIDIuMSBncGctYWdlbnQgbWFuYWdl cyB0aGUgc2VjcmV0IGtleSBhbmQgdGh1cyB0aGUKICBAYyBleHBvcnQtcmVzZXQt c3Via2V5LXBhc3N3ZCBoYWNrIGlzIG5vdCBhbnltb3JlIGp1c3RpZmllZC4gIFN1 Y2ggdXNlCiAgQGMgY2FzZXMgbWF5IGJlIGltcGxlbWVudGVkIHVzaW5nIGEgc3Bl Y2lhbGl6ZWQgc2VjcmV0IGtleSBleHBvcnQKICBAYyB0b29sLgogIEBjIEBpdGVt IGV4cG9ydC1yZXNldC1zdWJrZXktcGFzc3dkCiAgQGMgV2hlbiB1c2luZyB0aGUg QG9wdGlvbnstLWV4cG9ydC1zZWNyZXQtc3Via2V5c30gY29tbWFuZCwgdGhpcyBv cHRpb24gcmVzZXRzCiAgQGMgdGhlIHBhc3NwaHJhc2VzIGZvciBhbGwgZXhwb3J0 ZWQgc3Via2V5cyB0byBlbXB0eS4gVGhpcyBpcyB1c2VmdWwKICBAYyB3aGVuIHRo ZSBleHBvcnRlZCBzdWJrZXkgaXMgdG8gYmUgdXNlZCBvbiBhbiB1bmF0dGVuZGVk IG1hY2hpbmUgd2hlcmUKICBAYyBhIHBhc3NwaHJhc2UgZG9lc24ndCBuZWNlc3Nh cmlseSBtYWtlIHNlbnNlLiBEZWZhdWx0cyB0byBuby4KCiAgQGl0ZW0gZXhwb3J0 LWNsZWFuCiAgQ29tcGFjdCAocmVtb3ZlIGFsbCBzaWduYXR1cmVzIGZyb20pIHVz ZXIgSURzIG9uIHRoZSBrZXkgYmVpbmcKICBleHBvcnRlZCBpZiB0aGUgdXNlciBJ RHMgYXJlIG5vdCB1c2FibGUuIEFsc28sIGRvIG5vdCBleHBvcnQgYW55CiAgc2ln bmF0dXJlcyB0aGF0IGFyZSBub3QgdXNhYmxlLiBUaGlzIGluY2x1ZGVzIHNpZ25h dHVyZXMgdGhhdCB3ZXJlCiAgaXNzdWVkIGJ5IGtleXMgdGhhdCBhcmUgbm90IHBy ZXNlbnQgb24gdGhlIGtleXJpbmcuIFRoaXMgb3B0aW9uIGlzCiAgdGhlIHNhbWUg YXMgcnVubmluZyB0aGUgQG9wdGlvbnstLWVkaXQta2V5fSBjb21tYW5kICJjbGVh biIgYmVmb3JlIGV4cG9ydAogIGV4Y2VwdCB0aGF0IHRoZSBsb2NhbCBjb3B5IG9m IHRoZSBrZXkgaXMgbm90IG1vZGlmaWVkLiBEZWZhdWx0cyB0bwogIG5vLgoKICBA aXRlbSBleHBvcnQtbWluaW1hbAogIEV4cG9ydCB0aGUgc21hbGxlc3Qga2V5IHBv c3NpYmxlLiBUaGlzIHJlbW92ZXMgYWxsIHNpZ25hdHVyZXMgZXhjZXB0IHRoZQog IG1vc3QgcmVjZW50IHNlbGYtc2lnbmF0dXJlIG9uIGVhY2ggdXNlciBJRC4gVGhp cyBvcHRpb24gaXMgdGhlIHNhbWUgYXMKICBydW5uaW5nIHRoZSBAb3B0aW9uey0t ZWRpdC1rZXl9IGNvbW1hbmQgIm1pbmltaXplIiBiZWZvcmUgZXhwb3J0IGV4Y2Vw dAogIHRoYXQgdGhlIGxvY2FsIGNvcHkgb2YgdGhlIGtleSBpcyBub3QgbW9kaWZp ZWQuIERlZmF1bHRzIHRvIG5vLgpAZW5kIHRhYmxlCgpAaXRlbSAtLXdpdGgtY29s b25zCkBvcGluZGV4IHdpdGgtY29sb25zClByaW50IGtleSBsaXN0aW5ncyBkZWxp bWl0ZWQgYnkgY29sb25zLiBOb3RlIHRoYXQgdGhlIG91dHB1dCB3aWxsIGJlCmVu Y29kZWQgaW4gVVRGLTggcmVnYXJkbGVzcyBvZiBhbnkgQG9wdGlvbnstLWRpc3Bs YXktY2hhcnNldH0gc2V0dGluZy4gVGhpcwpmb3JtYXQgaXMgdXNlZnVsIHdoZW4g R251UEcgaXMgY2FsbGVkIGZyb20gc2NyaXB0cyBhbmQgb3RoZXIgcHJvZ3JhbXMK YXMgaXQgaXMgZWFzaWx5IG1hY2hpbmUgcGFyc2VkLiBUaGUgZGV0YWlscyBvZiB0 aGlzIGZvcm1hdCBhcmUKZG9jdW1lbnRlZCBpbiB0aGUgZmlsZSBAZmlsZXtkb2Mv REVUQUlMU30sIHdoaWNoIGlzIGluY2x1ZGVkIGluIHRoZSBHbnVQRwpzb3VyY2Ug ZGlzdHJpYnV0aW9uLgoKCkBpdGVtIC0tcHJpbnQtcGthLXJlY29yZHMKQG9waW5k ZXggcHJpbnQtcGthLXJlY29yZHMKTW9kaWZ5IHRoZSBvdXRwdXQgb2YgdGhlIGxp c3QgY29tbWFuZHMgdG8gcHJpbnQgUEtBIHJlY29yZHMgc3VpdGFibGUKdG8gcHV0 IGludG8gRE5TIHpvbmUgZmlsZXMuICBBbiBPUklHSU4gbGluZSBpcyBwcmludGVk IGJlZm9yZSBlYWNoCnJlY29yZCB0byBhbGxvdyBkaXZlcnRpbmcgdGhlIHJlY29y ZHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgem9uZSBmaWxlLgoKQGl0ZW0gLS1wcmlu dC1kYW5lLXJlY29yZHMKQG9waW5kZXggcHJpbnQtZGFuZS1yZWNvcmRzCk1vZGlm eSB0aGUgb3V0cHV0IG9mIHRoZSBsaXN0IGNvbW1hbmRzIHRvIHByaW50IE9wZW5Q R1AgREFORSByZWNvcmRzCnN1aXRhYmxlIHRvIHB1dCBpbnRvIEROUyB6b25lIGZp bGVzLiAgQW4gT1JJR0lOIGxpbmUgaXMgcHJpbnRlZCBiZWZvcmUKZWFjaCByZWNv cmQgdG8gYWxsb3cgZGl2ZXJ0aW5nIHRoZSByZWNvcmRzIHRvIHRoZSBjb3JyZXNw b25kaW5nIHpvbmUKZmlsZS4KCkBpdGVtIC0tZml4ZWQtbGlzdC1tb2RlCkBvcGlu ZGV4IGZpeGVkLWxpc3QtbW9kZQpEbyBub3QgbWVyZ2UgcHJpbWFyeSB1c2VyIElE IGFuZCBwcmltYXJ5IGtleSBpbiBAb3B0aW9uey0td2l0aC1jb2xvbn0KbGlzdGlu ZyBtb2RlIGFuZCBwcmludCBhbGwgdGltZXN0YW1wcyBhcyBzZWNvbmRzIHNpbmNl IDE5NzAtMDEtMDEuClNpbmNlIEdudVBHIDIuMC4xMCwgdGhpcyBtb2RlIGlzIGFs d2F5cyB1c2VkIGFuZCB0aHVzIHRoaXMgb3B0aW9uIGlzCm9ic29sZXRlOyBpdCBk b2VzIG5vdCBoYXJtIHRvIHVzZSBpdCB0aG91Z2guCgpAaXRlbSAtLWxlZ2FjeS1s aXN0LW1vZGUKQG9waW5kZXggbGVnYWN5LWxpc3QtbW9kZQpSZXZlcnQgdG8gdGhl IHByZS0yLjEgcHVibGljIGtleSBsaXN0IG1vZGUuICBUaGlzIG9ubHkgYWZmZWN0 cyB0aGUKaHVtYW4gcmVhZGFibGUgb3V0cHV0IGFuZCBub3QgdGhlIG1hY2hpbmUg aW50ZXJmYWNlCihpLmUuIEBjb2Rley0td2l0aC1jb2xvbnN9KS4gIE5vdGUgdGhh dCB0aGUgbGVnYWN5IGZvcm1hdCBkb2VzIG5vdAphbGxvdyB0byBjb252ZXkgc3Vp dGFibGUgaW5mb3JtYXRpb24gZm9yIGVsbGlwdGljIGN1cnZlcy4KCkBpdGVtIC0t d2l0aC1maW5nZXJwcmludApAb3BpbmRleCB3aXRoLWZpbmdlcnByaW50ClNhbWUg YXMgdGhlIGNvbW1hbmQgQG9wdGlvbnstLWZpbmdlcnByaW50fSBidXQgY2hhbmdl cyBvbmx5IHRoZSBmb3JtYXQKb2YgdGhlIG91dHB1dCBhbmQgbWF5IGJlIHVzZWQg dG9nZXRoZXIgd2l0aCBhbm90aGVyIGNvbW1hbmQuCgpAaXRlbSAtLXdpdGgtaWNh by1zcGVsbGluZwpAb3BpbmRleCB3aXRoLWljYW8tc3BlbGxpbmcKUHJpbnQgdGhl IElDQU8gc3BlbGxpbmcgb2YgdGhlIGZpbmdlcnByaW50IGluIGFkZGl0aW9uIHRv IHRoZSBoZXggZGlnaXRzLgoKQGl0ZW0gLS13aXRoLWtleWdyaXAKQG9waW5kZXgg d2l0aC1rZXlncmlwCkluY2x1ZGUgdGhlIGtleWdyaXAgaW4gdGhlIGtleSBsaXN0 aW5ncy4KCkBpdGVtIC0td2l0aC1zZWNyZXQKQG9waW5kZXggd2l0aC1zZWNyZXQK SW5jbHVkZSBpbmZvIGFib3V0IHRoZSBwcmVzZW5jZSBvZiBhIHNlY3JldCBrZXkg aW4gcHVibGljIGtleSBsaXN0aW5ncwpkb25lIHdpdGggQGNvZGV7LS13aXRoLWNv bG9uc30uCgpAZW5kIHRhYmxlCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqCkBjICoqKioqKioqICBPUEVOUEdQIE9QVElPTlMg ICoqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgpAbm9kZSBPcGVuUEdQIE9wdGlvbnMKQHN1YnNlY3Rp b24gT3BlblBHUCBwcm90b2NvbCBzcGVjaWZpYyBvcHRpb25zLgoKQHRhYmxlIEBn bnVwZ3RhYm9wdAoKQGl0ZW0gLXQsIC0tdGV4dG1vZGUKQGl0ZW14IC0tbm8tdGV4 dG1vZGUKQG9waW5kZXggdGV4dG1vZGUKVHJlYXQgaW5wdXQgZmlsZXMgYXMgdGV4 dCBhbmQgc3RvcmUgdGhlbSBpbiB0aGUgT3BlblBHUCBjYW5vbmljYWwgdGV4dApm b3JtIHdpdGggc3RhbmRhcmQgIkNSTEYiIGxpbmUgZW5kaW5ncy4gVGhpcyBhbHNv IHNldHMgdGhlIG5lY2Vzc2FyeQpmbGFncyB0byBpbmZvcm0gdGhlIHJlY2lwaWVu dCB0aGF0IHRoZSBlbmNyeXB0ZWQgb3Igc2lnbmVkIGRhdGEgaXMgdGV4dAphbmQg bWF5IG5lZWQgaXRzIGxpbmUgZW5kaW5ncyBjb252ZXJ0ZWQgYmFjayB0byB3aGF0 ZXZlciB0aGUgbG9jYWwKc3lzdGVtIHVzZXMuIFRoaXMgb3B0aW9uIGlzIHVzZWZ1 bCB3aGVuIGNvbW11bmljYXRpbmcgYmV0d2VlbiB0d28KcGxhdGZvcm1zIHRoYXQg aGF2ZSBkaWZmZXJlbnQgbGluZSBlbmRpbmcgY29udmVudGlvbnMgKFVOSVgtbGlr ZSB0byBNYWMsCk1hYyB0byBXaW5kb3dzLCBldGMpLiBAb3B0aW9uey0tbm8tdGV4 dG1vZGV9IGRpc2FibGVzIHRoaXMgb3B0aW9uLCBhbmQKaXMgdGhlIGRlZmF1bHQu CgpAaXRlbSAtLWZvcmNlLXYzLXNpZ3MKQGl0ZW14IC0tbm8tZm9yY2UtdjMtc2ln cwpAaXRlbSAtLWZvcmNlLXY0LWNlcnRzCkBpdGVteCAtLW5vLWZvcmNlLXY0LWNl cnRzClRoZXNlIG9wdGlvbnMgYXJlIG9ic29sZXRlIGFuZCBoYXZlIG5vIGVmZmVj dCBzaW5jZSBHbnVQRyAyLjEuCgpAaXRlbSAtLWZvcmNlLW1kYwpAb3BpbmRleCBm b3JjZS1tZGMKRm9yY2UgdGhlIHVzZSBvZiBlbmNyeXB0aW9uIHdpdGggYSBtb2Rp ZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUuIFRoaXMKaXMgYWx3YXlzIHVzZWQgd2l0 aCB0aGUgbmV3ZXIgY2lwaGVycyAodGhvc2Ugd2l0aCBhIGJsb2Nrc2l6ZSBncmVh dGVyCnRoYW4gNjQgYml0cyksIG9yIGlmIGFsbCBvZiB0aGUgcmVjaXBpZW50IGtl eXMgaW5kaWNhdGUgTURDIHN1cHBvcnQgaW4KdGhlaXIgZmVhdHVyZSBmbGFncy4K CkBpdGVtIC0tZGlzYWJsZS1tZGMKQG9waW5kZXggZGlzYWJsZS1tZGMKRGlzYWJs ZSB0aGUgdXNlIG9mIHRoZSBtb2RpZmljYXRpb24gZGV0ZWN0aW9uIGNvZGUuIE5v dGUgdGhhdCBieQp1c2luZyB0aGlzIG9wdGlvbiwgdGhlIGVuY3J5cHRlZCBtZXNz YWdlIGJlY29tZXMgdnVsbmVyYWJsZSB0byBhCm1lc3NhZ2UgbW9kaWZpY2F0aW9u IGF0dGFjay4KCkBpdGVtIC0tcGVyc29uYWwtY2lwaGVyLXByZWZlcmVuY2VzIEBj b2Rle3N0cmluZ30KQG9waW5kZXggcGVyc29uYWwtY2lwaGVyLXByZWZlcmVuY2Vz ClNldCB0aGUgbGlzdCBvZiBwZXJzb25hbCBjaXBoZXIgcHJlZmVyZW5jZXMgdG8g QGNvZGV7c3RyaW5nfS4gIFVzZQpAY29tbWFuZHtAZ3BnbmFtZSAtLXZlcnNpb259 IHRvIGdldCBhIGxpc3Qgb2YgYXZhaWxhYmxlIGFsZ29yaXRobXMsCmFuZCB1c2Ug QGNvZGV7bm9uZX0gdG8gc2V0IG5vIHByZWZlcmVuY2UgYXQgYWxsLiAgVGhpcyBh bGxvd3MgdGhlIHVzZXIKdG8gc2FmZWx5IG92ZXJyaWRlIHRoZSBhbGdvcml0aG0g Y2hvc2VuIGJ5IHRoZSByZWNpcGllbnQga2V5CnByZWZlcmVuY2VzLCBhcyBHUEcg d2lsbCBvbmx5IHNlbGVjdCBhbiBhbGdvcml0aG0gdGhhdCBpcyB1c2FibGUgYnkK YWxsIHJlY2lwaWVudHMuICBUaGUgbW9zdCBoaWdobHkgcmFua2VkIGNpcGhlciBp biB0aGlzIGxpc3QgaXMgYWxzbwp1c2VkIGZvciB0aGUgQG9wdGlvbnstLXN5bW1l dHJpY30gZW5jcnlwdGlvbiBjb21tYW5kLgoKQGl0ZW0gLS1wZXJzb25hbC1kaWdl c3QtcHJlZmVyZW5jZXMgQGNvZGV7c3RyaW5nfQpAb3BpbmRleCBwZXJzb25hbC1k aWdlc3QtcHJlZmVyZW5jZXMKU2V0IHRoZSBsaXN0IG9mIHBlcnNvbmFsIGRpZ2Vz dCBwcmVmZXJlbmNlcyB0byBAY29kZXtzdHJpbmd9LiAgVXNlCkBjb21tYW5ke0Bn cGduYW1lIC0tdmVyc2lvbn0gdG8gZ2V0IGEgbGlzdCBvZiBhdmFpbGFibGUgYWxn b3JpdGhtcywKYW5kIHVzZSBAY29kZXtub25lfSB0byBzZXQgbm8gcHJlZmVyZW5j ZSBhdCBhbGwuICBUaGlzIGFsbG93cyB0aGUgdXNlcgp0byBzYWZlbHkgb3ZlcnJp ZGUgdGhlIGFsZ29yaXRobSBjaG9zZW4gYnkgdGhlIHJlY2lwaWVudCBrZXkKcHJl ZmVyZW5jZXMsIGFzIEdQRyB3aWxsIG9ubHkgc2VsZWN0IGFuIGFsZ29yaXRobSB0 aGF0IGlzIHVzYWJsZSBieQphbGwgcmVjaXBpZW50cy4gIFRoZSBtb3N0IGhpZ2hs eSByYW5rZWQgZGlnZXN0IGFsZ29yaXRobSBpbiB0aGlzIGxpc3QKaXMgYWxzbyB1 c2VkIHdoZW4gc2lnbmluZyB3aXRob3V0IGVuY3J5cHRpb24KKGUuZy4gQG9wdGlv bnstLWNsZWFyc2lnbn0gb3IgQG9wdGlvbnstLXNpZ259KS4KCkBpdGVtIC0tcGVy c29uYWwtY29tcHJlc3MtcHJlZmVyZW5jZXMgQGNvZGV7c3RyaW5nfQpAb3BpbmRl eCBwZXJzb25hbC1jb21wcmVzcy1wcmVmZXJlbmNlcwpTZXQgdGhlIGxpc3Qgb2Yg cGVyc29uYWwgY29tcHJlc3Npb24gcHJlZmVyZW5jZXMgdG8gQGNvZGV7c3RyaW5n fS4KVXNlIEBjb21tYW5ke0BncGduYW1lIC0tdmVyc2lvbn0gdG8gZ2V0IGEgbGlz dCBvZiBhdmFpbGFibGUKYWxnb3JpdGhtcywgYW5kIHVzZSBAY29kZXtub25lfSB0 byBzZXQgbm8gcHJlZmVyZW5jZSBhdCBhbGwuICBUaGlzCmFsbG93cyB0aGUgdXNl ciB0byBzYWZlbHkgb3ZlcnJpZGUgdGhlIGFsZ29yaXRobSBjaG9zZW4gYnkgdGhl CnJlY2lwaWVudCBrZXkgcHJlZmVyZW5jZXMsIGFzIEdQRyB3aWxsIG9ubHkgc2Vs ZWN0IGFuIGFsZ29yaXRobSB0aGF0CmlzIHVzYWJsZSBieSBhbGwgcmVjaXBpZW50 cy4gIFRoZSBtb3N0IGhpZ2hseSByYW5rZWQgY29tcHJlc3Npb24KYWxnb3JpdGht IGluIHRoaXMgbGlzdCBpcyBhbHNvIHVzZWQgd2hlbiB0aGVyZSBhcmUgbm8gcmVj aXBpZW50IGtleXMKdG8gY29uc2lkZXIgKGUuZy4gQG9wdGlvbnstLXN5bW1ldHJp Y30pLgoKQGl0ZW0gLS1zMmstY2lwaGVyLWFsZ28gQGNvZGV7bmFtZX0KQG9waW5k ZXggczJrLWNpcGhlci1hbGdvClVzZSBAY29kZXtuYW1lfSBhcyB0aGUgY2lwaGVy IGFsZ29yaXRobSB1c2VkIHRvIHByb3RlY3Qgc2VjcmV0IGtleXMuClRoZSBkZWZh dWx0IGNpcGhlciBpcyBAdmFsdWV7R1BHU1lNRU5DQUxHT30uIFRoaXMgY2lwaGVy IGlzIGFsc28gdXNlZApmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gd2l0aCBhIHBh c3NwaHJhc2UgaWYKQG9wdGlvbnstLXBlcnNvbmFsLWNpcGhlci1wcmVmZXJlbmNl c30gYW5kIEBvcHRpb257LS1jaXBoZXItYWxnb30gaXMKbm90IGdpdmVuLgoKQGl0 ZW0gLS1zMmstZGlnZXN0LWFsZ28gQGNvZGV7bmFtZX0KQG9waW5kZXggczJrLWRp Z2VzdC1hbGdvClVzZSBAY29kZXtuYW1lfSBhcyB0aGUgZGlnZXN0IGFsZ29yaXRo bSB1c2VkIHRvIG1hbmdsZSB0aGUgcGFzc3BocmFzZXMuClRoZSBkZWZhdWx0IGFs Z29yaXRobSBpcyBTSEEtMS4KCkBpdGVtIC0tczJrLW1vZGUgQGNvZGV7bn0KQG9w aW5kZXggczJrLW1vZGUKU2VsZWN0cyBob3cgcGFzc3BocmFzZXMgYXJlIG1hbmds ZWQuIElmIEBjb2Rle259IGlzIDAgYSBwbGFpbgpwYXNzcGhyYXNlICh3aGljaCBp cyBub3QgcmVjb21tZW5kZWQpIHdpbGwgYmUgdXNlZCwgYSAxIGFkZHMgYSBzYWx0 IHRvCnRoZSBwYXNzcGhyYXNlIGFuZCBhIDMgKHRoZSBkZWZhdWx0KSBpdGVyYXRl cyB0aGUgd2hvbGUgcHJvY2VzcyBhCm51bWJlciBvZiB0aW1lcyAoc2VlIC0tczJr LWNvdW50KS4gIFVubGVzcyBAb3B0aW9uey0tcmZjMTk5MX0gaXMgdXNlZCwKdGhp cyBtb2RlIGlzIGFsc28gdXNlZCBmb3Igc3ltbWV0cmljIGVuY3J5cHRpb24gd2l0 aCBhIHBhc3NwaHJhc2UuCgpAaXRlbSAtLXMyay1jb3VudCBAY29kZXtufQpAb3Bp bmRleCBzMmstY291bnQKU3BlY2lmeSBob3cgbWFueSB0aW1lcyB0aGUgcGFzc3Bo cmFzZSBtYW5nbGluZyBpcyByZXBlYXRlZC4gIFRoaXMKdmFsdWUgbWF5IHJhbmdl IGJldHdlZW4gMTAyNCBhbmQgNjUwMTE3MTIgaW5jbHVzaXZlLiAgVGhlIGRlZmF1 bHQgaXMKaW5xdWlyZWQgZnJvbSBncGctYWdlbnQuICBOb3RlIHRoYXQgbm90IGFs bCB2YWx1ZXMgaW4gdGhlCjEwMjQtNjUwMTE3MTIgcmFuZ2UgYXJlIGxlZ2FsIGFu ZCBpZiBhbiBpbGxlZ2FsIHZhbHVlIGlzIHNlbGVjdGVkLApHbnVQRyB3aWxsIHJv dW5kIHVwIHRvIHRoZSBuZWFyZXN0IGxlZ2FsIHZhbHVlLiAgVGhpcyBvcHRpb24g aXMgb25seQptZWFuaW5nZnVsIGlmIEBvcHRpb257LS1zMmstbW9kZX0gaXMgMy4K CgpAZW5kIHRhYmxlCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioKQGMg KioqKioqKiBDb21wbGlhbmNlICoqKioqKioqCkBjICoqKioqKioqKioqKioqKioq KioqKioqKioqKgpAbm9kZSBDb21wbGlhbmNlIE9wdGlvbnMKQHN1YnNlY3Rpb24g Q29tcGxpYW5jZSBvcHRpb25zCgpUaGVzZSBvcHRpb25zIGNvbnRyb2wgd2hhdCBH bnVQRyBpcyBjb21wbGlhbnQgdG8uIE9ubHkgb25lIG9mIHRoZXNlCm9wdGlvbnMg bWF5IGJlIGFjdGl2ZSBhdCBhIHRpbWUuIE5vdGUgdGhhdCB0aGUgZGVmYXVsdCBz ZXR0aW5nIG9mCnRoaXMgaXMgbmVhcmx5IGFsd2F5cyB0aGUgY29ycmVjdCBvbmUu IFNlZSB0aGUgSU5URVJPUEVSQUJJTElUWSBXSVRICk9USEVSIE9QRU5QR1AgUFJP R1JBTVMgc2VjdGlvbiBiZWxvdyBiZWZvcmUgdXNpbmcgb25lIG9mIHRoZXNlCm9w dGlvbnMuCgpAdGFibGUgQGdudXBndGFib3B0CgpAaXRlbSAtLWdudXBnCkBvcGlu ZGV4IGdudXBnClVzZSBzdGFuZGFyZCBHbnVQRyBiZWhhdmlvci4gVGhpcyBpcyBl c3NlbnRpYWxseSBPcGVuUEdQIGJlaGF2aW9yCihzZWUgQG9wdGlvbnstLW9wZW5w Z3B9KSwgYnV0IHdpdGggc29tZSBhZGRpdGlvbmFsIHdvcmthcm91bmRzIGZvciBj b21tb24KY29tcGF0aWJpbGl0eSBwcm9ibGVtcyBpbiBkaWZmZXJlbnQgdmVyc2lv bnMgb2YgUEdQLiBUaGlzIGlzIHRoZQpkZWZhdWx0IG9wdGlvbiwgc28gaXQgaXMg bm90IGdlbmVyYWxseSBuZWVkZWQsIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIHRvCm92 ZXJyaWRlIGEgZGlmZmVyZW50IGNvbXBsaWFuY2Ugb3B0aW9uIGluIHRoZSBncGcu Y29uZiBmaWxlLgoKQGl0ZW0gLS1vcGVucGdwCkBvcGluZGV4IG9wZW5wZ3AKUmVz ZXQgYWxsIHBhY2tldCwgY2lwaGVyIGFuZCBkaWdlc3Qgb3B0aW9ucyB0byBzdHJp Y3QgT3BlblBHUApiZWhhdmlvci4gVXNlIHRoaXMgb3B0aW9uIHRvIHJlc2V0IGFs bCBwcmV2aW91cyBvcHRpb25zIGxpa2UKQG9wdGlvbnstLXMyay0qfSwgQG9wdGlv bnstLWNpcGhlci1hbGdvfSwgQG9wdGlvbnstLWRpZ2VzdC1hbGdvfSBhbmQKQG9w dGlvbnstLWNvbXByZXNzLWFsZ299IHRvIE9wZW5QR1AgY29tcGxpYW50IHZhbHVl cy4gQWxsIFBHUAp3b3JrYXJvdW5kcyBhcmUgZGlzYWJsZWQuCgpAaXRlbSAtLXJm YzQ4ODAKQG9waW5kZXggcmZjNDg4MApSZXNldCBhbGwgcGFja2V0LCBjaXBoZXIg YW5kIGRpZ2VzdCBvcHRpb25zIHRvIHN0cmljdCBSRkMtNDg4MApiZWhhdmlvci4g Tm90ZSB0aGF0IHRoaXMgaXMgY3VycmVudGx5IHRoZSBzYW1lIHRoaW5nIGFzCkBv cHRpb257LS1vcGVucGdwfS4KCkBpdGVtIC0tcmZjMjQ0MApAb3BpbmRleCByZmMy NDQwClJlc2V0IGFsbCBwYWNrZXQsIGNpcGhlciBhbmQgZGlnZXN0IG9wdGlvbnMg dG8gc3RyaWN0IFJGQy0yNDQwCmJlaGF2aW9yLgoKQGlmY2xlYXIgZ3BndG93b25l CkBpdGVtIC0tcmZjMTk5MQpAb3BpbmRleCByZmMxOTkxClRyeSB0byBiZSBtb3Jl IFJGQy0xOTkxIChQR1AgMi54KSBjb21wbGlhbnQuICBUaGlzIG9wdGlvbiBpcwpk ZXByZWNhdGVkIHdpbGwgYmUgcmVtb3ZlZCBpbiBHbnVQRyAyLjEuCgpAaXRlbSAt LXBncDIKQG9waW5kZXggcGdwMgpTZXQgdXAgYWxsIG9wdGlvbnMgdG8gYmUgYXMg UEdQIDIueCBjb21wbGlhbnQgYXMgcG9zc2libGUsIGFuZCB3YXJuIGlmCmFuIGFj dGlvbiBpcyB0YWtlbiAoZS5nLiBlbmNyeXB0aW5nIHRvIGEgbm9uLVJTQSBrZXkp IHRoYXQgd2lsbCBjcmVhdGUKYSBtZXNzYWdlIHRoYXQgUEdQIDIueCB3aWxsIG5v dCBiZSBhYmxlIHRvIGhhbmRsZS4gTm90ZSB0aGF0IGBQR1AKMi54JyBoZXJlIG1l YW5zIGBNSVQgUEdQIDIuNi4yJy4gVGhlcmUgYXJlIG90aGVyIHZlcnNpb25zIG9m IFBHUCAyLngKYXZhaWxhYmxlLCBidXQgdGhlIE1JVCByZWxlYXNlIGlzIGEgZ29v ZCBjb21tb24gYmFzZWxpbmUuCgpUaGlzIG9wdGlvbiBpbXBsaWVzCkBvcHRpb257 LS1yZmMxOTkxIC0tZGlzYWJsZS1tZGMgLS1uby1mb3JjZS12NC1jZXJ0cwogLS1l c2NhcGUtZnJvbS1saW5lcyAgLS1mb3JjZS12My1zaWdzIC0tYWxsb3ctd2Vhay1k aWdlc3QtYWxnb3MKIC0tY2lwaGVyLWFsZ28gSURFQSAtLWRpZ2VzdC1hbGdvIE1E NSAtLWNvbXByZXNzLWFsZ28gWklQfS4KSXQgYWxzbyBkaXNhYmxlcyBAb3B0aW9u ey0tdGV4dG1vZGV9IHdoZW4gZW5jcnlwdGluZy4KClRoaXMgb3B0aW9uIGlzIGRl cHJlY2F0ZWQgd2lsbCBiZSByZW1vdmVkIGluIEdudVBHIDIuMS4gIFRoZSByZWFz b24KZm9yIGRyb3BwaW5nIFBHUC0yIHN1cHBvcnQgaXMgdGhhdCB0aGUgUEdQIDIg Zm9ybWF0IGlzIG5vdCBhbnltb3JlCmNvbnNpZGVyZWQgc2FmZSAoZm9yIGV4YW1w bGUgZHVlIHRvIHRoZSB1c2Ugb2YgdGhlIGJyb2tlbiBNRDUgYWxnb3JpdGhtKS4K Tm90ZSB0aGF0IHRoZSBkZWNyeXB0aW9uIG9mIFBHUC0yIGNyZWF0ZWQgbWVzc2Fn ZXMgd2lsbCBjb250aW51ZSB0byB3b3JrLgpAZW5kIGlmY2xlYXIKCkBpdGVtIC0t cGdwNgpAb3BpbmRleCBwZ3A2ClNldCB1cCBhbGwgb3B0aW9ucyB0byBiZSBhcyBQ R1AgNiBjb21wbGlhbnQgYXMgcG9zc2libGUuIFRoaXMKcmVzdHJpY3RzIHlvdSB0 byB0aGUgY2lwaGVycyBJREVBIChpZiB0aGUgSURFQSBwbHVnaW4gaXMgaW5zdGFs bGVkKSwKM0RFUywgYW5kIENBU1Q1LCB0aGUgaGFzaGVzIE1ENSwgU0hBMSBhbmQg UklQRU1EMTYwLCBhbmQgdGhlCmNvbXByZXNzaW9uIGFsZ29yaXRobXMgbm9uZSBh bmQgWklQLiBUaGlzIGFsc28gZGlzYWJsZXMKLS10aHJvdy1rZXlpZHMsIGFuZCBt YWtpbmcgc2lnbmF0dXJlcyB3aXRoIHNpZ25pbmcgc3Via2V5cyBhcyBQR1AgNgpk b2VzIG5vdCB1bmRlcnN0YW5kIHNpZ25hdHVyZXMgbWFkZSBieSBzaWduaW5nIHN1 YmtleXMuCgpUaGlzIG9wdGlvbiBpbXBsaWVzIEBvcHRpb257LS1kaXNhYmxlLW1k YyAtLWVzY2FwZS1mcm9tLWxpbmVzfS4KCkBpdGVtIC0tcGdwNwpAb3BpbmRleCBw Z3A3ClNldCB1cCBhbGwgb3B0aW9ucyB0byBiZSBhcyBQR1AgNyBjb21wbGlhbnQg YXMgcG9zc2libGUuIFRoaXMgaXMKaWRlbnRpY2FsIHRvIEBvcHRpb257LS1wZ3A2 fSBleGNlcHQgdGhhdCBNRENzIGFyZSBub3QgZGlzYWJsZWQsIGFuZCB0aGUKbGlz dCBvZiBhbGxvd2FibGUgY2lwaGVycyBpcyBleHBhbmRlZCB0byBhZGQgQUVTMTI4 LCBBRVMxOTIsIEFFUzI1NiwgYW5kClRXT0ZJU0guCgpAaXRlbSAtLXBncDgKQG9w aW5kZXggcGdwOApTZXQgdXAgYWxsIG9wdGlvbnMgdG8gYmUgYXMgUEdQIDggY29t cGxpYW50IGFzIHBvc3NpYmxlLiBQR1AgOCBpcyBhIGxvdApjbG9zZXIgdG8gdGhl IE9wZW5QR1Agc3RhbmRhcmQgdGhhbiBwcmV2aW91cyB2ZXJzaW9ucyBvZiBQR1As IHNvIGFsbAp0aGlzIGRvZXMgaXMgZGlzYWJsZSBAb3B0aW9uey0tdGhyb3cta2V5 aWRzfSBhbmQgc2V0CkBvcHRpb257LS1lc2NhcGUtZnJvbS1saW5lc30uICBBbGwg YWxnb3JpdGhtcyBhcmUgYWxsb3dlZCBleGNlcHQgZm9yIHRoZQpTSEEyMjQsIFNI QTM4NCwgYW5kIFNIQTUxMiBkaWdlc3RzLgoKQGVuZCB0YWJsZQoKCkBjICoqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQGMgKioqKioq KiogIEVTT1RFUklDIE9QVElPTlMgICoqKioqKioqKioqKioqKgpAYyAqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCkBub2RlIEdQRyBF c290ZXJpYyBPcHRpb25zCkBzdWJzZWN0aW9uIERvaW5nIHRoaW5ncyBvbmUgdXN1 YWxseSBkb2Vzbid0IHdhbnQgdG8gZG8uCgpAdGFibGUgQGdudXBndGFib3B0CgpA aXRlbSAtbgpAaXRlbXggLS1kcnktcnVuCkBvcGluZGV4IGRyeS1ydW4KRG9uJ3Qg bWFrZSBhbnkgY2hhbmdlcyAodGhpcyBpcyBub3QgY29tcGxldGVseSBpbXBsZW1l bnRlZCkuCgpAaXRlbSAtLWxpc3Qtb25seQpAb3BpbmRleCBsaXN0LW9ubHkKQ2hh bmdlcyB0aGUgYmVoYXZpb3VyIG9mIHNvbWUgY29tbWFuZHMuIFRoaXMgaXMgbGlr ZSBAb3B0aW9uey0tZHJ5LXJ1bn0gYnV0CmRpZmZlcmVudCBpbiBzb21lIGNhc2Vz LiBUaGUgc2VtYW50aWMgb2YgdGhpcyBjb21tYW5kIG1heSBiZSBleHRlbmRlZCBp bgp0aGUgZnV0dXJlLiBDdXJyZW50bHkgaXQgb25seSBza2lwcyB0aGUgYWN0dWFs IGRlY3J5cHRpb24gcGFzcyBhbmQKdGhlcmVmb3JlIGVuYWJsZXMgYSBmYXN0IGxp c3Rpbmcgb2YgdGhlIGVuY3J5cHRpb24ga2V5cy4KCkBpdGVtIC1pCkBpdGVteCAt LWludGVyYWN0aXZlCkBvcGluZGV4IGludGVyYWN0aXZlClByb21wdCBiZWZvcmUg b3ZlcndyaXRpbmcgYW55IGZpbGVzLgoKQGl0ZW0gLS1kZWJ1Zy1sZXZlbCBAdmFy e2xldmVsfQpAb3BpbmRleCBkZWJ1Zy1sZXZlbApTZWxlY3QgdGhlIGRlYnVnIGxl dmVsIGZvciBpbnZlc3RpZ2F0aW5nIHByb2JsZW1zLiBAdmFye2xldmVsfSBtYXkg YmUKYSBudW1lcmljIHZhbHVlIG9yIGJ5IGEga2V5d29yZDoKCkB0YWJsZSBAY29k ZQogIEBpdGVtIG5vbmUKICBObyBkZWJ1Z2dpbmcgYXQgYWxsLiAgQSB2YWx1ZSBv ZiBsZXNzIHRoYW4gMSBtYXkgYmUgdXNlZCBpbnN0ZWFkIG9mCiAgdGhlIGtleXdv cmQuCiAgQGl0ZW0gYmFzaWMKICBTb21lIGJhc2ljIGRlYnVnIG1lc3NhZ2VzLiAg QSB2YWx1ZSBiZXR3ZWVuIDEgYW5kIDIgbWF5IGJlIHVzZWQKICBpbnN0ZWFkIG9m IHRoZSBrZXl3b3JkLgogIEBpdGVtIGFkdmFuY2VkCiAgTW9yZSB2ZXJib3NlIGRl YnVnIG1lc3NhZ2VzLiAgQSB2YWx1ZSBiZXR3ZWVuIDMgYW5kIDUgbWF5IGJlIHVz ZWQKICBpbnN0ZWFkIG9mIHRoZSBrZXl3b3JkLgogIEBpdGVtIGV4cGVydAogIEV2 ZW4gbW9yZSBkZXRhaWxlZCBtZXNzYWdlcy4gIEEgdmFsdWUgYmV0d2VlbiA2IGFu ZCA4IG1heSBiZSB1c2VkCiAgaW5zdGVhZCBvZiB0aGUga2V5d29yZC4KICBAaXRl bSBndXJ1CiAgQWxsIG9mIHRoZSBkZWJ1ZyBtZXNzYWdlcyB5b3UgY2FuIGdldC4g QSB2YWx1ZSBncmVhdGVyIHRoYW4gOCBtYXkgYmUKICB1c2VkIGluc3RlYWQgb2Yg dGhlIGtleXdvcmQuICBUaGUgY3JlYXRpb24gb2YgaGFzaCB0cmFjaW5nIGZpbGVz IGlzCiAgb25seSBlbmFibGVkIGlmIHRoZSBrZXl3b3JkIGlzIHVzZWQuCkBlbmQg dGFibGUKCkhvdyB0aGVzZSBtZXNzYWdlcyBhcmUgbWFwcGVkIHRvIHRoZSBhY3R1 YWwgZGVidWdnaW5nIGZsYWdzIGlzIG5vdApzcGVjaWZpZWQgYW5kIG1heSBjaGFu Z2Ugd2l0aCBuZXdlciByZWxlYXNlcyBvZiB0aGlzIHByb2dyYW0uIFRoZXkgYXJl Cmhvd2V2ZXIgY2FyZWZ1bGx5IHNlbGVjdGVkIHRvIGJlc3QgYWlkIGluIGRlYnVn Z2luZy4KCkBpdGVtIC0tZGVidWcgQHZhcntmbGFnc30KQG9waW5kZXggZGVidWcK U2V0IGRlYnVnZ2luZyBmbGFncy4gQWxsIGZsYWdzIGFyZSBvci1lZCBhbmQgQHZh cntmbGFnc30gbWF5IGJlIGdpdmVuCmluIEMgc3ludGF4IChlLmcuIDB4MDA0Mikg b3IgYXMgYSBjb21tYSBzZXBhcmF0ZWQgbGlzdCBvZiBmbGFnIG5hbWVzLgpUbyBn ZXQgYSBsaXN0IG9mIGFsbCBzdXBwb3J0ZWQgZmxhZ3MgdGhlIHNpbmdsZSB3b3Jk ICJoZWxwIiBjYW4gYmUKdXNlZC4KCkBpdGVtIC0tZGVidWctYWxsCkBvcGluZGV4 IGRlYnVnLWFsbApTZXQgYWxsIHVzZWZ1bCBkZWJ1Z2dpbmcgZmxhZ3MuCgpAaXRl bSAtLWRlYnVnLWlvbGJmCkBvcGluZGV4IGRlYnVnLWlvbGJmClNldCBzdGRvdXQg aW50byBsaW5lIGJ1ZmZlcmVkIG1vZGUuICBUaGlzIG9wdGlvbiBpcyBvbmx5IGhv bm9yZWQgd2hlbgpnaXZlbiBvbiB0aGUgY29tbWFuZCBsaW5lLgoKQGl0ZW0gLS1m YWtlZC1zeXN0ZW0tdGltZSBAdmFye2Vwb2NofQpAb3BpbmRleCBmYWtlZC1zeXN0 ZW0tdGltZQpUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWZ1bCBmb3IgdGVzdGluZzsg aXQgc2V0cyB0aGUgc3lzdGVtIHRpbWUgYmFjayBvcgpmb3J0aCB0byBAdmFye2Vw b2NofSB3aGljaCBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgZWxhcHNlZCBzaW5j ZSB0aGUgeWVhcgoxOTcwLiAgQWx0ZXJuYXRpdmVseSBAdmFye2Vwb2NofSBtYXkg YmUgZ2l2ZW4gYXMgYSBmdWxsIElTTyB0aW1lIHN0cmluZwooZS5nLiAiMjAwNzA5 MjRUMTU0ODEyIikuCgpAaXRlbSAtLWVuYWJsZS1wcm9ncmVzcy1maWx0ZXIKQG9w aW5kZXggZW5hYmxlLXByb2dyZXNzLWZpbHRlcgpFbmFibGUgY2VydGFpbiBQUk9H UkVTUyBzdGF0dXMgb3V0cHV0cy4gVGhpcyBvcHRpb24gYWxsb3dzIGZyb250ZW5k cwp0byBkaXNwbGF5IGEgcHJvZ3Jlc3MgaW5kaWNhdG9yIHdoaWxlIGdwZyBpcyBw cm9jZXNzaW5nIGxhcmdlciBmaWxlcy4KVGhlcmUgaXMgYSBzbGlnaHQgcGVyZm9y bWFuY2Ugb3ZlcmhlYWQgdXNpbmcgaXQuCgpAaXRlbSAtLXN0YXR1cy1mZCBAY29k ZXtufQpAb3BpbmRleCBzdGF0dXMtZmQKV3JpdGUgc3BlY2lhbCBzdGF0dXMgc3Ry aW5ncyB0byB0aGUgZmlsZSBkZXNjcmlwdG9yIEBjb2Rle259LgpTZWUgdGhlIGZp bGUgREVUQUlMUyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBmb3IgYSBsaXN0aW5nIG9m IHRoZW0uCgpAaXRlbSAtLXN0YXR1cy1maWxlIEBjb2Rle2ZpbGV9CkBvcGluZGV4 IHN0YXR1cy1maWxlClNhbWUgYXMgQG9wdGlvbnstLXN0YXR1cy1mZH0sIGV4Y2Vw dCB0aGUgc3RhdHVzIGRhdGEgaXMgd3JpdHRlbiB0byBmaWxlCkBjb2Rle2ZpbGV9 LgoKQGl0ZW0gLS1sb2dnZXItZmQgQGNvZGV7bn0KQG9waW5kZXggbG9nZ2VyLWZk CldyaXRlIGxvZyBvdXRwdXQgdG8gZmlsZSBkZXNjcmlwdG9yIEBjb2Rle259IGFu ZCBub3QgdG8gU1RERVJSLgoKQGl0ZW0gLS1sb2ctZmlsZSBAY29kZXtmaWxlfQpA aXRlbXggLS1sb2dnZXItZmlsZSBAY29kZXtmaWxlfQpAb3BpbmRleCBsb2ctZmls ZQpTYW1lIGFzIEBvcHRpb257LS1sb2dnZXItZmR9LCBleGNlcHQgdGhlIGxvZ2dl ciBkYXRhIGlzIHdyaXR0ZW4gdG8gZmlsZQpAY29kZXtmaWxlfS4gIE5vdGUgdGhh dCBAb3B0aW9uey0tbG9nLWZpbGV9IGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yCkdu dVBHLTIuCgpAaXRlbSAtLWF0dHJpYnV0ZS1mZCBAY29kZXtufQpAb3BpbmRleCBh dHRyaWJ1dGUtZmQKV3JpdGUgYXR0cmlidXRlIHN1YnBhY2tldHMgdG8gdGhlIGZp bGUgZGVzY3JpcHRvciBAY29kZXtufS4gVGhpcyBpcyBtb3N0CnVzZWZ1bCBmb3Ig dXNlIHdpdGggQG9wdGlvbnstLXN0YXR1cy1mZH0sIHNpbmNlIHRoZSBzdGF0dXMg bWVzc2FnZXMgYXJlCm5lZWRlZCB0byBzZXBhcmF0ZSBvdXQgdGhlIHZhcmlvdXMg c3VicGFja2V0cyBmcm9tIHRoZSBzdHJlYW0gZGVsaXZlcmVkCnRvIHRoZSBmaWxl IGRlc2NyaXB0b3IuCgpAaXRlbSAtLWF0dHJpYnV0ZS1maWxlIEBjb2Rle2ZpbGV9 CkBvcGluZGV4IGF0dHJpYnV0ZS1maWxlClNhbWUgYXMgQG9wdGlvbnstLWF0dHJp YnV0ZS1mZH0sIGV4Y2VwdCB0aGUgYXR0cmlidXRlIGRhdGEgaXMgd3JpdHRlbiB0 bwpmaWxlIEBjb2Rle2ZpbGV9LgoKQGl0ZW0gLS1jb21tZW50IEBjb2Rle3N0cmlu Z30KQGl0ZW14IC0tbm8tY29tbWVudHMKQG9waW5kZXggY29tbWVudApVc2UgQGNv ZGV7c3RyaW5nfSBhcyBhIGNvbW1lbnQgc3RyaW5nIGluIGNsZWFyIHRleHQgc2ln bmF0dXJlcyBhbmQgQVNDSUkKYXJtb3JlZCBtZXNzYWdlcyBvciBrZXlzIChzZWUg QG9wdGlvbnstLWFybW9yfSkuIFRoZSBkZWZhdWx0IGJlaGF2aW9yIGlzCm5vdCB0 byB1c2UgYSBjb21tZW50IHN0cmluZy4gQG9wdGlvbnstLWNvbW1lbnR9IG1heSBi ZSByZXBlYXRlZCBtdWx0aXBsZQp0aW1lcyB0byBnZXQgbXVsdGlwbGUgY29tbWVu dCBzdHJpbmdzLiBAb3B0aW9uey0tbm8tY29tbWVudHN9IHJlbW92ZXMKYWxsIGNv bW1lbnRzLiAgSXQgaXMgYSBnb29kIGlkZWEgdG8ga2VlcCB0aGUgbGVuZ3RoIG9m IGEgc2luZ2xlIGNvbW1lbnQKYmVsb3cgNjAgY2hhcmFjdGVycyB0byBhdm9pZCBw cm9ibGVtcyB3aXRoIG1haWwgcHJvZ3JhbXMgd3JhcHBpbmcgc3VjaApsaW5lcy4g IE5vdGUgdGhhdCBjb21tZW50IGxpbmVzLCBsaWtlIGFsbCBvdGhlciBoZWFkZXIg bGluZXMsIGFyZSBub3QKcHJvdGVjdGVkIGJ5IHRoZSBzaWduYXR1cmUuCgpAaXRl bSAtLWVtaXQtdmVyc2lvbgpAaXRlbXggLS1uby1lbWl0LXZlcnNpb24KQG9waW5k ZXggZW1pdC12ZXJzaW9uCkZvcmNlIGluY2x1c2lvbiBvZiB0aGUgdmVyc2lvbiBz dHJpbmcgaW4gQVNDSUkgYXJtb3JlZCBvdXRwdXQuICBJZgpnaXZlbiBvbmNlIG9u bHkgdGhlIG5hbWUgb2YgdGhlIHByb2dyYW0gYW5kIHRoZSBtYWpvciBudW1iZXIg aXMKZW1pdHRlZCAoZGVmYXVsdCksIGdpdmVuIHR3aWNlIHRoZSBtaW5vciBpcyBh bHNvIGVtaXR0ZWQsIGdpdmVuIHRyaXBsZQp0aGUgbWljcm8gaXMgYWRkZWQsIGFu ZCBnaXZlbiBxdWFkIGFuIG9wZXJhdGluZyBzeXN0ZW0gaWRlbnRpZmljYXRpb24K aXMgYWxzbyBlbWl0dGVkLiAgQG9wdGlvbnstLW5vLWVtaXQtdmVyc2lvbn0gZGlz YWJsZXMgdGhlIHZlcnNpb24KbGluZS4KCkBpdGVtIC0tc2lnLW5vdGF0aW9uIEBj b2Rle25hbWU9dmFsdWV9CkBpdGVteCAtLWNlcnQtbm90YXRpb24gQGNvZGV7bmFt ZT12YWx1ZX0KQGl0ZW14IC1OLCAtLXNldC1ub3RhdGlvbiBAY29kZXtuYW1lPXZh bHVlfQpAb3BpbmRleCBzaWctbm90YXRpb24KQG9waW5kZXggY2VydC1ub3RhdGlv bgpAb3BpbmRleCBzZXQtbm90YXRpb24KUHV0IHRoZSBuYW1lIHZhbHVlIHBhaXIg aW50byB0aGUgc2lnbmF0dXJlIGFzIG5vdGF0aW9uIGRhdGEuCkBjb2Rle25hbWV9 IG11c3QgY29uc2lzdCBvbmx5IG9mIHByaW50YWJsZSBjaGFyYWN0ZXJzIG9yIHNw YWNlcywgYW5kCm11c3QgY29udGFpbiBhICdAQCcgY2hhcmFjdGVyIGluIHRoZSBm b3JtIGtleW5hbWVAQGRvbWFpbi5leGFtcGxlLmNvbQooc3Vic3RpdHV0aW5nIHRo ZSBhcHByb3ByaWF0ZSBrZXluYW1lIGFuZCBkb21haW4gbmFtZSwgb2YgY291cnNl KS4gIFRoaXMKaXMgdG8gaGVscCBwcmV2ZW50IHBvbGx1dGlvbiBvZiB0aGUgSUVU RiByZXNlcnZlZCBub3RhdGlvbgpuYW1lc3BhY2UuIFRoZSBAb3B0aW9uey0tZXhw ZXJ0fSBmbGFnIG92ZXJyaWRlcyB0aGUgJ0BAJwpjaGVjay4gQGNvZGV7dmFsdWV9 IG1heSBiZSBhbnkgcHJpbnRhYmxlIHN0cmluZzsgaXQgd2lsbCBiZSBlbmNvZGVk IGluClVURjgsIHNvIHlvdSBzaG91bGQgY2hlY2sgdGhhdCB5b3VyIEBvcHRpb257 LS1kaXNwbGF5LWNoYXJzZXR9IGlzIHNldApjb3JyZWN0bHkuIElmIHlvdSBwcmVm aXggQGNvZGV7bmFtZX0gd2l0aCBhbiBleGNsYW1hdGlvbiBtYXJrICghKSwgdGhl Cm5vdGF0aW9uIGRhdGEgd2lsbCBiZSBmbGFnZ2VkIGFzIGNyaXRpY2FsCihyZmM0 ODgwOjUuMi4zLjE2KS4gQG9wdGlvbnstLXNpZy1ub3RhdGlvbn0gc2V0cyBhIG5v dGF0aW9uIGZvciBkYXRhCnNpZ25hdHVyZXMuIEBvcHRpb257LS1jZXJ0LW5vdGF0 aW9ufSBzZXRzIGEgbm90YXRpb24gZm9yIGtleSBzaWduYXR1cmVzCihjZXJ0aWZp Y2F0aW9ucykuIEBvcHRpb257LS1zZXQtbm90YXRpb259IHNldHMgYm90aC4KClRo ZXJlIGFyZSBzcGVjaWFsIGNvZGVzIHRoYXQgbWF5IGJlIHVzZWQgaW4gbm90YXRp b24gbmFtZXMuICIlayIgd2lsbApiZSBleHBhbmRlZCBpbnRvIHRoZSBrZXkgSUQg b2YgdGhlIGtleSBiZWluZyBzaWduZWQsICIlSyIgaW50byB0aGUKbG9uZyBrZXkg SUQgb2YgdGhlIGtleSBiZWluZyBzaWduZWQsICIlZiIgaW50byB0aGUgZmluZ2Vy cHJpbnQgb2YgdGhlCmtleSBiZWluZyBzaWduZWQsICIlcyIgaW50byB0aGUga2V5 IElEIG9mIHRoZSBrZXkgbWFraW5nIHRoZQpzaWduYXR1cmUsICIlUyIgaW50byB0 aGUgbG9uZyBrZXkgSUQgb2YgdGhlIGtleSBtYWtpbmcgdGhlIHNpZ25hdHVyZSwK IiVnIiBpbnRvIHRoZSBmaW5nZXJwcmludCBvZiB0aGUga2V5IG1ha2luZyB0aGUg c2lnbmF0dXJlICh3aGljaCBtaWdodApiZSBhIHN1YmtleSksICIlcCIgaW50byB0 aGUgZmluZ2VycHJpbnQgb2YgdGhlIHByaW1hcnkga2V5IG9mIHRoZSBrZXkKbWFr aW5nIHRoZSBzaWduYXR1cmUsICIlYyIgaW50byB0aGUgc2lnbmF0dXJlIGNvdW50 IGZyb20gdGhlIE9wZW5QR1AKc21hcnRjYXJkLCBhbmQgIiUlIiByZXN1bHRzIGlu IGEgc2luZ2xlICIlIi4gJWssICVLLCBhbmQgJWYgYXJlIG9ubHkKbWVhbmluZ2Z1 bCB3aGVuIG1ha2luZyBhIGtleSBzaWduYXR1cmUgKGNlcnRpZmljYXRpb24pLCBh bmQgJWMgaXMgb25seQptZWFuaW5nZnVsIHdoZW4gdXNpbmcgdGhlIE9wZW5QR1Ag c21hcnRjYXJkLgoKQGl0ZW0gLS1zaWctcG9saWN5LXVybCBAY29kZXtzdHJpbmd9 CkBpdGVteCAtLWNlcnQtcG9saWN5LXVybCBAY29kZXtzdHJpbmd9CkBpdGVteCAt LXNldC1wb2xpY3ktdXJsIEBjb2Rle3N0cmluZ30KQG9waW5kZXggc2lnLXBvbGlj eS11cmwKQG9waW5kZXggY2VydC1wb2xpY3ktdXJsCkBvcGluZGV4IHNldC1wb2xp Y3ktdXJsClVzZSBAY29kZXtzdHJpbmd9IGFzIGEgUG9saWN5IFVSTCBmb3Igc2ln bmF0dXJlcyAocmZjNDg4MDo1LjIuMy4yMCkuICBJZgp5b3UgcHJlZml4IGl0IHdp dGggYW4gZXhjbGFtYXRpb24gbWFyayAoISksIHRoZSBwb2xpY3kgVVJMIHBhY2tl dCB3aWxsCmJlIGZsYWdnZWQgYXMgY3JpdGljYWwuIEBvcHRpb257LS1zaWctcG9s aWN5LXVybH0gc2V0cyBhIHBvbGljeSB1cmwgZm9yCmRhdGEgc2lnbmF0dXJlcy4g QG9wdGlvbnstLWNlcnQtcG9saWN5LXVybH0gc2V0cyBhIHBvbGljeSB1cmwgZm9y IGtleQpzaWduYXR1cmVzIChjZXJ0aWZpY2F0aW9ucykuIEBvcHRpb257LS1zZXQt cG9saWN5LXVybH0gc2V0cyBib3RoLgoKVGhlIHNhbWUgJS1leHBhbmRvcyB1c2Vk IGZvciBub3RhdGlvbiBkYXRhIGFyZSBhdmFpbGFibGUgaGVyZSBhcyB3ZWxsLgoK QGl0ZW0gLS1zaWcta2V5c2VydmVyLXVybCBAY29kZXtzdHJpbmd9CkBvcGluZGV4 IHNpZy1rZXlzZXJ2ZXItdXJsClVzZSBAY29kZXtzdHJpbmd9IGFzIGEgcHJlZmVy cmVkIGtleXNlcnZlciBVUkwgZm9yIGRhdGEgc2lnbmF0dXJlcy4gSWYKeW91IHBy ZWZpeCBpdCB3aXRoIGFuIGV4Y2xhbWF0aW9uIG1hcmsgKCEpLCB0aGUga2V5c2Vy dmVyIFVSTCBwYWNrZXQKd2lsbCBiZSBmbGFnZ2VkIGFzIGNyaXRpY2FsLgoKVGhl IHNhbWUgJS1leHBhbmRvcyB1c2VkIGZvciBub3RhdGlvbiBkYXRhIGFyZSBhdmFp bGFibGUgaGVyZSBhcyB3ZWxsLgoKQGl0ZW0gLS1zZXQtZmlsZW5hbWUgQGNvZGV7 c3RyaW5nfQpAb3BpbmRleCBzZXQtZmlsZW5hbWUKVXNlIEBjb2Rle3N0cmluZ30g YXMgdGhlIGZpbGVuYW1lIHdoaWNoIGlzIHN0b3JlZCBpbnNpZGUgbWVzc2FnZXMu ClRoaXMgb3ZlcnJpZGVzIHRoZSBkZWZhdWx0LCB3aGljaCBpcyB0byB1c2UgdGhl IGFjdHVhbCBmaWxlbmFtZSBvZiB0aGUKZmlsZSBiZWluZyBlbmNyeXB0ZWQuICBV c2luZyB0aGUgZW1wdHkgc3RyaW5nIGZvciBAdmFye3N0cmluZ30KZWZmZWN0aXZl bHkgcmVtb3ZlcyB0aGUgZmlsZW5hbWUgZnJvbSB0aGUgb3V0cHV0LgoKQGl0ZW0g LS1mb3IteW91ci1leWVzLW9ubHkKQGl0ZW14IC0tbm8tZm9yLXlvdXItZXllcy1v bmx5CkBvcGluZGV4IGZvci15b3VyLWV5ZXMtb25seQpTZXQgdGhlIGBmb3IgeW91 ciBleWVzIG9ubHknIGZsYWcgaW4gdGhlIG1lc3NhZ2UuIFRoaXMgY2F1c2VzIEdu dVBHIHRvCnJlZnVzZSB0byBzYXZlIHRoZSBmaWxlIHVubGVzcyB0aGUgQG9wdGlv bnstLW91dHB1dH0gb3B0aW9uIGlzIGdpdmVuLAphbmQgUEdQIHRvIHVzZSBhICJz ZWN1cmUgdmlld2VyIiB3aXRoIGEgY2xhaW1lZCBUZW1wZXN0LXJlc2lzdGFudCBm b250CnRvIGRpc3BsYXkgdGhlIG1lc3NhZ2UuIFRoaXMgb3B0aW9uIG92ZXJyaWRl cyBAb3B0aW9uey0tc2V0LWZpbGVuYW1lfS4KQG9wdGlvbnstLW5vLWZvci15b3Vy LWV5ZXMtb25seX0gZGlzYWJsZXMgdGhpcyBvcHRpb24uCgpAaXRlbSAtLXVzZS1l bWJlZGRlZC1maWxlbmFtZQpAaXRlbXggLS1uby11c2UtZW1iZWRkZWQtZmlsZW5h bWUKQG9waW5kZXggdXNlLWVtYmVkZGVkLWZpbGVuYW1lClRyeSB0byBjcmVhdGUg YSBmaWxlIHdpdGggYSBuYW1lIGFzIGVtYmVkZGVkIGluIHRoZSBkYXRhLiBUaGlz IGNhbiBiZQphIGRhbmdlcm91cyBvcHRpb24gYXMgaXQgYWxsb3dzIHRvIG92ZXJ3 cml0ZSBmaWxlcy4gRGVmYXVsdHMgdG8gbm8uCgpAaXRlbSAtLWNpcGhlci1hbGdv IEBjb2Rle25hbWV9CkBvcGluZGV4IGNpcGhlci1hbGdvClVzZSBAY29kZXtuYW1l fSBhcyBjaXBoZXIgYWxnb3JpdGhtLiBSdW5uaW5nIHRoZSBwcm9ncmFtIHdpdGgg dGhlCmNvbW1hbmQgQG9wdGlvbnstLXZlcnNpb259IHlpZWxkcyBhIGxpc3Qgb2Yg c3VwcG9ydGVkIGFsZ29yaXRobXMuIElmCnRoaXMgaXMgbm90IHVzZWQgdGhlIGNp cGhlciBhbGdvcml0aG0gaXMgc2VsZWN0ZWQgZnJvbSB0aGUgcHJlZmVyZW5jZXMK c3RvcmVkIHdpdGggdGhlIGtleS4gSW4gZ2VuZXJhbCwgeW91IGRvIG5vdCB3YW50 IHRvIHVzZSB0aGlzIG9wdGlvbiBhcwppdCBhbGxvd3MgeW91IHRvIHZpb2xhdGUg dGhlIE9wZW5QR1Agc3RhbmRhcmQuCkBvcHRpb257LS1wZXJzb25hbC1jaXBoZXIt cHJlZmVyZW5jZXN9IGlzIHRoZSBzYWZlIHdheSB0byBhY2NvbXBsaXNoIHRoZQpz YW1lIHRoaW5nLgoKQGl0ZW0gLS1kaWdlc3QtYWxnbyBAY29kZXtuYW1lfQpAb3Bp bmRleCBkaWdlc3QtYWxnbwpVc2UgQGNvZGV7bmFtZX0gYXMgdGhlIG1lc3NhZ2Ug ZGlnZXN0IGFsZ29yaXRobS4gUnVubmluZyB0aGUgcHJvZ3JhbQp3aXRoIHRoZSBj b21tYW5kIEBvcHRpb257LS12ZXJzaW9ufSB5aWVsZHMgYSBsaXN0IG9mIHN1cHBv cnRlZCBhbGdvcml0aG1zLiBJbgpnZW5lcmFsLCB5b3UgZG8gbm90IHdhbnQgdG8g dXNlIHRoaXMgb3B0aW9uIGFzIGl0IGFsbG93cyB5b3UgdG8KdmlvbGF0ZSB0aGUg T3BlblBHUCBzdGFuZGFyZC4gQG9wdGlvbnstLXBlcnNvbmFsLWRpZ2VzdC1wcmVm ZXJlbmNlc30gaXMgdGhlCnNhZmUgd2F5IHRvIGFjY29tcGxpc2ggdGhlIHNhbWUg dGhpbmcuCgpAaXRlbSAtLWNvbXByZXNzLWFsZ28gQGNvZGV7bmFtZX0KQG9waW5k ZXggY29tcHJlc3MtYWxnbwpVc2UgY29tcHJlc3Npb24gYWxnb3JpdGhtIEBjb2Rl e25hbWV9LiAiemxpYiIgaXMgUkZDLTE5NTAgWkxJQgpjb21wcmVzc2lvbi4gInpp cCIgaXMgUkZDLTE5NTEgWklQIGNvbXByZXNzaW9uIHdoaWNoIGlzIHVzZWQgYnkg UEdQLgoiYnppcDIiIGlzIGEgbW9yZSBtb2Rlcm4gY29tcHJlc3Npb24gc2NoZW1l IHRoYXQgY2FuIGNvbXByZXNzIHNvbWUKdGhpbmdzIGJldHRlciB0aGFuIHppcCBv ciB6bGliLCBidXQgYXQgdGhlIGNvc3Qgb2YgbW9yZSBtZW1vcnkgdXNlZApkdXJp bmcgY29tcHJlc3Npb24gYW5kIGRlY29tcHJlc3Npb24uICJ1bmNvbXByZXNzZWQi IG9yICJub25lIgpkaXNhYmxlcyBjb21wcmVzc2lvbi4gSWYgdGhpcyBvcHRpb24g aXMgbm90IHVzZWQsIHRoZSBkZWZhdWx0CmJlaGF2aW9yIGlzIHRvIGV4YW1pbmUg dGhlIHJlY2lwaWVudCBrZXkgcHJlZmVyZW5jZXMgdG8gc2VlIHdoaWNoCmFsZ29y aXRobXMgdGhlIHJlY2lwaWVudCBzdXBwb3J0cy4gSWYgYWxsIGVsc2UgZmFpbHMs IFpJUCBpcyB1c2VkIGZvcgptYXhpbXVtIGNvbXBhdGliaWxpdHkuCgpaTElCIG1h eSBnaXZlIGJldHRlciBjb21wcmVzc2lvbiByZXN1bHRzIHRoYW4gWklQLCBhcyB0 aGUgY29tcHJlc3Npb24Kd2luZG93IHNpemUgaXMgbm90IGxpbWl0ZWQgdG8gOGsu IEJaSVAyIG1heSBnaXZlIGV2ZW4gYmV0dGVyCmNvbXByZXNzaW9uIHJlc3VsdHMg dGhhbiB0aGF0LCBidXQgd2lsbCB1c2UgYSBzaWduaWZpY2FudGx5IGxhcmdlcgph bW91bnQgb2YgbWVtb3J5IHdoaWxlIGNvbXByZXNzaW5nIGFuZCBkZWNvbXByZXNz aW5nLiBUaGlzIG1heSBiZQpzaWduaWZpY2FudCBpbiBsb3cgbWVtb3J5IHNpdHVh dGlvbnMuIE5vdGUsIGhvd2V2ZXIsIHRoYXQgUEdQIChhbGwKdmVyc2lvbnMpIG9u bHkgc3VwcG9ydHMgWklQIGNvbXByZXNzaW9uLiBVc2luZyBhbnkgYWxnb3JpdGht IG90aGVyCnRoYW4gWklQIG9yICJub25lIiB3aWxsIG1ha2UgdGhlIG1lc3NhZ2Ug dW5yZWFkYWJsZSB3aXRoIFBHUC4gSW4KZ2VuZXJhbCwgeW91IGRvIG5vdCB3YW50 IHRvIHVzZSB0aGlzIG9wdGlvbiBhcyBpdCBhbGxvd3MgeW91IHRvCnZpb2xhdGUg dGhlIE9wZW5QR1Agc3RhbmRhcmQuIEBvcHRpb257LS1wZXJzb25hbC1jb21wcmVz cy1wcmVmZXJlbmNlc30gaXMgdGhlCnNhZmUgd2F5IHRvIGFjY29tcGxpc2ggdGhl IHNhbWUgdGhpbmcuCgpAaXRlbSAtLWNlcnQtZGlnZXN0LWFsZ28gQGNvZGV7bmFt ZX0KQG9waW5kZXggY2VydC1kaWdlc3QtYWxnbwpVc2UgQGNvZGV7bmFtZX0gYXMg dGhlIG1lc3NhZ2UgZGlnZXN0IGFsZ29yaXRobSB1c2VkIHdoZW4gc2lnbmluZyBh CmtleS4gUnVubmluZyB0aGUgcHJvZ3JhbSB3aXRoIHRoZSBjb21tYW5kIEBvcHRp b257LS12ZXJzaW9ufSB5aWVsZHMgYQpsaXN0IG9mIHN1cHBvcnRlZCBhbGdvcml0 aG1zLiBCZSBhd2FyZSB0aGF0IGlmIHlvdSBjaG9vc2UgYW4gYWxnb3JpdGhtCnRo YXQgR251UEcgc3VwcG9ydHMgYnV0IG90aGVyIE9wZW5QR1AgaW1wbGVtZW50YXRp b25zIGRvIG5vdCwgdGhlbiBzb21lCnVzZXJzIHdpbGwgbm90IGJlIGFibGUgdG8g dXNlIHRoZSBrZXkgc2lnbmF0dXJlcyB5b3UgbWFrZSwgb3IgcXVpdGUKcG9zc2li bHkgeW91ciBlbnRpcmUga2V5LgoKQGl0ZW0gLS1kaXNhYmxlLWNpcGhlci1hbGdv IEBjb2Rle25hbWV9CkBvcGluZGV4IGRpc2FibGUtY2lwaGVyLWFsZ28KTmV2ZXIg YWxsb3cgdGhlIHVzZSBvZiBAY29kZXtuYW1lfSBhcyBjaXBoZXIgYWxnb3JpdGht LgpUaGUgZ2l2ZW4gbmFtZSB3aWxsIG5vdCBiZSBjaGVja2VkIHNvIHRoYXQgYSBs YXRlciBsb2FkZWQgYWxnb3JpdGhtCndpbGwgc3RpbGwgZ2V0IGRpc2FibGVkLgoK QGl0ZW0gLS1kaXNhYmxlLXB1YmtleS1hbGdvIEBjb2Rle25hbWV9CkBvcGluZGV4 IGRpc2FibGUtcHVia2V5LWFsZ28KTmV2ZXIgYWxsb3cgdGhlIHVzZSBvZiBAY29k ZXtuYW1lfSBhcyBwdWJsaWMga2V5IGFsZ29yaXRobS4KVGhlIGdpdmVuIG5hbWUg d2lsbCBub3QgYmUgY2hlY2tlZCBzbyB0aGF0IGEgbGF0ZXIgbG9hZGVkIGFsZ29y aXRobQp3aWxsIHN0aWxsIGdldCBkaXNhYmxlZC4KCkBpdGVtIC0tdGhyb3cta2V5 aWRzCkBpdGVteCAtLW5vLXRocm93LWtleWlkcwpAb3BpbmRleCB0aHJvdy1rZXlp ZHMKRG8gbm90IHB1dCB0aGUgcmVjaXBpZW50IGtleSBJRHMgaW50byBlbmNyeXB0 ZWQgbWVzc2FnZXMuIFRoaXMgaGVscHMgdG8KaGlkZSB0aGUgcmVjZWl2ZXJzIG9m IHRoZSBtZXNzYWdlIGFuZCBpcyBhIGxpbWl0ZWQgY291bnRlcm1lYXN1cmUKYWdh aW5zdCB0cmFmZmljIGFuYWx5c2lzLkBmb290bm90ZXtVc2luZyBhIGxpdHRsZSBz b2NpYWwgZW5naW5lZXJpbmcKYW55b25lIHdobyBpcyBhYmxlIHRvIGRlY3J5cHQg dGhlIG1lc3NhZ2UgY2FuIGNoZWNrIHdoZXRoZXIgb25lIG9mIHRoZQpvdGhlciBy ZWNpcGllbnRzIGlzIHRoZSBvbmUgaGUgc3VzcGVjdHMufSAgT24gdGhlIHJlY2Vp dmluZyBzaWRlLCBpdCBtYXkKc2xvdyBkb3duIHRoZSBkZWNyeXB0aW9uIHByb2Nl c3MgYmVjYXVzZSBhbGwgYXZhaWxhYmxlIHNlY3JldCBrZXlzIG11c3QKYmUgdHJp ZWQuICBAb3B0aW9uey0tbm8tdGhyb3cta2V5aWRzfSBkaXNhYmxlcyB0aGlzIG9w dGlvbi4gVGhpcyBvcHRpb24KaXMgZXNzZW50aWFsbHkgdGhlIHNhbWUgYXMgdXNp bmcgQG9wdGlvbnstLWhpZGRlbi1yZWNpcGllbnR9IGZvciBhbGwKcmVjaXBpZW50 cy4KCkBpdGVtIC0tbm90LWRhc2gtZXNjYXBlZApAb3BpbmRleCBub3QtZGFzaC1l c2NhcGVkClRoaXMgb3B0aW9uIGNoYW5nZXMgdGhlIGJlaGF2aW9yIG9mIGNsZWFy dGV4dCBzaWduYXR1cmVzCnNvIHRoYXQgdGhleSBjYW4gYmUgdXNlZCBmb3IgcGF0 Y2ggZmlsZXMuIFlvdSBzaG91bGQgbm90CnNlbmQgc3VjaCBhbiBhcm1vcmVkIGZp bGUgdmlhIGVtYWlsIGJlY2F1c2UgYWxsIHNwYWNlcwphbmQgbGluZSBlbmRpbmdz IGFyZSBoYXNoZWQgdG9vLiBZb3UgY2FuIG5vdCB1c2UgdGhpcwpvcHRpb24gZm9y IGRhdGEgd2hpY2ggaGFzIDUgZGFzaGVzIGF0IHRoZSBiZWdpbm5pbmcgb2YgYQps aW5lLCBwYXRjaCBmaWxlcyBkb24ndCBoYXZlIHRoaXMuIEEgc3BlY2lhbCBhcm1v ciBoZWFkZXIKbGluZSB0ZWxscyBHbnVQRyBhYm91dCB0aGlzIGNsZWFydGV4dCBz aWduYXR1cmUgb3B0aW9uLgoKQGl0ZW0gLS1lc2NhcGUtZnJvbS1saW5lcwpAaXRl bXggLS1uby1lc2NhcGUtZnJvbS1saW5lcwpAb3BpbmRleCBlc2NhcGUtZnJvbS1s aW5lcwpCZWNhdXNlIHNvbWUgbWFpbGVycyBjaGFuZ2UgbGluZXMgc3RhcnRpbmcg d2l0aCAiRnJvbSAiIHRvICI+RnJvbSAiIGl0CmlzIGdvb2QgdG8gaGFuZGxlIHN1 Y2ggbGluZXMgaW4gYSBzcGVjaWFsIHdheSB3aGVuIGNyZWF0aW5nIGNsZWFydGV4 dApzaWduYXR1cmVzIHRvIHByZXZlbnQgdGhlIG1haWwgc3lzdGVtIGZyb20gYnJl YWtpbmcgdGhlIHNpZ25hdHVyZS4gTm90ZQp0aGF0IGFsbCBvdGhlciBQR1AgdmVy c2lvbnMgZG8gaXQgdGhpcyB3YXkgdG9vLiAgRW5hYmxlZCBieQpkZWZhdWx0LiBA b3B0aW9uey0tbm8tZXNjYXBlLWZyb20tbGluZXN9IGRpc2FibGVzIHRoaXMgb3B0 aW9uLgoKQGl0ZW0gLS1wYXNzcGhyYXNlLXJlcGVhdCBAY29kZXtufQpAb3BpbmRl eCBwYXNzcGhyYXNlLXJlcGVhdApTcGVjaWZ5IGhvdyBtYW55IHRpbWVzIEBjb21t YW5ke0BncGduYW1lfSB3aWxsIHJlcXVlc3QgYSBuZXcKcGFzc3BocmFzZSBiZSBy ZXBlYXRlZC4gIFRoaXMgaXMgdXNlZnVsIGZvciBoZWxwaW5nIG1lbW9yaXplIGEK cGFzc3BocmFzZS4gIERlZmF1bHRzIHRvIDEgcmVwZXRpdGlvbi4KCkBpdGVtIC0t cGFzc3BocmFzZS1mZCBAY29kZXtufQpAb3BpbmRleCBwYXNzcGhyYXNlLWZkClJl YWQgdGhlIHBhc3NwaHJhc2UgZnJvbSBmaWxlIGRlc2NyaXB0b3IgQGNvZGV7bn0u IE9ubHkgdGhlIGZpcnN0IGxpbmUKd2lsbCBiZSByZWFkIGZyb20gZmlsZSBkZXNj cmlwdG9yIEBjb2Rle259LiBJZiB5b3UgdXNlIDAgZm9yIEBjb2Rle259LAp0aGUg cGFzc3BocmFzZSB3aWxsIGJlIHJlYWQgZnJvbSBTVERJTi4gVGhpcyBjYW4gb25s eSBiZSB1c2VkIGlmIG9ubHkKb25lIHBhc3NwaHJhc2UgaXMgc3VwcGxpZWQuCgpO b3RlIHRoYXQgdGhpcyBwYXNzcGhyYXNlIGlzIG9ubHkgdXNlZCBpZiB0aGUgb3B0 aW9uIEBvcHRpb257LS1iYXRjaH0KaGFzIGFsc28gYmVlbiBnaXZlbi4gIFRoaXMg aXMgZGlmZmVyZW50IGZyb20gR251UEcgdmVyc2lvbiAxLnguCgpAaXRlbSAtLXBh c3NwaHJhc2UtZmlsZSBAY29kZXtmaWxlfQpAb3BpbmRleCBwYXNzcGhyYXNlLWZp bGUKUmVhZCB0aGUgcGFzc3BocmFzZSBmcm9tIGZpbGUgQGNvZGV7ZmlsZX0uIE9u bHkgdGhlIGZpcnN0IGxpbmUgd2lsbApiZSByZWFkIGZyb20gZmlsZSBAY29kZXtm aWxlfS4gVGhpcyBjYW4gb25seSBiZSB1c2VkIGlmIG9ubHkgb25lCnBhc3NwaHJh c2UgaXMgc3VwcGxpZWQuIE9idmlvdXNseSwgYSBwYXNzcGhyYXNlIHN0b3JlZCBp biBhIGZpbGUgaXMKb2YgcXVlc3Rpb25hYmxlIHNlY3VyaXR5IGlmIG90aGVyIHVz ZXJzIGNhbiByZWFkIHRoaXMgZmlsZS4gRG9uJ3QgdXNlCnRoaXMgb3B0aW9uIGlm IHlvdSBjYW4gYXZvaWQgaXQuCk5vdGUgdGhhdCB0aGlzIHBhc3NwaHJhc2UgaXMg b25seSB1c2VkIGlmIHRoZSBvcHRpb24gQG9wdGlvbnstLWJhdGNofQpoYXMgYWxz byBiZWVuIGdpdmVuLiAgVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBHbnVQRyB2ZXJz aW9uIDEueC4KCkBpdGVtIC0tcGFzc3BocmFzZSBAY29kZXtzdHJpbmd9CkBvcGlu ZGV4IHBhc3NwaHJhc2UKVXNlIEBjb2Rle3N0cmluZ30gYXMgdGhlIHBhc3NwaHJh c2UuIFRoaXMgY2FuIG9ubHkgYmUgdXNlZCBpZiBvbmx5IG9uZQpwYXNzcGhyYXNl IGlzIHN1cHBsaWVkLiBPYnZpb3VzbHksIHRoaXMgaXMgb2YgdmVyeSBxdWVzdGlv bmFibGUKc2VjdXJpdHkgb24gYSBtdWx0aS11c2VyIHN5c3RlbS4gRG9uJ3QgdXNl IHRoaXMgb3B0aW9uIGlmIHlvdSBjYW4KYXZvaWQgaXQuCk5vdGUgdGhhdCB0aGlz IHBhc3NwaHJhc2UgaXMgb25seSB1c2VkIGlmIHRoZSBvcHRpb24gQG9wdGlvbnst LWJhdGNofQpoYXMgYWxzbyBiZWVuIGdpdmVuLiAgVGhpcyBpcyBkaWZmZXJlbnQg ZnJvbSBHbnVQRyB2ZXJzaW9uIDEueC4KCkBpdGVtIC0tcGluZW50cnktbW9kZSBA Y29kZXttb2RlfQpAb3BpbmRleCBwaW5lbnRyeS1tb2RlClNldCB0aGUgcGluZW50 cnkgbW9kZSB0byBAY29kZXttb2RlfS4gIEFsbG93ZWQgdmFsdWVzIGZvciBAY29k ZXttb2RlfQphcmU6CkB0YWJsZSBAYXNpcwogIEBpdGVtIGRlZmF1bHQKICBVc2Ug dGhlIGRlZmF1bHQgb2YgdGhlIGFnZW50LCB3aGljaCBpcyBAY29kZXthc2t9Lgog IEBpdGVtIGFzawogIEZvcmNlIHRoZSB1c2Ugb2YgdGhlIFBpbmVudHJ5LgogIEBp dGVtIGNhbmNlbAogIEVtdWxhdGUgdXNlIG9mIFBpbmVudHJ5J3MgY2FuY2VsIGJ1 dHRvbi4KICBAaXRlbSBlcnJvcgogIFJldHVybiBhIFBpbmVudHJ5IGVycm9yIChg YE5vIFBpbmVudHJ5JycpLgogIEBpdGVtIGxvb3BiYWNrCiAgUmVkaXJlY3QgUGlu ZW50cnkgcXVlcmllcyB0byB0aGUgY2FsbGVyLiAgTm90ZSB0aGF0IGluIGNvbnRy YXN0IHRvCiAgUGluZW50cnkgdGhlIHVzZXIgaXMgbm90IHByb21wdGVkIGFnYWlu IGlmIGhlIGVudGVycyBhIGJhZCBwYXNzd29yZC4KQGVuZCB0YWJsZQoKQGl0ZW0g LS1jb21tYW5kLWZkIEBjb2Rle259CkBvcGluZGV4IGNvbW1hbmQtZmQKVGhpcyBp cyBhIHJlcGxhY2VtZW50IGZvciB0aGUgZGVwcmVjYXRlZCBzaGFyZWQtbWVtb3J5 IElQQyBtb2RlLgpJZiB0aGlzIG9wdGlvbiBpcyBlbmFibGVkLCB1c2VyIGlucHV0 IG9uIHF1ZXN0aW9ucyBpcyBub3QgZXhwZWN0ZWQKZnJvbSB0aGUgVFRZIGJ1dCBm cm9tIHRoZSBnaXZlbiBmaWxlIGRlc2NyaXB0b3IuIEl0IHNob3VsZCBiZSB1c2Vk CnRvZ2V0aGVyIHdpdGggQG9wdGlvbnstLXN0YXR1cy1mZH0uIFNlZSB0aGUgZmls ZSBkb2MvREVUQUlMUyBpbiB0aGUgc291cmNlCmRpc3RyaWJ1dGlvbiBmb3IgZGV0 YWlscyBvbiBob3cgdG8gdXNlIGl0LgoKQGl0ZW0gLS1jb21tYW5kLWZpbGUgQGNv ZGV7ZmlsZX0KQG9waW5kZXggY29tbWFuZC1maWxlClNhbWUgYXMgQG9wdGlvbnst LWNvbW1hbmQtZmR9LCBleGNlcHQgdGhlIGNvbW1hbmRzIGFyZSByZWFkIG91dCBv ZiBmaWxlCkBjb2Rle2ZpbGV9CgpAaXRlbSAtLWFsbG93LW5vbi1zZWxmc2lnbmVk LXVpZApAaXRlbXggLS1uby1hbGxvdy1ub24tc2VsZnNpZ25lZC11aWQKQG9waW5k ZXggYWxsb3ctbm9uLXNlbGZzaWduZWQtdWlkCkFsbG93IHRoZSBpbXBvcnQgYW5k IHVzZSBvZiBrZXlzIHdpdGggdXNlciBJRHMgd2hpY2ggYXJlIG5vdApzZWxmLXNp Z25lZC4gVGhpcyBpcyBub3QgcmVjb21tZW5kZWQsIGFzIGEgbm9uIHNlbGYtc2ln bmVkIHVzZXIgSUQgaXMKdHJpdmlhbCB0byBmb3JnZS4gQG9wdGlvbnstLW5vLWFs bG93LW5vbi1zZWxmc2lnbmVkLXVpZH0gZGlzYWJsZXMuCgpAaXRlbSAtLWFsbG93 LWZyZWVmb3JtLXVpZApAb3BpbmRleCBhbGxvdy1mcmVlZm9ybS11aWQKRGlzYWJs ZSBhbGwgY2hlY2tzIG9uIHRoZSBmb3JtIG9mIHRoZSB1c2VyIElEIHdoaWxlIGdl bmVyYXRpbmcgYSBuZXcKb25lLiBUaGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSB1 c2VkIGluIHZlcnkgc3BlY2lhbCBlbnZpcm9ubWVudHMgYXMKaXQgZG9lcyBub3Qg ZW5zdXJlIHRoZSBkZS1mYWN0byBzdGFuZGFyZCBmb3JtYXQgb2YgdXNlciBJRHMu CgpAaXRlbSAtLWlnbm9yZS10aW1lLWNvbmZsaWN0CkBvcGluZGV4IGlnbm9yZS10 aW1lLWNvbmZsaWN0CkdudVBHIG5vcm1hbGx5IGNoZWNrcyB0aGF0IHRoZSB0aW1l c3RhbXBzIGFzc29jaWF0ZWQgd2l0aCBrZXlzIGFuZApzaWduYXR1cmVzIGhhdmUg cGxhdXNpYmxlIHZhbHVlcy4gSG93ZXZlciwgc29tZXRpbWVzIGEgc2lnbmF0dXJl CnNlZW1zIHRvIGJlIG9sZGVyIHRoYW4gdGhlIGtleSBkdWUgdG8gY2xvY2sgcHJv YmxlbXMuIFRoaXMgb3B0aW9uCm1ha2VzIHRoZXNlIGNoZWNrcyBqdXN0IGEgd2Fy bmluZy4gU2VlIGFsc28gQG9wdGlvbnstLWlnbm9yZS12YWxpZC1mcm9tfSBmb3IK dGltZXN0YW1wIGlzc3VlcyBvbiBzdWJrZXlzLgoKQGl0ZW0gLS1pZ25vcmUtdmFs aWQtZnJvbQpAb3BpbmRleCBpZ25vcmUtdmFsaWQtZnJvbQpHbnVQRyBub3JtYWxs eSBkb2VzIG5vdCBzZWxlY3QgYW5kIHVzZSBzdWJrZXlzIGNyZWF0ZWQgaW4gdGhl IGZ1dHVyZS4KVGhpcyBvcHRpb24gYWxsb3dzIHRoZSB1c2Ugb2Ygc3VjaCBrZXlz IGFuZCB0aHVzIGV4aGliaXRzIHRoZQpwcmUtMS4wLjcgYmVoYXZpb3VyLiBZb3Ug c2hvdWxkIG5vdCB1c2UgdGhpcyBvcHRpb24gdW5sZXNzIHRoZXJlCmlzIHNvbWUg Y2xvY2sgcHJvYmxlbS4gU2VlIGFsc28gQG9wdGlvbnstLWlnbm9yZS10aW1lLWNv bmZsaWN0fSBmb3IgdGltZXN0YW1wCmlzc3VlcyB3aXRoIHNpZ25hdHVyZXMuCgpA aXRlbSAtLWlnbm9yZS1jcmMtZXJyb3IKQG9waW5kZXggaWdub3JlLWNyYy1lcnJv cgpUaGUgQVNDSUkgYXJtb3IgdXNlZCBieSBPcGVuUEdQIGlzIHByb3RlY3RlZCBi eSBhIENSQyBjaGVja3N1bSBhZ2FpbnN0CnRyYW5zbWlzc2lvbiBlcnJvcnMuIE9j Y2FzaW9uYWxseSB0aGUgQ1JDIGdldHMgbWFuZ2xlZCBzb21ld2hlcmUgb24KdGhl IHRyYW5zbWlzc2lvbiBjaGFubmVsIGJ1dCB0aGUgYWN0dWFsIGNvbnRlbnQgKHdo aWNoIGlzIHByb3RlY3RlZCBieQp0aGUgT3BlblBHUCBwcm90b2NvbCBhbnl3YXkp IGlzIHN0aWxsIG9rYXkuIFRoaXMgb3B0aW9uIGFsbG93cyBHbnVQRwp0byBpZ25v cmUgQ1JDIGVycm9ycy4KCkBpdGVtIC0taWdub3JlLW1kYy1lcnJvcgpAb3BpbmRl eCBpZ25vcmUtbWRjLWVycm9yClRoaXMgb3B0aW9uIGNoYW5nZXMgYSBNREMgaW50 ZWdyaXR5IHByb3RlY3Rpb24gZmFpbHVyZSBpbnRvIGEgd2FybmluZy4KVGhpcyBj YW4gYmUgdXNlZnVsIGlmIGEgbWVzc2FnZSBpcyBwYXJ0aWFsbHkgY29ycnVwdCwg YnV0IGl0IGlzCm5lY2Vzc2FyeSB0byBnZXQgYXMgbXVjaCBkYXRhIGFzIHBvc3Np YmxlIG91dCBvZiB0aGUgY29ycnVwdCBtZXNzYWdlLgpIb3dldmVyLCBiZSBhd2Fy ZSB0aGF0IGEgTURDIHByb3RlY3Rpb24gZmFpbHVyZSBtYXkgYWxzbyBtZWFuIHRo YXQgdGhlCm1lc3NhZ2Ugd2FzIHRhbXBlcmVkIHdpdGggaW50ZW50aW9uYWxseSBi eSBhbiBhdHRhY2tlci4KCkBpdGVtIC0tYWxsb3ctd2Vhay1kaWdlc3QtYWxnb3MK QG9waW5kZXggYWxsb3ctd2Vhay1kaWdlc3QtYWxnb3MKU2lnbmF0dXJlcyBtYWRl IHdpdGgga25vd24td2VhayBkaWdlc3QgYWxnb3JpdGhtcyBhcmUgbm9ybWFsbHkK cmVqZWN0ZWQgd2l0aCBhbiBgYGludmFsaWQgZGlnZXN0IGFsZ29yaXRobScnIG1l c3NhZ2UuICBUaGlzIG9wdGlvbgphbGxvd3MgdGhlIHZlcmlmaWNhdGlvbiBvZiBz aWduYXR1cmVzIG1hZGUgd2l0aCBzdWNoIHdlYWsgYWxnb3JpdGhtcy4KTUQ1IGlz IHRoZSBvbmx5IGRpZ2VzdCBhbGdvcml0aG0gY29uc2lkZXJlZCB3ZWFrIGJ5IGRl ZmF1bHQuICBTZWUgYWxzbwpAb3B0aW9uey0td2Vhay1kaWdlc3R9IHRvIHJlamVj dCBvdGhlciBkaWdlc3QgYWxnb3JpdGhtcy4KCkBpdGVtIC0td2Vhay1kaWdlc3Qg QGNvZGV7bmFtZX0KQG9waW5kZXggd2Vhay1kaWdlc3QKVHJlYXQgdGhlIHNwZWNp ZmllZCBkaWdlc3QgYWxnb3JpdGhtIGFzIHdlYWsuICBTaWduYXR1cmVzIG1hZGUg b3Zlcgp3ZWFrIGRpZ2VzdHMgYWxnb3JpdGhtcyBhcmUgbm9ybWFsbHkgcmVqZWN0 ZWQuIFRoaXMgb3B0aW9uIGNhbiBiZQpzdXBwbGllZCBtdWx0aXBsZSB0aW1lcyBp ZiBtdWx0aXBsZSBhbGdvcml0aG1zIHNob3VsZCBiZSBjb25zaWRlcmVkCndlYWsu ICBTZWUgYWxzbyBAb3B0aW9uey0tYWxsb3ctd2Vhay1kaWdlc3QtYWxnb3N9IHRv IGRpc2FibGUKcmVqZWN0aW9uIG9mIHdlYWsgZGlnZXN0cy4gIE1ENSBpcyBhbHdh eXMgY29uc2lkZXJlZCB3ZWFrLCBhbmQgZG9lcwpub3QgbmVlZCB0byBiZSBsaXN0 ZWQgZXhwbGljaXRseS4KCkBpdGVtIC0tbm8tZGVmYXVsdC1rZXlyaW5nCkBvcGlu ZGV4IG5vLWRlZmF1bHQta2V5cmluZwpEbyBub3QgYWRkIHRoZSBkZWZhdWx0IGtl eXJpbmdzIHRvIHRoZSBsaXN0IG9mIGtleXJpbmdzLiBOb3RlIHRoYXQKR251UEcg d2lsbCBub3Qgb3BlcmF0ZSB3aXRob3V0IGFueSBrZXlyaW5ncywgc28gaWYgeW91 IHVzZSB0aGlzIG9wdGlvbgphbmQgZG8gbm90IHByb3ZpZGUgYWx0ZXJuYXRlIGtl eXJpbmdzIHZpYSBAb3B0aW9uey0ta2V5cmluZ30gb3IKQG9wdGlvbnstLXNlY3Jl dC1rZXlyaW5nfSwgdGhlbiBHbnVQRyB3aWxsIHN0aWxsIHVzZSB0aGUgZGVmYXVs dCBwdWJsaWMgb3IKc2VjcmV0IGtleXJpbmdzLgoKQGl0ZW0gLS1za2lwLXZlcmlm eQpAb3BpbmRleCBza2lwLXZlcmlmeQpTa2lwIHRoZSBzaWduYXR1cmUgdmVyaWZp Y2F0aW9uIHN0ZXAuIFRoaXMgbWF5IGJlCnVzZWQgdG8gbWFrZSB0aGUgZGVjcnlw dGlvbiBmYXN0ZXIgaWYgdGhlIHNpZ25hdHVyZQp2ZXJpZmljYXRpb24gaXMgbm90 IG5lZWRlZC4KCkBpdGVtIC0td2l0aC1rZXktZGF0YQpAb3BpbmRleCB3aXRoLWtl eS1kYXRhClByaW50IGtleSBsaXN0aW5ncyBkZWxpbWl0ZWQgYnkgY29sb25zIChs aWtlIEBvcHRpb257LS13aXRoLWNvbG9uc30pIGFuZApwcmludCB0aGUgcHVibGlj IGtleSBkYXRhLgoKQGl0ZW0gLS1mYXN0LWxpc3QtbW9kZQpAb3BpbmRleCBmYXN0 LWxpc3QtbW9kZQpDaGFuZ2VzIHRoZSBvdXRwdXQgb2YgdGhlIGxpc3QgY29tbWFu ZHMgdG8gd29yayBmYXN0ZXI7IHRoaXMgaXMgYWNoaWV2ZWQKYnkgbGVhdmluZyBz b21lIHBhcnRzIGVtcHR5LiBTb21lIGFwcGxpY2F0aW9ucyBkb24ndCBuZWVkIHRo ZSB1c2VyIElECmFuZCB0aGUgdHJ1c3QgaW5mb3JtYXRpb24gZ2l2ZW4gaW4gdGhl IGxpc3RpbmdzLiBCeSB1c2luZyB0aGlzIG9wdGlvbnMKdGhleSBjYW4gZ2V0IGEg ZmFzdGVyIGxpc3RpbmcuIFRoZSBleGFjdCBiZWhhdmlvdXIgb2YgdGhpcyBvcHRp b24gbWF5CmNoYW5nZSBpbiBmdXR1cmUgdmVyc2lvbnMuICBJZiB5b3UgYXJlIG1p c3Npbmcgc29tZSBpbmZvcm1hdGlvbiwgZG9uJ3QKdXNlIHRoaXMgb3B0aW9uLgoK QGl0ZW0gLS1uby1saXRlcmFsCkBvcGluZGV4IG5vLWxpdGVyYWwKVGhpcyBpcyBu b3QgZm9yIG5vcm1hbCB1c2UuIFVzZSB0aGUgc291cmNlIHRvIHNlZSBmb3Igd2hh dCBpdCBtaWdodCBiZSB1c2VmdWwuCgpAaXRlbSAtLXNldC1maWxlc2l6ZQpAb3Bp bmRleCBzZXQtZmlsZXNpemUKVGhpcyBpcyBub3QgZm9yIG5vcm1hbCB1c2UuIFVz ZSB0aGUgc291cmNlIHRvIHNlZSBmb3Igd2hhdCBpdCBtaWdodCBiZSB1c2VmdWwu CgpAaXRlbSAtLXNob3ctc2Vzc2lvbi1rZXkKQG9waW5kZXggc2hvdy1zZXNzaW9u LWtleQpEaXNwbGF5IHRoZSBzZXNzaW9uIGtleSB1c2VkIGZvciBvbmUgbWVzc2Fn ZS4gU2VlCkBvcHRpb257LS1vdmVycmlkZS1zZXNzaW9uLWtleX0gZm9yIHRoZSBj b3VudGVycGFydCBvZiB0aGlzIG9wdGlvbi4KCldlIHRoaW5rIHRoYXQgS2V5IEVz Y3JvdyBpcyBhIEJhZCBUaGluZzsgaG93ZXZlciB0aGUgdXNlciBzaG91bGQgaGF2 ZQp0aGUgZnJlZWRvbSB0byBkZWNpZGUgd2hldGhlciB0byBnbyB0byBwcmlzb24g b3IgdG8gcmV2ZWFsIHRoZSBjb250ZW50Cm9mIG9uZSBzcGVjaWZpYyBtZXNzYWdl IHdpdGhvdXQgY29tcHJvbWlzaW5nIGFsbCBtZXNzYWdlcyBldmVyCmVuY3J5cHRl ZCBmb3Igb25lIHNlY3JldCBrZXkuCgpZb3UgY2FuIGFsc28gdXNlIHRoaXMgb3B0 aW9uIGlmIHlvdSByZWNlaXZlIGFuIGVuY3J5cHRlZCBtZXNzYWdlIHdoaWNoCmlz IGFidXNpdmUgb3Igb2ZmZW5zaXZlLCB0byBwcm92ZSB0byB0aGUgYWRtaW5pc3Ry YXRvcnMgb2YgdGhlCm1lc3NhZ2luZyBzeXN0ZW0gdGhhdCB0aGUgY2lwaGVydGV4 dCB0cmFuc21pdHRlZCBjb3JyZXNwb25kcyB0byBhbgppbmFwcHJvcHJpYXRlIHBs YWludGV4dCBzbyB0aGV5IGNhbiB0YWtlIGFjdGlvbiBhZ2FpbnN0IHRoZSBvZmZl bmRpbmcKdXNlci4KCkBpdGVtIC0tb3ZlcnJpZGUtc2Vzc2lvbi1rZXkgQGNvZGV7 c3RyaW5nfQpAb3BpbmRleCBvdmVycmlkZS1zZXNzaW9uLWtleQpEb24ndCB1c2Ug dGhlIHB1YmxpYyBrZXkgYnV0IHRoZSBzZXNzaW9uIGtleSBAY29kZXtzdHJpbmd9 LiBUaGUgZm9ybWF0Cm9mIHRoaXMgc3RyaW5nIGlzIHRoZSBzYW1lIGFzIHRoZSBv bmUgcHJpbnRlZCBieQpAb3B0aW9uey0tc2hvdy1zZXNzaW9uLWtleX0uIFRoaXMg b3B0aW9uIGlzIG5vcm1hbGx5IG5vdCB1c2VkIGJ1dCBjb21lcwpoYW5keSBpbiBj YXNlIHNvbWVvbmUgZm9yY2VzIHlvdSB0byByZXZlYWwgdGhlIGNvbnRlbnQgb2Yg YW4gZW5jcnlwdGVkCm1lc3NhZ2U7IHVzaW5nIHRoaXMgb3B0aW9uIHlvdSBjYW4g ZG8gdGhpcyB3aXRob3V0IGhhbmRpbmcgb3V0IHRoZQpzZWNyZXQga2V5LgoKQGl0 ZW0gLS1hc2stc2lnLWV4cGlyZQpAaXRlbXggLS1uby1hc2stc2lnLWV4cGlyZQpA b3BpbmRleCBhc2stc2lnLWV4cGlyZQpXaGVuIG1ha2luZyBhIGRhdGEgc2lnbmF0 dXJlLCBwcm9tcHQgZm9yIGFuIGV4cGlyYXRpb24gdGltZS4gSWYgdGhpcwpvcHRp b24gaXMgbm90IHNwZWNpZmllZCwgdGhlIGV4cGlyYXRpb24gdGltZSBzZXQgdmlh CkBvcHRpb257LS1kZWZhdWx0LXNpZy1leHBpcmV9IGlzIHVzZWQuIEBvcHRpb257 LS1uby1hc2stc2lnLWV4cGlyZX0KZGlzYWJsZXMgdGhpcyBvcHRpb24uCgpAaXRl bSAtLWRlZmF1bHQtc2lnLWV4cGlyZQpAb3BpbmRleCBkZWZhdWx0LXNpZy1leHBp cmUKVGhlIGRlZmF1bHQgZXhwaXJhdGlvbiB0aW1lIHRvIHVzZSBmb3Igc2lnbmF0 dXJlIGV4cGlyYXRpb24uIFZhbGlkCnZhbHVlcyBhcmUgIjAiIGZvciBubyBleHBp cmF0aW9uLCBhIG51bWJlciBmb2xsb3dlZCBieSB0aGUgbGV0dGVyIGQKKGZvciBk YXlzKSwgdyAoZm9yIHdlZWtzKSwgbSAoZm9yIG1vbnRocyksIG9yIHkgKGZvciB5 ZWFycykgKGZvcgpleGFtcGxlICIybSIgZm9yIHR3byBtb250aHMsIG9yICI1eSIg Zm9yIGZpdmUgeWVhcnMpLCBvciBhbiBhYnNvbHV0ZQpkYXRlIGluIHRoZSBmb3Jt IFlZWVktTU0tREQuIERlZmF1bHRzIHRvICIwIi4KCkBpdGVtIC0tYXNrLWNlcnQt ZXhwaXJlCkBpdGVteCAtLW5vLWFzay1jZXJ0LWV4cGlyZQpAb3BpbmRleCBhc2st Y2VydC1leHBpcmUKV2hlbiBtYWtpbmcgYSBrZXkgc2lnbmF0dXJlLCBwcm9tcHQg Zm9yIGFuIGV4cGlyYXRpb24gdGltZS4gSWYgdGhpcwpvcHRpb24gaXMgbm90IHNw ZWNpZmllZCwgdGhlIGV4cGlyYXRpb24gdGltZSBzZXQgdmlhCkBvcHRpb257LS1k ZWZhdWx0LWNlcnQtZXhwaXJlfSBpcyB1c2VkLiBAb3B0aW9uey0tbm8tYXNrLWNl cnQtZXhwaXJlfQpkaXNhYmxlcyB0aGlzIG9wdGlvbi4KCkBpdGVtIC0tZGVmYXVs dC1jZXJ0LWV4cGlyZQpAb3BpbmRleCBkZWZhdWx0LWNlcnQtZXhwaXJlClRoZSBk ZWZhdWx0IGV4cGlyYXRpb24gdGltZSB0byB1c2UgZm9yIGtleSBzaWduYXR1cmUg ZXhwaXJhdGlvbi4KVmFsaWQgdmFsdWVzIGFyZSAiMCIgZm9yIG5vIGV4cGlyYXRp b24sIGEgbnVtYmVyIGZvbGxvd2VkIGJ5IHRoZQpsZXR0ZXIgZCAoZm9yIGRheXMp LCB3IChmb3Igd2Vla3MpLCBtIChmb3IgbW9udGhzKSwgb3IgeSAoZm9yIHllYXJz KQooZm9yIGV4YW1wbGUgIjJtIiBmb3IgdHdvIG1vbnRocywgb3IgIjV5IiBmb3Ig Zml2ZSB5ZWFycyksIG9yIGFuCmFic29sdXRlIGRhdGUgaW4gdGhlIGZvcm0gWVlZ WS1NTS1ERC4gRGVmYXVsdHMgdG8gIjAiLgoKQGl0ZW0gLS1hbGxvdy1zZWNyZXQt a2V5LWltcG9ydApAb3BpbmRleCBhbGxvdy1zZWNyZXQta2V5LWltcG9ydApUaGlz IGlzIGFuIG9ic29sZXRlIG9wdGlvbiBhbmQgaXMgbm90IHVzZWQgYW55d2hlcmUu CgpAaXRlbSAtLWFsbG93LW11bHRpcGxlLW1lc3NhZ2VzCkBpdGVtIC0tbm8tYWxs b3ctbXVsdGlwbGUtbWVzc2FnZXMKQG9waW5kZXggYWxsb3ctbXVsdGlwbGUtbWVz c2FnZXMKQWxsb3cgcHJvY2Vzc2luZyBvZiBtdWx0aXBsZSBPcGVuUEdQIG1lc3Nh Z2VzIGNvbnRhaW5lZCBpbiBhIHNpbmdsZSBmaWxlCm9yIHN0cmVhbS4gIFNvbWUg cHJvZ3JhbXMgdGhhdCBjYWxsIEdQRyBhcmUgbm90IHByZXBhcmVkIHRvIGRlYWwg d2l0aAptdWx0aXBsZSBtZXNzYWdlcyBiZWluZyBwcm9jZXNzZWQgdG9nZXRoZXIs IHNvIHRoaXMgb3B0aW9uIGRlZmF1bHRzIHRvCm5vLiAgTm90ZSB0aGF0IHZlcnNp b25zIG9mIEdQRyBwcmlvciB0byAxLjQuNyBhbHdheXMgYWxsb3dlZCBtdWx0aXBs ZQptZXNzYWdlcy4KCldhcm5pbmc6IERvIG5vdCB1c2UgdGhpcyBvcHRpb24gdW5s ZXNzIHlvdSBuZWVkIGl0IGFzIGEgdGVtcG9yYXJ5Cndvcmthcm91bmQhCgoKQGl0 ZW0gLS1lbmFibGUtc3BlY2lhbC1maWxlbmFtZXMKQG9waW5kZXggZW5hYmxlLXNw ZWNpYWwtZmlsZW5hbWVzClRoaXMgb3B0aW9ucyBlbmFibGVzIGEgbW9kZSBpbiB3 aGljaCBmaWxlbmFtZXMgb2YgdGhlIGZvcm0KQGZpbGV7LSZufSwgd2hlcmUgbiBp cyBhIG5vbi1uZWdhdGl2ZSBkZWNpbWFsIG51bWJlciwKcmVmZXIgdG8gdGhlIGZp bGUgZGVzY3JpcHRvciBuIGFuZCBub3QgdG8gYSBmaWxlIHdpdGggdGhhdCBuYW1l LgoKQGl0ZW0gLS1uby1leHBlbnNpdmUtdHJ1c3QtY2hlY2tzCkBvcGluZGV4IG5v LWV4cGVuc2l2ZS10cnVzdC1jaGVja3MKRXhwZXJpbWVudGFsIHVzZSBvbmx5LgoK QGl0ZW0gLS1wcmVzZXJ2ZS1wZXJtaXNzaW9ucwpAb3BpbmRleCBwcmVzZXJ2ZS1w ZXJtaXNzaW9ucwpEb24ndCBjaGFuZ2UgdGhlIHBlcm1pc3Npb25zIG9mIGEgc2Vj cmV0IGtleXJpbmcgYmFjayB0byB1c2VyCnJlYWQvd3JpdGUgb25seS4gVXNlIHRo aXMgb3B0aW9uIG9ubHkgaWYgeW91IHJlYWxseSBrbm93IHdoYXQgeW91IGFyZSBk b2luZy4KCkBpdGVtIC0tZGVmYXVsdC1wcmVmZXJlbmNlLWxpc3QgQGNvZGV7c3Ry aW5nfQpAb3BpbmRleCBkZWZhdWx0LXByZWZlcmVuY2UtbGlzdApTZXQgdGhlIGxp c3Qgb2YgZGVmYXVsdCBwcmVmZXJlbmNlcyB0byBAY29kZXtzdHJpbmd9LiBUaGlz IHByZWZlcmVuY2UKbGlzdCBpcyB1c2VkIGZvciBuZXcga2V5cyBhbmQgYmVjb21l cyB0aGUgZGVmYXVsdCBmb3IgInNldHByZWYiIGluIHRoZQplZGl0IG1lbnUuCgpA aXRlbSAtLWRlZmF1bHQta2V5c2VydmVyLXVybCBAY29kZXtuYW1lfQpAb3BpbmRl eCBkZWZhdWx0LWtleXNlcnZlci11cmwKU2V0IHRoZSBkZWZhdWx0IGtleXNlcnZl ciBVUkwgdG8gQGNvZGV7bmFtZX0uIFRoaXMga2V5c2VydmVyIHdpbGwgYmUKdXNl ZCBhcyB0aGUga2V5c2VydmVyIFVSTCB3aGVuIHdyaXRpbmcgYSBuZXcgc2VsZi1z aWduYXR1cmUgb24gYSBrZXksCndoaWNoIGluY2x1ZGVzIGtleSBnZW5lcmF0aW9u IGFuZCBjaGFuZ2luZyBwcmVmZXJlbmNlcy4KCkBpdGVtIC0tbGlzdC1jb25maWcK QG9waW5kZXggbGlzdC1jb25maWcKRGlzcGxheSB2YXJpb3VzIGludGVybmFsIGNv bmZpZ3VyYXRpb24gcGFyYW1ldGVycyBvZiBHbnVQRy4gVGhpcyBvcHRpb24KaXMg aW50ZW5kZWQgZm9yIGV4dGVybmFsIHByb2dyYW1zIHRoYXQgY2FsbCBHbnVQRyB0 byBwZXJmb3JtIHRhc2tzLCBhbmQKaXMgdGh1cyBub3QgZ2VuZXJhbGx5IHVzZWZ1 bC4gU2VlIHRoZSBmaWxlIEBmaWxle2RvYy9ERVRBSUxTfSBpbiB0aGUKc291cmNl IGRpc3RyaWJ1dGlvbiBmb3IgdGhlIGRldGFpbHMgb2Ygd2hpY2ggY29uZmlndXJh dGlvbiBpdGVtcyBtYXkgYmUKbGlzdGVkLiBAb3B0aW9uey0tbGlzdC1jb25maWd9 IGlzIG9ubHkgdXNhYmxlIHdpdGgKQG9wdGlvbnstLXdpdGgtY29sb25zfSBzZXQu CgpAaXRlbSAtLWxpc3QtZ2NyeXB0LWNvbmZpZwpAb3BpbmRleCBsaXN0LWdjcnlw dC1jb25maWcKRGlzcGxheSB2YXJpb3VzIGludGVybmFsIGNvbmZpZ3VyYXRpb24g cGFyYW1ldGVycyBvZiBMaWJnY3J5cHQuCgpAaXRlbSAtLWdwZ2NvbmYtbGlzdApA b3BpbmRleCBncGdjb25mLWxpc3QKVGhpcyBjb21tYW5kIGlzIHNpbWlsYXIgdG8g QG9wdGlvbnstLWxpc3QtY29uZmlnfSBidXQgaW4gZ2VuZXJhbCBvbmx5CmludGVy bmFsbHkgdXNlZCBieSB0aGUgQGNvbW1hbmR7Z3BnY29uZn0gdG9vbC4KCkBpdGVt IC0tZ3BnY29uZi10ZXN0CkBvcGluZGV4IGdwZ2NvbmYtdGVzdApUaGlzIGlzIG1v cmUgb3IgbGVzcyBkdW1teSBhY3Rpb24uICBIb3dldmVyIGl0IHBhcnNlcyB0aGUg Y29uZmlndXJhdGlvbgpmaWxlIGFuZCByZXR1cm5zIHdpdGggZmFpbHVyZSBpZiB0 aGUgY29uZmlndXJhdGlvbiBmaWxlIHdvdWxkIHByZXZlbnQKQGNvbW1hbmR7Z3Bn fSBmcm9tIHN0YXJ0dXAuICBUaHVzIGl0IG1heSBiZSB1c2VkIHRvIHJ1biBhIHN5 bnRheCBjaGVjawpvbiB0aGUgY29uZmlndXJhdGlvbiBmaWxlLgoKQGVuZCB0YWJs ZQoKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAYyAqKioqKioq IERlcHJlY2F0ZWQgKioqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKQG5vZGUgRGVwcmVjYXRlZCBPcHRpb25zCkBzdWJzZWN0aW9u IERlcHJlY2F0ZWQgb3B0aW9ucwoKQHRhYmxlIEBnbnVwZ3RhYm9wdAoKQGl0ZW0g LS1zaG93LXBob3RvcwpAaXRlbXggLS1uby1zaG93LXBob3RvcwpAb3BpbmRleCBz aG93LXBob3RvcwpDYXVzZXMgQG9wdGlvbnstLWxpc3Qta2V5c30sIEBvcHRpb257 LS1saXN0LXNpZ3N9LApAb3B0aW9uey0tbGlzdC1wdWJsaWMta2V5c30sIEBvcHRp b257LS1saXN0LXNlY3JldC1rZXlzfSwgYW5kIHZlcmlmeWluZwphIHNpZ25hdHVy ZSB0byBhbHNvIGRpc3BsYXkgdGhlIHBob3RvIElEIGF0dGFjaGVkIHRvIHRoZSBr ZXksIGlmCmFueS4gU2VlIGFsc28gQG9wdGlvbnstLXBob3RvLXZpZXdlcn0uIFRo ZXNlIG9wdGlvbnMgYXJlIGRlcHJlY2F0ZWQuIFVzZQpAb3B0aW9uey0tbGlzdC1v cHRpb25zIFtuby1dc2hvdy1waG90b3N9IGFuZC9vciBAb3B0aW9uey0tdmVyaWZ5 LW9wdGlvbnMKW25vLV1zaG93LXBob3Rvc30gaW5zdGVhZC4KCkBpdGVtIC0tc2hv dy1rZXlyaW5nCkBvcGluZGV4IHNob3cta2V5cmluZwpEaXNwbGF5IHRoZSBrZXly aW5nIG5hbWUgYXQgdGhlIGhlYWQgb2Yga2V5IGxpc3RpbmdzIHRvIHNob3cgd2hp Y2gKa2V5cmluZyBhIGdpdmVuIGtleSByZXNpZGVzIG9uLiBUaGlzIG9wdGlvbiBp cyBkZXByZWNhdGVkOiB1c2UKQG9wdGlvbnstLWxpc3Qtb3B0aW9ucyBbbm8tXXNo b3cta2V5cmluZ30gaW5zdGVhZC4KCkBpdGVtIC0tYWx3YXlzLXRydXN0CkBvcGlu ZGV4IGFsd2F5cy10cnVzdApJZGVudGljYWwgdG8gQG9wdGlvbnstLXRydXN0LW1v ZGVsIGFsd2F5c30uIFRoaXMgb3B0aW9uIGlzIGRlcHJlY2F0ZWQuCgpAaXRlbSAt LXNob3ctbm90YXRpb24KQGl0ZW14IC0tbm8tc2hvdy1ub3RhdGlvbgpAb3BpbmRl eCBzaG93LW5vdGF0aW9uClNob3cgc2lnbmF0dXJlIG5vdGF0aW9ucyBpbiB0aGUg QG9wdGlvbnstLWxpc3Qtc2lnc30gb3IgQG9wdGlvbnstLWNoZWNrLXNpZ3N9IGxp c3RpbmdzCmFzIHdlbGwgYXMgd2hlbiB2ZXJpZnlpbmcgYSBzaWduYXR1cmUgd2l0 aCBhIG5vdGF0aW9uIGluIGl0LiBUaGVzZQpvcHRpb25zIGFyZSBkZXByZWNhdGVk LiBVc2UgQG9wdGlvbnstLWxpc3Qtb3B0aW9ucyBbbm8tXXNob3ctbm90YXRpb259 CmFuZC9vciBAb3B0aW9uey0tdmVyaWZ5LW9wdGlvbnMgW25vLV1zaG93LW5vdGF0 aW9ufSBpbnN0ZWFkLgoKQGl0ZW0gLS1zaG93LXBvbGljeS11cmwKQGl0ZW14IC0t bm8tc2hvdy1wb2xpY3ktdXJsCkBvcGluZGV4IHNob3ctcG9saWN5LXVybApTaG93 IHBvbGljeSBVUkxzIGluIHRoZSBAb3B0aW9uey0tbGlzdC1zaWdzfSBvciBAb3B0 aW9uey0tY2hlY2stc2lnc30KbGlzdGluZ3MgYXMgd2VsbCBhcyB3aGVuIHZlcmlm eWluZyBhIHNpZ25hdHVyZSB3aXRoIGEgcG9saWN5IFVSTCBpbgppdC4gVGhlc2Ug b3B0aW9ucyBhcmUgZGVwcmVjYXRlZC4gVXNlIEBvcHRpb257LS1saXN0LW9wdGlv bnMKW25vLV1zaG93LXBvbGljeS11cmx9IGFuZC9vciBAb3B0aW9uey0tdmVyaWZ5 LW9wdGlvbnMKW25vLV1zaG93LXBvbGljeS11cmx9IGluc3RlYWQuCgoKQGVuZCB0 YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioKQGMgKioqKioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioq KioqKgpAYyAqKioqKioqKioqKioqKiogICBGSUxFUyAgICAqKioqKioqKioqKioq KioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioq KioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KgpAbWFuc2VjdCBmaWxlcwpAbm9kZSBHUEcgQ29uZmlndXJhdGlvbgpAc2VjdGlv biBDb25maWd1cmF0aW9uIGZpbGVzCgpUaGVyZSBhcmUgYSBmZXcgY29uZmlndXJh dGlvbiBmaWxlcyB0byBjb250cm9sIGNlcnRhaW4gYXNwZWN0cyBvZgpAY29tbWFu ZHtAZ3BnbmFtZX0ncyBvcGVyYXRpb24uIFVubGVzcyBub3RlZCwgdGhleSBhcmUg ZXhwZWN0ZWQgaW4gdGhlCmN1cnJlbnQgaG9tZSBkaXJlY3RvcnkgKEBweHJlZntv cHRpb24gLS1ob21lZGlyfSkuCgpAdGFibGUgQGZpbGUKCiAgQGl0ZW0gZ3BnLmNv bmYKICBAY2luZGV4IGdwZy5jb25mCiAgVGhpcyBpcyB0aGUgc3RhbmRhcmQgY29u ZmlndXJhdGlvbiBmaWxlIHJlYWQgYnkgQGNvbW1hbmR7QGdwZ25hbWV9IG9uCiAg c3RhcnR1cC4gIEl0IG1heSBjb250YWluIGFueSB2YWxpZCBsb25nIG9wdGlvbjsg dGhlIGxlYWRpbmcgdHdvIGRhc2hlcwogIG1heSBub3QgYmUgZW50ZXJlZCBhbmQg dGhlIG9wdGlvbiBtYXkgbm90IGJlIGFiYnJldmlhdGVkLiAgVGhpcyBkZWZhdWx0 CiAgbmFtZSBtYXkgYmUgY2hhbmdlZCBvbiB0aGUgY29tbWFuZCBsaW5lIChAcHhy ZWZ7Z3BnLW9wdGlvbiAtLW9wdGlvbnN9KS4KICBZb3Ugc2hvdWxkIGJhY2t1cCB0 aGlzIGZpbGUuCgpAZW5kIHRhYmxlCgpAYyBtYW46LlJFCk5vdGUgdGhhdCBvbiBs YXJnZXIgaW5zdGFsbGF0aW9ucywgaXQgaXMgdXNlZnVsIHRvIHB1dCBwcmVkZWZp bmVkIGZpbGVzCmludG8gdGhlIGRpcmVjdG9yeSBAZmlsZXtAdmFsdWV7U1lTQ09O RlNLRUxESVJ9fSBzbyB0aGF0Cm5ld2x5IGNyZWF0ZWQgdXNlcnMgc3RhcnQgdXAg d2l0aCBhIHdvcmtpbmcgY29uZmlndXJhdGlvbi4KRm9yIGV4aXN0aW5nIHVzZXJz IGEgc21hbGwKaGVscGVyIHNjcmlwdCBpcyBwcm92aWRlZCB0byBjcmVhdGUgdGhl c2UgZmlsZXMgKEBweHJlZnthZGRnbnVwZ2hvbWV9KS4KCkZvciBpbnRlcm5hbCBw dXJwb3NlcyBAY29tbWFuZHtAZ3BnbmFtZX0gY3JlYXRlcyBhbmQgbWFpbnRhaW5z IGEgZmV3IG90aGVyCmZpbGVzOyBUaGV5IGFsbCBsaXZlIGluIGluIHRoZSBjdXJy ZW50IGhvbWUgZGlyZWN0b3J5IChAcHhyZWZ7b3B0aW9uCi0taG9tZWRpcn0pLiAg T25seSB0aGUgQGNvbW1hbmR7QGdwZ25hbWV9IHByb2dyYW0gbWF5IG1vZGlmeSB0 aGVzZSBmaWxlcy4KCgpAdGFibGUgQGZpbGUKICBAaXRlbSB+Ly5nbnVwZy9wdWJy aW5nLmdwZwogIFRoZSBwdWJsaWMga2V5cmluZy4gIFlvdSBzaG91bGQgYmFja3Vw IHRoaXMgZmlsZS4KCiAgQGl0ZW0gfi8uZ251cGcvcHVicmluZy5ncGcubG9jawog IFRoZSBsb2NrIGZpbGUgZm9yIHRoZSBwdWJsaWMga2V5cmluZy4KCiAgQGl0ZW0g fi8uZ251cGcvcHVicmluZy5rYngKICBUaGUgcHVibGljIGtleXJpbmcgdXNpbmcg YSBkaWZmZXJlbnQgZm9ybWF0LiAgVGhpcyBmaWxlIGlzIHNoYXJyZWQKICB3aXRo IEBjb21tYW5ke2dwZ3NtfS4gIFlvdSBzaG91bGQgYmFja3VwIHRoaXMgZmlsZS4K CiAgQGl0ZW0gfi8uZ251cGcvcHVicmluZy5rYngubG9jawogIFRoZSBsb2NrIGZp bGUgZm9yIEBmaWxle3B1YnJpbmcua2J4fS4KCiAgQGl0ZW0gfi8uZ251cGcvc2Vj cmluZy5ncGcKICBBIHNlY3JldCBrZXlyaW5nIGFzIHVzZWQgYnkgR251UEcgdmVy c2lvbnMgYmVmb3JlIDIuMS4gIEl0IGlzIG5vdAogIHVzZWQgYnkgR251UEcgMi4x IGFuZCBsYXRlci4KCiAgQGl0ZW0gfi8uZ251cGcvLmdwZy12MjEtbWlncmF0ZWQK ICBGaWxlIGluZGljYXRpbmcgdGhhdCBhIG1pZ3JhdGlvbiB0byBHbnVQRyAyLjEg aGFzIGJlZW4gZG9uZS4KCiAgQGl0ZW0gfi8uZ251cGcvdHJ1c3RkYi5ncGcKICBU aGUgdHJ1c3QgZGF0YWJhc2UuICBUaGVyZSBpcyBubyBuZWVkIHRvIGJhY2t1cCB0 aGlzIGZpbGU7IGl0IGlzIGJldHRlcgogIHRvIGJhY2t1cCB0aGUgb3duZXJ0cnVz dCB2YWx1ZXMgKEBweHJlZntvcHRpb24gLS1leHBvcnQtb3duZXJ0cnVzdH0pLgoK ICBAaXRlbSB+Ly5nbnVwZy90cnVzdGRiLmdwZy5sb2NrCiAgVGhlIGxvY2sgZmls ZSBmb3IgdGhlIHRydXN0IGRhdGFiYXNlLgoKICBAaXRlbSB+Ly5nbnVwZy9yYW5k b21fc2VlZAogIEEgZmlsZSB1c2VkIHRvIHByZXNlcnZlIHRoZSBzdGF0ZSBvZiB0 aGUgaW50ZXJuYWwgcmFuZG9tIHBvb2wuCgogIEBpdGVtIH4vLmdudXBnL3NlY3Jp bmcuZ3BnLmxvY2sKICBUaGUgbG9jayBmaWxlIGZvciB0aGUgc2VjcmV0IGtleXJp bmcuCgogIEBpdGVtIH4vLmdudXBnL29wZW5wZ3AtcmV2b2NzLmQvCiAgVGhpcyBp cyB0aGUgZGlyZWN0b3J5IHdoZXJlIGdwZyBzdG9yZXMgcHJlLWdlbmVyYXRlZCBy ZXZvY2F0aW9uCiAgY2VydGlmaWNhdGVzLiAgVGhlIGZpbGUgbmFtZSBjb3JyZXNw b25kcyB0byB0aGUgT3BlblBHUCBmaW5nZXJwcmludCBvZgogIHRoZSByZXNwZWN0 aXZlIGtleS4gIEl0IGlzIHN1Z2dlc3RlZCB0byBiYWNrdXAgdGhvc2UgY2VydGlm aWNhdGVzIGFuZAogIGlmIHRoZSBwcmltYXJ5IHByaXZhdGUga2V5IGlzIG5vdCBz dG9yZWQgb24gdGhlIGRpc2sgdG8gbW92ZSB0aGVtIHRvCiAgYW4gZXh0ZXJuYWwg c3RvcmFnZSBkZXZpY2UuICBBbnlvbmUgd2hvIGNhbiBhY2Nlc3MgdGhlc2VzIGZp bGVzIGlzCiAgYWJsZSB0byByZXZva2UgdGhlIGNvcnJlc3BvbmRpbmcga2V5LiAg WW91IG1heSB3YW50IHRvIHByaW50IHRoZW0gb3V0LgogIFlvdSBzaG91bGQgYmFj a3VwIGFsbCBmaWxlcyBpbiB0aGlzIGRpcmVjdG9yeSBhbmQgdGFrZSBjYXJlIHRv IGtlZXAKICB0aGlzIGJhY2t1cCBjbG9zZWQgYXdheS4KCiAgQGl0ZW0gQHZhbHVl e0RBVEFESVJ9L29wdGlvbnMuc2tlbAogIFRoZSBza2VsZXRvbiBvcHRpb25zIGZp bGUuCgogIEBpdGVtIEB2YWx1ZXtMSUJESVJ9LwogIERlZmF1bHQgbG9jYXRpb24g Zm9yIGV4dGVuc2lvbnMuCgpAZW5kIHRhYmxlCgpAYyBtYW46LlJFCk9wZXJhdGlv biBpcyBmdXJ0aGVyIGNvbnRyb2xsZWQgYnkgYSBmZXcgZW52aXJvbm1lbnQgdmFy aWFibGVzOgoKQHRhYmxlIEBhc2lzCgogIEBpdGVtIEhPTUUKICBVc2VkIHRvIGxv Y2F0ZSB0aGUgZGVmYXVsdCBob21lIGRpcmVjdG9yeS4KCiAgQGl0ZW0gR05VUEdI T01FCiAgSWYgc2V0IGRpcmVjdG9yeSB1c2VkIGluc3RlYWQgb2YgIn4vLmdudXBn Ii4KCiAgQGl0ZW0gR1BHX0FHRU5UX0lORk8KICBUaGlzIHZhcmlhYmxlIHdhcyB1 c2VkIGJ5IEdudVBHIHZlcnNpb25zIGJlZm9yZSAyLjEKCiAgQGl0ZW0gUElORU5U UllfVVNFUl9EQVRBCiAgVGhpcyB2YWx1ZSBpcyBwYXNzZWQgdmlhIGdwZy1hZ2Vu dCB0byBwaW5lbnRyeS4gIEl0IGlzIHVzZWZ1bCB0byBjb252ZXkKICBleHRyYSBp bmZvcm1hdGlvbiB0byBhIGN1c3RvbSBwaW5lbnRyeS4KCiAgQGl0ZW0gQ09MVU1O UwogIEBpdGVteCBMSU5FUwogIFVzZWQgdG8gc2l6ZSBzb21lIGRpc3BsYXlzIHRv IHRoZSBmdWxsIHNpemUgb2YgdGhlIHNjcmVlbi4KCgogIEBpdGVtIExBTkdVQUdF CiAgQXBhcnQgZnJvbSBpdHMgdXNlIGJ5IEdOVSwgaXQgaXMgdXNlZCBpbiB0aGUg VzMyIHZlcnNpb24gdG8gb3ZlcnJpZGUgdGhlCiAgbGFuZ3VhZ2Ugc2VsZWN0aW9u IGRvbmUgdGhyb3VnaCB0aGUgUmVnaXN0cnkuICBJZiB1c2VkIGFuZCBzZXQgdG8g YQogIHZhbGlkIGFuZCBhdmFpbGFibGUgbGFuZ3VhZ2UgbmFtZSAoQHZhcntsYW5n aWR9KSwgdGhlIGZpbGUgd2l0aCB0aGUKICB0cmFuc2xhdGlvbiBpcyBsb2FkZWQg ZnJvbQoKICBAY29kZXtAdmFye2dwZ2Rpcn0vZ251cGcubmxzL0B2YXJ7bGFuZ2lk fS5tb30uICBIZXJlIEB2YXJ7Z3BnZGlyfSBpcyB0aGUKICBkaXJlY3Rvcnkgb3V0 IG9mIHdoaWNoIHRoZSBncGcgYmluYXJ5IGhhcyBiZWVuIGxvYWRlZC4gIElmIGl0 IGNhbid0IGJlCiAgbG9hZGVkIHRoZSBSZWdpc3RyeSBpcyB0cmllZCBhbmQgYXMg bGFzdCByZXNvcnQgdGhlIG5hdGl2ZSBXaW5kb3dzCiAgbG9jYWxlIHN5c3RlbSBp cyB1c2VkLgoKQGVuZCB0YWJsZQoKCkBjICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqICAgICAgICAg ICAgKioqKioqKioqKioqKioqKgpAYyAqKioqKioqKioqKioqKiogIEVYQU1QTEVT ICAqKioqKioqKioqKioqKioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAg ICoqKioqKioqKioqKioqKioKQGMgKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKgpAbWFuc2VjdCBleGFtcGxlcwpAbm9kZSBHUEcgRXhh bXBsZXMKQHNlY3Rpb24gRXhhbXBsZXMKCkB0YWJsZSBAYXNpcwoKQGl0ZW0gZ3Bn IC1zZSAtciBAY29kZXtCb2J9IEBjb2Rle2ZpbGV9CnNpZ24gYW5kIGVuY3J5cHQg Zm9yIHVzZXIgQm9iCgpAaXRlbSBncGcgLS1jbGVhcnNpZ24gQGNvZGV7ZmlsZX0K bWFrZSBhIGNsZWFyIHRleHQgc2lnbmF0dXJlCgpAaXRlbSBncGcgLXNiIEBjb2Rl e2ZpbGV9Cm1ha2UgYSBkZXRhY2hlZCBzaWduYXR1cmUKCkBpdGVtIGdwZyAtdSAw eDEyMzQ1Njc4IC1zYiBAY29kZXtmaWxlfQptYWtlIGEgZGV0YWNoZWQgc2lnbmF0 dXJlIHdpdGggdGhlIGtleSAweDEyMzQ1Njc4CgpAaXRlbSBncGcgLS1saXN0LWtl eXMgQGNvZGV7dXNlcl9JRH0Kc2hvdyBrZXlzCgpAaXRlbSBncGcgLS1maW5nZXJw cmludCBAY29kZXt1c2VyX0lEfQpzaG93IGZpbmdlcnByaW50CgpAaXRlbSBncGcg LS12ZXJpZnkgQGNvZGV7cGdwZmlsZX0KQGl0ZW14IGdwZyAtLXZlcmlmeSBAY29k ZXtzaWdmaWxlfQpWZXJpZnkgdGhlIHNpZ25hdHVyZSBvZiB0aGUgZmlsZSBidXQg ZG8gbm90IG91dHB1dCB0aGUgZGF0YS4gVGhlCnNlY29uZCBmb3JtIGlzIHVzZWQg Zm9yIGRldGFjaGVkIHNpZ25hdHVyZXMsIHdoZXJlIEBjb2Rle3NpZ2ZpbGV9Cmlz IHRoZSBkZXRhY2hlZCBzaWduYXR1cmUgKGVpdGhlciBBU0NJSSBhcm1vcmVkIG9y IGJpbmFyeSkgYW5kCmFyZSB0aGUgc2lnbmVkIGRhdGE7IGlmIHRoaXMgaXMgbm90 IGdpdmVuLCB0aGUgbmFtZSBvZgp0aGUgZmlsZSBob2xkaW5nIHRoZSBzaWduZWQg ZGF0YSBpcyBjb25zdHJ1Y3RlZCBieSBjdXR0aW5nIG9mZiB0aGUKZXh0ZW5zaW9u ICgiLmFzYyIgb3IgIi5zaWciKSBvZiBAY29kZXtzaWdmaWxlfSBvciBieSBhc2tp bmcgdGhlCnVzZXIgZm9yIHRoZSBmaWxlbmFtZS4KQGVuZCB0YWJsZQoKCkBjICoq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKQGMgKioq KioqKioqKioqKioqICAgICAgICAgICAgKioqKioqKioqKioqKioqKgpAYyAqKioq KioqKioqKioqKiogIFVTRVIgSUQgICAqKioqKioqKioqKioqKioqCkBjICoqKioq KioqKioqKioqKiAgICAgICAgICAgICoqKioqKioqKioqKioqKioKQGMgKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgpAbWFuc2VjdCBo b3cgdG8gc3BlY2lmeSBhIHVzZXIgaWQKQGlmc2V0IGlzbWFuCkBpbmNsdWRlIHNw ZWNpZnktdXNlci1pZC50ZXhpCkBlbmQgaWZzZXQKCkBtYW5zZWN0IHJldHVybiB2 YWx1ZQpAY2hhcGhlYWRpbmcgUkVUVVJOIFZBTFVFCgpUaGUgcHJvZ3JhbSByZXR1 cm5zIDAgaWYgZXZlcnl0aGluZyB3YXMgZmluZSwgMSBpZiBhdCBsZWFzdAphIHNp Z25hdHVyZSB3YXMgYmFkLCBhbmQgb3RoZXIgZXJyb3IgY29kZXMgZm9yIGZhdGFs IGVycm9ycy4KCkBtYW5zZWN0IHdhcm5pbmdzCkBjaGFwaGVhZGluZyBXQVJOSU5H UwoKVXNlIGEgKmdvb2QqIHBhc3N3b3JkIGZvciB5b3VyIHVzZXIgYWNjb3VudCBh bmQgYSAqZ29vZCogcGFzc3BocmFzZQp0byBwcm90ZWN0IHlvdXIgc2VjcmV0IGtl eS4gVGhpcyBwYXNzcGhyYXNlIGlzIHRoZSB3ZWFrZXN0IHBhcnQgb2YgdGhlCndo b2xlIHN5c3RlbS4gUHJvZ3JhbXMgdG8gZG8gZGljdGlvbmFyeSBhdHRhY2tzIG9u IHlvdXIgc2VjcmV0IGtleXJpbmcKYXJlIHZlcnkgZWFzeSB0byB3cml0ZSBhbmQg c28geW91IHNob3VsZCBwcm90ZWN0IHlvdXIgIn4vLmdudXBnLyIKZGlyZWN0b3J5 IHZlcnkgd2VsbC4KCktlZXAgaW4gbWluZCB0aGF0LCBpZiB0aGlzIHByb2dyYW0g aXMgdXNlZCBvdmVyIGEgbmV0d29yayAodGVsbmV0KSwgaXQKaXMgKnZlcnkqIGVh c3kgdG8gc3B5IG91dCB5b3VyIHBhc3NwaHJhc2UhCgpJZiB5b3UgYXJlIGdvaW5n IHRvIHZlcmlmeSBkZXRhY2hlZCBzaWduYXR1cmVzLCBtYWtlIHN1cmUgdGhhdCB0 aGUKcHJvZ3JhbSBrbm93cyBhYm91dCBpdDsgZWl0aGVyIGdpdmUgYm90aCBmaWxl bmFtZXMgb24gdGhlIGNvbW1hbmQgbGluZQpvciB1c2UgQHNhbXB7LX0gdG8gc3Bl Y2lmeSBTVERJTi4KCkBtYW5zZWN0IGludGVyb3BlcmFiaWxpdHkKQGNoYXBoZWFk aW5nIElOVEVST1BFUkFCSUxJVFkgV0lUSCBPVEhFUiBPUEVOUEdQIFBST0dSQU1T CgpHbnVQRyB0cmllcyB0byBiZSBhIHZlcnkgZmxleGlibGUgaW1wbGVtZW50YXRp b24gb2YgdGhlIE9wZW5QR1AKc3RhbmRhcmQuIEluIHBhcnRpY3VsYXIsIEdudVBH IGltcGxlbWVudHMgbWFueSBvZiB0aGUgb3B0aW9uYWwgcGFydHMKb2YgdGhlIHN0 YW5kYXJkLCBzdWNoIGFzIHRoZSBTSEEtNTEyIGhhc2gsIGFuZCB0aGUgWkxJQiBh bmQgQlpJUDIKY29tcHJlc3Npb24gYWxnb3JpdGhtcy4gSXQgaXMgaW1wb3J0YW50 IHRvIGJlIGF3YXJlIHRoYXQgbm90IGFsbApPcGVuUEdQIHByb2dyYW1zIGltcGxl bWVudCB0aGVzZSBvcHRpb25hbCBhbGdvcml0aG1zIGFuZCB0aGF0IGJ5CmZvcmNp bmcgdGhlaXIgdXNlIHZpYSB0aGUgQG9wdGlvbnstLWNpcGhlci1hbGdvfSwKQG9w dGlvbnstLWRpZ2VzdC1hbGdvfSwgQG9wdGlvbnstLWNlcnQtZGlnZXN0LWFsZ299 LCBvcgpAb3B0aW9uey0tY29tcHJlc3MtYWxnb30gb3B0aW9ucyBpbiBHbnVQRywg aXQgaXMgcG9zc2libGUgdG8gY3JlYXRlIGEKcGVyZmVjdGx5IHZhbGlkIE9wZW5Q R1AgbWVzc2FnZSwgYnV0IG9uZSB0aGF0IGNhbm5vdCBiZSByZWFkIGJ5IHRoZQpp bnRlbmRlZCByZWNpcGllbnQuCgpUaGVyZSBhcmUgZG96ZW5zIG9mIHZhcmlhdGlv bnMgb2YgT3BlblBHUCBwcm9ncmFtcyBhdmFpbGFibGUsIGFuZCBlYWNoCnN1cHBv cnRzIGEgc2xpZ2h0bHkgZGlmZmVyZW50IHN1YnNldCBvZiB0aGVzZSBvcHRpb25h bCBhbGdvcml0aG1zLgpGb3IgZXhhbXBsZSwgdW50aWwgcmVjZW50bHksIG5vICh1 bmhhY2tlZCkgdmVyc2lvbiBvZiBQR1Agc3VwcG9ydGVkCnRoZSBCTE9XRklTSCBj aXBoZXIgYWxnb3JpdGhtLiBBIG1lc3NhZ2UgdXNpbmcgQkxPV0ZJU0ggc2ltcGx5 IGNvdWxkCm5vdCBiZSByZWFkIGJ5IGEgUEdQIHVzZXIuIEJ5IGRlZmF1bHQsIEdu dVBHIHVzZXMgdGhlIHN0YW5kYXJkCk9wZW5QR1AgcHJlZmVyZW5jZXMgc3lzdGVt IHRoYXQgd2lsbCBhbHdheXMgZG8gdGhlIHJpZ2h0IHRoaW5nIGFuZApjcmVhdGUg bWVzc2FnZXMgdGhhdCBhcmUgdXNhYmxlIGJ5IGFsbCByZWNpcGllbnRzLCByZWdh cmRsZXNzIG9mIHdoaWNoCk9wZW5QR1AgcHJvZ3JhbSB0aGV5IHVzZS4gT25seSBv dmVycmlkZSB0aGlzIHNhZmUgZGVmYXVsdCBpZiB5b3UKcmVhbGx5IGtub3cgd2hh dCB5b3UgYXJlIGRvaW5nLgoKSWYgeW91IGFic29sdXRlbHkgbXVzdCBvdmVycmlk ZSB0aGUgc2FmZSBkZWZhdWx0LCBvciBpZiB0aGUgcHJlZmVyZW5jZXMKb24gYSBn aXZlbiBrZXkgYXJlIGludmFsaWQgZm9yIHNvbWUgcmVhc29uLCB5b3UgYXJlIGZh ciBiZXR0ZXIgb2ZmIHVzaW5nCnRoZSBAb3B0aW9uey0tcGdwNn0sIEBvcHRpb257 LS1wZ3A3fSwgb3IgQG9wdGlvbnstLXBncDh9IG9wdGlvbnMuIFRoZXNlCm9wdGlv bnMgYXJlIHNhZmUgYXMgdGhleSBkbyBub3QgZm9yY2UgYW55IHBhcnRpY3VsYXIg YWxnb3JpdGhtcyBpbgp2aW9sYXRpb24gb2YgT3BlblBHUCwgYnV0IHJhdGhlciBy ZWR1Y2UgdGhlIGF2YWlsYWJsZSBhbGdvcml0aG1zIHRvIGEKIlBHUC1zYWZlIiBs aXN0LgoKQG1hbnNlY3QgYnVncwpAY2hhcGhlYWRpbmcgQlVHUwoKT24gb2xkZXIg c3lzdGVtcyB0aGlzIHByb2dyYW0gc2hvdWxkIGJlIGluc3RhbGxlZCBhcyBzZXR1 aWQocm9vdCkuIFRoaXMKaXMgbmVjZXNzYXJ5IHRvIGxvY2sgbWVtb3J5IHBhZ2Vz LiBMb2NraW5nIG1lbW9yeSBwYWdlcyBwcmV2ZW50cyB0aGUKb3BlcmF0aW5nIHN5 c3RlbSBmcm9tIHdyaXRpbmcgbWVtb3J5IHBhZ2VzICh3aGljaCBtYXkgY29udGFp bgpwYXNzcGhyYXNlcyBvciBvdGhlciBzZW5zaXRpdmUgbWF0ZXJpYWwpIHRvIGRp c2suIElmIHlvdSBnZXQgbm8Kd2FybmluZyBtZXNzYWdlIGFib3V0IGluc2VjdXJl IG1lbW9yeSB5b3VyIG9wZXJhdGluZyBzeXN0ZW0gc3VwcG9ydHMKbG9ja2luZyB3 aXRob3V0IGJlaW5nIHJvb3QuIFRoZSBwcm9ncmFtIGRyb3BzIHJvb3QgcHJpdmls ZWdlcyBhcyBzb29uCmFzIGxvY2tlZCBtZW1vcnkgaXMgYWxsb2NhdGVkLgoKTm90 ZSBhbHNvIHRoYXQgc29tZSBzeXN0ZW1zIChlc3BlY2lhbGx5IGxhcHRvcHMpIGhh dmUgdGhlIGFiaWxpdHkgdG8KYGBzdXNwZW5kIHRvIGRpc2snJyAoYWxzbyBrbm93 biBhcyBgYHNhZmUgc2xlZXAnJyBvciBgYGhpYmVybmF0ZScnKS4KVGhpcyB3cml0 ZXMgYWxsIG1lbW9yeSB0byBkaXNrIGJlZm9yZSBnb2luZyBpbnRvIGEgbG93IHBv d2VyIG9yIGV2ZW4KcG93ZXJlZCBvZmYgbW9kZS4gIFVubGVzcyBtZWFzdXJlcyBh cmUgdGFrZW4gaW4gdGhlIG9wZXJhdGluZyBzeXN0ZW0KdG8gcHJvdGVjdCB0aGUg c2F2ZWQgbWVtb3J5LCBwYXNzcGhyYXNlcyBvciBvdGhlciBzZW5zaXRpdmUgbWF0 ZXJpYWwKbWF5IGJlIHJlY292ZXJhYmxlIGZyb20gaXQgbGF0ZXIuCgpCZWZvcmUg eW91IHJlcG9ydCBhIGJ1ZyB5b3Ugc2hvdWxkIGZpcnN0IHNlYXJjaCB0aGUgbWFp bGluZyBsaXN0CmFyY2hpdmVzIGZvciBzaW1pbGFyIHByb2JsZW1zIGFuZCBzZWNv bmQgY2hlY2sgd2hldGhlciBzdWNoIGEgYnVnIGhhcwphbHJlYWR5IGJlZW4gcmVw b3J0ZWQgdG8gb3VyIGJ1ZyB0cmFja2VyIGF0IGh0dHA6Ly9idWdzLmdudXBnLm9y ZyAuCgpAYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqCkBjICoqKioqKioqKioqKioqKiAgICAgICAgICAgICAgKioqKioqKioqKioq KioKQGMgKioqKioqKioqKioqKioqICBVTkFUVEVOREVEICAqKioqKioqKioqKioq KgpAYyAqKioqKioqKioqKioqKiogICAgICAgICAgICAgICoqKioqKioqKioqKioq CkBjICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioK QG1hbnBhdXNlCkBub2RlIFVuYXR0ZW5kZWQgVXNhZ2Ugb2YgR1BHCkBzZWN0aW9u IFVuYXR0ZW5kZWQgVXNhZ2UKCkBjb21tYW5ke2dwZ30gaXMgb2Z0ZW4gdXNlZCBh cyBhIGJhY2tlbmQgZW5naW5lIGJ5IG90aGVyIHNvZnR3YXJlLiAgVG8gaGVscAp3 aXRoIHRoaXMgYSBtYWNoaW5lIGludGVyZmFjZSBoYXMgYmVlbiBkZWZpbmVkIHRv IGhhdmUgYW4gdW5hbWJpZ3VvdXMKd2F5IHRvIGRvIHRoaXMuICBUaGUgb3B0aW9u cyBAb3B0aW9uey0tc3RhdHVzLWZkfSBhbmQgQG9wdGlvbnstLWJhdGNofQphcmUg YWxtb3N0IGFsd2F5cyByZXF1aXJlZCBmb3IgdGhpcy4KCkBtZW51CiogVW5hdHRl bmRlZCBHUEcga2V5IGdlbmVyYXRpb246OiAgVW5hdHRlbmRlZCBrZXkgZ2VuZXJh dGlvbgpAZW5kIG1lbnUKCgpAbm9kZSBVbmF0dGVuZGVkIEdQRyBrZXkgZ2VuZXJh dGlvbgpAc3Vic2VjdGlvbiBVbmF0dGVuZGVkIGtleSBnZW5lcmF0aW9uCgpUaGUg Y29tbWFuZCBAb3B0aW9uey0tZ2VuLWtleX0gbWF5IGJlIHVzZWQgYWxvbmcgd2l0 aCB0aGUgb3B0aW9uCkBvcHRpb257LS1iYXRjaH0gZm9yIHVuYXR0ZW5kZWQga2V5 IGdlbmVyYXRpb24uICBUaGUgcGFyYW1ldGVycyBhcmUKZWl0aGVyIHJlYWQgZnJv bSBzdGRpbiBvciBnaXZlbiBhcyBhIGZpbGUgb24gdGhlIGNvbW1hbmQgbGluZS4K VGhlIGZvcm1hdCBvZiB0aGUgcGFyYW1ldGVyIGZpbGUgaXMgYXMgZm9sbG93czoK CkBpdGVtaXplIEBidWxsZXQKICBAaXRlbSBUZXh0IG9ubHksIGxpbmUgbGVuZ3Ro IGlzIGxpbWl0ZWQgdG8gYWJvdXQgMTAwMCBjaGFyYWN0ZXJzLgogIEBpdGVtIFVU Ri04IGVuY29kaW5nIG11c3QgYmUgdXNlZCB0byBzcGVjaWZ5IG5vbi1BU0NJSSBj aGFyYWN0ZXJzLgogIEBpdGVtIEVtcHR5IGxpbmVzIGFyZSBpZ25vcmVkLgogIEBp dGVtIExlYWRpbmcgYW5kIHRyYWlsaW5nIHdoaWxlIHNwYWNlIGlzIGlnbm9yZWQu CiAgQGl0ZW0gQSBoYXNoIHNpZ24gYXMgdGhlIGZpcnN0IG5vbiB3aGl0ZSBzcGFj ZSBjaGFyYWN0ZXIgaW5kaWNhdGVzCiAgYSBjb21tZW50IGxpbmUuCiAgQGl0ZW0g Q29udHJvbCBzdGF0ZW1lbnRzIGFyZSBpbmRpY2F0ZWQgYnkgYSBsZWFkaW5nIHBl cmNlbnQgc2lnbiwgdGhlCiAgYXJndW1lbnRzIGFyZSBzZXBhcmF0ZWQgYnkgd2hp dGUgc3BhY2UgZnJvbSB0aGUga2V5d29yZC4KICBAaXRlbSBQYXJhbWV0ZXJzIGFy ZSBzcGVjaWZpZWQgYnkgYSBrZXl3b3JkLCBmb2xsb3dlZCBieSBhIGNvbG9uLiAg QXJndW1lbnRzCiAgYXJlIHNlcGFyYXRlZCBieSB3aGl0ZSBzcGFjZS4KICBAaXRl bQogIFRoZSBmaXJzdCBwYXJhbWV0ZXIgbXVzdCBiZSBAc2FtcHtLZXktVHlwZX07 IGNvbnRyb2wgc3RhdGVtZW50cyBtYXkgYmUKICBwbGFjZWQgYW55d2hlcmUuCiAg QGl0ZW0KICBUaGUgb3JkZXIgb2YgdGhlIHBhcmFtZXRlcnMgZG9lcyBub3QgbWF0 dGVyIGV4Y2VwdCBmb3IgQHNhbXB7S2V5LVR5cGV9CiAgd2hpY2ggbXVzdCBiZSB0 aGUgZmlyc3QgcGFyYW1ldGVyLiAgVGhlIHBhcmFtZXRlcnMgYXJlIG9ubHkgdXNl ZCBmb3IKICB0aGUgZ2VuZXJhdGVkIGtleWJsb2NrIChwcmltYXJ5IGFuZCBzdWJr ZXlzKTsgcGFyYW1ldGVycyBmcm9tIHByZXZpb3VzCiAgc2V0cyBhcmUgbm90IHVz ZWQuICBTb21lIHN5bnRhY3RpY2FsbHkgY2hlY2tzIG1heSBiZSBwZXJmb3JtZWQu CiAgQGl0ZW0KICBLZXkgZ2VuZXJhdGlvbiB0YWtlcyBwbGFjZSB3aGVuIGVpdGhl ciB0aGUgZW5kIG9mIHRoZSBwYXJhbWV0ZXIgZmlsZQogIGlzIHJlYWNoZWQsIHRo ZSBuZXh0IEBzYW1we0tleS1UeXBlfSBwYXJhbWV0ZXIgaXMgZW5jb3VudGVyZWQg b3IgYXQgdGhlCiAgY29udHJvbCBzdGF0ZW1lbnQgQHNhbXB7JWNvbW1pdH0gaXMg ZW5jb3VudGVyZWQuCkBlbmQgaXRlbWl6ZQoKQG5vaW5kZW50CkNvbnRyb2wgc3Rh dGVtZW50czoKCkB0YWJsZSBAYXNpcwoKQGl0ZW0gJWVjaG8gQHZhcnt0ZXh0fQpQ cmludCBAdmFye3RleHR9IGFzIGRpYWdub3N0aWMuCgpAaXRlbSAlZHJ5LXJ1bgpT dXBwcmVzcyBhY3R1YWwga2V5IGdlbmVyYXRpb24gKHVzZWZ1bCBmb3Igc3ludGF4 IGNoZWNraW5nKS4KCkBpdGVtICVjb21taXQKUGVyZm9ybSB0aGUga2V5IGdlbmVy YXRpb24uICBOb3RlIHRoYXQgYW4gaW1wbGljaXQgY29tbWl0IGlzIGRvbmUgYXQK dGhlIG5leHQgQGFzaXN7S2V5LVR5cGV9IHBhcmFtZXRlci4KCkBpdGVtICVwdWJy aW5nIEB2YXJ7ZmlsZW5hbWV9CkBpdGVteCAlc2VjcmluZyBAdmFye2ZpbGVuYW1l fQpEbyBub3Qgd3JpdGUgdGhlIGtleSB0byB0aGUgZGVmYXVsdCBvciBjb21tYW5k bGluZSBnaXZlbiBrZXlyaW5nIGJ1dAp0byBAdmFye2ZpbGVuYW1lfS4gIFRoaXMg bXVzdCBiZSBnaXZlbiBiZWZvcmUgdGhlIGZpcnN0IGNvbW1pdCB0byB0YWtlCnBs YWNlLCBkdXBsaWNhdGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgc2FtZSBmaWxlbmFt ZSBpcyBpZ25vcmVkLCB0aGUKbGFzdCBmaWxlbmFtZSBiZWZvcmUgYSBjb21taXQg aXMgdXNlZC4gIFRoZSBmaWxlbmFtZSBpcyB1c2VkIHVudGlsIGEKbmV3IGZpbGVu YW1lIGlzIHVzZWQgKGF0IGNvbW1pdCBwb2ludHMpIGFuZCBhbGwga2V5cyBhcmUg d3JpdHRlbiB0bwp0aGF0IGZpbGUuIElmIGEgbmV3IGZpbGVuYW1lIGlzIGdpdmVu LCB0aGlzIGZpbGUgaXMgY3JlYXRlZCAoYW5kCm92ZXJ3cml0ZXMgYW4gZXhpc3Rp bmcgb25lKS4gIEZvciBHbnVQRyB2ZXJzaW9ucyBwcmlvciB0byAyLjEsIGJvdGgK Y29udHJvbCBzdGF0ZW1lbnRzIG11c3QgYmUgZ2l2ZW4uIEZvciBHbnVQRyAyLjEg YW5kIGxhdGVyCkBzYW1weyVzZWNyaW5nfSBpcyBhIG5vLW9wLgoKQGl0ZW0gJWFz ay1wYXNzcGhyYXNlCkBpdGVteCAlbm8tYXNrLXBhc3NwaHJhc2UKVGhpcyBvcHRp b24gaXMgYSBuby1vcCBmb3IgR251UEcgMi4xIGFuZCBsYXRlci4KCkBpdGVtICVu by1wcm90ZWN0aW9uClVzaW5nIHRoaXMgb3B0aW9uIGFsbG93cyB0aGUgY3JlYXRp b24gb2Yga2V5cyB3aXRob3V0IGFueSBwYXNzcGhyYXNlCnByb3RlY3Rpb24uICBU aGlzIG9wdGlvbiBpcyBtYWlubHkgaW50ZW5kZWQgZm9yIHJlZ3Jlc3Npb24gdGVz dHMuCgpAaXRlbSAldHJhbnNpZW50LWtleQpJZiBnaXZlbiB0aGUga2V5cyBhcmUg Y3JlYXRlZCB1c2luZyBhIGZhc3RlciBhbmQgYSBzb21ld2hhdCBsZXNzCnNlY3Vy ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvci4gIFRoaXMgb3B0aW9uIG1heSBiZSB1 c2VkIGZvciBrZXlzCndoaWNoIGFyZSBvbmx5IHVzZWQgZm9yIGEgc2hvcnQgdGlt ZSBhbmQgZG8gbm90IHJlcXVpcmUgZnVsbApjcnlwdG9ncmFwaGljIHN0cmVuZ3Ro LiAgSXQgdGFrZXMgb25seSBlZmZlY3QgaWYgdXNlZCB0b2dldGhlciB3aXRoCnRo ZSBjb250cm9sIHN0YXRlbWVudCBAc2FtcHslbm8tcHJvdGVjdGlvbn0uCgpAZW5k IHRhYmxlCgpAbm9pbmRlbnQKR2VuZXJhbCBQYXJhbWV0ZXJzOgoKQHRhYmxlIEBh c2lzCgpAaXRlbSBLZXktVHlwZTogQHZhcnthbGdvfQpTdGFydHMgYSBuZXcgcGFy YW1ldGVyIGJsb2NrIGJ5IGdpdmluZyB0aGUgdHlwZSBvZiB0aGUgcHJpbWFyeQpr ZXkuIFRoZSBhbGdvcml0aG0gbXVzdCBiZSBjYXBhYmxlIG9mIHNpZ25pbmcuICBU aGlzIGlzIGEgcmVxdWlyZWQKcGFyYW1ldGVyLiAgQHZhcnthbGdvfSBtYXkgZWl0 aGVyIGJlIGFuIE9wZW5QR1AgYWxnb3JpdGhtIG51bWJlciBvciBhCnN0cmluZyB3 aXRoIHRoZSBhbGdvcml0aG0gbmFtZS4gIFRoZSBzcGVjaWFsIHZhbHVlIEBzYW1w e2RlZmF1bHR9IG1heQpiZSB1c2VkIGZvciBAdmFye2FsZ299IHRvIGNyZWF0ZSB0 aGUgZGVmYXVsdCBrZXkgdHlwZTsgaW4gdGhpcyBjYXNlIGEKQHNhbXB7S2V5LVVz YWdlfSBzaGFsbCBub3QgYmUgZ2l2ZW4gYW5kIEBzYW1we2RlZmF1bHR9IGFsc28g YmUgdXNlZApmb3IgQHNhbXB7U3Via2V5LVR5cGV9LgoKQGl0ZW0gS2V5LUxlbmd0 aDogQHZhcntuYml0c30KVGhlIHJlcXVlc3RlZCBsZW5ndGggb2YgdGhlIGdlbmVy YXRlZCBrZXkgaW4gYml0cy4gIFRoZSBkZWZhdWx0IGlzCnJldHVybmVkIGJ5IHJ1 bm5pbmcgdGhlIGNvbW1hbmQgQHNhbXB7Z3BnMiAtLWdwZ2NvbmYtbGlzdH0uCgpA aXRlbSBLZXktR3JpcDogQHZhcntoZXhzdHJpbmd9ClRoaXMgaXMgb3B0aW9uYWwg YW5kIHVzZWQgdG8gZ2VuZXJhdGUgYSBDU1Igb3IgY2VydGlmaWNhdGUgZm9yIGFu CmFscmVhZHkgZXhpc3Rpbmcga2V5LiAgS2V5LUxlbmd0aCB3aWxsIGJlIGlnbm9y ZWQgd2hlbiBnaXZlbi4KCkBpdGVtIEtleS1Vc2FnZTogQHZhcnt1c2FnZS1saXN0 fQpTcGFjZSBvciBjb21tYSBkZWxpbWl0ZWQgbGlzdCBvZiBrZXkgdXNhZ2VzLiAg QWxsb3dlZCB2YWx1ZXMgYXJlCkBzYW1we2VuY3J5cHR9LCBAc2FtcHtzaWdufSwg YW5kIEBzYW1we2F1dGh9LiAgVGhpcyBpcyB1c2VkIHRvCmdlbmVyYXRlIHRoZSBr ZXkgZmxhZ3MuICBQbGVhc2UgbWFrZSBzdXJlIHRoYXQgdGhlIGFsZ29yaXRobSBp cwpjYXBhYmxlIG9mIHRoaXMgdXNhZ2UuICBOb3RlIHRoYXQgT3BlblBHUCByZXF1 aXJlcyB0aGF0IGFsbCBwcmltYXJ5CmtleXMgYXJlIGNhcGFibGUgb2YgY2VydGlm aWNhdGlvbiwgc28gbm8gbWF0dGVyIHdoYXQgdXNhZ2UgaXMgZ2l2ZW4KaGVyZSwg dGhlIEBzYW1we2NlcnR9IGZsYWcgd2lsbCBiZSBvbi4gIElmIG5vIEBzYW1we0tl eS1Vc2FnZX0gaXMKc3BlY2lmaWVkIGFuZCB0aGUgQHNhbXB7S2V5LVR5cGV9IGlz IG5vdCBAc2FtcHtkZWZhdWx0fSwgYWxsIGFsbG93ZWQKdXNhZ2VzIGZvciB0aGF0 IHBhcnRpY3VsYXIgYWxnb3JpdGhtIGFyZSB1c2VkOyBpZiBpdCBpcyBub3QgZ2l2 ZW4gYnV0CkBzYW1we2RlZmF1bHR9IGlzIHVzZWQgdGhlIHVzYWdlIHdpbGwgYmUg QHNhbXB7c2lnbn0uCgpAaXRlbSBTdWJrZXktVHlwZTogQHZhcnthbGdvfQpUaGlz IGdlbmVyYXRlcyBhIHNlY29uZGFyeSBrZXkgKHN1YmtleSkuICBDdXJyZW50bHkg b25seSBvbmUgc3Via2V5CmNhbiBiZSBoYW5kbGVkLiAgU2VlIGFsc28gQHNhbXB7 S2V5LVR5cGV9IGFib3ZlLgoKQGl0ZW0gU3Via2V5LUxlbmd0aDogQHZhcntuYml0 c30KTGVuZ3RoIG9mIHRoZSBzZWNvbmRhcnkga2V5IChzdWJrZXkpIGluIGJpdHMu ICBUaGUgZGVmYXVsdCBpcyByZXR1cm5lZApieSBydW5uaW5nIHRoZSBjb21tYW5k IEBzYW1we2dwZzIgLS1ncGdjb25mLWxpc3R9Ii4KCkBpdGVtIFN1YmtleS1Vc2Fn ZTogQHZhcnt1c2FnZS1saXN0fQpLZXkgdXNhZ2UgbGlzdHMgZm9yIGEgc3Via2V5 OyBzaW1pbGFyIHRvIEBzYW1we0tleS1Vc2FnZX0uCgpAaXRlbSBQYXNzcGhyYXNl OiBAdmFye3N0cmluZ30KSWYgeW91IHdhbnQgdG8gc3BlY2lmeSBhIHBhc3NwaHJh c2UgZm9yIHRoZSBzZWNyZXQga2V5LCBlbnRlciBpdCBoZXJlLgpEZWZhdWx0IGlz IHRvIHVzZSB0aGUgUGluZW50cnkgZGlhbG9nIHRvIGFzayBmb3IgYSBwYXNzcGhy YXNlLgoKQGl0ZW0gTmFtZS1SZWFsOiBAdmFye25hbWV9CkBpdGVteCBOYW1lLUNv bW1lbnQ6IEB2YXJ7Y29tbWVudH0KQGl0ZW14IE5hbWUtRW1haWw6IEB2YXJ7ZW1h aWx9ClRoZSB0aHJlZSBwYXJ0cyBvZiBhIHVzZXIgbmFtZS4gIFJlbWVtYmVyIHRv IHVzZSBVVEYtOCBlbmNvZGluZyBoZXJlLgpJZiB5b3UgZG9uJ3QgZ2l2ZSBhbnkg b2YgdGhlbSwgbm8gdXNlciBJRCBpcyBjcmVhdGVkLgoKQGl0ZW0gRXhwaXJlLURh dGU6IEB2YXJ7aXNvLWRhdGV9fChAdmFye251bWJlcn1bZHx3fG18eV0pClNldCB0 aGUgZXhwaXJhdGlvbiBkYXRlIGZvciB0aGUga2V5IChhbmQgdGhlIHN1YmtleSku ICBJdCBtYXkgZWl0aGVyCmJlIGVudGVyZWQgaW4gSVNPIGRhdGUgZm9ybWF0IChl LmcuICIyMDAwMDgxNVQxNDUwMTIiKSBvciBhcyBudW1iZXIgb2YKZGF5cywgd2Vl a3MsIG1vbnRoIG9yIHllYXJzIGFmdGVyIHRoZSBjcmVhdGlvbiBkYXRlLiAgVGhl IHNwZWNpYWwKbm90YXRpb24gInNlY29uZHM9TiIgaXMgYWxzbyBhbGxvd2VkIHRv IHNwZWNpZnkgYSBudW1iZXIgb2Ygc2Vjb25kcwpzaW5jZSBjcmVhdGlvbi4gIFdp dGhvdXQgYSBsZXR0ZXIgZGF5cyBhcmUgYXNzdW1lZC4gIE5vdGUgdGhhdCB0aGVy ZQppcyBubyBjaGVjayBkb25lIG9uIHRoZSBvdmVyZmxvdyBvZiB0aGUgdHlwZSB1 c2VkIGJ5IE9wZW5QR1AgZm9yCnRpbWVzdGFtcHMuICBUaHVzIHlvdSBiZXR0ZXIg bWFrZSBzdXJlIHRoYXQgdGhlIGdpdmVuIHZhbHVlIG1ha2UKc2Vuc2UuICBBbHRo b3VnaCBPcGVuUEdQIHdvcmtzIHdpdGggdGltZSBpbnRlcnZhbHMsIEdudVBHIHVz ZXMgYW4KYWJzb2x1dGUgdmFsdWUgaW50ZXJuYWxseSBhbmQgdGh1cyB0aGUgbGFz dCB5ZWFyIHdlIGNhbiByZXByZXNlbnQgaXMKMjEwNS4KCkBpdGVtICBDcmVhdGlv bi1EYXRlOiBAdmFye2lzby1kYXRlfQpTZXQgdGhlIGNyZWF0aW9uIGRhdGUgb2Yg dGhlIGtleSBhcyBzdG9yZWQgaW4gdGhlIGtleSBpbmZvcm1hdGlvbiBhbmQKd2hp Y2ggaXMgYWxzbyBwYXJ0IG9mIHRoZSBmaW5nZXJwcmludCBjYWxjdWxhdGlvbi4g IEVpdGhlciBhIGRhdGUgbGlrZQoiMTk4Ni0wNC0yNiIgb3IgYSBmdWxsIHRpbWVz dGFtcCBsaWtlICIxOTg2MDQyNlQwNDI2NDAiIG1heSBiZSB1c2VkLgpUaGUgdGlt ZSBpcyBjb25zaWRlcmVkIHRvIGJlIFVUQy4gIFRoZSBzcGVjaWFsIG5vdGF0aW9u ICJzZWNvbmRzPU4iCm1heSBiZSB1c2VkIHRvIGRpcmVjdGx5IHNwZWNpZnkgYSB0 aGUgbnVtYmVyIG9mIHNlY29uZHMgc2luY2UgRXBvY2gKKFVuaXggdGltZSkuICBJ ZiBpdCBpcyBub3QgZ2l2ZW4gdGhlIGN1cnJlbnQgdGltZSBpcyB1c2VkLgoKQGl0 ZW0gUHJlZmVyZW5jZXM6IEB2YXJ7c3RyaW5nfQpTZXQgdGhlIGNpcGhlciwgaGFz aCwgYW5kIGNvbXByZXNzaW9uIHByZWZlcmVuY2UgdmFsdWVzIGZvciB0aGlzIGtl eS4KVGhpcyBleHBlY3RzIHRoZSBzYW1lIHR5cGUgb2Ygc3RyaW5nIGFzIHRoZSBz dWItY29tbWFuZCBAc2FtcHtzZXRwcmVmfQppbiB0aGUgQG9wdGlvbnstLWVkaXQt a2V5fSBtZW51LgoKQGl0ZW0gIFJldm9rZXI6IEB2YXJ7YWxnb306QHZhcntmcHJ9 IFtzZW5zaXRpdmVdCkFkZCBhIGRlc2lnbmF0ZWQgcmV2b2tlciB0byB0aGUgZ2Vu ZXJhdGVkIGtleS4gIEFsZ28gaXMgdGhlIHB1YmxpYyBrZXkKYWxnb3JpdGhtIG9m IHRoZSBkZXNpZ25hdGVkIHJldm9rZXIgKGkuZS4gUlNBPTEsIERTQT0xNywgZXRj LikKQHZhcntmcHJ9IGlzIHRoZSBmaW5nZXJwcmludCBvZiB0aGUgZGVzaWduYXRl ZCByZXZva2VyLiAgVGhlIG9wdGlvbmFsCkBzYW1we3NlbnNpdGl2ZX0gZmxhZyBt YXJrcyB0aGUgZGVzaWduYXRlZCByZXZva2VyIGFzIHNlbnNpdGl2ZQppbmZvcm1h dGlvbi4gIE9ubHkgdjQga2V5cyBtYXkgYmUgZGVzaWduYXRlZCByZXZva2Vycy4K CkBpdGVtIEtleXNlcnZlcjogQHZhcntzdHJpbmd9ClRoaXMgaXMgYW4gb3B0aW9u YWwgcGFyYW1ldGVyIHRoYXQgc3BlY2lmaWVzIHRoZSBwcmVmZXJyZWQga2V5c2Vy dmVyClVSTCBmb3IgdGhlIGtleS4KCkBpdGVtIEhhbmRsZTogQHZhcntzdHJpbmd9 ClRoaXMgaXMgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIG9ubHkgdXNlZCB3aXRoIHRo ZSBzdGF0dXMgbGluZXMKS0VZX0NSRUFURUQgYW5kIEtFWV9OT1RfQ1JFQVRFRC4g IEB2YXJ7c3RyaW5nfSBtYXkgYmUgdXAgdG8gMTAwCmNoYXJhY3RlcnMgYW5kIHNo b3VsZCBub3QgY29udGFpbiBzcGFjZXMuICBJdCBpcyB1c2VmdWwgZm9yIGJhdGNo IGtleQpnZW5lcmF0aW9uIHRvIGFzc29jaWF0ZSBhIGtleSBwYXJhbWV0ZXIgYmxv Y2sgd2l0aCBhIHN0YXR1cyBsaW5lLgoKQGVuZCB0YWJsZQoKQG5vaW5kZW50Ckhl cmUgaXMgYW4gZXhhbXBsZSBvbiBob3cgdG8gY3JlYXRlIGEga2V5OgpAc21hbGxl eGFtcGxlCiQgY2F0ID5mb28gPDxFT0YKICAgICAlZWNobyBHZW5lcmF0aW5nIGEg YmFzaWMgT3BlblBHUCBrZXkKICAgICBLZXktVHlwZTogRFNBCiAgICAgS2V5LUxl bmd0aDogMTAyNAogICAgIFN1YmtleS1UeXBlOiBFTEctRQogICAgIFN1YmtleS1M ZW5ndGg6IDEwMjQKICAgICBOYW1lLVJlYWw6IEpvZSBUZXN0ZXIKICAgICBOYW1l LUNvbW1lbnQ6IHdpdGggc3R1cGlkIHBhc3NwaHJhc2UKICAgICBOYW1lLUVtYWls OiBqb2VAQGZvby5iYXIKICAgICBFeHBpcmUtRGF0ZTogMAogICAgIFBhc3NwaHJh c2U6IGFiYwogICAgICVwdWJyaW5nIGZvby5wdWIKICAgICAlc2VjcmluZyBmb28u c2VjCiAgICAgIyBEbyBhIGNvbW1pdCBoZXJlLCBzbyB0aGF0IHdlIGNhbiBsYXRl ciBwcmludCAiZG9uZSIgOi0pCiAgICAgJWNvbW1pdAogICAgICVlY2hvIGRvbmUK RU9GCiQgZ3BnMiAtLWJhdGNoIC0tZ2VuLWtleSBmb28KIFsuLi5dCiQgZ3BnMiAt LW5vLWRlZmF1bHQta2V5cmluZyAtLXNlY3JldC1rZXlyaW5nIC4vZm9vLnNlYyBc CiAgICAgICAtLWtleXJpbmcgLi9mb28ucHViIC0tbGlzdC1zZWNyZXQta2V5cwov aG9tZS93ay93b3JrL2dudXBnLXN0YWJsZS9zY3JhdGNoL2Zvby5zZWMKLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCnNlYyAgMTAyNEQv OTE1QTg3OEQgMjAwMC0wMy0wOSBKb2UgVGVzdGVyICh3aXRoIHN0dXBpZCBwYXNz cGhyYXNlKSA8am9lQEBmb28uYmFyPgpzc2IgIDEwMjRnLzhGNzBFMkMwIDIwMDAt MDMtMDkKQGVuZCBzbWFsbGV4YW1wbGUKCgpAbm9pbmRlbnQKSWYgeW91IHdhbnQg dG8gY3JlYXRlIGEga2V5IHdpdGggdGhlIGRlZmF1bHQgYWxnb3JpdGhtcyB5b3Ug d291bGQgdXNlCnRoZXNlIHBhcmFtZXRlcnM6CkBzbWFsbGV4YW1wbGUKICAgICAl ZWNobyBHZW5lcmF0aW5nIGEgZGVmYXVsdCBrZXkKICAgICBLZXktVHlwZTogZGVm YXVsdAogICAgIFN1YmtleS1UeXBlOiBkZWZhdWx0CiAgICAgTmFtZS1SZWFsOiBK b2UgVGVzdGVyCiAgICAgTmFtZS1Db21tZW50OiB3aXRoIHN0dXBpZCBwYXNzcGhy YXNlCiAgICAgTmFtZS1FbWFpbDogam9lQEBmb28uYmFyCiAgICAgRXhwaXJlLURh dGU6IDAKICAgICBQYXNzcGhyYXNlOiBhYmMKICAgICAlcHVicmluZyBmb28ucHVi CiAgICAgJXNlY3JpbmcgZm9vLnNlYwogICAgICMgRG8gYSBjb21taXQgaGVyZSwg c28gdGhhdCB3ZSBjYW4gbGF0ZXIgcHJpbnQgImRvbmUiIDotKQogICAgICVjb21t aXQKICAgICAlZWNobyBkb25lCkBlbmQgc21hbGxleGFtcGxlCgoKCgpAbWFuc2Vj dCBzZWUgYWxzbwpAaWZzZXQgaXNtYW4KQGNvbW1hbmR7Z3Bndn0oMSksCkBjb21t YW5ke2dwZ3NtfSgxKSwKQGNvbW1hbmR7Z3BnLWFnZW50fSgxKQpAZW5kIGlmc2V0 CkBpbmNsdWRlIHNlZS1hbHNvLW5vdGUudGV4aQo= =jeqE -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/00FE67F28A52A8AA08FFAED20AF832DA916D1985.asc000064400000000000000000000015171046102023000224150ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAqCYxh+c0mGKVkNRLiSe19rSb OgLVJcL6dH1EnawO6klyypIbrDom7DNNTlp7TMlwQ+UsKbmT8jwkU08/awg6W9Wq 5LCABUStYrVcwJJlf3p4lBru0BSRlaKuIslpk5Powfj2lPXX6o1eRHsnxk9FTD+M GcWkhfL9HF+Rq8vPcicpKDE6ZTM6AQABKSgxOmQxMjg6NPUmd199hJrT8TOzgIRl vkfedZRLziNM3yBO2nvEjMxKH3uJxKHh/VUg/VLo72On/HIyiQeeDVYcuLJGTm7e degk/9C85hT5K4VUF9+LXXDX1Vz/jQdZxq+JwUE/AdlAEC9fkFQzc0ftI832mgjR OASwMVphqYUQERz00ve+NDUpKDE6cDY1OgDJoHlM5kAfmQ3HQsykH2QoWnxA6mTa aiCn4XIPEsrXCiwObiwWBj3I+w2OTWbodzxWldxBsaYyVCM3bKR6eldFKSgxOnE2 NToA1X6NuSiiTP6lQcAqnoPC37LE6PUeoohF05hVoRotOm+/sIcve7ZrgVBvELEr q6ZU8fUeCUQoMc2ztQEHyC+0eykoMTp1NjQ6HOTajn4vJZPXy/q5sNWhQ7pZDHeJ clqSismtIwvuCV3wMAQMIUr+OWTlGHOCYa8FnBn7PbE6TevGdDEE8CQcfCkpKQ== =AhP7 -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/0D6F6AD4C4C803B25470F9104E9F4E6A4CA64255.asc000064400000000000000000000010161046102023000223260ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWxnKDE6cDk3OgD/BWuU2w+pPFZltSIytQ3wyNMV HbFSG5PDdx29GCJU9RP+rWXX4jcKmilUHH9e4CSDmwcHzTNzqlmDrnZgVXd0uhNx 5LuuJ1vmTbewdraFkYJ5OjoB3Eg7LneCII8M/0UpKDE6ZzE6AikoMTp5OTY6Toef zlcVKiPuobKfXHDhIUQPTfGic2Az47wkMoYHo9j9ZE7AWaliMdPz4jLyLfqqoU9m H8g+vJhyAc7UnAF2Sk5466FDypdPm5F9PTW3cqqIwJM4WgkSlM8J2hxH4YtlKSgx OngyOTob6nEVc0W4M+ZyrqMvp26DaKRnuFwcsDLsN11JLykpKQ== =Ghie -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/0DD40284FF992CD24DC4AAC367037E066FCEE26A.asc000064400000000000000000000015541046102023000224150ustar 00000000000000This is the unprotected private key for pub ed25519/97965A9A 2014-08-19 Key fingerprint = C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A Keygrip = 0DD40284FF992CD24DC4AAC367037E066FCEE26A uid [ unknown] EdDSA sample key 1 (draft-koch-eddsa-for-openpgp-00) The human readable version of the armored s-expression below is: (private-key (ecc (curve Ed25519) (flags eddsa) (q #403F098994BDD916ED4053197934E4A87C80733A1280D62F8010992E43EE3B2406#) (d #1A8B1FF05DED48E18BF50166C664AB023EA70003D78D9E41F5758A91D850F8D2#) ) ) -----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmU3OkVkMjU1MTkpKDU6ZmxhZ3M1 OmVkZHNhKSgxOnEzMzpAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJkuQ+47JAYp KDE6ZDMyOhqLH/Bd7Ujhi/UBZsZkqwI+pwAD142eQfV1ipHYUPjSKSkp =SS8V -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/13FDB8809B17C5547779F9D205C45F47CE0217CE.asc000064400000000000000000000015331046102023000223370ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAqFJWduzk11/m0Ac/K/mab0kz zr3UUor1bkxh4vcxJHOTZF3a9Y6t1WUpwlOXeCNkY98tRYUg6A40wFgkKz/4jdOa iDtHW2bOqrvJmJ/wH/5zdmDpthu53JEgXUKP/+j2dfrvYTZYxy2m11DA68QK9iPS BmksglFMQE2IJatwEAEpKDE6ZTI6AQEpKDE6ZDEyODoAvKABRIX7dtUOm2y6VyGs ESE5D4YI1AhL0EWodt84EPEUvC1o61UuYbAe28JIHwjIKDLgDiedZ6hTBV3K5cI1 aFHL421hDE0qtD+mVZhcRGnR2RHhr9gX6qX+4P8mV0w1nhdShwUhlFO1GuwQ2/dW KwYdXGbDW7P58LIiudGWuSkoMTpwNjU6AMM8WAY5lr1ZdSqr39rNqntLZqoXVO4N ibd5Tw3o/3JMVJ/xEqMykrude87nlPCAJMPlX9gjP1B57UmRxN8mGNkpKDE6cTY1 OgDctZRfAPGvQ4vUwxG4uso9nbCtFlGYZTQgMPHfMFflUyxH9Y0zA8ujyKKYFPYX t7Pe6Y+qqu6BG0mPqvIXe3dpKSgxOnU2NDop+y32myNaSakGsQ732PgarqitgefN 3h9Kec4kS/j85t1esYEbC9XlFluVcIUDaQHdKFpijCl6eC2oFXOkPRwJKSkp =nyLM -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/1DF48228FEFF3EC2481B106E0ACA8C465C662CC5.asc000064400000000000000000000022751046102023000224150ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4xMjk6AOnl30hwc47r LL9QH6g0TX1BEPdWMV4Ou6+rQOErIMAr1AOlUzpjwJllvQqf2OHnQWaTr9kbNLn7 XUEUhjkH3uHDYMHMdyAb7YJrk3ECDqnmr34VV/F/H5BH7D6AiFktl1SpUTczPxBx vPNlJ4joPmTm+ahfg+zL+4pVu6tIhM0LKSgxOmUzOgEAASkoOTpwcm90ZWN0ZWQx NDpvcGVucGdwLW5hdGl2ZSgxOTpvcGVucGdwLXByaXZhdGUta2V5KDc6dmVyc2lv bjE6NCkoNDphbGdvMzpSU0EpKDQ6c2tleTE6XzEyOToA6eXfSHBzjussv1AfqDRN fUEQ91YxXg67r6tA4SsgwCvUA6VTOmPAmWW9Cp/Y4edBZpOv2Rs0uftdQRSGOQfe 4cNgwcx3IBvtgmuTcQIOqeavfhVX8X8fkEfsPoCIWS2XVKlRNzM/EHG882UniOg+ ZOb5qF+D7Mv7ilW7q0iEzQsxOl8zOgEAATE6XzEyODpfHMTxVhkHswZdPZ3B7pLc LktR6NDmaKNVyhP1/G2y95+dY+s2QT4eosp+uYWeR0XHCqNla7TDND41qrzyEAtH iAF3OoydMK4lb0lqfKORRI4tr017wgMxRBLs82Gk5ehtI7AwSca7WvaoAJwKZp42 th4MOeykeGRRMagJI420QTE6XzY1OgDzN2Pz0dRD20hHKF6eiqAZYaZhmA7pKWuW jHCVXO9s6zGfn0Ds+kTQJltOxU/AULATN/ffXqTtXSiprxNUvwnbMTpfNjU6APYx GOABYcWOpJn35eSoisB04QtOgT5OpAl/dLbeaJ+Yh9KtrY6wLf/mX03FgE+YbkIf TmeB6tDf4RYbXCYyKJExOl82NDo5wagaIbek0F5TRtmqdVk1weEk/0XXdyG/mNIA 4l/qt/LHcduBN46qHYEKnKhyDMCBDwlSRf455FG8Oi1x+JMYKSg0OmNzdW01OjQx MDUyKSgxMDpwcm90ZWN0aW9uNDpub25lKSkpKSk= =hX0p -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/1E28F20E41B54C2D1234D896096495FF57E08D18.asc000064400000000000000000000004771046102023000223000ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmU3OkVkMjU1MTkpKDU6ZmxhZ3M1 OmVkZHNhKSgxOnEzMzpAZ8zkuQDL9x7rcvvoo6s3iEF1j88Dknd9nZhLnTEoBRkp KDE6ZDMyOnicJkwzhZjYg5Fd8zqmEsZLPdGwe+z+8DU6lq6zj5HcKSkp =ZStX -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/2BC997C0B8691D41D29A4EC81CCBCF08454E4961.asc000064400000000000000000000032751046102023000223730ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6ALWn703ukwPA klb9+e/m8qGu/XewzQ5fnciZy+YA71aO1L0vg5idBqmWWhUZ1H2jMLpSmHGTsWvw v7OpIgsPcyIqmlJ/hXNFxYI/xS8Y9AzFlASs+DqmMOjBghE5crakHjS6JxtkBNK6 efB3teA5WlD7oVJwhYMsUtkH8/OJq0Lml3sZaca3vDvm0CnEDlqr0pog6RiDxAmO gUO04ZcjaGVz9sb+U+coIe/qG1kJZFGdSpuV1BS79nyjMnmMfNt2uB0w9v1hnGrv MU7q+OaaP/ii8+tI01WOGn+KQsJp89PwgcnA8y57Up3zN6pDl9WF80uJL/J3FIe8 RuaE4VBv76spKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6fMHJiYfEZhM4OjE5NzM3NjAwKTE2OuNRxs9I ktHtlDMTy6rWZJgpNzM2OlWwk5Xhn92HLSgS6iqiDLYg3NLreSQrnI4i2ujY97BD R62o3Li+mu2wO8zFy+zErpMAg1Xn8Cy5III9jQYznUfUCa4UbThAz4XnSTHkP2Ta /YunBqAnetFmj+HIeSpFcsUEY/MF9bKNuiEtA2Te0J1X6BYUMY163TxfkLZDTG51 tyuEqn8n2B6fBu/Vjysyq95ohrrkvIkwIs3p1UOa4qgn+wbr4br8Bu6mf0+ClXoj nPCim1aQMrzZHyWYXgqnFjRnHW36lHpdWGqav7vV3+qbjzlVMldOGx24PH1bAYnS BD5eeMletc524qYBSxSIyItuReieymNNYAoF6Wf7ayDzDzf2pGrY55wIt6vH2J4D 24M1ydvS99ibu80A8O/K7WuYHTcrzgPPmp6/aA3q8kxGFrHrAZ1r54yHPKbYnNWE v0BxNe0poaMZJKDQIoJT0mGEmlpS4lr/K58QyECIDN1nOVyKL7ixxsqjJI3G0ZY9 vpOpXHzFIToA8U+/82e/qNUA7wkQMOhG2lF9AxyT5eEOEhCW8J7QZM+FO6ocplgH ZxwHa0ymv8Tj4yOVFNSo/ENJym1HGiyvjgnQS2MSZ5kIyVNuGI8AWPsWQJ6B/04p LE8apX775kVhvIX+DNU4Bnxnb7KtG2HovT9NxQIzIYcANC/rOKdOq2j5vS4XqHsB O66pV0JLa8TPD5iKDIzS2ONBxyKi2HqRg+xkEIpNBhvrQgGs2FzoRvivbjBOgwjp hRkX1dkF4axKWEPRuUhvlA7f/TzbHFtjbWyd5fm57j3BgsVj/EcSrGtpl5JQd4k7 etSIWvtWWySZJPDXz7CW9Wh7W0ZXA76tmniLDeYl8lnMIYa6ylttTnuiW4hh3naH JFtWytL1ivCeo8iy5wGQ2X3Jp1C+Y4+lgR4pPE8w04y5Rzo8Jo3VSMWbeovn8djM qfXy6yH7H6qHYCO31IJxFfz89EuCE0EGrYUzDFr5KpUpKDEyOnByb3RlY3RlZC1h dDE1OjIwMTQxMTAzVDE3Mjk0MikpKQ== =jzZd -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/343D8AF79796EE107D645A2787A9D9252F924E6F.asc000064400000000000000000000014571046102023000223500ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZHNhKDE6cDEyOToArHGqWD0rP0Nn/c3nYELTD4m1 gqR7f2+l1ZUMdHcweYwn/fVjaJKmbR+9GzeHWP398FWYs5mCU1DIfrZLF0nJnAJ6 WRnN9TL+oub1BqqLvCmDSngRuZZ2gUX8DVmD8xTsPnDnG74QDUnvtnpDIAs32sg5 dnusstrriXD8xXgt0g8pKDE6cTIxOgC449htJbbp5rkJHvBDs4YxEIkk5ykoMTpn MTI4Ol+ITxpSMOT5R67Bu4XWoYU7nVeYURpb6LJ8LK2CV7ygECwFdRFdukiGFB+a TP8nF6xtuXalaBuerkKp4QXVKqOIkp7MWN2TAOOg9eERHPT//whryf49meNYMPLv KAe60udHY76Glm+Zso+24WnEwXX2od1PHVV3CItWRb7YmhgGKSgxOnkxMjg6AgXt 40h2lpiIHTjbu6fiCBzbr5j2eQX3cNoydkRphJ66bqD+DsPW/Ag0WBCQxgRaLgMr db64fQT+fyjbTBLbC8ytt5hpCbm/q5x3TTXDAUNjoB3CnA/tQItBy7qqq/A0d3FZ grr6AixK58uZ4wauy8LRZCph67UZ8akcgwJkmVkpKDE6eDIwOn/Y1rjZASGMK9IG b1y/ZDKT0zkTKSkp =muRa -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/3C9D5ECA70130C2DBB1FC6AC0076BEEEC197716F.asc000064400000000000000000000032451046102023000224410ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AK8HhE8MmR/i QdHw5kcWa8Lm7henF1KdhF3Z5iDNeurFrDQsg/RFHJbaMyVCzCP/Jc4ayub2FzeS fJdKXrpMPAdaGjlbGLdY08Fc49E+7M79YQXgyGXhTm3kZa8bw+TfYnLJC6snxefG 5YQqEpvV/mfvfQd6XXxDcn/u56YDJ5Lo7xRXmnd4Ifj6T1lF2KDQtDAB1vlpnuxE QfnAI8C8UpsxOWC1tSuQ5HIoFnwqAEfEiHH+P2YuHG6m4oyUfT7c11rHf8S01R9Q JQCr11Dn9WMAI/IHe67BsrbIAxG+9yeBhIkEShBBxdNqIt2FnE+sTmQHv+uiY4ya 3ch63dvZ53MpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6+Nvda1z6F404OjE5NzM3NjAwKTE2Og6NQq99 p1NyYxcYgwRiATApNzIwOgzqYGEJNhmx149fV84cgLNbmIifZ48o+oywHbwdju0c oNmaBHv+Xkm/U5PG/CPYINJbFIewrxuNpGbW69VMfOi5nwcvIE2LouuRd4Ih7cYq ub9fjqIH9tO4AA4kkSA932AfJseLTZMcSqvSmyIE4GU6psDjQHuXur4ywKYX0iPi 11hlhFtiARw4S3ToidPukg+SiEJV6Sec77BmQ2NG55FEB3GiM8m5LOMSPq+ZfxI9 RmldLuyC5TfGWRgraR+3SU00gYkbAOjwlblHloQzoHquCpumujGvSxYolDsW32HO Eojy0k5iezdwbnpBmdWJbnI+qAQQ2wjmEFPKVPnOF4y1Nki+sRXrgFXGbgHwHbRN yMgRgMVeYycHhhEz5N+VwQ5yKE3hvIbD0dznD6Z8QAb4PXem929eJDz3FrR8gasN 2udqDyHkczK3y5oJs4k82Fnmn3Rjfgddyo04SSf/1Gwg31y33Xh7dkdtU+NOt9s9 wCu+nJhdbh/IH8fXPax2HuWY7q0EPlZQldbeBta4r+RWvNFFDAG8DK5uBHQqtKoV vV71ffPm30s4ysaSF4mqF3eIYLltPYNenvsYKpT/cn/3WvbLsKqMIOGytz3P8fQb 49ZDGDyzT1rQDuJ2oDk7N+epZu+lna/nRo7UBEo+Tf7CkcTKQ97wY8tqqLUdclJr KJsIIutg8WgIx09Xvip1gfOAZV4s9V6aMejT32CBLSEmC86t/Tu+3HrstX2E3F8+ Sc0gB5B62/PMSzCI3lgkjMRp6yCzm0cZkHSDHOSLpoEvSehV0Gv33DFBPNog8XVE A4H404JRMBHI5mKpYcYKv/o8ZpQgDGORMZYf5W9/LMF06QZGz36kPVyIwL2j8oCr 0T0kp/ik8WZSV+BkwKON2fPkROQ7c7ZM+S/xcrpKEe40/dWtTZUABGhCL7IXwlqm u2nGS/Cfjmq3TRuRJAZFZykoMTI6cHJvdGVjdGVkLWF0MTU6MjAxNDExMDNUMTcy OTQxKSkp =04As -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/449E644892C951A37525654730DD32C202079926.asc000064400000000000000000000005341046102023000221520ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmUxMDpOSVNUIFAtMjU2KSgxOnE2 NToEOx/Lj6ZzYdOMdprseVCR/dwZaYPeInquOlapE22Udwppy4tQqj2jXDYH8d0Z 5uRvT/FD5lpcW+Cv+BAoo2auuykoMTpkMzI6Xka+GGkZ6tp+azZo+LPj0inV0GnO vact0wafLNZvlQQpKSk= =Rgp0 -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/4DF9172D6FF428C97A0E9AA96F03E8BCE3B2F188.asc000064400000000000000000000032451046102023000224440ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AMwChvrQ9TUc PtBbfK0UWOt2GZrzq7I0ZhcjfoxGD4UXxKNBxHcyb2cQYTh5tF4XqIv9d2Sys1c4 fU2Rr6lnPDc6VpSLKoHZj76jWkcWVf80+MXFNVp/YqErQBMu/AkA/Cwk3hEgjqQI ZOo9awfBATJqGmW9y3Ct1IV8oM6SUOjYQ8CcIa2jpSNNq9rhXQjzTYUZHK4ayTmj mPvuqSxWahUsOZClA3GHpLZkFe9k2UJuVIUfhwYD4CyIR1nqlFfj87p/UEPs1264 /RpBagz4G74BiLhiHQss8NXm1zWiRZ1xPyJIkrDm42JRQ+6gGf1qvk2tyS3Le4W+ 7sg3r08UExMpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6xlhuUgeZDb84OjE5NzM3NjAwKTE2OilEwfz2 SNwgLhCK76qARHgpNzIwOqgwKI52Qj5ABmkzDaJ3srvp4C6GnCFvosWjaNBZkLaX z2cGEh75T8Klm/RR8tXhXxHcl/b+UErb0CDRy6nQvMhU6LX+0hfk6t3M+wE+Wz/Q /uPoT5cdgWRUKBjCzSgH3DKwjBM8z8L14UCsZt17vEDVwE3jvAIo7DmvCjAKt4tP jyyBUMl8kn7HBAJkIthCnNZ3Egj1o5NqYVc6Dbh82x01lPh50EkNUOi2MANRxkCG Ycg8zeB7uaMwM7Hu+wtev+QMve3aoRVRGHIEbwzj6wl/OwmSROWmQxmLebs20dMD sdhaUkfGV2EFXSzgsK8q3zrWN7mkr/h5zs63kvsQnbsOU3ym+/OPgCOUSBm87Ggu GyUoIblgyzJHxNHN0x0RoFue3JE4CCZvsj+Cn9auwgniBCTMBHhanLm4+y4jMAdU CEdHV4m55FOG1i5AyNr9m8U3/SPzlHdPJ+9P/8hEJhcB6tbX7I43K8Wl+5I9yJI4 p6gI7VQhLCjmpUihsnRdmFGfxneDxNNIlzDwPOoV0thfOoju15ofxNdDHCzWhiin 2WVhQ60iHLT1Pfgk1htGs73wIFDsmHdJphmAscCq+uPDeDu34GPZi+DGQIndIlWw 2Dx0QjvtV5DYYHL4AYKbvCrMhTF+2ECZB1WuwTRV3AaOS27GnaneWK6KURrAE8p+ LSIvFya6g6tbjScflrLNBm+8n7/Iyq526IiwgxQC8g6t79AxxKBSarjw2RhQRi5Q PJymKlVvp+smFATNLMC+cjEFSP3zf+8a1gQnmSuaSY+UmhG/yakDlEmZzTRH5K4r rzgFvQhi4rZMCSBTy2I08IsIzeZhzpsrWmsTCnPIaFZ3VwzzabbLV2pwWda4hW0M vXf1SZwL02RujWISEiJ5ufPwm6eFwH1dNRvxSTN34cw53/cFyiuuETDx2/XIp7Ec ODuPCvJvsVjRUBQ6tdxkLSkoMTI6cHJvdGVjdGVkLWF0MTU6MjAxNDExMDRUMDg0 MzIzKSkp =opty -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/50B2D4FA4122C212611048BC5FC31BD44393626E.asc000064400000000000000000000020631046102023000222370ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmRzYSgxOnAxMjk6AL8pJ97q5V8O ADcGsak0uFXFP/K3BcykEjykR1OJjSNaditv9i7zC0J5n0YC7H9kD+1537ul2Jsd d9fk/MN+BRNnCsglrns5SlbAjzvwDNnE2ydW/Ug/q58bIRIowTg9RA7mF4qHABvS BDAXACtLe/ih5isSWOEnv2Sm3fX0kQATKSgxOnEyMToA+hTknylYwYGT/PEVQ4Jl LPoWmqUpKDE6ZzEyOToAmfUdfU53m3Kgrg4QAzkb7AfPdIGPgUyidk1azUi3Tcko egzm6VDYWARaYFUg9MpIOb+NBc9gCnPkOnGmgZhtMJoSjrN8TfYATOhcOYYBkT3R eGr/BwQ34lwekfK0AD+f6FhpHexh6BDnaZYxH691330o7RXSMtFxySAEDtnaOUUp KDE6eTEyODp8cyy2nYt0QI5Tf+t/d4WBeib2yNWVtZH/j7XpDqHLZDgVAYkazCA6 ZF7BvLddBEqVAh1X5tqua4AXX9L4SGYb7B0LRV72alhYiWWHez126KjVgwRTUxtE J4EnHmYJRReLlXosPIRhXSz7HFAqalPXJ0DvC9kzTQnnjPOylyMPTSkoOTpwcm90 ZWN0ZWQyNTpvcGVucGdwLXMyazMtc2hhMS1hZXMtY2JjKCg0OnNoYTE4OnBnEA/u YyreNzo0OTMzNjMyKTE2OtXuvrOxsl1/bOm+6zBEQZ0pODA6XEPa+d4D7F2jof/+ sJvtf22PzAgN/qZ93eIKlJaHxQFQeOyLrghCAUyZLIBzR8dlNBG+uWhg7DBJMVnR MhH24nqzdivp+SxlMO0XdnkmkBspKDEyOnByb3RlY3RlZC1hdDE1OjIwMTAxMDE0 VDEyMDgxMSkpKQ== =ZfqD -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/58FFE844087634E62440224908BDE44BEA7EB730.asc000064400000000000000000000032451046102023000223110ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AKotlDIKDSEy vIjkWDdGHQCzm1ebRtyb15Ljkl17NV4biDAA+2qOrw3QJQ+6CfVpD8XEygXpBEv0 16VgFuB5MsINHNE94dKAUc0R1uUwZljeINPQ2F/72t3SFiiBBGwY4AHDNn/zi6Rc M7JwjJW/pkkqcmvy1kA5kP18XA6wgY8NsyCa+H9ZJm5BK64MSGUEdscWykuHUW3z g6Dc8bST6OhlokclRWh9KVK0QRbqnlQeVP/E/Kv4LhnbXNB2GE2Yecah4rva/PNq 2YZ9CfyuQHwSJQhb1h1MKLi57AAacgAhV6OcR1hM6We1Vh5JDFEj01DsIMC11S1Z zHYLXRWAec8pKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6O8dPH/PCXh04OjE5NzM3NjAwKTE2OhEO7X2q 8iasv3iHvYbCdQcpNzIwOjBesXtjq+5LWL6zU5yqEK5GrykQBIHisxNK+2TA3vBM sb/646D5Za60r6rjAShVxIWa9c5rzmS+rITBVodTzAjOn2uj9k1TQNmqsWf/i3zj xe6puh6e0IIkAoMcHpRozSOHF1q5YDKfI7wjr8+u+TdROFhEhObQ1CXTnjTCx1aB oQG5AvybctPjSCdYxVujXmNjrgngZodiTxsE4OBG/bk2msK6GY+oJKgBCp/5m04Y DGDe2w9MDt7UcW0tlo2kHk5cwKPs/ziSu1gfaFqqOzFBdUc+gR5ikbzDF1vJ53W8 3DwnzCSkuciBX8MeGiAfkR8f0WQsBStMNZewnCsPYeB20Cl8bTAtzs+X7LKzdSI2 8gSkIV/GD3VwYw80cqn2eF+5cJKtKIV1nOxPRoXgcuWvNTL2nyLggaJDVusy3MKY O3yNnadWmA1XT8NMBx+yY1i0pCfmxWK5h/2F2cNbe21MyhlwgkGD8jVZCiW/NeCB VdpFHcqZz+rYchLTjs+LSoINKFiwoIpK54pMAuRO+E1y32Zo7XoZqyDkU/ip2iAK OaB5LTjl/GI5ISRBcsxbPXOxbNnUat+0p88T4Dj/V2ZJkubAwRIzgOE9p4TgHqlF 2kkl+4rqqnooDUQ4ViEIUxjq2YIws9wkWAthMMcJVDgRcD8+G6IGAJ3tQlIaW9oA OVLsHcXdiFbcEE12m30CMI0uUQSavk+aO0qO1ZQRYtu9EipGWnjWs+0ZqcMaz9rj ACv6rvsts6puie3uvL+yzEuzpWC74e50kElF0MLVQropNY50hvXqrnKzoU5ppaNt W7q4vrtKZh7QOFt7mcG4oTSIpr0vTwBGl0YbrORviF1KdaW2sPHNfbL7hrTx1HlU 3BnAM8b0kYz+NEJ1qxNUfymta5iZI21LebJNTWJIiiCBS33J73Cxr92UaafU3VRA jZRpavMXHHoesBZ78uDqAikoMTI6cHJvdGVjdGVkLWF0MTU6MjAxNDExMDRUMDg0 MjM0KSkp =zQRC -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/6E6B7ED0BD4425018FFC54F3921D5467A3AE00EB.asc000064400000000000000000000032751046102023000223720ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6APL1FJVAgVOE iOLqgmqCWcCgIfl3FT/pBaLJYLO8NersRuygQ6ArAdNYar/h8MKnOkYCwlISr3fp Jtj6cpPrz6IU1K09HYEpVc6n1UbD5r25sDc9Ol8ztg5QPVP+ceA42nzpHAnMAW7E 9dz5gsM/H6TlicF4qOT3rOfpBqDx1EHOaOS6pdnem7SwSQZ6RFetJotkXqEFfSNV lMTLqqysfk5kUW+jn7B4Jlpd7YWtlaLsPXyY1dFwi24VqpIiztOYRoWFObySrpZk wuPGkQ5P/Eqi/2+L7VKXNfODRI0NV6GX1FaQ96lIq0Y+z1EWojLwPb9JR2FLGqC+ 4/mm/W7Unf0pKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6vkrGYgB5EO44OjE5NzM3NjAwKTE2OuQHqFdP +Q1Oz+cCYcb27DIpNzM2OjoNch/oeQ0jhPqg+yQ0z3Qf26SgZEKqsdozUsPbhBfs n4zjoOj3goT4DTFl/pCWL6lCMy56Tb2Ra7j/SUeKAqBSSwarsG6mrFktOQntpw34 QWxaOc0dJEmy5/IqY0uz4vK6y8X0MWPTDPt0kxvi5Z74MQ1uVsC3ZnepSenLpr/W F38jEsq3CHO5rXUDrwMLLTqL0zE9bE4mgQkFIrzZ0UFM8iFi7cI+Yyp/esbZHubJ MqJD1QVf9TpA8OAVXPj+JEYljsqszvjqWbO5pceTyT3OxS0/t0GXeGkbhgS+42qw VOlZQe8r8Zs2MfJcGKwTGxS4HW218YZxZAan0eFOsVan+gKthNRGjvJzyy2w9foV OND0EOzkeBFDohjWN8ROkVI2z/DyG2WDoc2H7tiajWHTr31uhNlMXDLynhp+zoRV GfWIEsrfQiUcnuPyWP+tTyHoqTlAPOqeosxDsZfosEN/GRxgd3CFT1OBdgjd0YHc fB5Dfc8JtVvZwXECz6A2eXCOCUJ7ljRpNp4bxtnRoO9VAydWcgpAq8DjwkgiDqLR xYAvjAe6irEKNBKVocGV/zw03JvkqnYW7ChLr7sNfiJReFuiJXmWq1mYerOHo356 LIaZsN0n7NW0OmQmAQmv2ezC1ZCMyjuIMKcDssTieln6Yi7NmmmRPCkkiWoK2XtC PVY6Q0gZ1zUysQ4O/Rcm3Nt+U8JUpeXvry0086f0sk0yEdzB0RbZFyYMWFzwNSW4 VsYtxqvzPVmYHBO6UihvmPnCuwIpUBVpKjsXN3NiARlPk8uAzR/quOgLxVIX6leq 1hT9DohrFGxP/O1SQhgD1xZfMRwJGo9J7OYA9JWRvZKguM6bJMYZ7Y+PJWZDfifG TuQLPq8eA7B2KXEzNjHt6tyyDmV/SsbEoUPZBmGqD59/4JJiHtRy5HJdEAJXTYul FpV6Fx4qVf6IjnH8ax8tmxLenGBomboigTofJFnz51MpKDEyOnByb3RlY3RlZC1h dDE1OjIwMTQxMTA0VDA4NDg1NikpKQ== =4K7Q -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/76F7E2B35832976B50A27A282D9B87E44577EB66.asc000064400000000000000000000020571046102023000223130ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmRzYSgxOnAxMjk6ALZlsUNfTCYk jzIsNhB0iJl4C4cuZ/IeypdosZQxm1aIC+f+E2ly3BqGbMqbmheKcdS9SQs5DSzy s6W7XmeHDhrNzfStM/UuwiSfnM5E2cV2BgLpErKE56Kb/rf7/Ia12dObj2VV9oKr CwSYEISRdp5YMar6J7Vvz0nz1Pqf8mq7KSgxOnEyMToAoQkjVeVGG+B/SzJ6+yif dHWQVkcpKDE6ZzEyODoVw8i11+Plhxj9mnredV5SqI1hsLGZnPSzz2IcFP0XFDu3 HtUEG9FxZVFRQYWNCUKTP7cv5DYvmhlhc4oG0PhwFmZFLwPPlSAFZ3jfqfkh4RiM i01yqQGE6uOgML5ZWeQqb39Ngqf/ltWlcgNKpwVjMniMV5kfRzoupccZ+XI2oyko MTp5MTI4OlVm585daoJeQG/Pg7LdDkVuNBDT/63LysOfw5NqI+LjUXJScSLos76r IFLT0WOdmP74+RxFxdb31I3GYQlFjsy40e3nAi8QfaM0Q4n2WzPNkUENu7CyNccr fn6U9sYTLr3EI/bqIRp/KwoptFcmETUL62TxKcr4abrayK+Yr/lqKSg5OnByb3Rl Y3RlZDI1Om9wZW5wZ3AtczJrMy1zaGExLWFlcy1jYmMoKDQ6c2hhMTg6ndF2xFqT 19k3OjUyNDI4ODApMTY6QB3EeZz7Zs2uIRmjRj/ocyk4MDoN3zs2+IgNNxe0pZQ9 XzwAAgAA0MhK4ypYOdDc2fvfvCsjrhQyUW5ZQVVxFmf7hgY6YZzAlldXF9bD9DMC JtcJmap6Xk5D7VClxR97yHK+ASkoMTI6cHJvdGVjdGVkLWF0MTU6MjAxMDEwMTRU MTU0MzUyKSkp =8r3/ -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/7E201E28B6FEB2927B321F443205F4724EBE637E.asc000064400000000000000000000015601046102023000223130ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmVsZygxOnAxMjk6AOgCS1p47zcd ec0UvVC0phewalHUU6f7mulWr0j0ZY1RU0IOP18HAeT7INcwPcUaUvC9KYenXmYb vO1i7sNNUCOsKUamwg+oSNMcbM3AwNwxlggTyJS1N6WzIX7MjRLUlUqtbLRhPDGl Cltt6yeAjS0pZT646TANaBDiRIgk94ADKSgxOmcxOgUpKDE6eTEyODpGh2X1Sy+4 Ip/RtMJDPZOY+Y6sWUN7OiM2BkdUmCLOmaOVfgrsEevKdSBBj0oVWN81U02i7jQz hhAI3tZMFJmP/hlF7AlS5HSaLj2+t1nHAKKy70QhskINR41CCv9sHAc5gN1WrY5N DpeI12GmqsWMPQVPUHsTTe0QsT6XbHzvCykoOTpwcm90ZWN0ZWQyNTpvcGVucGdw LXMyazMtc2hhMS1hZXMtY2JjKCg0OnNoYTE4Or78V63MKf6HNzo0OTMzNjMyKTE2 OkxDOAnTGrRgVCyb5u0UbCYpOTY6tghO175Vpfia/wJGrOUT0hgS3Es/EaEHv+bn jYBeErvROJrKtUboxoGox/Qa2xxpFFhFWtR3IX6rjmqS1a5RhwEmYxFb/IzVESuZ Kf00wS+lmJuR14ACnuAOfVF6OQP5KSgxMjpwcm90ZWN0ZWQtYXQxNToyMDEwMTAx NFQxMjA4MTIpKSk= =a0Os -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/8B5ABF3EF9EB8D96B91A0B8C2C4401C91C834C34.asc000064400000000000000000000011501046102023000224110ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWxnKDE6cDEyOToAzNix+drHTYCMxS8NiUZNpVTG nWfzMjxCqVyZYt9CEm7A4JcfSbgRUppqKunwreuDmmNGFc1W+lT1oLfvJaDi/oQ/ oubgIcq0EZ5gOUydaj961PV3ltNmaaUSZsJ6jRxaa0FB1cgx6EVB88gR6JB4mAM4 KV+Ct/f9QzPv2TMS8qspKDE6ZzE6BikoMTp5MTI4OjdzptnsiJ124yTW5ewhvUVp mDGuT9CuA3ggW65bjOhfravX5rfHMCXLPXMNXFgpA012vghVwun/ekkj7/rxapZm lE28YpSDj8Pwn/lkqNAjy466My+wUeoCgg7mEg/75is2ogKzx1L52nay7BGmfS41 5m7BBjWHsiUA6KRtFXt1KSgxOngzMTppFcbO0lgUP4k3sTNfSIfwBCt8YwBTmPk5 a7hTI4y2KSkp =miH9 -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/9D7CD8F53F2F14C3E2177D1E9D1D11F39513A4A4.asc000064400000000000000000000005341046102023000223570ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmUxMDpOSVNUIFAtMjU2KSgxOnE2 NToEMIx/SmNEvuSVkX0Xq60JBOTUT4qTr3ywNqUOSaKijgdYKjwkIF+jpD+7TfSW vMznIU/Ued6WdRrqtQbi4KVzdCkoMTpkMzM6AIbAgwG04OO3x2tqboQ8eGekVM24 4oEWVVQjQwNeheokKSkp =RxSg -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/A0747D5F9425E6664F4FFBEED20FBCA79FDED2BD.asc000064400000000000000000000017621046102023000225400ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmVsZygxOnAxMjk6AJyN1x9X9Lsj fX2Z8O9s7BzMO9OoOxFtvZw+FA0BuDs0WVYkq1GuZ9/XiO0K30zvtZnlb7NMvBfz 7xbLeYx+vKzy5xkq18+LE5dU+HKKdRQZKrrwgCsDy8tJRO447QsiLTksCDqPMaE3 2OCRBF5nKrG5vih7/cmEhf2CuAn+2yM3KSgxOmcxOgcpKDE6eTEyODoZ5eYysaLn AwPeqQ9vNvUyrCxUEmrvl4svG7zkkg3ZcgAbDpDQUmnijt3gEBCoAzO3c41TU5wJ aUNBEPGPWfKcTlmBEGJWjK50QQuA2diGncxIS5SDs+QVaf434a6/KFVQcCmV7K8/ T2S8/nuGJ/rIlFL5XovW6A/S9mYEjh2pDykoOTpwcm90ZWN0ZWQyNTpvcGVucGdw LXMyazMtc2hhMS1hZXMtY2JjKCg0OnNoYTE4OkuRjUFO6YIJNzo0NjYwMjI0KTE2 Or7L9Ekww4C0lZz3g61PzJEpMTkyOk7ezAcv7simMXQw+afvqUlhdoyVM4QQuhj8 KzqjNP3IC2fSHoFECWxGfC1fNcuqzRnzs98TqAy5BDnNXSW+e+CpenWtLpID/dvb azkeATfhMf/2KMd2Mahi6rnQ6IBnxhq1d5jLhYg00Ba1HbojEYOkCPKQlFV01bQw mUsyQ7sMr42JvdFTI4lDmQlHfqoexpFpLCDv4eUKjvG/K7xs0uLiF4vyMLVH5H/k 6EF9HEP9sUF+aTDJXrrfHOUG1LR6/CkoMTI6cHJvdGVjdGVkLWF0MTU6MjAxMDEw MTRUMTUzNTM4KSkp =soiR -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/A2832820DC9F40751BDCD375BB0945BA33EC6B4C.asc000064400000000000000000000015171046102023000223610ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAx9HkS9EewRBeMrB/4u8wPapd l6spEli/46To7WcmBhmvEZJdG0ZQatYNvgkREqOadsgd49onjYaCkBSJtrJrSUOS +Mo56Ff/52ejToFyfuZs6Ky0UGm9tvKEJw3aZiGNAZ5Pyvp+Jf+xLDwvj0xHHAj8 lEEhOSrIrGvq4yx/+nUpKDE6ZTM6AQABKSgxOmQxMjg6DfYRUGbNEko1eq8wUEfM BBL6NRWlaf2/coVcLPIvCvASdlTWoog4KC7KiQOTKM07hp8Wz4u3hcDnMG/u60/u BPHPHCZThYlpGLVMhQwI46NZtMcRSNBp1rhJ5dt/FEcSFvseJOgce4PD/96bB3+c dbnvKcWM7ncRLj0wVfBzKeEpKDE6cDY1OgDanvj9klp9UkAgNwRxswOgiFOlGBsz J4dpCZHzWDCjYUd3eGWieynAnfuvctGTaMyB5xT7RwruntbgeRgPpejZKSgxOnE2 NToA6fv/DFn2WVRAODQVQQGGxsvO2cM847IFJu96BbbxOLaZJ536RE980c2a9q/9 B4hOYzKV4B4NI03u5/BqoOY8/SkoMTp1NjQ6ZIvWN1fksXhQMypVTLg8R81igqS3 GXKmQ+KrVEfTIHnXKxH7tyfDeJSS6nfpfARhAe2mP3TIrbjX+9PR+QmkgykpKQ== =dUou -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/ADE710D74409777B7729A7653373D820F67892E0.asc000064400000000000000000000015171046102023000222500ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToA5Hj2C3jzD8OGtLaw7+P2gYdA fR4s4YS3/AK+kYYtbm5EX4srysyUbylbQDQXUvRzw4FPkjXbboF6KjHw8icNWHCa zwSfPTfCDvi0JIildkfNqwBzCmNDRn++X8rvAeDCEJ/BtfcgfgmDTElSJOd+3B4X wnmtnBW54KlR42PLobspKDE6ZTM6AQABKSgxOmQxMjg6AkvpIaKimXAwf3G1m1nl +LEDKdo55gosry8XToQakvdeXyUerCkplTS1uax8smOQUvrIPYvvnQZ7S9wuPli3 FWH6l/O+2Cgdti99xTSPeJRBeCuf2vv3bAgu/0tyB8MZgRRM9j5NJCeGO7o4DwRg UkLWX2+R5p4daI2LRUfmV4EpKDE6cDY1OgDr3h6mXHrLT4qSNexzz8BAvK/PlHMA MAJcy76lXSkl92+c4BcpjFDr5Vpaq/VXoLC4L/IlnEEqY967pAycdLH7KSgxOnE2 NToA9/lAf6hJ4dHQ6ux5BH8DImq2OjW+sK3tIzzf6fpVkPjDuqOYidm+OL2SFCJa ymSWdVq2gQYbkcdRXdGKVJWDQSkoMTp1NjQ6NeHBLEuc/VX+h3ifO1jyMlh+9nZs HLkQzUyi2HnrXJ224cjvgc312wvtBQMUyLARWuEuMVMAwWofjX+GZXLz0ikpKQ== =Rw+Y -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/B2BAA7144303DF19BB6FDE23781DD3FDD97918D4.asc000064400000000000000000000032751046102023000224240ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AM0QnGL35Fvz +RybOtdBOWPX8XHZ3CvPq0gr50pjtZGZLjlDe5Jf8oX24cGBVdFdILOlOglXNJX6 Qz5WxNrZtU53vDfkgjA8flQXFqIlkxv2ZkjKP2S+Vgr9LjbrFxxWRlZY+XqMNahE jbfA9gLr1GG8gM7ABsU7O03/pR2q7iF/aDMKm8asN7+k4/tW11e5yZeQkc+aBz8z bhBCZ90jdfQr5jHQsJx9EOlrCWvDcnGojDXQBc2AflwuEJQHSHqPsy4E5KnMlpp8 ZzFw2spfExWzNnEfZ/qQ9dXgnhdeNFmg/JRvgohreRExvO3yJiQMbH28UBTb/NBO e14F8j1XdfkpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6kSqZ9Kag78g4OjE5NzM3NjAwKTE2OlKflmHj kP1iNdN0sAvT1dopNzM2OvOi7aAUszePhXP3b3zH60C9ygixV1MQIKMUTDlZkTFv uVwdyH8IsB5rwaIZV5kO9xOdTPZAUG+jw3i5vUJzVYb3tORlIQLMZl+cT6InABFm eZ0jC7n2i5qEGK5nb+7na4SRv7jOCDpvEvmX3UxYsx9OvnVq9ndNg0t95wDc8Yp4 OuWQM56DoSmlfi8yvX8vdihp5XVqwvoKZNbXP17o0K2VjSBfWMW30mF+1MRVGZjj rji0TJA0747OQjYEVVi4Jyvd1Qd+Ao3QWkXm4TzeiRAOYKTy1g9+6mTpLr29IQPo Ljvea48pJK2YJM9FNoZUOA04Pv6n0w/CCSFMSGDJon8KATgTgkXFWlxhCEPqJxJL emruPGPIb3Qv05etKPjGyvxk7fm+5xBjpxU2Xwk6kUZOfuX9b8KkBWDBlBSSRV/w teH+vTVFG1ydDFoCbay4TzKIHRHwS93ME0L11GHLViXMD3tOG1BKudPD4JUxrHVa MFHKtkvfTEz6v4YPCCp84+cjrbOKhSabg6caNcD0rge7iFVN4BArs1B/akEN+E8i q3MoUv7lN6GC1XEiEvK/8NgDamwUtbRQfPyJizow4tJSWTm0SZdTlBrkdUgCgW2s 2dTElthntFqGOpBj6AvxoUPpnKKUp4o1W97bqV4regz9g8iMSna+BrzfYMrt8AlB A4eKtYbjFS0aNzhDRJepATVh/DVsy4bm3XN5L5Lne5greOCRcIjmE6n2GOHjh4Y0 /ba/hj4WKm2n63toXJlxJ1t1Db90qiH8ASn6Bgd6BR0NueIrYI+YJMoeG+NLjB2h Ag6rd+yyjLEqaxniJkz9lZvj1AmX0JX3hfC6q8I84ZUdQFyBVQIxeN8EsKeWh45c 1bEgyecQx+PNmrEUa90OZpJt6V1mQhb2SCDBgSVpAGoI4N2J5NOJ8gm+plgLsMDT Q1xhmBNF67kVYmV+ljiOOCB9CluiR/i2STv75ydnuBkpKDEyOnByb3RlY3RlZC1h dDE1OjIwMTQxMTA0VDA4NDIzNCkpKQ== =1YfR -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/C6A6390E9388CDBAD71EAEA698233FE5E04F001E.asc000064400000000000000000000026611046102023000224220ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjI1NzoAqBvNbHXRfWWcek7De5Xpw8bO d8KibdW2sE6F2ZeqifoTvLTDcv2lIGqqovKQuRV9x5UkUIY0RQ0F6uI0d/o3nBSt 8H8JsUylzCoTeds4UiFgpRA+O+egd8DyE7sABtlmBXHApYa7Vl/I/sASuSKS1VQF 0JzkWSzj+381GZDtSg7t2z+A+n9S0MmrSM4EtPHZ5aelr7CQ65FHhmOkebJqcfX/ j6gVX1FaZnJGzDkfgWDybaZWU9JXs+KlrJnVm6lO2YXb54TBnE2wW5PVm30dSCab YoHrivL01NuCadhUI+oiAVfTg41H69dRCelt07x2lrnXXdIX1/Q58h/a4IawxSko MTplMzoBAAEpKDE6ZDI1Njog6qS8HovBCoLrvf1v9wg5YfWupIlKiWTGu/FgjF6D uthfhGOa4giRwuEbm/RzkT46NL1SGR0mAilM9zL/5Ro7cR8n7rAWq+PxCLIck6zB BDEY0QfmkfGtUTX1YBHexXXBDieDIdEP1hyUqUZhQuBObi/fS8E4pt4TMjLTCTo1 XEqZxqvK11AD6y2GddnCtH8vTgUaALzxNks23nngDEAdaDfJMHobST4Jb9RYVHNN zsZnLkKRr+GIemOoRXlCvTmTaw+8Vh6vUq8OWB5jryNxmt64FtWAHpLcW0n5OE6S 6OlndqM92Xe9NT12wu75Mn+qTYrVauSPQvVveZMakG/hKSgxOnAxMjk6AMNAbeJx Bb6BlIWYMYrpAhkuPBgB3HvS0wZQ/n0j8LLEh+BJI8xa9HgDz7LOJPo00w6ERHvb Q+8VVBP69wxwHFJSfxJsImqUmQYXgoA2n/6GAqfj4oFK/FAsFd350bkaFnZcSxqj hJai8JQPku0cZqPudfRzThX5XIBbynMBNqIxKSgxOnExMjk6ANxpdW6WqMrWGerg X1i4MQd9ofyyWaT2XaGrnwMJY1qUqAqPViqZWPpPmya8mVrT9XkajdtPUm0zVzeK IjEScdvoS/pwkIMmM2+GRCFCo9zrsExeqa1cQpc8GFDZgynZ9/jXWeRiidU1xTMt gANAiZWOb8Ww6ti9p+t96liUEB7VKSgxOnUxMjk6AK/BZIZC/C6GJyRhEoTBlzmn nSC5eC6MojPTOQwd5VIkeEq4illBE7DF/5gFw/fufn7s+0vicZx/8yLH1mFYkbwq DfuoY/Da5lnRFw6fGOj4N0ikS26FApjlh2DS09HtIFuNAhErr5PDPjF1F31XL/1M 50jkxfKPamxMiEs8it0VKSkp =GHvX -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/C905D0AB6AE9655C5A35975939997BBF3325D6DD.asc000064400000000000000000000011071046102023000223630ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOmVjYyg1OmN1cnZlNzpFZDI1NTE5 KSg1OmZsYWdzNTplZGRzYSkoMTpxMzM6QJASwJYtt7iJ0ho9ryWXzi6FYfC5KR+p uwXT8cWoMCuCKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1zaGExLWFlcy1j YmMoKDQ6c2hhMTg6vuifz6Hv4GM4OjE5NzM3NjAwKTE2OpcAZjV5+F/YlpOPgp1b WQUpOTY6qFMSoZCpIVdpOB9iKNKcrowuxl4tpSya+TVyDRedFeYEJgrcUjLFa5qt Eqi/0/ceDijJBz1HGyZ1mRWwGOzCqhd/8ccVQlQp66GqO8x4Na9uYtfNurj1a7Gv kdi+aQ+UKSgxMjpwcm90ZWN0ZWQtYXQxNToyMDE0MTEwM1QxODA1MzApKSk= =FCvp -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/CEFC51AF91F68A2904FBFF62C4F075A4785B803F.asc000064400000000000000000000015171046102023000224330ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjEyOToAvkUCG0xYaTIkZiTwd1wCUF8a Q2+YdrBGjSfzCyB8DzbPozYA29eOAayDg9RuesQGISmFQ6YRSINsAogdNfZmKu8j VMp/2mRQR6necW4OKkdtdnAI8B6Qaj/clBJt990RahXcrXG13fa0n72TpRbxmUUs Y4KRpbCRm44rR9AAWPspKDE6ZTM6AQABKSgxOmQxMjg6IvI/yc3C60dXYh9kvzd6 AVMGWt5zTVFhE+oDfMaxooW5q0tu6vHzViFeYmcxB4FbctnSbTNiN0RUIT7oxpGE AAumKRejGAaMwiKZz3bMV05l0LI0Yn10GzXsLtRx+iKzpUxThZETRU43BJeMqP5/ rVqdQAu47pClgTwQWn6bXNkpKDE6cDY1OgDXtvl8CYDL/Q+9qZDCyItE5j7X4wRV en939fdDepuYAgsLLc7yqnDUOzajXWyx6PxygpnRs5cwmo2zbtZyyWKFKSgxOnE2 NToA4c2I2FZT8gQLl9E3LF8TkBACZzsGb/t3mBUhYNSNZ7W6R/AkZARLI3IZOto5 xhBrxfQayRISS2PBk390z3JlfykoMTp1NjQ6TamsumtzX7waNMzurt48kluI5Zy9 isGpweGpp1T+4L+DiXMMAbhFW60gdqqo4+vzkn2M/M/8BPrKCw1TlDn3TSkpKQ== =lYo+ -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/CF60965BF51F67CF80DECE853E0D2D343468571D.asc000064400000000000000000000032751046102023000224030ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AL8OibB/4Jrv yu3WLmT9knI/wEmxSjU6PXn7xCyDgxXd45szIKV3uURsYVsexrIRr5y+uijOWq2J FunrhNV4sCGpRAnS3EA1y1zqFx7Ob0/k4bLvNn8UFNtblIlxqSjT2Oz2T5+4GAme Vo7Z49keWryDyMeo+J1cio0NacBwR5Ee+DL6NfGoSyYYHrrQOn9PCnASR/I7THMP 4l729yHnVNHnsgA1t/plvgXJj2Vf4KTu8NFaXFbd5a2gW14+nv2kUTenQuHs3Nn9 d9NQeXSZ3tWP7FvthgklO3bp+dmjbynDKacKQGWKFyYlnx/qNKRe9Wnr59vVSeyk tyA0pbyvYNcpKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6LskYBR0oJSs4OjE5NzM3NjAwKTE2OtX507Od 8u583SoOhgpvTDopNzM2OqQsv6qf5uCTG0KqleH7oUveFKt4ucEElrAyAiHe8x4c 5BIt9r2cz9yVyZjiolXC2zuGZMmt15odX+1vp9zUAaK5cFFFk8z6qEBEeFOP+4Ss iBeI2r3fHN+/mYMlyomBXV9bZ3ER3lio8iqdsnjkqFo+AfA3otGvrZNhXPa6GaLh 1KRW3D3Lg97gp+GwrsQ5sRQ6EFBlGzg2YFWLFGO1txvQfLECEzQMZaej1S6XNKY0 87LmmCNhyNvSP7WECb0PMwlXKDUEy7zjEK2VkGRSEg4Y8CmMFeW68Zrlvivcy01E KXQ2EpI0i9mxI/QnQa/6d4GAkuPywbJG4U/rgEDMwubHhp+QVNpU6JWy2KKnMVVf 7Ln5KMKCOKh3ZcvRYUq1yen8ybEOKJ2nFZ5VQfmSSXvW5yDClQCe8PwwOY1a5nw/ ODcPM4oeW8PmWncWNuhme/uicECa0wuJ4IGUKTyg/Vs4OLMjiXLwT1gblPEcfuws +3A3o494JOEqnyyvfM3ZmHE+RYe9+OV6/1JFsIhSn9cWty/H26QpuFvN5D2cXXKU txuqC8MmovtCRzG/ASja68rc0NC7uACBRvb90v5tlDCFmBZAPJmFnBnB/OGqQOmF dFXGRJiauaKOwRtEzC0wyMdkB5+j4/oBj4Nt3Ua5Qbk1B5m5M4YfEX4c89G635O0 cmO+c9ubv/oQSNcXnJmIDnIvwBXDMzS9psQp/LzIpXIpbJUU1tRclUL/LAQChhmS Isq2qP/s8jg8BNSjiXlRkLqg5xkcKuW757y725fiAOrNjDYYBNVC1XIPaVc1/Fkm T1Mcn0OuQ9Hwcj7C+lqcq7vSZkx6h5+YjvJ5uDUQvFVJMfoDbKMKsKuJ2qSK7ano ePtji6v9SylT9cSZnSngaar+j55JD/wocGlAcVOZ+fOkoo81wWAJ1+XNZX4YNQ+/ naNT4eyAq9k+CqxZjDOSbdg/aoOzFPDkRpDrkQGq1IcpKDEyOnByb3RlY3RlZC1h dDE1OjIwMTQxMTA0VDA4NDg1NykpKQ== =MG45 -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3.asc000064400000000000000000000026611046102023000224670ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6cnNhKDE6bjI1NzoA255CUJxFEKLVwEoSgwZqXd94 AhjGUbMY6NXdFj5cCq0JmWZrbpT/5OblTrymiH1iLmI0ymo+/s8vh6NtB98dhr1s yH3asNQfXZRfF+u5X5hLDNPF4sUelsl4+EUef0Hbc9U+e+8F8A9TMxELSqQ8Ul3H u42hc+/ugkc1G/8++Sv/f60TqWcUR2GmuiAvkuS1WmdATMhwPr7vMfssV0X0mboz 32//b/UfuOyctso5FM+bRaKrEJDQ2WDg57yqnaqsKEgajW0jElpAVIn792W6YWKO k4auYSpO5f7BVs40Z+bxKGxiH87z9fnmlYAsQwPOOxZwWaCSrReeheK6c6emASko MTplMzoBAAEpKDE6ZDI1NjoYgHaQ5xkEJcvyhmZm/H8/doq9XnrkazZ7O5OimKsi Jx4BYZ4uGdeBd9/bbKFTwaauMBddrIQstNFuW5BIJt9KGgtvRC3y49JABClRJ45o mOVpSp3dkp+6s5hDHUsCvZvjN3D02LzxLx8u0lb6fopFp4rSD5dqB48KNTGQAbvK hqYZ521wmTfYLiy9taVAhqZLHlhfmrHYmdvvKjdNE3tSActlHWXdu119rdHhJ0zJ Rxx/N845rl+PXXdFHveQxCBhHBQpSUaKpte+ZbT4vrjyNugD6XjDi4HLI9CysUDP A0IFD+BJWw7NgYY51yamT7nNcMD6bJdgtt1FXbSgh7jVKSgxOnAxMjk6AN7btgbl HEHrKf77a9ptklDvd2bEkUOwj3bFavB1lpkliW1USoWMx97zjxRPzQOs6EoE7u9Z JRDO8xA9ZbI0WOk7io5OHpVp1BHyeqebqfxHzN5wsRphu+peg7vYfENVf0lA8LIU NeUkbfEWDQ+inXxqkgD51gPfrU3PRdCDM8fnKSgxOnExMjk6APxHMsTrjaUoITcI LqT35wDinFnX1+OgKD00krcUmc+G0ylLMolVxsB4yDVIkY8QfhbaGtFoP45PCnxS rvHKrTt/6sZJCWXf+3KaN0QSxyfi/mEPj3KbXhmaY6x8R4aB/M7ipLXNdj/308pu a50YPwIYyX0L0qoRBBo/xQDgOsXXKSgxOnUxMjk6AMzWw92nzShDRzPZwBvb48YY YzZFiFtJbcZ1n8DaiM7VmzAkRqwmCu6HPP/8IC4d6UkFUUlHyDyxSaKuA45Y+FR1 Pb2/Y/mQVsBanK4i+1oL4fYGexFO0qjA+8l2+6BEWbKQX60nIcFXD2hAP0aqWDGO lXrPhpWPRrwDd4j9DEvfKSkp =1cwG -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/DF00E361D34F80868D06879AC21D7A7D4E4FAD76.asc000064400000000000000000000032751046102023000223760ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDIxOnByb3RlY3RlZC1wcml2YXRlLWtleSgzOnJzYSgxOm4yNTc6AK5ASAwdxvm1 x0sD1PVAjVCEgo2oqT3mg/onopj3t3dVlBuEv23f+5/EoLTEIAE8ulGDCBQRw70X j4e5B87oc5DxBs2uiMGbCX8L7cEQuXVRRrwQR5kJI62iCle1prehdXTWFgZUBXwQ 60GAGeft/MmznrUN4qy1qt7dp8eqOq9on9xA8uKzigCYEjRsGeScrFedAemg0so6 AWbCSz6S1BbZKxYPilbG7VMvpA24kgPqQiiaZESlFt7iey04WE9v26vH5CExVqFl +M+tAGIPw439X0leIpdidTWFdREw7DCkRBjZ8cWbLEIfhErco1mqlSxR1AvlSXnb yxerHQRO+KspKDE6ZTM6AQABKSg5OnByb3RlY3RlZDI1Om9wZW5wZ3AtczJrMy1z aGExLWFlcy1jYmMoKDQ6c2hhMTg6tIGQBN/WvYA4OjE5NzM3NjAwKTE2Olq8YLkU 7sO9zkXVYdR0ApwpNzM2OneDiO9TEO0M//ms4Wh2ZDR/oOHF67pj9woAkW+en7vv r512xqgFV2m2b2aFTJYgeJwWJgVItmgmoM4RsbtL3CVSXrKRi4fi3VbwWEN0p4MI wOXkbdFFxywvEQjQoNEvvBFHTlLkRIHzugfhUJID4wNzcGq55LnH1zoyXdUorlhi dpJ7Y1QHjm7j3RBiTRpGXXOIwQkpTf4eNIIsOeaDTQVIhTh62UFzUY26NBftx0mC cYhFs0lOk7k482OnCkm712BejhvHOcs46Lhi9JwfY6j8QcgrIp4b2MyT8BOg1cIX vjD39tKJYh9SHWZlB694KZYqSmlr+RfhgLTNV7Oq4Il9JNhPgImG/ouE/O14j8W9 MyIg7T8NhvYRt+sym9oijvxXb8Z7dD12RomxOZFAajrHMv349JAebUOSIxCBg082 LNRleJKl7s8Dw5avgyc03kqAUageGOjRWsJvbSKLebKDUoLqEyyNiTNbbTru4oZb RyfqPftZkPymIQGS7rukohZ7cZHM8jT4Bf79VRvFAXQJ8IVGjHVvrwEbV0mOgin7 i3n0hYsO8t3YvNtQZ6c2oTkhaeakYgebRKXSgWmLK/FcCtnftYuulPD/ApkcnGFa jqJcxKT6vNbsrp+YOlder0cZz7S+1qXkKP9iGuVUa6uG818pv4IZrrgWJP85ZUqj PV5Dy9QYQbd8HHxrDkWQ6xMdFM0049KZeNuKGnbv2gz27RUMf7U7eyj7QBuDCHwL Q3UHOXr5Db7bDepCOXBdjTxET2BzotOkn/pbNJN1wAa3UZB3ovFWo7vOwQCF1+nY AWAUxNm8W07SzBVZuCHxPsnMX8z501jz1f8yiKgDgG6JtCCESTIPnOj+7k+86eYV CXfgf3klgcruOTXCZwaUhQYEf7Rxyln8FoMD/5VoKWAIwUsbpMquhwbZmmq6nada owEctivvDKqlXNf5vREV76+OTpiFSpRDiX5cwWU/eG4pKDEyOnByb3RlY3RlZC1h dDE1OjIwMTQxMTA0VDA4NDMyMykpKQ== =3wKz -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/EB33B687EB8581AB64D04852A54453E85F3DF62D.asc000064400000000000000000000005141046102023000223460ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZWNjKDU6Y3VydmUxMDpDdXJ2ZTI1NTE5KSg1OmZs YWdzOTpkamItdHdlYWspKDE6cTMzOkAWeeZlz31O4qTmIKr3CZhlRUXZFxc3YKyo CXyIZBBRaykoMTpkMzI6VN/VGmlcwGBPcLTya2hfU4t37nMcFCKdNSXjJ5DFA0Ap KSk= =eVhB -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/privkeys/FD692BD59D6640A84C8422573D469F84F3B98E53.asc000064400000000000000000000012551046102023000223410ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v1.4.8 (GNU/Linux) Comment: Use "gpg --dearmor" for unpacking KDExOnByaXZhdGUta2V5KDM6ZHNhKDE6cDk3OgDbbxWAbWsheUJprK6VryMTpwDi YwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEmSppp/6/Ygp+N3n32Kznq7PjHXiuW LlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUpKDE6cTIxOgD/igRZcqjTHbCv I/mTtAPK5yJhqykoMTpnOTc6ALV10OZ7mJkWRMRYeGu1T3uwS7YYORJAHwd1fwKh Fys7P8HZaWIXqp8EqFxk8VUEiEo3ONN9jtIRgBmTbNywKbx6WfBItoYTPEoU0UGo oM1c/5rfmylyqwdIbMNXDhW4oykoMTp5OTc6AJNnAP6skpHlhVAmecLZT9eRzVoO q1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXvdCT24hlfoGoXzkoD InkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLSkoMTp4MjA6cZuCxaj7sT+FZqTO y2lNfMjaQMgpKSk= =s5nv -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/pubdemo.asc000064400000000000000000001054721046102023000154430ustar 0000000000000026 demo keys: pub 1024D/68697734 1999-03-08 Alpha Test (demo key) uid Alice (demo key) uid Alfa Test (demo key) sub 1024g/46A871F8 1999-03-08 pub 1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) sub 1024g/BC43DA60 1999-03-08 pub 1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) uid Eve (demo key) uid Echelon (demo key) sub 1024g/7272144D 1999-03-08 pub 1024D/8FC282E6 1999-03-08 Golf Test (demo key) sub 1024g/9DCAD354 1999-03-08 pub 1024D/04259677 1999-03-08 India Test (demo key) sub 1024g/61F76C73 1999-03-08 pub 1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) sub 1024g/9AF64D02 1999-03-08 pub 1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) uid Bob (demo key) sub 1024g/E29BA37F 1999-03-08 pub 1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) sub 1024g/B0C45424 1999-03-08 pub 1024D/7372E243 1999-03-08 Foxtrot Test (demo key) sub 1024g/EE45198E 1999-03-08 pub 1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) sub 1024g/D622AD0A 1999-03-08 pub 1024D/D2699313 1999-03-08 Juliet Test (demo key) sub 1024g/35F8F136 1999-03-08 pub 1024D/B79103F8 1999-03-08 Lima Test (demo key) sub 1024g/FE56350C 1999-03-08 pub 1024D/BE5CF886 1999-03-08 Mike Test (demo key) uid Mallory (demo key) sub 1024g/4F31EAE8 1999-03-08 pub 1024D/30CEC684 1999-03-08 November Test (demo key) sub 1024g/8B70E472 1999-03-08 pub 1024D/6D9732AC 1999-03-08 Oscar Test (demo key) sub 1024g/2681619F 1999-03-08 pub 1024D/3FF13206 1999-03-08 Papa test (demo key) sub 1024g/63330D9C 1999-03-08 pub 1024D/3C661C84 1999-03-08 Quebec Test (demo key) sub 1024g/A029ACF4 1999-03-08 pub 1024D/777FBED3 1999-03-08 Romeo Test (demo key) sub 1024g/11D102EA 1999-03-08 pub 1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) sub 1024g/0F1B50B4 1999-03-08 pub 1024D/85A81F38 1999-03-08 Tango Test (demo key) sub 1024g/101C0402 1999-03-08 pub 1024D/653244D6 1999-03-08 Uniform Test (demo key) sub 1024g/5522BDB9 1999-03-08 pub 1024D/61F04784 1999-03-08 Victor Test (demo key) sub 1024g/07287134 1999-03-08 pub 1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) sub 1024g/FD6E27F6 1999-03-08 pub 1024D/567FB34A 1999-03-08 XRay Test (demo key) sub 1024g/41E408BE 1999-03-08 pub 1024D/4B11B25F 1999-03-08 Yankee Test (demo key) sub 1024g/F7B080AD 1999-03-08 pub 1024D/54ACD246 1999-03-08 Zulu Test (demo key) sub 1024g/A172C881 1999-03-08 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v0.9.3 (GNU/Linux) Comment: For info see http://www.gnupg.org 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 =1N8S -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/pubring.asc000064400000000000000000001327341046102023000154570ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.3.5-cvs (GNU/Linux) mQGiBD/yNQgRBAC/KSfe6uVfDgA3BrGpNLhVxT/ytwXMpBI8pEdTiY0jWnYrb/Yu 8wtCeZ9GAux/ZA/ted+7pdibHXfX5PzDfgUTZwrIJa57OUpWwI878AzZxNsnVv1I P6ufGyESKME4PUQO5heKhwAb0gQwFwArS3v4oeYrEljhJ79kpt319JEAEwCg+hTk nylYwYGT/PEVQ4JlLPoWmqUEAJn1HX1Od5tyoK4OEAM5G+wHz3SBj4FMonZNWs1I t03JKHoM5ulQ2FgEWmBVIPTKSDm/jQXPYApz5DpxpoGYbTCaEo6zfE32AEzoXDmG AZE90Xhq/wcEN+JcHpHytAA/n+hYaR3sYegQ52mWMR+vdd99KO0V0jLRcckgBA7Z 2jlFA/98cyy2nYt0QI5Tf+t/d4WBeib2yNWVtZH/j7XpDqHLZDgVAYkazCA6ZF7B vLddBEqVAh1X5tqua4AXX9L4SGYb7B0LRV72alhYiWWHez126KjVgwRTUxtEJ4En HmYJRReLlXosPIRhXSz7HFAqalPXJ0DvC9kzTQnnjPOylyMPTbQjVGVzdCBvbmUg KHBwPWRlZikgPG9uZUBleGFtcGxlLmNvbT6IWgQTEQIAGgUCP/I1CAIbAwILAgMV AgMDFgIBAh4BAheAAAoJEA73cJbXTF8iUO4AnA8wHb3erMrfWV3ij0d/cEiSJAYF AJ9fcbShgTXDN1dIVZvLSW5E93TfC4haBBMRAgAaBQI/8jUIAhsDAgsCAxUCAwMW AgECHgECF4AACgkQDvdwltdMXyJQ7gCfcOplS9yv3a1gj4TCPiNybMWs0owAnjJh NmPvm3h3taFS/VaO0OAmSQCbuQENBD/yNQ0QBADoAktaeO83HXnNFL1QtKYXsGpR 1FOn+5rpVq9I9GWNUVNCDj9fBwHk+yDXMD3FGlLwvSmHp15mG7ztYu7DTVAjrClG psIPqEjTHGzNwMDcMZYIE8iUtTelsyF+zI0S1JVKrWy0YTwxpQpbbesngI0tKWU+ uOkwDWgQ4kSIJPeAAwADBQP/Rodl9UsvuCKf0bTCQz2TmPmOrFlDezojNgZHVJgi zpmjlX4K7BHrynUgQY9KFVjfNVNNou40M4YQCN7WTBSZj/4ZRewJUuR0mi49vrdZ xwCisu9EIbJCDUeNQgr/bBwHOYDdVq2OTQ6XiNdhpqrFjD0FT1B7E03tELE+l2x8 7wuISQQYEQIACQUCP/I1DQIbDAAKCRAO93CW10xfInB4AKDKD5BulHRXb04ynP6Y Wel6I2g3fQCgqJEJLoUNcIF3tp2jF2jBr80WmM2ZAaIEP/JSaxEEAKxxqlg9Kz9D Z/3N52BC0w+JtYKke39vpdWVDHR3MHmMJ/31Y2iSpm0fvRs3h1j9/fBVmLOZglNQ yH62SxdJyZwCelkZzfUy/qLm9Qaqi7wpg0p4EbmWdoFF/A1Zg/MU7D5w5xu+EA1J 77Z6QyALN9rIOXZ7rLLa64lw/MV4LdIPAKC449htJbbp5rkJHvBDs4YxEIkk5wP/ X4hPGlIw5PlHrsG7hdahhTudV5hRGlvosnwsrYJXvKAQLAV1EV26SIYUH5pM/ycX rG25dqVoG56uQqnhBdUqo4iSnsxY3ZMA46D14REc9P//CGvJ/j2Z41gw8u8oB7rS 50djvoaWb5myj7bhacTBdfah3U8dVXcIi1ZFvtiaGAYD+gIF7eNIdpaYiB0427un 4ggc26+Y9nkF93DaMnZEaYSeum6g/g7D1vwINFgQkMYEWi4DK3W+uH0E/n8o20wS 2wvMrbeYaQm5v6ucd001wwFDY6AdwpwP7UCLQcu6qqvwNHdxWYK6+gIsSufLmeMG rsvC0WQqYeu1GfGpHIMCZJlZtCJUZXN0IHR3byAobm8gcHApIDx0d29AZXhhbXBs ZS5jb20+iF8EExECAB8FAj/yUmsCGwMHCwkIBwMCAQMVAgMDFgIBAh4BAheAAAoJ EJc9UOHED97PgEMAn0F8RGDrnmXv7rqM2+pic2oDz1kpAJ0SWPHxdjJHWzoGMrHq ocAy/3wFi7kBDQQ/8lJvEAQAzNix+drHTYCMxS8NiUZNpVTGnWfzMjxCqVyZYt9C Em7A4JcfSbgRUppqKunwreuDmmNGFc1W+lT1oLfvJaDi/oQ/oubgIcq0EZ5gOUyd aj961PV3ltNmaaUSZsJ6jRxaa0FB1cgx6EVB88gR6JB4mAM4KV+Ct/f9QzPv2TMS 8qsAAwYD/jdzptnsiJ124yTW5ewhvUVpmDGuT9CuA3ggW65bjOhfravX5rfHMCXL PXMNXFgpA012vghVwun/ekkj7/rxapZmlE28YpSDj8Pwn/lkqNAjy466My+wUeoC gg7mEg/75is2ogKzx1L52nay7BGmfS415m7BBjWHsiUA6KRtFXt1iEkEGBECAAkF Aj/yUm8CGwwACgkQlz1Q4cQP3s8svgCgmWcpVwvtDN3nAVT1dMFTvCz0hfwAoI4V szJBesG/8GyLW+e2E+LiQXVqmIwEP/JTvQEEAKhSVnbs5Ndf5tAHPyv5mm9JM869 1FKK9W5MYeL3MSRzk2Rd2vWOrdVlKcJTl3gjZGPfLUWFIOgONMBYJCs/+I3Tmog7 R1tmzqq7yZif8B/+c3Zg6bYbudyRIF1Cj//o9nX672E2WMctptdQwOvECvYj0gZp LIJRTEBNiCWrcBABAAkBAbQmVGVzdCB0aHJlZSAobm8gcHApIDx0aHJlZUBleGFt cGxlLmNvbT6ItQQTAQIAHwUCP/JTvQIbAwcLCQgHAwIBAxUCAwMWAgECHgECF4AA CgkQ0SC2Juyr9R1qQwP/bCDX1WGk1u0zkKJWJ/VXnuH3jk6ZevkuHZICwjlqAxv1 de5P3Jeya/4kPmEQTotEv3xcDAZ+9pBL3TrZolAKhxkBZ08l4QSy76kyf8hB0eoZ 2Svs7LrGPBJr6CHX0kyDiapHgAhBKQq9GhNKpIAZuL6DK2dOaQDtoRSW2iB1h4mZ AaIENuOOnhEEALZlsUNfTCYkjzIsNhB0iJl4C4cuZ/IeypdosZQxm1aIC+f+E2ly 3BqGbMqbmheKcdS9SQs5DSzys6W7XmeHDhrNzfStM/UuwiSfnM5E2cV2BgLpErKE 56Kb/rf7/Ia12dObj2VV9oKrCwSYEISRdp5YMar6J7Vvz0nz1Pqf8mq7AKChCSNV 5UYb4H9LMnr7KJ90dZBWRwP9FcPItdfj5YcY/Zp63nVeUqiNYbCxmZz0s89iHBT9 FxQ7tx7VBBvRcWVRUUGFjQlCkz+3L+Q2L5oZYXOKBtD4cBZmRS8Dz5UgBWd436n5 IeEYjItNcqkBhOrjoDC+WVnkKm9/TYKn/5bVpXIDSqcFYzJ4jFeZH0c6LqXHGfly NqMD/1Vm585daoJeQG/Pg7LdDkVuNBDT/63LysOfw5NqI+LjUXJScSLos76rIFLT 0WOdmP74+RxFxdb31I3GYQlFjsy40e3nAi8QfaM0Q4n2WzPNkUENu7CyNccrfn6U 9sYTLr3EI/bqIRp/KwoptFcmETUL62TxKcr4abrayK+Yr/lqtClBbHBoYSBUZXN0 IChkZW1vIGtleSkgPGFscGhhQGV4YW1wbGUubmV0PohdBBMRAgAVBQI2446eAwsK AwMVAwIDFgIBAheAABIJEC1yfMdoaXc0B2VHUEcAAQE5eACggS5kaZb//GX0qnqe SI6hALml71sAoJejRM0/v1nsD0xnMGWPqS5MnC79tBBBbGljZSAoZGVtbyBrZXkp iF0EExECABUFAjbjtqsDCwoDAxUDAgMWAgECF4AAEgkQLXJ8x2hpdzQHZUdQRwAB ASeMAJ9MeUVrago5Jc6PdwdeN5OMwby37QCghW65cZTQlD1bBlIq/QM8bz9AN4G0 J0FsZmEgVGVzdCAoZGVtbyBrZXkpIDxhbGZhQGV4YW1wbGUubmV0PohdBBMRAgAV BQI247hYAwsKAwMVAwIDFgIBAheAABIJEC1yfMdoaXc0B2VHUEcAAQG3wgCgk/Br qP5WblWLc2+6jwlmuLg8n8MAn12puZol0HwV0mcd8aHWtcrfL8lyuQENBDbjjw8Q BACcjdcfV/S7I319mfDvbOwczDvTqDsRbb2cPhQNAbg7NFlWJKtRrmff14jtCt9M 77WZ5W+zTLwX8+8Wy3mMfrys8ucZKtfPixOXVPhyinUUGSq68IArA8vLSUTuOO0L Ii05LAg6jzGhN9jgkQReZyqxub4oe/3JhIX9grgJ/tsjNwADBwP9GeXmMrGi5wMD 3qkPbzb1MqwsVBJq75eLLxu85JIN2XIAGw6Q0FJp4o7d4BAQqAMzt3ONU1OcCWlD QRDxj1nynE5ZgRBiVoyudEELgNnYhp3MSEuUg7PkFWn+N+GuvyhVUHApleyvP09k vP57hif6yJRS+V6L1ugP0vZmBI4dqQ+ITgQYEQIABgUCNuOPDwASCRAtcnzHaGl3 NAdlR1BHAAEBIKkAn3A15g/LjVXSoPwvb6iNyUp3apJ7AJ0cc1Xh4v4ie9zgirbx ax21fRqIKpkBogQ245BnEQQAvwwkLp4Dtoie4/fvandnK4wVPCvgJkIbNuyQZCar QGwv8RapBwbANT4vGW+ky2vzgptj21xYjOcdNMIhJ1Sjc7hjs1PLhwepMFrS4/Pl e1TljpEgxLZ5UxertMvSTr7OxsA76jjOQt0B+y2vs5zXgLtedux4+pdFxkgM8r6f jZMAoJ5LVNdVRaSkiHaKZWQWsjfTs0/LA/wMHP/PdH4kjFmDRqOPp+iB8YYwQTPZ S/gwHtUbQhLcFEljaxrCMRZw0ZDMbzKWk+BrrBvgz4Wk3XawwUshYgi8SgwWIDG0 jusEPYOs1hBIdWTEzFVP2pK/NQzhAqJV5/390OLEY8SN4bts/LY1XsADzU7lhE0O ohx6FanaZCuGgAQAn2zK53yuk7o8UrPdTHygVn2McsPYYzOvlVfHCSXQ14oXjCs1 nK1XnMIGGM7pJjYpzv/wUZkHLNcHX4uVHXxyzRQ4oMPekncmaR8fu/YIQ9zag5s2 GpKESKAynGQCKwI4H5eYn+ryIgOHNS44UnXFUwbEsonP5pJNNRIM7VimNGm0LUNo YXJsaWUgVGVzdCAoZGVtbyBrZXkpIDxjaGFybGllQGV4YW1wbGUubmV0PohdBBMR AgAVBQI245BnAwsKAwMVAwIDFgIBAheAABIJEEE/SvMa/atsB2VHUEcAAQE+RACf X3AwFwPu5+mr/f1Sa/Wv0m9T57gAn1TBIoUErMqJehQZu73N0u93fqSKuQENBDbj kIIQBAChY8NSvu6sK0p4D0AVBsRz8iVXYqbRlRTZAHS4LCXwx/i8FmfdIXnaNLOo yi44YruSCnlZdh4YWquCx2mgywG589AzcFhahmqElNbKb7m4F//EGIZK0zTgW13t QwG9hTXOhYeqchnOOaDDwPEK1Gr+2o/5ANqhqrin0TFFBWLgdwADBwP/R009s61X /FkUUAh8w4Tua6qndN/2GsqXsyPYjdF5E3gErK8jDcDLniOHqkswV17bJG81czCR E5JcVFLLWQJg9cpeoTpP+YcF+m9whtswaOJ/LPrx888i/OmluSD81VP+6zBhhTUb pazfLEdt3XczpW7CNdNbyiEcgT+6Cr+W2GaITgQYEQIABgUCNuOQggASCRBBP0rz Gv2rbAdlR1BHAAEBta0AnA21IY9iNt6wtJN5HAoYDl99mIUOAJ9M8Loj5fIZq+Mc mtodOBL9tII3Q5kBogQ245HNEQQAis7GTDqtEM6luop6eWsxFi9+qhUVp9N6S+xl bwzQZVA4FjCqf1VR9JX8fwjLecmxT5xThQVcRqgeFVaCyky2Nge/FcFMPZQeaP5j v5GRWc5PvH9Sw8pvGOTB56V4ZeR4cQLDBm5CF5tKu1BCWWq2MLHfct7TXe6QCzZK cjzdw8sAoN9VvrKN+EbQC+THzdWaUWpdcfWnBACFWEyLVPTpI1jNsoCZ00F8Fau/ 2baXk8mdROlJZS6bq54ksfOQQzReBWce35h0W7NeBRp+yeoSf7Y3i0jTO4mrOiL/ 0NCcS8qKNnGKG1irdLes3pQhDZpcUe2G9W3FnGhxl6W5hpYc9550mUj2H3I5tmfS YsVcVjpNSIdBizxE2AP/SI1t6q7LHMQp0h3MPQ2z7daMhUGViXnVl2+rKjb5T7bv SFdV0iyyuyoqvUPBGWwJFLAxj6esHRlQ6W8togHuoJCR7cL2bK798mgYOExk5gBe xq1VHQQZN1edK4LGo2ESKrCVtkYwBzAU76hYFKAbKMU8dMxI7DRdLjZ3vdQ3FNq0 J0VjaG8gVGVzdCAoZGVtbyBrZXkpIDxlY2hvQGV4YW1wbGUubmV0PohdBBMRAgAV BQI246R/AwsKAwMVAwIDFgIBAheAABIJEDGMH676720bB2VHUEcAAQFnAwCgs2ha IgJu/UEpmCEnojO1zCoaBwwAmgPAlNY/PttAu6zYqTh2M9yn1DIXtA5FdmUgKGRl bW8ga2V5KYhdBBMRAgAVBQI247gAAwsKAwMVAwIDFgIBAheAABIJEDGMH676720b B2VHUEcAAQEg3QCeOMf0g3znbc8IBiTrIPUgUz9p3WoAoJ6eRZTZk7z+hTyx4JDc eReQbYlGtBJFY2hlbG9uIChkZW1vIGtleSmIXQQTEQIAFQUCNuO4HwMLCgMDFQMC AxYCAQIXgAASCRAxjB+u+u9tGwdlR1BHAAEBXqYAnjqVBua1ZFlSV1C2nhmc6m0/ tkm1AJ9x5gxl8wCepQomIeTa0yG/AO8CHbkBDQQ245H/EAQAtKXtJo0R/yZii95r m0k0TChnHe+/pfKbJeBrXAOoqjY94OudENscYFvkG9Yi/UnoiCT/CrhH4+r3z1Sm RypEQH7I56W4TfM8+1kGtsvJJJqqIx6BiIecAA9zROqMftQ9lr58kplNSTrgEJRA 30QuQvYUq0AZDtE1Ali9sKrg79cAAwUEAJd07hrdkgrmEl6OEdnTWaQdrpKqhzo+ 5500Lu2VaItTrYGWMaK/8O/Nxsyye+T33UDEnek/hm8qvkIKWogb5ZlrXOa3Bd2Y J8YlvZ9s1JUPjOnXp7myU+vwKn5+8i/b9LK/Cu5E6z6gDNJW+gwDMAZKTfKPmdPm iKRuf4zrZ8LkiE4EGBECAAYFAjbjkf8AEgkQMYwfrvrvbRsHZUdQRwABAY+QAJ0R /tZntf4hw50uZbV8rDnZduPwTACgj04QKUO5SXvC2K+tfpV1FMK9UymZAaIENuOS 0REEALm1DndAe3BcyRxeb6OTcIjGdSVz48jai9jlhP132niYgeeaDJlRD5itSRev cFO2QaaNZeDxCFnD+1kTKrwRBZfvC53pUZElveZMBa9w/E0Z2q2ct5H4gRdbd93Z 5FU2mWMQgyjgXWf2Ykby2uoGfyh4SE382ku4d+htjGwJRpY/AKCkDxbBD4wcimHc e9puf9ibv+HeIwP6AjQCmiR+zfGNxy4rNUoYacrST9cgvRiY7XnN7oM2Egu0Sldz SXAXgl+KJtyoYg0jemGFSAn+MHas+kwKHKKj80drexc+vrqcSIIeVhp5wrNnu7jt Xl1AklzjX4gxA80Shk0I5Hb8BaPvPNA5IhpZ/6pka3CCwOevHcDZzqwYqOUD/3W5 KVAYahg69i3IaZKGMkJas271KVydcZX2YptY365nX7JPN3RN4gc75k/AciGXDKKg xB4pfeS5iad6sNclXgKT/2VkftF4gSxBfRoXADnOYoR9gAkly1okV6cjJitv3q07 0190JAHKqENXBVgsDTQq5YMnAfOB3ZuRl3Wo6e3AtCdHb2xmIFRlc3QgKGRlbW8g a2V5KSA8Z29sZkBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOS0QMLCgMDFQMCAxYC AQIXgAASCRAWhBCkj8KC5gdlR1BHAAEBIuMAn222gK7ibwOXzIKd/gZP09JC/3+e AKCOelaqqYqNNbku0gA84+O7d1kMqrkBDQQ245L8EAQAtsGp/UnA1y4AqjewlkkT OQevLwtzwm3pmLLjl2Y3TfGn8Ni0h8Wd27kV32MUZyTaNaZuDxpDEO2aUIpGWVQm WvlqCFV2F0Z2AI8R4bx1tC2kD758hUvR+S2hn9lK7E1lQPuvec2LEml+uvVxW/Vm 4iDBgeMlIlz70MFC9LUnfpMAAwUD/At7Clo7D4dNk43BMvhQ8VgJ+INy37Dj8PHX 2sCZZ/tIfSwNIU3m2ygSVreTlDKo406v6Qmefs/m9dH9lsBE/8QL40Ek3SY6xV/Q zTVN44QgnpRKWpfaMbGzWJVXeczlNkTeIZZo/nhDm+aMucMu/e7EKbG64BnrQk7L z6LSKb2xiE4EGBECAAYFAjbjkvwAEgkQFoQQpI/CguYHZUdQRwABAffsAKCJwKTp e9OoS/fhFdVKSF/4RwMc4wCfeSuo9zll5IkZrtF9FxWGblC1y/KZAaIENuOUsREE AMhuJkVEGWoIw4JdMQJ2kmywkOcCamKv7J8ApfiGw5V3KB6l0DTvUCazysCkAFL9 zb5O5qmVp3zD6LJCzgEq7Op5Ar9haPQMOrJjYszuolu8V3qcL8Y4aOIS5xNNKBjw g4VJwFNOSztqUwaMcB1bNKOr7WmlYl5NLOnThQqFXX/TAKC44hpSv9wxVqFK6iIr hN2i34JHXQQAq6dbJydQbYhoZio7ewJ+kKHOS1Z1ONSf0RIkCMorVBQLz1/n4qsw 8hN1Q/Kl/770y6YGQmL7xHQZUnzPCHAp9f0IeGsPSR87rykIPFnJb50PM6v+0VfS e4f2kvyiIQySKRoYumH4343Uiny2GH690uE1SvcQ9GWtwB+/5a06lvID/36SlrvH ycifZKh8mKyP4+MpLeUCgY97R46gr+xUG+BWPLcZzd3y8wbb2v7ZZEikbC6G4sY2 VBhfrkEdXUwr9ONi8WemhFKq1MrcalHNOaQkgLxGVfG19h/+frpUsHcShM7NYdjb 0kwImeeM8yhoxzZhIrXQGjw//bucXQIqjxcRtClJbmRpYSBUZXN0IChkZW1vIGtl eSkgPGluZGlhQGV4YW1wbGUubmV0PohdBBMRAgAVBQI245SxAwsKAwMVAwIDFgIB AheAABIJEB/o/G8EJZZ3B2VHUEcAAQFaWACglWew3yvov2GRshLtfA51qtIsZYoA oIRsA6DBoC53p0o8koTGftRHHpImuQENBDbjlRIQBACDDIJP3vJbFfyhJHeP4zSu MhY+YsvxWqJ/NNCNxlMxE7kANgE94HrUfhrleKW2VhP/NG/YZzVudFCRoj9fkl31 bWOb0/Kf4DRcJ+XdDv6at26YBUSZqGsE88fEhQ8AlTxxHMDhxNo+S73670QTsilN 9ra/e+q4vlKMLdPvdi7gOwADBQP9GKPXQ6oY0dlKDXGHxGcFoUR2miXpz9890G84 yZAEm+R/OMQkxKb9HahLVUyVKCKPC4eVY24gsKJOEDy1Um0BXh6kym+zfej43r5G dQqOjqywjTnD0b18YAsEhm7rizJECRLrZ1y7tAziqrmPeCl14e/S2u5U4I0XhP9V s24HNfqITgQYEQIABgUCNuOVEgASCRAf6PxvBCWWdwdlR1BHAAEBCXgAoI5oimsZ s8ZKmLb5sPB4AZzngCyzAJ9og9spt3EYXAB95XmfzqgJBRv04ZkBogQ245UlEQQA nKdAaILozJ04V6Z+FIwQEY/aF4EFrJJIc+uewF7ukZl/7uUZqSxqmzZjbqigyMFG ybJSMa6TpwN0BKG5CJe04R/mVCIRsz1Jx5YXezN3UFsNVNE36R8l8dxWG+wgj2m6 0gu4VlodcpVMc/kRiSUgKUfg/xmPnRe3SJZSlG2lBm8AoNc/r5DW86om3MHWK8Ao yhvVXhWvA/wOcjx6gfTTKftzpQBhOF0U0fC3npQC6bvjLjTBhQjC3WX5rfwJqMmr udRbEO1sFqzTOQPtb9xatMeVqTcOi6+x2zfXes4nTfi9Lgq1z8HhE/LnktwxZxyP eOXqXu9N023IyQTv7mC59C1xMZk4POOv9WZUGz4C85s2/9iTJCfkMwP+MRW0S9mH misruCY6TDVFc12KIFMIPSmWav6gW6bCAA+wIHfmcSyR6MHiLV2gtJ0vQuqgyWfe TiaxPof07dg9pZsV7Hk1ZUhEmloeOcfZmwtHkRhWGEbEsd89IWMDJlwNJ7Y9JZ3Q vK7vB42bQVvyhdFQdEXH0slvlvsgKtCcaOa0J0tpbG8gVGVzdCAoZGVtbyBrZXkp IDxraWxvQGV4YW1wbGUubmV0PohdBBMRAgAVBQI245UlAwsKAwMVAwIDFgIBAheA ABIJEK0bD61DwtDHB2VHUEcAAQHVEgCfWTFa7EbAJLX6LsWnVwXPNkIfJwsAnAmr 5Ebu7H2xASainZXaYp2MFmaSuQENBDbjlUgQBAC5mWLT+9huzqHUeEX0du9EcUx4 +ND31KTyH91PHs8jt5KowddiHQ9mCFyGVusxI+d6bF/AxsmuZ0r1Y3RaH0ElR7bJ wfx+1RwZGjkJ0RKCJx7OIXpWDg9DP0WXG0SG+uXurxHrLs76PTdAAkpQbAF23njS hnxhgqIO+BlRnGeh5wADBwP/VvZ9jMCe5atBleFdBDhw1XEwFUUodJwfbigVVu4R YuAz+12AX4I/DZW3NtrzJJHUrzRVKCxB+zqfbDIJV34gjyUodNlP+l8gIVw8mUcq ziB74k2fUhzEECKrRBE1bmEZM70p0nwwVatafYFunmTfaugDO4JqCiJ6UWjgxUVl Ow2ITgQYEQIABgUCNuOVSAASCRCtGw+tQ8LQxwdlR1BHAAEBjv0An2hrfDXgptM2 7LJjq12er/cxZPMRAJ490qYy08qnpp4h0ifShMyCiQnYg5kBogQ246LiEQQAip3H OFHnnO3VmlQEctkpjVbn3knp2LOALCDz9L+fYxJeySNK2/uCWyCaAM1v4XJtuhkv 1G26UMIoPPz4DFFeUHwUk+AhDpX+/8dmuBypPbQ1eAJ+6tmja9W3lvrcMX1Bllle SNKNW/4ilZPy4kEYmjK/KSV2Nuupuv9j5/S5g7cAoPiKn8fILCtj2Qlr/O7hCgDi 8x17A/9XkcS6grdYU/fIHQy8pEU5SN5DKuhCtyPs//KQyDA7jyCatXjOvGHRWa/L O4tcntUKQ5bT2B4Fp1Au997owCgDXcsm5tx6wN00gYxAITX3LvJ5K1aK7wEkFAwi yWrVkViU1Fazx/hlyFzAPzouiw7IDQziWp8M87wwgpvIVkKlvQP+MWAGeDVRa0Kv ILUDyVrjCH0hUr6WVjYEIGGZ7Yl0lBmDlbNvE//O0aEcdNrbFQ8NjwPM+vKv10bj PTXXrcW1F0BwfXrMxS4t1tYnbF4XfwuEsok4BBVxvGPLPeBGnYJNTwGBzehnd0mO 45nr6mBlS5gae6n4+WPV0jOUhNE4fny0KUJyYXZvIFRlc3QgKGRlbW8ga2V5KSA8 YnJhdm9AZXhhbXBsZS5uZXQ+iF0EExECABUFAjbjouIDCwoDAxUDAgMWAgECF4AA EgkQ/hgLHanjsLIHZUdQRwABAfruAJ4iU4M5s1xsZiXa0wLnX4FBBl9abgCfflNp wyEp6KEhKCPWwPRG9WJc0qi0DkJvYiAoZGVtbyBrZXkpiF0EExECABUFAjbjtzsD CwoDAxUDAgMWAgECF4AAEgkQ/hgLHanjsLIHZUdQRwABARrhAKCK3IrzNqME6oA3 RllOrx87OCIRggCfVkR+Nf6N59lS5j7jMXOuk799fQ65AQ0ENuOjBxAEAJVJ1fFR aXPzUWOoeBHhvUS2aGZbz0Kamwd8qVLCVi8G1sH/LtMUh+8CvhkVum6p7Dom+2Mg Rmhe+iVNbAdU8QWS4bQsBrTeiVpinMLpkEO4uRvT1G6QIPjN1jrHBsAxGw7NmC/n 3stle04ssueY7JOmyNEMvO1ay42CWbmt985PAAMHA/9LJVm8UR0RWfn91BOnt4C1 d2ttkQzfv1y0InbrrdFtNl3nmUgF6/V9OcpCS8NNjZ7nzIhDgT43Ov32qD0LJ/p7 c6EStNSoQE6G6wGB7j/sTkushUy+joAVT2qCfRKCye7/DDa3FXDdcSOovweCX7hD /nthG8k576rb1h70svx5qIhOBBgRAgAGBQI246MHABIJEP4YCx2p47CyB2VHUEcA AQEyuQCfaXpOx+srd2RwCfu55+7BpsWMW+QAoNSDRTeADM6hFI22edSk1XQL8ipU mQGiBDbjo4cRBADeZztXPNYwpoIf6BfqepImZqhVd2qXuZBJnEvwaFoAl7er42pX XLZhWIu7/gWODfcyNxsUKgMbeQ+nWO2jdcZQtt+gmRAGl1F5LbxsP6aRw43W7PAk bmYgPY5tY/dhgFGP5puoV9mhijpFcK/cjeg6wNgmjuEsCv8BF5FX4/p2swCgwmgc x88EpJF3/EDrTk4/8Xr6Z88EAL99JWgnl0w2TNiP9T3c5mtVdcYs32ntJH82TiQQ 0LR0A7zRY5ruojNZC9LsTht5K69AJakrDA/Fu5mr2xYoFJcW4b7rpeKUy/wYifeO hYY5T2NDYvaZnQJXZ6O8lGLFgAxCmnZEN4IRFahKs/gAmG86d6fCvuSrohSZvQ+L sr06BACFT4tjfuL6MZ0VhsClxeBPny2AM10+bDDM5eOl5ODLN9Nxf+SRu5AdIojz 2OqD9Jd55WobpUXGzTI+0g23636IuJuH7VGCF92nFwkjdIDblRoqYPAsJRkMiC4F kRaeqF0DpgJacYSBnHdY3Yd7I+cvgkK7oBjzTiU/Zs5hZAeK8bQpRGVsdGEgVGVz dCAoZGVtbyBrZXkpIDxkZWx0YUBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOjhwML CgMDFQMCAxYCAQIXgAASCRDrqfJA653J5gdlR1BHAAEBriYAoJdBwMXGVRTFlfw1 u4XimCRPVFRNAJ9WFXysx0ugWaIaLJ3tyNZQHWoARrkBDQQ246OqEAQAj7WdaOJj zJNs2G8rvrDZvD/uaALQ9PtdvYAp/Drp7xMH5T62+KKTlKdO3s8IQBPiuFocJNir 5st/nm8Xl+gcOZOvtr45c/cl54fGO1gOjBZOfgbkdBVK/LMwuQWIebK4qCZnAOlD LYNGVUguGLnEQBSfnhhkgh0WA0kqt7fYvpcAAwUD/3cOEqPlMdYeLnGEG4wPxtyV IchwGOv0YRW5apbz2fdO7otj1AFUN5WzFw0A5+WHza1OIUhg50Zco6HnwKx6F+Lb Z5aOc37EAvaFgPuMxBfkaWYagCof3jBF0CbTWUXV/D5/dFmIeuGTuUMNsGVH+OSM W2hBN/7+aJK5LLHL+hzpiE4EGBECAAYFAjbjo6oAEgkQ66nyQOudyeYHZUdQRwAB AXNNAKCaviZP/A83ammDnHvkTdxefqoHbwCfaE7+GAg+R/+tJLJ0DvZllz8xYzqZ AaIENuOlJhEEAN1bOV3WXINYOoY9LMY6x6FfJNJrSk59VMtySkmkOkStyfyNLxwq teRVSjAjtKVmE9GZgj7mmoZobkVnlUl3VN8paKFzs74kMegrfJqY6eHo4VAU9lQX X5aUAaIVctz5Y4PNuA5IzL/zJcDqfTN76/d63mf0rOJvewMaPDkMyaJjAKCZTCeh +qyQdW/VLq0ODTyZcAsoowQAhUbJ/2KPcHM1vR9VgZQ4tTTuepDdGk1A9oq09CkG htGSdD9lJ3O6IAtwIH5Drrh/VwoYD46C2bQv9/XFSYpFbetP2XMy1wLLqRy50IjY 4eb+A5w/MqqOPmiekPzh+BHgF1ux6FPz66ubEWIr9sUUjp4LUvl50FBxEuztMXaN jdIEAJ1fL3IeDqINMmHKy9HtS4tYT/Wz3KyKuFmA9vS/IgXAd9HMz3oBgg+ktmv+ O+SsNrBPFgZ8YhmuPtTIZ4+7tEJ4VFVVfnkHp682/d8CpubBDUYdNftYcI10CQ/T vJPFn/Cdm508DNDBGQR9nf1N1xxs6Ed8e9u/dE1DRXFta1BStC1Gb3h0cm90IFRl c3QgKGRlbW8ga2V5KSA8Zm94dHJvdEBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOl JgMLCgMDFQMCAxYCAQIXgAASCRDUv1fzc3LiQwdlR1BHAAEBdy0An2YZaL/VMei6 H3kreYNoVYow3V9IAJ0XO2nYsUNoaaa7+LzaCr5rphfw+LkBDQQ246VQEAQA31Qj 2MGefTCoF0x+D+9UMxZ6RuBPzI6gzX1tzcUPWYy38NIq+lNYBg7hLFkUfn0uTsAm 33h2Q8z4/DGT7jmQWpoIg7yNTr6681L/gYo5FhhC+qERZ1iPMyfMwwD7rrz9bthU GTqChV2h6NiPUPM7ic/D9rxJICXy8dsoj0dQ6dsAAwUD/0ggimQTUCGmNHHypor/ GY0XAAL4Vy8jAsC0FH1UaqDVTrTDH1qWLRnS9uxEsOJIGSLMSdxC0FZEYq4jCm7C YjTOHTHvvYDbhs9QhvW9r4VD2efbERFSEYMiH69ASQLGDp/O5kOZTgQOvl5oxzvs rOMaRFSWcn66uUAMORmHKz1giE4EGBECAAYFAjbjpVAAEgkQ1L9X83Ny4kMHZUdQ RwABAY75AKCVZupUbMXq9yw03M34RS9YT9MzKQCfUgFd+Fn89xqU4Owg/MQzYlLr eUmZAaIENuOl2hEEAKeOL2pIdZ+zQtehxdL9l/uDBFSTuN9rLb8DgLiw8Z9j8U5C EH/M38WzH1nHKKlZKjGVZYiyhRfAG83wvHnT83lq+Ad0lgaZTR4z6nrd5ViOlHPl fqo4RPZPzPe+uF7EfDl792sJerXGAasLosmKnxKAyJyVjh7eZcjTS/hUhO9zAKDV yLHJ/gQlMYk8vE5XYL7Pw4d28wP/VsKVkjlxsXpcrCQIoKeDXgKNVv9L+0Pebspz r2WOah8iBN1QOkbtexIKCbb9mmviEnJU0FFx5MIw4mipvY4EpCaH3McGwJpCzWmd zID8Z6oISUyKsuP7PXjmASbogV6Iqy2m/2RDtfbIlbwotfbiOT9Tr3IPbH+tHAZB yMRyvxID/RN90WOPSpODxr9AH9btmeJD0BfNt99116+qdwvWrTofcbkBgzvB34vL LDaMKVIyinxz2lYyC7aSpA3uzjZvoPvPrQJFLE0dx7DSkUTtWbQGByRabpyrXYdK ZzsFXLb+LSTWwF3sQLax0C4cYT7OLPlxjDVq/A0jgztaZVWa37IYtClIb3RlbCBU ZXN0IChkZW1vIGtleSkgPGhvdGVsQGV4YW1wbGUubmV0PohdBBMRAgAVBQI246Xa AwsKAwMVAwIDFgIBAheAABIJEBPbllU0xuPxB2VHUEcAAQHs1ACgyFQrt3yZbUXj lCnC2luf8R1K6o0An3j4ZVjoau0xsDzKtkd4PzNIB52uuQENBDbjph0QBADOk7pS 4JZak/26nkZWEs+hIIF9IgD0labkCnr+GNDmGJrsJxLwTjU+NoaXo+SHmWPaqRJQ Frz3ZJfJAxioyoSr+Hv4Fbv6frZIJEy1g4dFhk8DiG+zR3uPOcZCUyyW3HupqahU 0/RcX7CzXAcuPJCXeoyeSsBDyUAk/6ODs/kerwADBwP8DrWpAtFexIWvsswGdpRJ HSjr7j8cJ2Hy36acB5AEMCSd7kNM+LCrOqyOhh6RfokrvCT6ZuwlN39nDnkmSr3F WbqcRSj8khs3tw+Uyp8ItqhL621vFn180I7dZM11bECv+YZlmIF/L3JNzFR+jmpO DR99bLjQI0dpUqT6IhyS0bOITgQYEQIABgUCNuOmHQASCRAT25ZVNMbj8QdlR1BH AAEBJmgAn1Pl0Ya/1IL4AnzJTrYWN9u75SN9AKCcqVnhi7qdg6qLmSBpGPG5qQ68 /ZkBogQ246f/EQQAl65ub9rEKS7XsXwNkvGtj1K7gnql2H1bJ5GF9bGCWhWmB8WF tsAy9XUeC3WbrcuWFgTsbtTfXZ5I7j7HSG6ukf6Ycusb+bA1IoT+GAQGWpFeWoXe 16wXZFl0pEc2iUnx9ThtoQF0fO5YlbvHJPEQ3kvoqcdb52WOOfOuCAJxc6sAoNqo 5w0YxgJ9jkj7J4cmR+OFUEKXA/wO0jrvYE7eiZeFUjGNiRotxzhTzh53rxtz2/DW G3D+IBFOt4qqxxp3WCSNO5SnBZWUW50hDkhTxS7jSmsfPBmCinmQ6EF5FaFPyLQB q0uKwhMaWficdrQS9syXFlPuzQ5jOS3kVAxOmtDd7CMTC8892dj02qzAE46QNNUI 91kZXAP+PINfoJ8hV2zvlGZ9tVlo+Lgsl1BOvxvEgmYV14gyTmMWga5sNq7TdMdW i8Fz0Vy7sI4S+RMJ96rMws2iTzWLi2jGO44itoWttCwqmGJmlSWurRsvYhSBgvNC LXFGGaQn5ncO1tqKnWSDf625UnAipsgW8P4Agd5qJZiwXfJ67Hi0K0p1bGlldCBU ZXN0IChkZW1vIGtleSkgPGp1bGlldEBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOn /wMLCgMDFQMCAxYCAQIXgAASCRAMggxx0mmTEwdlR1BHAAEBQPYAoKRB8Ey3Ny6T aKaGoL2GNFQEwM1MAJ0WblK0ScSKbm1BN+2hfDmmKRkgvbkBDQQ246gqEAQAkdlS JYfTiZH/CkfV8tnhI6IDz+SgiZKcneEBnO+hAJottARGAojdbURlOIeZqRCgKpdT XBK7MdHAz4RKFnAAXPDBZgA5q+Coqn580t/O/AKGb8kKn9n52z9lC8A5KnHaRAsO KVyPTIU5vq6FLmsWmMB55iz826Dk9kMhV7mmdQcABA0EAI8Jq3Jnqf0HqqaX7CZu NKHJgag14bTaBw0niZK0KSB6FBpzitEoyst5JBPCl0ayQEw0Hn4jhZAqcZybI//p C1CNQBBO47VUi0y1UVjExtaNmmWxugzkzWHHx4WmyWsCQwGN4B9riUws4g3dgC00 7l+aonKzj5QEo1XiiMNTFFmPiE4EGBECAAYFAjbjqCoAEgkQDIIMcdJpkxMHZUdQ RwABAY+uAKC+sJk79PGOrcXpT2/F1CqWssOBcgCeJ3lY+tmSH3V/eAz5BdNB+ar1 XhGZAaIENuOo3REEAMFaZuaYHLD67UlMCLHGPk1dFdAn3Mu2TFFDUYfEtA/JDOiN ZacPiQSZ7zK+wVe66Vs9fzNkyeXqpwLzC35vkTx0K1m69Ave9LnXIZ70zvpVEL/U eCuITRiocxNglPgn4dyJ+2V0cWJ36NGcZmkvBW0vGItpYCbpIGLzYVOfiVUbAKC2 Nze79Iyw+DKU9HI39B4fz85nkwP9HbIb9z5kXiRZyCaXOMnFBQ3bAZh4Og5ZQxdL yZ/rIX4Mu3DGjqg6UtosdVNHr6ofZWHPXNqqTUivoUmOS5Qa8dtUW3YGa8vbpK1O MnjMLhQVJZg/eou99s9OFP5GgPh5r5Vw/EYQZ6qzS6YiYnqzSt5LcolL2+Ae0ajX Uizic/UD/0TNXtCRfkS4SeVSkZXarb1oZjHdGlw6ENiLGiA0e5b4r0rByW4EQQGZ Pvg3DFXMjqp0lVVmfmXFPggLkbTP+SJ1/VGSC/wSqPkMiKSCenRqwHwWIdKxv7f1 3hyeTZXR7P8uaSddSXaakqmT99v6pdZOo8NsVQTx3PzPKpEVciPBtCdMaW1hIFRl c3QgKGRlbW8ga2V5KSA8bGltYUBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOo3QML CgMDFQMCAxYCAQIXgAASCRA3yrUft5ED+AdlR1BHAAEBilwAoJGWPf8Pesitjoqv zFLPwO+EsydjAJ4kNnkh0+QkOBvDz72Hz2bnjSPT07kBDQQ246j1EAQAp/Ccn5Ez xXIGljKVKZ5Pp0xJA3uBoQBvXzu2pU4HU+vmgwnX1313x+4BsHVEbw7+lfyhKnDD 0TSwIAHj/xeE+jraCTU8X1iwe49eAyTaWF4wTyTzdZKQ9mrfBnFgdWlRjLALcTMJ aOE2Zasn8wgAEHgi4QWyBPS1il+aFE6oizsAAwYD/RpvJnfv8VqfbCxOYt7meLfT LrvcPlGNynv1nEgNgjbYRGIRzbXDDz+jwcLc9MeNuZgtaXvUbsQ8s0X1dP6vq43V mQTQPlU1TQx10o+YYn73ptyhbwOkyIDGmyf6uFhO0+B5/MY0KRLCxo0lwMxvVkYN d6k804pSJPqwusWBm2R0iE4EGBECAAYFAjbjqPUAEgkQN8q1H7eRA/gHZUdQRwAB Af5vAJ9dQMc2nMpcKuH28xwKl8r7MP3pygCfWHGKFHWIDkUt8RfHAB9geauEQSKZ AaIENuOqZBEEAKLUF5GqBMWJQtBs1t1Sp+NIOGuMLgJOhINbMU6tk2jzeUt6ooNd +c8P0TexsbSETwhrU4ntpvIISb7I8Twhcled7bi5KCABJOzz7Fw+Ydxo5Yjm1DQH 7+gEtPx3n4AjZUfRAN0nqcFizDpRYPqVaN1QYiGWn9yPF3pubQhVn8zzAKCpx1LU lQl2e5t1YJhmom2qy38EeQP+IB45FBfDf5KKtyS64alQ0vHYIssUp806PQorw/ZO uoiscUQj/WeZ4vn7rCdu60uR1EuHpGp7n0t7igEgAOcxDjrxJmpgSdD79V+oJAFL ATo2msj1IklVvJeI7ZsImyPchIU1lqn/GvpAam9N+FiIB1KUMFqTJzc6zUn1Qqag 1w0EAIiRHPYRW8ojd9Uh4Ed3X0daAnClyMWL82t2bj/bJRmhupQn4aVJ5D0pFB9i zTiJEWciHpqiMdsi/zExYYIDS1Zu94+WFbNIxyMFfHrJ5fUQtAqLb7E5LrlxZONU nrRwshqR4X2TmW2mz1Wop542eUQ1UWp4Gr3VlH6giswY0CnQtCdNaWtlIFRlc3Qg KGRlbW8ga2V5KSA8bWlrZUBleGFtcGxlLm5ldD6IXQQTEQIAFQUCNuOqZAMLCgMD FQMCAxYCAQIXgAASCRC+eUhSvlz4hgdlR1BHAAEB8SMAmwR8MsDEfj2z2V/SeqUX i1x+Wmv/AJ4koI/qJXC+EYh0K74Nu9/rPz+wjrQSTWFsbG9yeSAoZGVtbyBrZXkp iF0EExECABUFAjbjt7cDCwoDAxUDAgMWAgECF4AAEgkQvnlIUr5c+IYHZUdQRwAB AZnVAKCoa3Ps+duJ3n5TKUcCfjRvClcTsQCbBWapu2wbWJZa3XE6jajJOPS3wTm5 AQ0ENuOqfhAEAKZ71o2OazL8PS8vMRS+PaRowGBW/cxYo74BuLTIqyN0/RAS35Si yfJuClqEaE9njZsvyRix8mY73mlYfE3qw1frsWZBBr7+9Np8/DThJUE4x1h6MtJ+ qaHIuhcYXyXdW5zowytpmRLnxEDUp9j4QOOoIwi0UwD7sC6YrUki+bm7AAMGA/4o /SkTuvfycd/lvQ2UMViEAYip2B1a9brNlqXaU1eI6QqiTgjoAf4ZQZgmNQtf7abA I9QN2WWpiUVlWaDaJJEXiLWS13xmnKaxm5po3IPPYBTOVd5xFDQlP5ptgUFqefIe DTgr+tHRq+RgKhw8QErT5N/PM28RHchbOewj0OGSbYhOBBgRAgAGBQI246p+ABIJ EL55SFK+XPiGB2VHUEcAAQGRMgCfdcoqwoaTU7rNH0BWaYUfCrQ6TnIAniN+yQaB bwZHMbSaDTBRndjLglsKmQGiBDbjquMRBACteKaHZ7pcM7Quj8Ec8Sx0fJ3u0NdL so5xn9Ek4FWMLBu6jw7b/5KjB2WtXOZSWKHOzeTfUAx79NMKJrD9jZW/0kEAFVeZ pwZF1l8fBsRELR9cxAajE3RvFkgCYAhXsF1Jno+qiU5TNvadGU4SzmP4vOnnjrIW Ty83mtZiwoFIcwCggaaaClE8Q41NyIfVtjS3f+Nm8x0D/icH9uwM3vpB2QV29IIB qazgaFr7vBoogFoAllaCQbPLiyHX1Mk3kEZg5xewmDS/tU4rGqj7UcL9OlZx1ICD 8cp80yNYfoI7K5XM6sYOMmfJORGOEsqMtoYbo3lluDgDkg26DZNynUeFHZRrIWz2 cKqTuaB3dw09m8sJNus3poEtA/9Q1KDsjKPi8+2kUzJoK3V61QglXAVDlfzK6B5K OEZ6GR/gX9M5uyyLjREybFSSNPlvLR11+mV4GR5AcrVQOmE0QpFyo1Mr+uDsbqwk zERvRq1r5pOyqM5WPXhlXa5oo4na1fBEX76IEzK6xIVG07GnNnaY+dlPgsLq4I8+ A20ZG7QvTm92ZW1iZXIgVGVzdCAoZGVtbyBrZXkpIDxub3ZlbWJlckBleGFtcGxl Lm5ldD6IXQQTEQIAFQUCNuOq4wMLCgMDFQMCAxYCAQIXgAASCRAlsA/UMM7GhAdl R1BHAAEBmNgAnj0Q0x8/ArVTURIRhBLli2zdJFwCAJ0brkbdlbR2eGeNACF/++T4 S14x8rkBDQQ246scEAQA4Zx5WDc8LoW2Ctmueh+iHNae6LoVUHN5qLUNnkwwqZ03 r9Ay/V54egw5vfd9t+HADnWf6Q+6FqmvpCpPPHrZEYD+ArWbu+NTY59jFI7rkY3+ tJRc3+QTzeNHse7HgyhxFdn7/yeCovskCPDUtl0nI6eIml5G+tyQ80L9spq5rvsA AwUD/3lWMCMkgBT+A4zC1upOBX5yYd7nYBrUIkRqVXzzIobzqeeoe4vjHFRNNmWP KNtsqV4kP8CHtHUHEGFIQPLxa5O6icRUdXFNwv1iKDiln87Nhl/l+SXV4s1pItvx dkxPQls/TZv/84ykCvb2VxqBrWjVG1a+uVTIhg5ObZFxPGR/iE4EGBECAAYFAjbj qxwAEgkQJbAP1DDOxoQHZUdQRwABASDnAJ47dL2Q5/ft3EzaQrldWSiLtreNdACd GNwpxQVBQTipOs5DiZ2gK8FTd2WZAaIENuOrWxEEAJVonskIQ7KNmZw9sG/oKumq pNa0VIXMHQcAk24hNWiwLJ7jJfJyx+H74Wk89lfwHo6C9NHtvHbgOaK/SYgX5lW5 a6UwCBlrLtAFOrhELFoGcEXbKNzR/ynx/GeZccCbZGf4ZQIhB6IZhqA9/JiTbIJ5 ut0V2nVB++oqzujHL1pXAKDjXh+4tuQHKzKJeDuwWcKhqtuYmwP/SEYSuwBYX4Gk aw08/OD2iLLMadXVimpUa7jCWBkCtiw7hJed0Pnda52AT5Yj241q//RpI8dyuAdA n1lkAtLFJe+2zURaq/BV5I0WXL5AqMcRxuzyBRu+6y3dkokPnkvnaeUIo7rjAvLJ JL0LrsUuniJNIPo4xpTYY7rve2GusXkD/2cXpN+6fD9bvU05je5z7Zcxlxq3ylYv Q7Sd9RPNOa7lxak7qBX3DgUa7X2Pgznm1/EcSMEFf0xJsscKF3ZpL9NxGMA+gCUp sd1rlYuf63r3B/Z30hBw8u7BQvAgaeGmrwBUUDa4aJkgfZUpuXJRi2Yg+J5YxdRB QAcEBXIex4ZTtClPc2NhciBUZXN0IChkZW1vIGtleSkgPG9zY2FyQGV4YW1wbGUu bmV0PohdBBMRAgAVBQI246tbAwsKAwMVAwIDFgIBAheAABIJEF9jVrptlzKsB2VH UEcAAQGwLwCbBT6UT+lNWMh/jxFu/m5Dy2qMwpMAmwePBu7USi6TWKaXYRSL2yyw JR0HuQENBDbjq44QBACdC1XRPM9CMFrgVUvioU7SShffLnjgWBZ3hqbOYrsgtXfu Qdv6lAixnNPdnk/k4mjL8w1pqbjUmfmbppVDxzsiiUQlJatzGDfU1gDc7ksnXpF/ vzghbucy8HNO0SHi3uM/GXC574iZ1oxa/A14fKnCVYT1ThqUa1usC5YQXHm4IwAD BQP/f4LZgN3dbL4jLqXHDNpAIEjiTbKXxDKHOnAof//4SE0mpaNVHLu3nxI57CtX fSI2kMQSm/3pqpTKzaBlM/CbMAJUanhmlLPARDcJ/hQcDtBsF5nFG7zfLfe0SBwg sM1HxL968Vva7WsbYpSa98+3HSDuy9VwphFp7i4HbnCbSK6ITgQYEQIABgUCNuOr jgASCRBfY1a6bZcyrAdlR1BHAAEBDeEAnR6sKjEq2lzXziIuSnmSldBqQMYeAJ4r ZZcDmBM5Qt+2Vp1dmfy02hczoJkBogQ246xDEQQAhBGYmGwmeI2L9tF9/9gatn1o Va3zUb3dbxaFXnWqr6e1QeBQ1jnljKizhcs5ra1L4rzM/pfXkV6xUE9ghBrkEgLX SYCwt8n7WtucYk+40EDZTYygRpHGj8m1dD//mOJNGVjAsNGcHO5owI92yKu9674k HDnfK1HCPB7ub8PU8+8AoKnZ2PUW0OO5tM3uQIXSjYrM/ATTA/sGKZDFfI/BLMao toddIQGyHzg5BPE8j3wFeCrTX3n8DUHX+k+zfnp64qWqh59RMdiFuOIxhuNlP4Dq O651/sDZRzLTcbwcNniTV/W+bOuPbj7rKAYFzFNWvQFrB6ILUPAbcuNCgnVy4XFF DwFgkMYjA+tRbkl2WfNbZslZ93Jc6gP/RLuIRU323GRIqKV054/VhwMIPwwzeG8X 2RRz7WFuaKvxI5n8hgkDJA36P6Zhawu4q1n8X2mqIE1NcfaNYJOqV04P9ljEdUkA BGeSJUbrJyQwuzEeLYs88ErzFpyTTL3aYp7vNr/t+FWAJFKzsz+vNRvNSHIicdLL GvZJhv7yVu60J1BhcGEgdGVzdCAoZGVtbyBrZXkpIDxwYXBhQGV4YW1wbGUubmV0 PohdBBMRAgAVBQI246xDAwsKAwMVAwIDFgIBAheAABIJEF0V4B0/8TIGB2VHUEcA AQEG+gCbBDRkJiuJ1K8HG7We/mr+Rg0Nk+MAn2CWldqwbU0fWlk0UH2TkKCJDRfP uQENBDbjrHEQBADeYTvnxIaltqV+9aElKlv00R1km8mzXOW60Nbc4E24Xh4hvy0C dZR47WaGULMltx/3nxLjQEcK8qOCI7ytJ5okLKmVEde/eV0yG6P8GjzdPELowtur lmy9aWC+ckGq8GyjqMgLLeI4BNTaWVXP69fllKezbhGqYnFY7xTc5IlQiwADBgQA lkCWK/odKM6+yUPwaiPL0yrlV2/gyAUI7kszey72oiKjKm/WXXzTZmdQLb5JaNgn tlTMpYkM1Uk2bhyUG36w0wVwX/kPgCDYh3WRAKHcwbw7+qe77E56D/gNm0vJesa1 jmyrdysvfhlA5Klt1rmoHFCqIEIBG/xSnnPhnoMEoFGITgQYEQIABgUCNuOscQAS CRBdFeAdP/EyBgdlR1BHAAEBk4cAn1I/jmu7FSgglh9aPmVYAw7HWQMAAJ9PAPPX fqtwza6I8ttGPLYNvEAmAZkBogQ246zREQQAgcIj/Eo8PrIhEaxKcjc9dNb9/0BZ 3BxBk7x9a7HKm6o0/vcfLH2XFjFxB4Ddfe+O1PC9KNUqIi6GTafGbyqS47XsnOJs 5nvsrgmVpUUzAd7p0dxcc2tJodwhkH4GtOP4i4P9XBrxngQrWQ0ju333EPF6wLWi 7qkVyGENCfsvktMAoKYgM+XYh9UQe7/HX0GiCnk3ExVnA/4ryBxdyBihj02i6s8v Ae5mlTrwv85ugouSB95XEX8GPfvaWIW/TpUWQ6a7o8YzU/kIPa7YzETYX8e/FVr2 Zd33HAfeLUNp3OS0NvEbYJlGDfW7/X7qLVv1o5WCjCHUhK8DCf9Ax9b4z7CbRHpt xSE4U79NCCOsXQsObV28qlGsFQP+IIaCh7dTqADw/nBmfuXxepPKXS6Xdi0to79L fQtr+TUtJOEVGIbqqQBsgESFiT5qR0W7qhOnl47TIQyPQnt/V994QwyAGtIgtM5q YFRW70g1FkyDRX57PzTMuU2BjVI6mHkaUkLaLujbRXiQFm8IXJ4rf297GppKuSgv Ncr7Rmq0K1F1ZWJlYyBUZXN0IChkZW1vIGtleSkgPHF1ZWJlY0BleGFtcGxlLm5l dD6IXQQTEQIAFQUCNuOs0QMLCgMDFQMCAxYCAQIXgAASCRAcZ+wTPGYchAdlR1BH AAEB0bgAn3zNLK9DdG35j4BV9rDISiiwUbkrAKCYzKPhFiFGVcpYI85EHEB8I5gy 1bkBDQQ246zkEAQAkaLhP+OtjkG1FMzSmwCd5DK3PMWAfj4uKBRcABvRAMA6TIY1 9Yet8ckhLsDc1z2kxYB06NaBIptjKvOtrRJDvn9KQjn79Ll6/YWmSL4dijtw2BVe dsImshjuTgMAy6eo8n0kJRdzzxbEa8pXlvjmG2oI+dXY+Cr4AQgoPloZ8uMAAwUD /347q21Rt5jZtAdF1OGXgdTFDDiWBg3uy2AZmxscJzTLqWfUcX2+UThOXocj81H/ w5q5Cte3z3zx2HTf1A1mw50B5FZOTg+BK5erpUMblY3DoH1u9E8pd7nJ5WY02Xoo RIHMxyrzuQA1lZnry8onYmKHE8dEDJ/HAavYkqRUXRL5iE4EGBECAAYFAjbjrOQA EgkQHGfsEzxmHIQHZUdQRwABAYiXAKCU8v6RR73fcsQGGQWKe6ixtpVCDgCfUZaW 46Lt8G/NbxPkHr9fhkBqWlWZAaIENuOuOBEEAJTQ6NWgLfYqH91SNc903oci6wSE eF5ikUjNgcdNgmYUESMGP0LCulgaMZSan4FLbAVLn3M7YyWlAYsauaj5gYF2Kjff wfB2bxtp5Jx3Yqiq76haQKgEybZXHFtLczySrSmk27ZDkQQ7+obLBWtWl8EzeyIz eZyyNVofJbL5PUirAKD+WeCA0iv5jPYehT0bALAGL3ffWQP+NFMEC5dOru8AbZsa knRf/OpIwtJFl/CdmPbyHHojRIhPTJlTXGCCsCDNJsHbhedBJLFYxHYFlCa6k90c 7SXzE+fkoJtijgL735mymvEReDT0q1Vww6xXqpOrjQ09I51FE0BWE45OD8YPSpfm v3O0Hnuql5+ang1/Lm2ajdJ6F9ED/2OR0oIutlGwT+QfnuQahPmS3ie8lbZfdPTc Ewq+ylWbdaN2WtHQmLTKLD0/TmwIwmp4Up7hFmt4bqLrToKK1mlEhFumN8wSrzfz OBQO/tUYXvOoJ51i7fqx6l+TPGP+yU3K7oDbUdOAxbGIGuQNegi7Ew8UpjNkYL6c IdeBba6htClSb21lbyBUZXN0IChkZW1vIGtleSkgPHJvbWVvQGV4YW1wbGUubmV0 PohdBBMRAgAVBQI24644AwsKAwMVAwIDFgIBAheAABIJEDvb7bF3f77TB2VHUEcA AQGr4ACgllMIBb4leDKz61LQiA4TGWQp9+QAn0gF7rrvXtHdEc9kFQxgfASZH4RZ uQENBDbjrmYQBACJ5res4tXRZj36s7P4KZWUf0YC8mtLxxeNEXe5ckAtn8gMfcSQ J4Mei4O1EBvrKZ9Dz28Emv0FmDd66DUd4ybRIk1PN8kWry9UuGLAf/VBAkMIyXhY CEnB7wRsNj4kF5DhYiytep2wekPocZO2GAUoIyY2yMNb2m2g2K8UnK2QBwADBQP+ Ixih3o+++i02Xwi4wOe7aro2xSeBmH9b8nEaJ8v8RVLRO0AgoR4GLzKeTOfv57FU 48tlY7sxth6FOxeJaQkS1nD1LRpb3GUDZr7qM/yOGYp0WhdRgGW+c0eYa32g5ajq 2zn3+H1L4yrmRSZM4nmZ5ZXe9ijkGs0UNYqmi0gBYxqITgQYEQIABgUCNuOuZgAS CRA72+2xd3++0wdlR1BHAAEBSdEAoJfp/f+ZWcSt5YKCitR1mHyGDUsSAKDsVRYK 2fcdY7CA7DHErM6z+tCb4JkBogQ2468EEQQAxS2TgAmJc/eNoqkiFuLcHvdLZJnr usrMGSJyN6WnBaToud2wKtsuwhawN/x822KHSv0Cz7Zqt8CmQ2XC4IarVmU8YYYR /Xw6o/EW+eCFURsN1yiw/hsibeTobayAVsyXrzEAadO2RLkZ/Pje5O7Oc/N1mcZs iM/S4GY99mToZbsAoOGLiG27Gvdj6532XHVtYz0qpS0DBACJFgebrTlFlUGR3OV9 jHUjCCf+XwKGrcyw+t8EyyVqkGerVqfb+cRA+a4h170LoAs3W3TcMekqifHZeCNh XPymC3LYVTu3FJKbYQT73vl1enei/hN8PUrGSw6XvvQ8DOLEt82E9bWrgDZwSu4a A7vioRff98BrUnSdEoOCYD+aBgP/ZNJkoJoUehzcgdCeTKCYbPNk2lVlXb7WQgHx naE2j1XzU9inOVhXxKUbnVqNbUbd49y2Lsk4g/oyq41RthHhM7NnLUOrj5WqpkIH p854govjQgooCgwwNgU0un3NxP6zr7oNM8fbt4TVYS341CMGCvah8L/iIBT+eYBi ajjGfti0K1NpZXJyYSBUZXN0IChkZW1vIGtleSkgPHNpZXJyYUBleGFtcGxlLm5l dD6IXQQTEQIAFQUCNuOvBAMLCgMDFQMCAxYCAQIXgAASCRCl5n9/o64+oQdlR1BH AAEBr38AoKHr1J9mnwnVtWy8G3EbOZGKzNRsAJ9OGOK9eQO8rWHTtj2sUpEieIJ+ TbkBDQQ246+AEAQAuHHJHT4loEDZBrwJt6vBcc0S6IOvP43374/DL7fvl0ODYpDt FSfHs2JFXfrxt7+UaB0yEsp5jFmWY0+emhQ0g2TzpELNhtKmYABIE6cwlAXZZ1Av Gax0k0kIwp+x7UdnKWAglAZYj7WrQ70tzHtV3UXwYV4m9OEwdHIug68xUJMAAwUE AI3tEdSDZvRpGSgM0xAovpVXou8G15J+CRep/a9Si+aFC1RfGhhzRCdU8I+5Lqtp GnGI3Pw4uCnREkU2TfbM5WZza7rwHfSShyIG3srHp3t8kYcvmBWql5tTLVgncMGg 4g6BwwEqZeeUbbgisc+rlu+6oa2fBOhkQ64SPdkfPA25iE4EGBECAAYFAjbjr4AA EgkQpeZ/f6OuPqEHZUdQRwABAWsJAJ0XijmoDUP1Iu6lhsSlmGOiNO/l4QCff5G6 w6Vkq8d86Ev2IwS9Wf4uNmaZAaIENuOwChEEAJDhTfBph5G51alEDUaIfFvD0K+o XDXqDB7hDg3stVIpZR99d2bo/dPOuVWorwXFBDJeK0c7iJEQrMWKlxdqbRGkH8pa FSnL5XWo4xMjknqnJzYu3gb734ioFHTC4WDM2/voTGuFpLw+eirW+wl12wusHpnN kWxMEIWt2HoGTerfAKD3JUBraePb8gHKnXFzyEu8RLp3swP/XaAKje+NAYeqhcAq xv2SEPUj8EMgtX7SDkkyDv8wuRfcNwMAt4XwHYnnM3bpUwWj2JcDGE9rsNna/HuF Ajz/2lrhUKncH0CywvjhYtt1t92j0cPZaeR3pY8R/bm8Ns20tiP7uxVlj+szI2Pf 5KiUHhiWHJ2RTXGE2pUmT6UFhc0D/juyZvINKwkbUSSwpKvsoi15d6e4Wx5PZ2mA rT5y+ULitBx4WKIsXV6UVVaEBNaBe63k9cFGdPEba/HflSd76kLmcSdy+Fr73d3T MIrmwAKMVdKjRAEc3l87YaPd2/LdT+TWzCQw33EotexJ7yZzZA2SJx27/jyIgXkW twvn5UCMtClUYW5nbyBUZXN0IChkZW1vIGtleSkgPHRhbmdvQGV4YW1wbGUubmV0 PohdBBMRAgAVBQI247AKAwsKAwMVAwIDFgIBAheAABIJEFjLmkyFqB84B2VHUEcA AQEk4gCeL5zcIOEDeTY+nYJaAFIVyxMDn0IAniDLX638/CT/T3nLVPqDevBFsTTN uQENBDbjsJ4QBACevTDY5y+VRfsTy7YLx0kYiPvBFTmoNrPGHS3Dnn/Jsnf8rKEI V+yvZ1nYTtnDpi9zW7dZNN/zacfhL78gkVIj6oGLdOtzBW23xdrc+jtwjM29LRsG Gp+Y45clziKFSUANHYm6Sb9AL5/ps7whkENav/sudPhLAQ+E+hk0wVvrewADBgQA naSI/d7XMz7MSjaLaOQ6fLUiDKfSxGK7DQ5dD0HrnrOnTYbmq0M34heGAt19CqCr JZyQ/gEsMng21CgQz8yvb/uiPeHTVeltTzpHVAVA5eahbDervKoRYjB84GoKVIXQ DXixd2NDBp3JptMWxbibxmfmMtb7Wwfg+tWMeg0TPgKITgQYEQIABgUCNuOwngAS CRBYy5pMhagfOAdlR1BHAAEBCJsAn2CeDRsh/7JwAcaMa8rlXIi9wsrvAKDLSGdt tgPGpeFytA60KiQJyGZRfpkBogQ247GpEQQA3rbWaPIEzk69ZyV25ObCX7lUkGjJ m4C6WaTLN0OwvoAF9F1/kP73Lh6fsFdjatEuL/sOSvrMQxeAPFA3/qvhpjSjAOVN u4ZHA0LxOPBGFIIXHVio1nhcJpiTm9CjKGrXXoeIj0+I/KHBsPotM+qP3tMtDlVr FLyKqeImT91JZzsAoIDquRnzyTKtyt3DQ951OxjkfHtRBADHIB9PaOvB2428KcPn oz7isFRWt+wjl/+uRRfDzjXpXquzK92PMiqmyyLCFg2sa5X5aW8jM/0obg3TVPII fprH8IdPkTc3RD5qSQglSTnWTuOnLnYG8gEK4h+z8rEm4uwG5qZzJe5EK7oQGVly 7Zx9XtZCqLweN2t6YfMBeJKLcgP+OQPGyyhJib6av2pmOlYw5xrMZA448NjqFW7f LC3Ro6YGp49378uSkYVnliyoZrauOLR/e5uGA5hgh1WvyInOGgzzDL1D1nWmOQ8g nnq1Tm9yTdaiwu6OcdhwbfERO3F5zyZeVSsXOKs8rOW6kBGGLdnT+HCaipNzo4wm 5ekyfvG0LVVuaWZvcm0gVGVzdCAoZGVtbyBrZXkpIDx1bmlmb3JtQGV4YW1wbGUu bmV0PohdBBMRAgAVBQI247GpAwsKAwMVAwIDFgIBAheAABIJEKlMD3VlMkTWB2VH UEcAAQEzWwCeMxscN9idLHgH2DP2U6tP0tNR0T0An3lfFgidO+z8ZeHXzuOM9TAS +jz6uQENBDbjscMQBAC1u+09NP46dPnn6RJtczL3LEroyrcPmHOk3FbiNfJ8YMnF BeST+U++chi/kKzm+N4y8TZE8sHwGqnkeIBtJX2YmQJFhKi2RR9AtVn2HV1ZTBYT 1q/P7MpZTPMI9EODlCEPJTvX+MdtP8xh0Gsj1i1wujQOJAiXdrqsPxen4Sch5wAD BQP+NRROzLFq4kBUpgoTyvWzJl96Gdykf+O0AhbTlZ7ix9KtQLfxGrqzgo0hwDjb 2QzeWHfjVhaaaSc5UWNMuIQyHRcsj9x4n25XGE0HUyOVSD46IOAjfZF+beXOa/Nb YcR+zzORfXr1qyW2g4oV8LN4s4uV4dPamQ3l98Lkg8lhWCeITgQYEQIABgUCNuOx wwASCRCpTA91ZTJE1gdlR1BHAAEBzpgAn1mBiOpDetJyYLCFzciHO3YBMA1vAJ0W 5WC8PZiHyWy6JazAsMWs2wOTlZkBogQ247OaEQQAowMahswOo9fdIojf9byb0uY2 C0NR98cYc13WemcYzyZLJV9aMRagSDYY8wSZ1ff+29RRXudPPTYgnBlFWWtsQ91b vp4i0wBjU0HjcumNBOsBH76ZUCyW6VRjprlXmckoRzQio67GRbUtZq+6NfUlG+UF kt4GR2mxU25oYm3BQV8AoN+qhlQJxnGc751ExqUct8Y6fs7hA/9qkyTaZz4YnCkp LFcG+hCRVx+5kEmZcm5QJzgFRTMdfRlIo1uDFj+RVHXE3eSsyA4JHp0Swa6QiyBV ZEOP22j/4TogizpgqEbt8ZxcqETzPyZ/eEMtyaNsIoMJIUFPs8jlOQvOUAQ/XLZG 2Kf9JrvW6cZmE3IR8A9b93V1FxFWowP/ZZxM9RoiNG8CqZvFSl6dGGD+YXmvCYeX zVW9UFtkKhnflzR50Rkql+bJhsq7PsaGMQ/Po79RYZhmkr/uvp/iQVSuE7lq0KWd HIGS+Y2Z19u0zmF3mOHeWCoBPu2Tue08AiHxfz+qbn5RpvreRnBcI+JJH6ITBGnj YZtUvsX9vau0K1ZpY3RvciBUZXN0IChkZW1vIGtleSkgPHZpY3RvckBleGFtcGxl Lm9yZz6IXQQTEQIAFQUCNuOzmgMLCgMDFQMCAxYCAQIXgAASCRBHr0tpYfBHhAdl R1BHAAEBzEkAoMA+KfY9bA8EdfvWwa8zUM1SMs5rAKDS+6X3HVuCaLtVxzXOob+D KbB7b7kBDQQ247O+EAQAh5FAgdvaTJL3jBGcjYiiJosxeTWf3L/dUY99fZN8R39D SVoUKf9Rt/EsS5DywXVnKAeJiUTYw8lbMRVF70VhSDHpMC9KtbB0lk3CcAqULPiy irT5g9ywN24W7k0naWIJisttUh+Hqbm6gc5Pz9Nfd5ll8x4Ehi3lKE6Nze3gUNMA AwUD/AtUN1hqwWTTphVZctHq3JaUEb9agmu/Ocsf24/bq9i8R8FaMwBF4fI5qIim cqAM+2BZ6dvZEdqrVaZR9aHjzchcHmaiI7ZmW4gmk+LHFFWf9y7mG8YDKFBXkaBu JpxFb1FIfJpmaLzJmRa76dLqI3A7H2E8dFQa/MGsYCa4NmILiE0EGBECAAYFAjbj s74AEgkQR69LaWHwR4QHZUdQRwABAVPdAKCcyVECIa28vmUPgZ2jkXQoQ/nNkQCU DpGL1aZn1eKrDlHcGyD4CzywnpkBogQ247Q0EQQAvVX9TJEynPJEsX3X2fGPPDiQ K+oB7D1INI9bfID5NKtoo8qybivOLo85i5m7RUiEyhX3E9lUg9buKmtIhas0sJ8s LURmCndIKtXjIWg3Kd0pmjE8q2zyd7ChQ3ffJ20875wNbR4GQhSO1WTuxwRoL53f t+9JTULJxkQRf71Azm8AoJZQYphKeLWrLtFjb2WKbYxst54tBACS7C/Vu40euIev p2TZHTtY0U+ObFvJr8jDrdQZMkUFSuhti7rfO/bf7qTwmCvv6IVmn905ACh9bnKw ZvcR5T1yR2b6CAN267fzriZhu6/FG+9Ddr62ZnV2rP8Oa7uxAXCnoovaafKYupop vHV0z0tUf2+wasrQdHZTvc0pfY+56AP/WOVJ0KGzP6k9bYjYSRJ1MJb70wdVFiHd lIlEd5P3jQsXOyHVMrWp6qH10sQLto8gweWJr9aHem0QjTNSTVpzp6laBHf7tnLE wCJGeX5f5BOh87akRjwfh9J9zW+DBrtpqS6vjlDYU5y6RGbGRl6ndtXhV5FpE4cb Lax/pGFWEq20K1doaXNreSBUZXN0IChkZW1vIGtleSkgPHdoaXNreUBleGFtcGxl Lm5ldD6IXQQTEQIAFQUCNuO0NAMLCgMDFQMCAxYCAQIXgAASCRDe8Pe47Gfb3gdl R1BHAAEBomoAn0xuW4iqzyqN3WU6SPnzELkrjzZsAKCN5glp0flK1eZskwbDZkPb 3J6/M7kBDQQ247RWEAQAz1fsQzEPDc5KqCcjvpa4gFKwjSAX9Sm3OlPyDwBjqBA9 WFT1+BAdu7tyvxJkVXd3JRUtPOQ2ruaxSK93f8V5y5/vsKkoEKtCXOy35TKSI9D9 tPf6CrejAaL0wEJ95TaXnJlnfKMYiqDz9efGYJu4i3Dr0U3LPv6dCgMzbxyL0HcA AwUD/AkEuPFdepYVjkl1ertyTrpDHlgcOk8fuzNQqsgYoZkfGTZRehTwb1ZF9DRV VB9qiZ+cq+j5sUMUkZwt8ghMjwWuPMaiHYrc8pzGxCJDVKxWUxPdea69JPTK8Mzx ri32j7a/zIsuASNHZ2f+VOIaMT8A26dGj1MEam/Pk/Tzk2bOiE4EGBECAAYFAjbj tFYAEgkQ3vD3uOxn294HZUdQRwABAf8gAJ9fC4NjVwHWOh1tCxLq4dF3L/M5VgCf Xj4izGMaaFuZ7+IOJ7jgFqC/yiyZAaIENuO03BEEAK1KlG4lUzMSYafGwOLzFwMw ri48rOAOOAxPrkRW/QBrGU5sPxUzxEzu4lP9365cmMk4CLyNswxdUsB1xtOihd8i LvCxejgjNDdJOypyqcPDNrZD4k/g/ADax1OXde/Hr85uND8jQ8isUhjZSBtTeDCC hbTXTJWoS77vdZBtOFnrAKCz2ucyEr7F/hMPeTNaOELYvImB2wP+MK/nmEcsD9+X m/xeVfWzi1oVphA88OCh10O1fjieyQ+Z+OEuSizysCKIKIQ5T5q8Q0wCf2ALpAKV CLXd9JK9FKt+EIBZLQLKoAj+wuShDNU08VNuU3LOKI1B6A8jI9eBArokwj9GRUSl Ir6KYI4EYRUyl1VVk8kpENIPUg2iE0oD/2tBclzEFGCY7gexgOq+FOkJyB7MUuca 0IJLIW+LadjFVjIapYbHzi2o9VmfqHtA8SsNDt2Ckx/xAM5jXpSnDG7U3IpS2iHS OZfmJWpv22Xu0L2zdrO9ip9j2Y7WKjt1M6sNeG6gCUZdHpJXjHWUTDMwLKLq/ojV Tx55aHV50NoMtCdYUmF5IFRlc3QgKGRlbW8ga2V5KSA8eHJheUBleGFtcGxlLm5l dD6IXQQTEQIAFQUCNuO03AMLCgMDFQMCAxYCAQIXgAASCRCJeabFVn+zSgdlR1BH AAEBt08An0PRqhiMzF+L37DyvcaVl+0zSrmbAJ0fL+8D5Frcp1m3YtBMpo+j5dsi eLkBDQQ247UFEAQAxuGlBvqoDkxhIDgFZzdHJO+gJym94zgSGHkBmBIBf5Q2G2O3 zkN7SIENI16yg9cxy7zkTbBu9PMgzUe/UuQov9Z6YXKzTj1jLozrGdljKOcW5YRv libo7eKXDUkSvT+X6J1BOIVexl05Y4Ncmf7otNDre29QfK8gGBO/bdQd7L8ABAsD /R4Nq/JQav4/7d5ETuMZddPAxV4kCnY+7F7oJgHDKJheJxt49rNtfXSxBZUsJ9P6 Xhr46fCRT33DD1P8RyUmmS3/dJl7H/qR3A1rox4FQPWAuk4WGhsfSXvlZnFWKJhC 8TZzFisjiXjw1OFYiF4TArxj9D7d/cHEKIi43rtefpf+iE4EGBECAAYFAjbjtQUA EgkQiXmmxVZ/s0oHZUdQRwABAeyQAJ4oZGFj58YW1ovUlDGgd0M9En7C7wCbBBq7 67mk9lz1SsGvRRX6kY+lj56ZAaIENuO1UREEAN1QBnOE/r7r1V3JGuBE2i2i5S9c TojyHSTFkVlkOtAmallw1aRQcOqBtgMn1GYh4S5Zk2bLM/FIVy8P1EbD0qYhm7aR lioi7ODgqo7JTdJR83JxqsRlgmSYsTIGWuQ3FmSY8KnVxGwwoYJuFCz/+/oiryHp 00DYRaAl6/TLXaBzAKC6TQpkipU7tR+RpVpmEyvQJ3Vq3wP+O4qdFWIMyL1ISNIl nBvebDX7IQKczy+sz4CgagAqILP+fw30Z/YNOwXLjIoSyQ9DyzT1Zzl6kEWjeA2u 4y7iQOd17S4KaIMRtPDOl1Ipk7nH3KL7tvf24I2SCgOXPCidpc10ifY2cUqMvjtO dX+8oV21JmAtb3Ta/BgZOvUCsv8EAIhzH1N3Gwn00zJooPswRwpB46s6q/8yrUfE U+QMEjiFNmlCIh3VdPGqQnpQcPD2xH9O+07lgqtmMg2SZoFkWIeXHWjIHQHe7pdR Utchz2WLIXKH1o4F1CR0eCPIjwrOTpnR6Nhyt7lNjjN+mUBkqRQOVjdTRJvRrTEg aGCjdhEQtCtZYW5rZWUgVGVzdCAoZGVtbyBrZXkpIDx5YW5rZWVAZXhhbXBsZS5u ZXQ+iF0EExECABUFAjbjtVEDCwoDAxUDAgMWAgECF4AAEgkQnu80zUsRsl8HZUdQ RwABAUkEAKCUUXvVByh4l9ohXM16up6769DYSwCffVvyOW9v9kENNcHvItZnEmD1 o+O5AQ0ENuO1ZxAEAJriuUXEtM08l6eko1tvlnkCKSZyQ35S9PogXv/90gA79Nal JsN41jALsRvgnAgKZLJddtlfZ6RB4iwuENgOva6C0bG8SgT3m7rLX2nSyaFWKj7L 456wZWn3uRnKxT5ymxNMFemV8f06f3kg4kJYneJVs+Sfs/5jeyoRwDc6EQG7AAMG BACTuX5AknTcJIrBV83irJVsZvWKHtUzqLoklddYXsdI/eB6c+cBlhFxe8/hWw6v uFdFKhpCsWhEbJehzFjZCJo+ezf/YdQtWA34ik4poObWaSpnoV7ZXaVhgjQ2axNE WrKxQihDVYRTIaXOJAJ8eq2wNPi4UbyZL5HcWO6SlP/2mYhOBBgRAgAGBQI247Vn ABIJEJ7vNM1LEbJfB2VHUEcAAQH0XACfffuI4IS7cgh0PNghr/0v3L/NhncAoJNw utmN7kkv9n/oPqkByzLxvZt4mQGiBDbjtcsRBACBDJOGX9C/xxCVZNP6OHz6cL5v M3PimUAhV+9HAVVPQViTnFKrkYPSQyRfWzjOU8RO1Tp5CHz747oOb6j9P74yH1uy 78yFg4UuhXBWinhuCKKq4IIWwJkCKBFr1U8fu8a6Y6NcjqiDA0KmGRJrMPmXenXk JpFGHG78rUvNi9IMfwCgugzNILh/3XZCZU+BUPYeXL+nUAEEAIDXZhj1vFXHgi9l mijKDjJocEBoamN/taQy6Ox1RRD6HtfAPY5TER1n7xm9hMzE+Ov1IKpH/E872Rha 1qu1v7eOa6eTuNWF0NvmSR955freRsNuR8JNIb6StI2ER9pzBUfjykC9pg2wPeC7 wpQJIF9TF+Ja1BvG2I+ha2xJ786AA/sHEUvAOsc58YbPlbIPyp2JdEHvXTRT2NIS VRuTMQsg8vV99nMYR2CUh270uPyy2xZaD/kYcJ9/1ngY7C9pbbNWoV70PkEMO/qj 67OIViWVPzUhIdURorbpGhuc3oBzUxOgial7IbISPRItDgg2oZoY4hqyQNx8Cj2Z ZAzDpM2vCrQnWnVsdSBUZXN0IChkZW1vIGtleSkgPHp1bHVAZXhhbXBsZS5uZXQ+ iF0EExECABUFAjbjtcsDCwoDAxUDAgMWAgECF4AAEgkQa8R3gFSs0kYHZUdQRwAB AUDrAJ4lTJHO4VuxnS5C6W+mA4hFMtMqxwCgt3cidUSPbSl5NRDlvY06KZJecrG5 AQ0ENuO18hAEAMx88MFCgzO/nYyaNvxJ1pgoo3OoN30rWhjaFwxKL4twdqD4okU7 IoF/dKgeZxT+8IQ34vJOCWNhIoOYR/jBnb54t+oWBJ0EmnbGbnmKH70IdeDd1fH1 JseIYkIjF8loiyc3PdWYkY8MOMGVp/+GOX/tJm9H4wmlUsU8aOPu46FPAAMFA/9K C/Rpt4JdV1VfAYSaF1XRUOjzfchBF1G7XK35AudZEwZNjWhBqmwfpAvBhJl8MmXF uwEDe1+opK2lFJt0Y01Owr5Eh6GwZ12LexYamVEable3kqmRj+Zz+0sVpgk0yoCB 9ZBwqVkcGnsShYyCJGIMlRarRMfXBEOg9pFz4fkZ2ohOBBgRAgAGBQI247XyABIJ EGvEd4BUrNJGB2VHUEcAAQF9YwCguRqebBzPbFnWXjOqn7ueBdjsDEAAn042F36T AKQETj5I4YRTah9HfMeRmQGiBDunE88RBADJ7pHJpvdSqmL2oVUHWGiPxr//5+GA 1i+wRzXQK1NzANMY3Jopsp0euyiF3bCrv5BFXECbx+q5ci9ifgb0aKcR0Zk/ieBS nUI829AXSTKCs8QXf792cIp1tH45b012m53J20Ttyn7A+gXeRRb/tBzhX1CU0AoG uWLTWK0GcSM+YwCg60xV3gtAAUYUDQQf8pto4iasw0UD/2Svbe7Sl9hipq3Z/LBX nN4/YdUDZw6D//Nsa12UESAjbrDARIT8w+zgBKNFYoKc9k7vvsFnIu4ISowgjKpo GEAxiVZlWyYK6jPuFoD0L+4w9kP8kVIZZH+/3adEjRV36HR8Tjg93eRY9MwTH6ay pXuerx4yA36TcGs/JNl42TMOA/4tb9FsnEi620lnAmGr6lRHmbZCeFDB3I7I0M9F ayO0/wzJjHmKGqrPK8x5QyRrk9jc+EN5MfKWP5Uy6ZOp+mmKux071x2Ul+SdPgJ/ +1YI91Ch/CrO/zf3Tee2SWOefupZZkJKYPz1dHHUDQ0mynlWJHgOLSaw41Yho3vO oemU1LQiSGFycnkgSC4gKHRlc3Qga2V5KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAg BQI7pxPPBQkAAVGABQsHCgMEAxUDAgMWAgECHgECF4AACgkQf/Iwv51WPlYg/QCb B3/W8gBLgzhAhEevTQJtfDdlnaQAnA4mjmgN4HdNTJHRM+eLaChSKTxGuQENBDun E9gQBADtzp5/lES7jzbBVc+q6yFnpyW6cxmE3TX+5/ZABSF3xQCi/Jz7XZ3uMy+l EHBwAAQzgHeIAiPbUEjx0619bUpcwxdsSS+bGxRcZGjdYrwfaIePk6DFxBjThwGf UkYpxanQaLc6/OM4P6xlRU84UrjJDwjFLvtTQihieAesCCevywADBQP9HuyaJunf cD0Pi2Q0QSu3B/8hvmJauYsZfOgC9xEWS/yVLlHuAdolT8d99bGOBuaQwt7Kr/BX JiLXYrXxTvBWCRTFg9g303W7RlOF0cIHegUN9fdgGi3MMo86bhDK6ZQhUI01dDnx BaIEXIT+MeVBseoHcl0Q4uZ+9wqkJRkuHq+ITAQYEQIADAUCO6cT2AUJAAFRgAAK CRB/8jC/nVY+VjuDAJ0QtU4XC3frnCt7jNDr2qi+CAdeBgCcDbwQ5jxDq17hEv8R Yrg2uWkc28iYiwQ7pxPZAQP/Z7JX/e7utktjH8j7Q7WkbcnaAff7PCkJWGpHE1mo 1UnqCl6kssgTZli9RJZMdKtJpvTqBLxUS41QRz5+MQjtjOb2UIJ8VPEiXB61bCZx WLtX0kLGvi0R6k6Il9y2O7ymiif+aPYE2FqW7F/2Q5EulMbkWtQUaBWGXQkvANv0 EhkABRG0JkhhcnJ5IEEuIChSU0EgdGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iLkE EwEBACMFAjunE9kCGw8FCQACowAFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRCenBCg zthU/wHfA/9PWfdy0flvORRc6/s7z4ZKdKCfTFXJ7jnHhMzYU+7j8mn/WWLYMh3Y zJ0TDD6mWZz/H8KMq5EqAf7w8vzPbfR9kRxm3VNBJRUXaklsDJBls6QNXMTMOULq s5xy6x4+lbDpENo6RpmN8gUMCQWxdfXhqt1eYyS1tC88p/RzN+06EZkBoQQ7qKLe EQQA2u7cgrIxZf9s7zUK/6/hh/2gn9dsJcbJlRNXLPxnZDuJ72YMwdJuUSj37ExH 9fDqeMGYesuK0CRwlBcVZBuzGzw9nf2lGstZ1O7wqLerxvPb5FDLbnm2WN7VzUH8 Fa7fJaPOw5wfxgNHSj0tEkM239PB4WocOBFEAxFiN7r3/+MAoKJmzdJ/HKVFT2qA zGZMiVlznfOfA/sGM5pCGx5PedXbDNcDi0L+2rYQ8A+2B4v7N+Fda1qGVZrk9lNx GYi7rGCeXP24LEbvfgN2Oqw5od1y+XfYKadiRLFoCTCOFO/fwLcs44sIDt4cN0Ll qKIflQdde6jPEsPV8hYZZkg9KI8YLZ64dmFuDsP2AfclOIi78D+Imgrh/AP3SKhP MTm25AItzW8g3sIui02Epy0JB71EIQbjASVHwSxyjb3dvP2ObnUuOKkL8/KBENcw JqNP8vpB1sX8Yd3hR0IjC+DEt+bKzwYrAlzqSRqCdHSfHOMvWvbK83oOmSRm08KB UEGW2gCMXHIkbrOzb5wjhKciiRG2tJcYclUwn7QiSGFycnkgSC4gKHRlc3Qga2V5 KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAgBQI7qKLeBQkAAVGABQsHCgMEAxUDAgMW AgECHgECF4AACgkQQjc2NGP7UxG5sQCePWDnb3MYe7QjwFT3C1hMWEvgXrIAn0EI UNaloyri8vclg3xikvuUJbKpuQENBDuoougQBACh6YePGIeo3sz5tU29hfVDn4Cw BCh128L+Rd5852HN/3Iwhy1yTSEqpavmX5UTLvJaVFn9h0C81RWF7Q1qAa7o5TpX WMtSFijr72DwUSFa23uq+LZ5JUTf9g2PA1VkkhaL7TYVrclBm4pfsAwEKA21kF4Y 536+Mzr/oCSIzGG81wADBQP/d1frnzRuI6pujq3DMH+hNRh9KQZckjsLtTukKy18 f2JSvnDEKj8sv6GelI/DKlBSCRAW0MHu28rmx5WCmyRum7OHnDlIIAE19wZ28ux8 Af8Y0COhAqYY8Zqxqrb23sBvCxkmTYZn68eOC9IC6PG6e+4/KQGgnNbMkvBzbnv9 ytSISwQYEQIADAUCO6ii6AUJAAFRgAAKCRBCNzY0Y/tTEW9ZAJ0XMOG6SmjO8MlK DiuKybmrPoDnzACWLKDApr6MxgHnkyRO5PAFpvaS2ZiLBDuooukBA/9r69N1QdSQ M40Ic4n2Nrnh8ntF/wXI7UhVoTeoyEMxx50R/KEmjTKdHeNoL8TaeWsqRLO9khTu FufNA7MWzXbUiYWguoZ6Z3AIPMgLGSKNyMe7+9/GJIeMzgf+ES8JmSc5toBvrKIk AAE0zgb5w9CCbplNOqQkVB0AydHWh7MK0QAFEbQmSGFycnkgQS4gKFJTQSB0ZXN0 IGtleSkgPGhoQEBkZG9yZi5kZT6IuQQTAQEAIwUCO6ii6QIbDwUJAAKjAAULBwoD BAMVAwIDFgIBAh4BAheAAAoJEIOptNOKdysIOsQD/1YIs0R0vtkcYf5FSiNfz0UK VRghJfbhwefKXjHT5d2gF8QXDqDvu+HH293Hvqw9AxBoY1ynFw5dncC5f5UgDnVM Bz3S4ujIr+CL6DMjLAssRSIBp6+6mVBTsxLnrPR9CG1W8Er+qSTAoMnNGjp0cghX 095vZVy/YSCFFb2sGrZ6mQGiBDuzYioRBADJT2TyxVZwVJ3PSdpWUXVZpx1oGAkX NpGIH3izKmO0PZfzXdUsbgrfA6bncFbP/MPuqDSB/oh9ZOKnGWDre2n8OQuVZ/Cx DfTX3E05L8BKm/c/BTXikwKhivJaZduTYADcKrcapYCvW2VLsczSIs7HPxqoJI8C +U4COr6YnHRaFwCg1sgnVPENxCusaBVsT0eQ/fFahqcD/RXQqxagvzbd6yRwKvTz QliVrUzv04ivC0vD8pu2EaGyi8xgAONbgWhHFMYSQDiSnlvJuI6vZn5kIsRiKA1p taAWzOaKE8klAcHiWVIddyCZqHDmBPvisSO0Vxpq7mhXAhtKbrByyaGp8s4einlG 8vUvz7WPQaN73PCNt/RD4Y9PA/4vZfnHVwhoRsDlkMbAjlHFy1fM23/pS9AMP23M La+vgkgrFvg3Z0bCc3MirCs/xHsyRPPS1LJhamV5x2knV0PlHTAHoGaGPoapZyDs YZDNkZRqjtnoHCfEya83rhxB7GJIsEKM8oSJ515kHYbQ50Pj67WIK9AWOZ4sMAer fDQhjrQiSGFycnkgSC4gKHRlc3Qga2V5KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAg BQI7s2IqBQkAAVGABQsHCgMEAxUDAgMWAgECHgECF4AACgkQyECct8vKuumUcwCc DNsPEKSgDH2bDiDyjoiSiAgl5WMAn2CmmieSzs+pqpEm1YA1baXgGSSVuQENBDuz YjUQBACJygT7QnMtfDnFUnixXdXu/vOCqTbXvmysKnnI4OeDW9QxTr+ugf+f6ROy kJFF75zq/53jgDD2cQkUjU2OWbrrqWF/aYHpYM21TDtIRfRe0llF1kSHPnYW2rjn Y4/AeWvPjToevxursEn1J3Ijd6NentxE/FWhetTEHSWE784/NwAECwP/fpxILkyJ UfPdNY5HqN4Aag1g0ZWjVfaWrebZDt0BIHJpQd8RvUtQnOzCOZ29KOQKS9LHOJOB 2EjysCKTwBDYK5ZonQUtmhdwNZeoLYlLrH1PQ9WuhddjT6dJWMl2yJ+zchmDRFaj f+4AvrbYGnMbMdjCllnDcygSlzUt7KGcjuuITAQYEQIADAUCO7NiNQUJAAFRgAAK CRDIQJy3y8q66b5jAJ9ROwHyPzvGq/vgztzs4972gMuDIQCfeQq3q4tW3qoWyC/T OkvTSeUuzwSYiwQ7s2I3AQP/ZLwvhFPpbGgF04i7p6pLQxyZk7sgO32sOxe2kYbQ K5cdqMiCJKAS5jFfu4wew29u9XYlDKc/dnIqHKbnFhyPC3+m7YSk3T1lpOy1evIM zalaXQPZtJ+RuMRrQO6YD5pmkNeLHk2O5axpDUpk8VZ6t8kqsoKNEt7U4MGS8qWA BWkABRO0JkhhcnJ5IEEuIChSU0EgdGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iLkE EwEBACMFAjuzYjcCGw8FCQACowAFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRCfk5C+ NXBwN1wvA/4oc01t7KIltGdDyU3XYwzA9Sfma6RZhv3MedM0XxHnEW6L1lIhHM46 KXDsORumgiUXPVbCT1N85Ay1gPZT5Oy7/ZraPEMm7FLza6BjYuOxmlRj0dnrHu/v FmljrjGlYPzzNyoit6cxZOsbWlT/Gv6YJDLCT10UBGyh5GtlYft8cpkBogQ7tCnL EQQA/fmXfM8N93cmPNBu6nAWQ5MOev//CfIr8R9hGRH3FV8bO758gFLkHX2Rf/uR cyo8ZHeLw1cI0UfzC3A7TJr62MAoLBS2fn9wgAzd7KsnJFcKmpKVQqUX0EN0i+k4 qnp1jyMCLNAVdTwVXuMTpBKEgYAI5xXNK6FnlmK4RAQ42M8AoKRDGHjijja3HLp/ +4P8/hwHYd8RA/9GjrsMfy9xynS2o99o7LkIaE4skJ7OYeJVfuZ9G6F7Q7JRIoTd d4OqHMeIvLIModiT0prmqRUdwEQS6Qi8HVwAsiUdNL9odleWOb380Ft6Qujn4zhs uvyt7S5/ctU4JPpOCokih/2D0jHzSMO5RPBKq7wQjkU/C3XSm09vsWou6wP/aSdB 6Im2y47qiG9mHoUsCKl9CaJX6W+hl5Pto9OLW6QkYPofMs61hmzXKEZEl6Gbqhu+ 1rUd/35xahvh+hgjtRsW3XHcd7VrAPwkEruFgOM01q++sZg/4JXPDLVhAHYi7Xin vBsKAvOXvMGqhgByvyM9VS6bcIF7kgkIvSuodYy0IkhhcnJ5IEguICh0ZXN0IGtl eSkgPGhoQEBkZG9yZi5kZT6IYAQTEQIAIAUCO7QpywUJAAFRgAULBwoDBAMVAwID FgIBAh4BAheAAAoJEAQMJpyCUltmKsIAoJ5uxGMJtPAAGEBFidTybQ44Lk/AAJ9p h2WUiJFTUeNYbZa9YHcg1gk2+7kBDQQ7tCnREAQAvkwf0DiD1zbcqiBajDGZhDvE 0cb5BUbMcuJvSH0FBXopIIniYcmnfu5q393y8WPc/rVrJVHrAU2RyHTAoX8vI14H vc4HUFDdnoj6Wk/xSiuYP8C4VN0NX3G+S+C4Pa1Er2s/m4X9PRz/YA0bMVynp7f9 QM18aN++OpWV2jVBRd8AAwUD/3cuV7jHchUeZ7h6Upagzj7quky9o6o5lB///Pk9 QZ5HEBQTCJDvmu13xCaaO9II4XFwjYntYbPOxOTJ1aEBKQubkUo0SIj8i5rhLTeD kkHB5M/rO40gS/MFNMVWqFCvUIQk7yBkum+MFcJFSEz7OMpL3K5X93W9twllqtUZ qjvuiEwEGBECAAwFAju0KdEFCQABUYAACgkQBAwmnIJSW2YNEwCfbPwQzlrLRCUu JM2inVLcz/3jijIAoJWggcMT69FfppDw3sA2h2PtAdOAmIsEO7Qp0gEEAMuvaXje qJDz2mAbPWARryInKsu+SJiOBsyNPdX2WIJTABcRh7FckP07IodeDPFGh4EgS/FE lDZRsMlL5SWf6Fj80JUXuyrbLNmvv0qUlDNVw1uJoeYulIypU1ZbuGSq+sDVyYur PDkXTlBfptMGII7Yuu+Q5Xk3CXymvDsQNbslAAURtCZIYXJyeSBBLiAoUlNBIHRl c3Qga2V5KSA8aGhAQGRkb3JmLmRlPoi5BBMBAQAjBQI7tCnSAhsPBQkAAqMABQsH CgMEAxUDAgMWAgECHgECF4AACgkQmwfivFMU1yHXHQP/ZZwHatqc12l6Pn9iawmU mFru8jnOhMJAzCQ/H+gUldmN9qsSQV0pFj+fP7NkNXEPOvkO4DS+ME/mHcm7JxDC 4Z0MZbt4Xlkhffie0J6kwuiEuSoQ70lZQxbME3f+lBcNJTIhsTupJEsqqf3MaC+y tvHu/CcE8UkT9DPSBES5Qn2ZAaIEO7Qs+REEALaiacuS+YqTQ9Xrl462vSA6Ahvo hm6PUW8dg3kMOthEMVn0+fiQi7MvfDrgws51geKklPoHPwHKZs9/T7him2dcrHzN suh7e8i6kVGSXyLPLJUCnhklzxDnBEEjnXUG1uZQz306L/wE9oX/b76Yt08gbkPa 33lYeep0bwvO4oBHAKCYAha4i/nB5MdV03XppOeOtp5UbwQAsCzn7IWSX6H9oYIN nyYBKOp1BpnidmsR878tzRHdM06A2lBGqF9O+Jt7H7vlqogX24LRuE7yw9aUTWKx iw/6UP+QEKHAR3RAbPv9Tg4rqyMDwHhzkebkc17VJyVSaLIEEo6TSkOl+tCqBvV1 T5qq+z5lGzcaWqRYCkXEJu3Y32gEAKY2nu/lrMzBCHXRunNuMbhSkcIb8OplbWc4 IDfrxw740iCsg5wh2GNzmEtPzwy3ay6sQhkGruV6pYpUii5Ms24e8ztSn85x7muL i1EhdqpExKt547wXz8ShXShP2Fst6bVfsaGbFU5a3kX/7BEMzzRrcSd6g85aCGWx a/Td6F8DtCJIYXJyeSBILiAodGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iGAEExEC ACAFAju0LPkFCQABUYAFCwcKAwQDFQMCAxYCAQIeAQIXgAAKCRAM8Ubp5JhAg8/T AJ9PKJJLVr4KwCetNM2FWR+0Ldug/wCfbgPT1B7WtvQMztTsJom49sc1rGi5AQ0E O7QtABAEAM1AVhC7V3EnU5XF7M7OPozDnk9fOgGpCh4HeD8Emuqh4TRVWSmCSA+Y qWt5r1L4TpV4QQX+vUDHet2i/IieIFKOrowuwiONln+YGToxXSB8tOKKr4p0qJ/w 4ozijJZ6NVBmsGeXZIpu5LB2Ar4K3z3HZmwNSlDznVNwXJXNpfIXAAMHA/48d7y3 W9y7jHD6QatVl68EelxV/x7BWHQF0JEltwHCKN65H5yV6IhUn84VNJazS5jVwYUv bmbQu09Ndm7iKX/Gfwo5EyPxGzbLl/W5fA3vn1USXJFX2Tk7wALQ5SAZHHbrluIp /660zvXn3E+466KchiRCdOfqFpCd3Rxgrv/hAohMBBgRAgAMBQI7tC0ABQkAAVGA AAoJEAzxRunkmECDFXwAn0NXK//V3U3k1LNXeU0mz6GYmaPRAJ9eRstO6/n170QF 3Q7bkGNUvtPVdZiLBDu0LQEBA/933MLSz3/cCubVa6XR94o7mM8DSmT+Jl1wINBZ iqgx+W7Z32Pe8ioU03+2r0kOW9Re11zjXX0+vkyCHulWdJpC1ipuKHx9tiA1RtfU 2uqq2B4jufbxLlb5Ix9H+4sKl0ZJGhyH+C+YrPa7umfJAv9Nybl98w/SCSCM1UZr SiT/UwAFEbQmSGFycnkgQS4gKFJTQSB0ZXN0IGtleSkgPGhoQEBkZG9yZi5kZT6I uQQTAQEAIwUCO7QtAQIbDwUJAAKjAAULBwoDBAMVAwIDFgIBAh4BAheAAAoJEGre QqJ0A/WJWGwD/2r6jQvyWpIQsyK0BwR7yrvi36BqhCA7Mh1ZmnQbgZhrHIdTrFQC 5a3XxYA4l1/VYb6+aXPmRVfg6+VNAWXSh5UR8IS81No4mxSU8RqMHyjdGsrOHGus n6ckZlXtJizsJsXZx+ue4sxne9zTtiUYwDFlTlANNPiwpnSGQQGEarKWmQGiBDu0 L9kRBAD8/PiBfF/3DoGsadZWnzFmpmaBmuyWi7wG7UCWVfCWf9mrtYgF54/wuX+w UvH0JOLhPeJkMunI9UwZDQiRAEQqxkVEN3EjAaxQ/+1ip3lPTi7k2xunLwei0QWb /i2rkotviOzg/tZOFYWa2MiEhiMx0rSQBUHszS3vjHfc5TVa7wCgk9GBkr9m4L5V OA+Pn/S4vttDRjMD/1CmsrzbOh+E8ViYqTDUHqdawzlAyjU8iCVmjwMwO+Zfohbs qwQMN3DeDU7AykXTQgjn5pawttY9Hkg3Is8t41XlwHZCrM0EiygrK2xquMi/mSIB 5X0HS/LJkjCJegtF++OhM/VVPeWnI444b4fFk8Ndo5GyEdUS/Rz/C1+tvq/zA/9Y sYdeqAb7StJfEDla25vx+hcE2bKX+Wy2+RtEUQV9VSWyh+Bgs5S8kN+HwFpdcXp+ j3+W3iT+QjJxtnlmAq0ugJblLiCYKNcPr8eDBr6vTjHSsiWXGC21lJ8ewg2zqP9Z vr2bF4pAPM/hhX0bDi8C/h0nUkFcRGWxuoVifo0TLrQiSGFycnkgSC4gKHRlc3Qg a2V5KSA8aGhAQGRkb3JmLmRlPohgBBMRAgAgBQI7tC/ZBQkAAVGABQsHCgMEAxUD AgMWAgECHgECF4AACgkQcBJ6QSqLCEBA4QCdHAGobRtfv+IDDFpbW4rUqm0zQawA nRFFs5sBFUjq1/5zG74QHo0pY07auQENBDu0L94QBADW/R4I4DMQvkGlvP6jxWLz 6TgkPMAAfEyxIJoZYLJggau4XJYyElmUGVFVH36DPE0453yN7j3gBxVbOCZamUOI NyehuBy8Gxom36Oegzvr/43TcNPTHZnVl9wJVCFmOsAR3L8A617lAguvUzlj4e7G wV5yCwwlNtBGO27Lq/dISwADBgP+JB4l+2Bdx9wMs1zVDGQj0BERtyHmwSVzLn3B G0pAM9wf6Me5/o633rOOQYl1mwmXXjUWZasmjegqWLUFPEkCyFMHR0CWWI9CdBOQ ROBFb6jK9Oq2jYoGxTJ4kCtMGo3z/pNsAGdNtgj5s0AgUIoQHw+L7u6XF8De/Sww 56eyuKOITAQYEQIADAUCO7Qv3gUJAAFRgAAKCRBwEnpBKosIQNT/AJ9z794Z40YO apyZWN3NyQPI1zM0vwCfZIkY3c9J7WVXDqO+FlXWrb9L722YiwQ7tC/gAQP/U1mk j+I4eBCICqWjFBqJe84v1fmFu1c9sUw3wnVL7vxxHEEq1xvPgdfPlXQ6tMpcbtpe 7nbWGuU554CMEWF/ZK99iY+Ln+zpG1CW/br6YtQWCm1fLww1WJoANloUimZs9B9p FtjVGNWDyRI8q3flw5rcOo7aCM1+BtNQhNM5RC8ABRO0JkhhcnJ5IEEuIChSU0Eg dGVzdCBrZXkpIDxoaEBAZGRvcmYuZGU+iLkEEwEBACMFAju0L+ACGw8FCQACowAF CwcKAwQDFQMCAxYCAQIeAQIXgAAKCRBHrPEvKhKYmd/XA/4uJqeH2WLMAtbxuARZ TsDwrof1adVKpVgn/KKFle/yId4co0DmeFS6a/HbHPYVtlQ2TWWASVu6geNobua3 6MnG9vHs2W4YmQGTSO8T3MXP4sOp9oinwtvcgZW+XGfCX4PAZDoxHUwN/UVwGkiU wRjlQVX31vkPxZDR2UBoHjBYDg== =XVtd -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/pubring.pkr.asc000064400000000000000000000026231046102023000162430ustar 00000000000000This is a test pubring generated by pgp 5 beta Type Bits KeyID Created Expires Algorithm Use sec+ 768 439F02CA 1998-03-17 ---------- DSS Sign and Encrypt sub 768 CB879DE9 1998-03-17 ---------- Diffie-Hellman uid pgp5 test -----BEGIN PGP ARMORED FILE----- Version: GNUPG v0.2.13a (Linux) Comment: This is an alpha version! Comment: Use "gpgm --dearmor" for unpacking mQFCBDUOrE4RAwDbbxWAbWsheUJprK6VryMTpwDiYwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEm Sppp/6/Ygp+N3n32Kznq7PjHXiuWLlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUAoP+KBFly qNMdsK8j+ZO0A8rnImGrAwC1ddDme5iZFkTEWHhrtU97sEu2GDkSQB8HdX8CoRcrOz/B2WliF6qf BKhcZPFVBIhKNzjTfY7SEYAZk2zcsCm8elnwSLaGEzxKFNFBqKDNXP+a35spcqsHSGzDVw4VuKMD AJNnAP6skpHlhVAmecLZT9eRzVoOq1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXv dCT24hlfoGoXzkoDInkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLbABh7QZcGdwNSB0ZXN0IDxw Z3A1QGRldi5udWxsPrABA4kASwQQEQIACwUCNQ6sTgQLAwECAAoJENY0E25DnwLKxIoAoPSyM/Mw BogpyMU5YY+Sj74k3UIfAJ0RopQa8ciickDVzoSVPrGysrnOkLABZ7kAzQQ1DqxWEAMA/wVrlNsP qTxWZbUiMrUN8MjTFR2xUhuTw3cdvRgiVPUT/q1l1+I3CpopVBx/XuAkg5sHB80zc6pZg652YFV3 dLoTceS7ridb5k23sHa2hZGCeTo6AdxIOy53giCPDP9FAAICAv9Oh5/OVxUqI+6hsp9ccOEhRA9N 8aJzYDPjvCQyhgej2P1kTsBZqWIx0/PiMvIt+qqhT2YfyD68mHIBztScAXZKTnjroUPKl0+bkX09 NbdyqojAkzhaCRKUzwnaHEfhi2WwAYeJAD8DBRg1DqxW1jQTbkOfAsoRAnaPAJ0Z/k6Y2ypgDhXo qBLeW7Lq/AKYEACeLTod6Nt117DkqDz9epmIqwWOE1ewAWc= =6BrN -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/samplekeys/E657FB607BB4F21C90BB6651BC067AF28BC90111.asc000064400000000000000000000051611046102023000226410ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 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 OZSqAC5pVGPYCcXie7mx1k+5DrnQUgaf11zdvzI= =Htgs -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/README000064400000000000000000000022431046102023000163450ustar 00000000000000 no-creation-time.gpg A key with a zero creation time. ecc-sample-1-pub.asc A NIST P-256 ECC sample key. ecc-sample-1-sec.asc Ditto, but the secret keyblock. ecc-sample-2-pub.asc A NIST P-384 ECC sample key. ecc-sample-2-sec.asc Ditto, but the secret keyblock. ecc-sample-3-pub.asc A NIST P-521 ECC sample key. ecc-sample-3-sec.asc Ditto, but the secret keyblock. eddsa-sample-1-pub.asc An Ed25519 sample key. eddsa-sample-1-sec.asc Ditto, but as protected secret keyblock. dda252ebb8ebe1af-1.asc rsa4096 key 1 dda252ebb8ebe1af-2.asc rsa4096 key 2 with a long keyid collision. whats-new-in-2.1.asc Collection of sample keys. e2e-p256-1-clr.asc Google End-end-End test key (no protection) e2e-p256-1-prt.asc Ditto, but protected with passphrase "a". E657FB607BB4F21C90BB6651BC067AF28BC90111.asc Key with subkeys (no protection) rsa-rsa-sample-1.asc RSA+RSA sample key (no passphrase) ed25519-cv25519-sample-1.asc Ed25519+CV25519 sample key (no passphrase) silent-running.asc Collection of sample secret keys (no passphrases) rsa-primary-auth-only.pub.asc rsa2408 primary only, usage: cert,auth rsa-primary-auth-only.sec.asc Ditto but the secret keyblock. pgp-0.15.0/tests/openpgp/samplekeys/alice-marker.sec.asc000064400000000000000000000012711046102023000212620ustar 00000000000000-----BEGIN PGP ARMORED FILE----- ygNQR1DFWARlrrUwFgkrBgEEAdpHDwEBB0D+NJLAvIyoOQyeKrJu9m5iD0MVuacp vyIVvU+uGpCTGwAA/1sXeNJuROAM1I02PwDqKm+2Xf56+rNflcGv4egIoTliEVvN EWFsaWNlQGV4YW1wbGUub3JnwoEEEBYIACkCGQEFAmWutTACGwIBCwEVARYWIQTx UMfZU+bLtFayDmFs1etwRNAu6gAKCRBs1etwRNAu6lA4AQDmZec6PZqrK4utmIQ6 9KEbRFmFTOK8aazvxaHWXRDQ7AEA5AKXPkpa7LyYU2+PAfpAwllNGM4YYinqSinI gwwQ/QbHXQRlrrUwEgorBgEEAZdVAQUBAQdACnbg0Y88o+amFpwjMuUb/CaZQjGY 5eWMcGD0hSlqfWQDAQgHAAD/bs+LEBx6G0eXYx5hzx4vYb9IWdLVrrgOM6x7mjzx 6ygPdMJ4BBgWCAAgBQJlrrUwAhsMFiEE8VDH2VPmy7RWsg5hbNXrcETQLuoACgkQ bNXrcETQLurf1AEA0rLD2BiN0dvg5d9AQwBohSZcLPgCZAaweHoQuL75RIgA/2+J oDASC1TaQD8eElRC688s1XPsEFq7n8UaMCQlA3MJ =5Q6Z -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/samplekeys/authenticate-only.pub.asc000064400000000000000000000033561046102023000224050ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFg8F68BCAC5VS/59Nrg5mw+wEAnk/vi0CGI+K5rGTmyAruy/aiS4kYfUJiE Pq/JZYCeNQ9GTbJN5M+Fiv1bhw6xeEfl4FAC/A0Uo39fvUSLJH2V+8lT3GxXt8KR Yx8MvotvoKiG1DRvgnwRh1qibX6+htJahPwHDViUuFz0ZeEPWiCwuoMOELmiTsuE VZbQsv08BwCOzIc3M8s63TtwMCUe+MBhqfRjEu6/Gt7miuGGVFXB96ao2O9u1HsR 7cUjgVQp6JwGLgIIijjy167Ms+fKZetqA9tzu1C1SAtNYiqmAUoqGG1YEjS7oApo AKmHD+LGCMUPg5d6bhw+NyHjDAFWJEYv3kG3ABEBAAG0NVRlc3QgS2V5IChkbyBu b3QgdXNlKSA8YXV0aGVudGljYXRlLW9ubHlAZXhhbXBsZS5vcmc+iQFOBBMBCAA4 FiEEkn7zd/0aG295XkDAKoeRfY/7pJ8FAlg8F68CGwEFCwkIBwIGFQgJCgsCBBYC AwECHgECF4AACgkQKoeRfY/7pJ9+zAf9FVZknDCWCNY42+RIR36fq2l1Gs8KfMsX rNXtfYPtLqioP8fz2LE0LoudSsZMLVygonPG0ZAxdIUHXcFdUqPrEzs4fEyR4xae OSxui2Q/u6+9bi7eilYYzVNRWkuyx2TrRQZEjMXMnuJcWptGbRWs/ipRUZBHWfLl 2udLl+0TRIL7hni06xVCHbwE5szcLoyzzvIowGVADXFqeG7nty7uRNZNAD+ZWMH2 J0vspZlUSVi7z1VygzDI3U42SMJmVqnRmICsB3QLI8Ns4nxWXO2z8fheSFcrP+LA cY3W6JgnLCzvyuogxnWmd4fzr1iB3E2Hcy/sr0cgQ5wtuseQRhmTlrkBDQRYPBfZ AQgAtKcbBYrIqh3cRTqyZjMxw492RVQoFawYmpr1bQ4HphVGnT4IhJZQ4DAm1JJZ QjzwDQiZMc1wD9Om6UC/g8gUBuFCpLCobwBzjH4an/G3Cfa8zGz5ANAROo5i5T1j vgoFEFdVue/GpAmMNixz+0ItQBh9jiOC6IYk1yyv/OsTzsj6AHnH0XiDpGoTNkca tb6Mu1VcXTMNf620Mxj6c7WE7awxL6MwKIa7XQSgXaO+JnbB+5Szz1wZ1ZhlnDp3 KOurlfcXIbZirEaqmRByb+V21Dj3icXOJEj1RUbyVNqBS8rhw17kSxcehw/6ZAMW ehDmhXO98VVUknS0Mf+OJBi2JwARAQABiQE2BBgBCAAgFiEEkn7zd/0aG295XkDA KoeRfY/7pJ8FAlg8F9kCGyAACgkQKoeRfY/7pJ+sawf/eSjxxAglAdolF9lK070u VmMgq4GFPqJ3RqJPUFjwEFFSYLXkiALnMGXDSmOfPqCQ4c+PWwumFhKCz4MXVDD8 x6mi9Z+HlEwIMaCnckrSTuQ5OgwO/6vkhz42OcgMZ3WQnWfNVM8jbNP9vX1vroPe HLFaPGy9KJMM0Z/hlCIIeyK/a90zWlT5UMfRoqNQRbY/iiYdmpvf69I9PobGVbo/ 7ahZTumPWwjiGOztNXeuo5UUaAVVxMQBYKp2w3wil2sHzYfTfYUSMyh+oUFx4Xlz WF3bLzsafRaeuK1h5+JuvIcimvU5zWZtn0hOpiIXpZOoJvvM9r5D4ZRT5UX2blQ8 Pw== =vt5C -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/authenticate-only.sec.asc000064400000000000000000000071151046102023000223660ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- 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 VDw/ =vLFX -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/dda252ebb8ebe1af-1.asc000064400000000000000000000031271046102023000211030ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQINBFJtd/UBEACpw/psXoGNM8RHczviD7FnGdjMQPEJQ+nuWQ2AEGYouulg5hFv 0ChuSQVLiqQht2k5K2liyW1MeXoJ8tr9nSn/Zi9nttc0Wo6K7pvrDD40r2HNg305 qLCzItr5st3x8cq2cIXvN4LOm2rqpBLZ/sqMmNiW2Y7/aAQqV1xtR35joHqamWHD UPOmzBMs07YSUjXgC1EMx8kWQSV6cuARj93kxWj8R6eoYHHfrWCEGR313wov6QST zIfVU7FqQqOmdLW3LaPHxcrI/TjsnkUN99qdlpjJH/YW925LDPJHAkliqPP5AvhU F9KbY2F8mcIZBCDd8TH+xXynuN3BbIU4kCwVbdx/tcpO1npuJcKB1Go/udyow/Ei Z3nHzJsCVkezvopek77wnwPaP0nAb7f4iIY3gJCoGirOx6N075TgF6MBe00q9oFE y4rvnUnU9/QzOOes95eUMhM+9eK1cuLFEV5t47DfxRdq+fQip3FJ2l6v19sZvQ0G j06pjYqg0of273rG8oXcDrFjb1Zqhj8x1mLl6u7d/ide5wTm9HylBWcYKQjIJJAi WIScxEPIOINDJKgsKTuKtoyNvISJ3xUeS1yzxiIb3YGLIyPgFFx0vFyqJfbkXq70 m1n2xnJlkTidfzbZvc6EA7vRGSDYK6FqqhlGhc7UypUEVW8FM/jZNAOS6QARAUGt tCg5RTY2OTg2MTM2OEJDQTBCRTQyREFGN0REREEyNTJFQkI4RUJFMUFGiQI3BBMB CgAhBQJSg/uTAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEN2iUuu46+Gv +Z0P+wQhkLwm+WGcEsS98Lei9O7hit/k4g/VkLUUQV7BOR3n8uRZIFkdOtpvrFU3 aKf246uCy6GM48Oh+1U2cv5InX/WEuKaFo5uF6t79wyt18BUn1weDcU+DQdOSG4f fSnNa55wkN0l0svW4fGIthjmDTz6HZFntYD+9A20wZAqpPIs+vyG9Jp+e9E9Y/W/ EFQbNlxHHb9+BMT2+DtNP+HSl3MPFlQPKOLZxyLAU5uzT0Sa0LxhrQy5FgkW6Jog sbAJVM9z0pZw+grzGPciM66ZW1rxeICvbYsdWLytRjqxpY8GS8XudyseUGd+dZim ptarsrE5yfSMg2gW5Z1PTc0tEMXJLUwtpyzQjpFpbb7dPuo2TUp09LgZKX63WCbS Nb1RTaGfkeYudOTo2rh4Jfg+Tb/JRpO6clo0rxAq8nPH2WmG+9TB8Zbb7YRzGWuV /e5SeVNR+zY8tXZKnmUIH1HIprc+BtT6Bupdvd0CT14Mg9MmsFvUXofwHLa4gahr 8/iG9y3uHSA6Rhz++yOpyOmNvO1LDxsYNaRCIXQJbqgNwF5YNYlMPsEeY/CG7FOb Afv7rHiYtRRQfz2P4OF900DJO7QL9gdNXJ1+Hajy/5Lvvl7qwqMG4GvVQEsgFc5O jjFCUhE2i20j2kEMxvA5RLBH/fOoGARn87tiKSfb+pqLNZQb =fDJ8 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/dda252ebb8ebe1af-2.asc000064400000000000000000000031271046102023000211040ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQINBFKD+38BEADSv5l4xOx9hCRJVcybq6yK5hTpGSFf3xo1bkhoMvyC62ehb4jD MDLwwNRyzCBEWQJLbq/LLizPFN2qXFJpXJcsuqsHNYRtDqDBEjtriRQwSqHnqTXt c0K46FYHldCJQ4/tBXxPI+WwtXjcNRWaV7n2BvR/Jk+B5e4Zz3LPnN0C4w5vORHs hN1jil8A3Hs/F+OmlQYrU8ZtNwTpSo2EXxe2fVgSDCsKRyNsPZj++OyujPzW+yaN lJ9I/q6s9gvX9o9o7nwZbqBETipWsdRK6RfBdTKpnyLNordbWwWTk6GxN8T5Ppit P6a3UlQ71VuflcswCTmEQ1pEfZrlRFKa9psBOW+cZLNxT9h0jGFMh6/B3w48Sag+ cFcPBFWParC+cAXBIURDxT9G6bzNLogg7YKoaPsyiXnLDH2VJUCXs27D2wPJL24Q S7npvsg63MPPssWgG5cauLznmNR4y5pQi6oH/C10v0zrUJy6FPJzQhYRhWOvhtz6 j88RGMrFNNCdB2VACtn699D+ixu3nRlXHIKCT+xLSfgslVYifmJOCNljBLGHOQ1e FJxQuNVpmmxjvk/8kqK+pHLB9Qn6M1ZYzip7OyUL3OAWabCabgEw2bQmUhiBWD3u buv0WAVOJEAFvBCAeYNQzrQMY+Rc3RnvynG4pI6Tbo8wC6/IJcDOw516JwARASB3 tChBNTUxMjA0MjczNzRGM0Y3QUE1RjExNjZEREEyNTJFQkI4RUJFMUFGiQI3BBMB CgAhBQJSg/uTAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEN2iUuu46+Gv 9L0P/3tFu0LOZ/dAPjUNfKJCZqcIuVnD5xShMTsUbVx+QoXMy7rt4iRLD7ofGi/I vTAZehxk3sk/Slx5nbews+3NItyw6mcaP9HlmwKNr6k7BC2kJHcCxH4DNzhmIx1H 3T/CggtHX42JBYKlGf22y+M8jAbvsPOUfTznx96mYNrOY6s1dJyn0kRleqJ8+tGj /5+0y90iZnGCa0FtacQkKUPkXwVodeZVxk8z5OEipShYKc+8dl+5WsvOzHqLC/KY xCGRb4JaqEMwouLNg8dTNAXXUvFGqJNDX4+andggogmI1hdD9xExfSU9cAGegg2t vvveC4S+CCHd+zt88iK5ze6F61RxwYhhNbkuFGjdgNGCpHtG/BQhKnYJuKEbq3oi mgNyxJERlfgaWXveiMG0AmACXN+jCkTtqZjQnsg2N2QDL3tjY7usmuiwRL1aVOFG Kw5/Cc+2nDeANS3Xi1403Ni269b1c6kNSoLe4zd0WsbO3Kouds8F8EQfeheXQe97 ZxuvBOMsR9wHC3f0sl/vfxCGdUC+khmKk5taKnUeUFJmVmh5ghlVy8FySHGB0QHO zd8GUl59rFpQJNpNFQW2YKDhrcjxIr2AeJrdoDI6NsQ02+Qtep/bbq53hqtAD4jF t3S8vBbTXtRk6g2qn4ojF4SOIc8SAiZcURgVFuSJX8ngFbO4 =OEw/ -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/e2e-p256-1-clr.asc000064400000000000000000000033141046102023000202360ustar 00000000000000pub nistp256/03288C74F8BE8F0F 1970-01-01 uid [ unknown] sub nistp256/A6ED196C7C513F1E 1970-01-01 Not protected. Taken from https://github.com/google/end-to-end/issues/326#issuecomment-123585977 -----BEGIN PGP PRIVATE KEY BLOCK----- Charset: UTF-8 Version: End-To-End v0.3.1342 xf8AAAB3BAAAAAATCCqGSM49AwEHAgMEmUwnXtxBvQY+nXvduAbd626NmYshRVi4 HULGQ9fAHjKqfld4qWk97o+ggZDAnhQJ/Jm3ljtXr3/SosXUsSh7AAABAP2/JEYo 22A3Ju3N3vhcbSuvJiHggUDtaomAX2ts2uGYEOvN/wAAABY8ZXhhbXBsZUBhbm90 aGVyLnRlc3Q+wv8AAACNBBATCAA//wAAAAWCVazty/8AAAACiwn/AAAACZADKIx0 +L6PD/8AAAAFlQgJCgv/AAAAA5YBAv8AAAACmwP/AAAAAp4BAACIEgD8C80DxHrk iIBDHF5EWguzM+gUTb4xmIdTAJ2wGUOnTOoA/RpWuJNKU3kdtnnmqce88//jN8VF 1Ho0BONH1b7dRV4ix/8AAAB7BAAAAAASCCqGSM49AwEHAgMEyfb375CDU05C3BXj FY3tGbGEmGrTgNj0lAzdbi7TVm5tiHidcNWPHSQPS8aMmygH23OvIkTBmJdCHR38 lGID/gMBCAcAAQD8IOp5uKaGHtkmHNdwiwizTl3a2fAltOEAmWwyS6X0qBD1wv8A AABtBBgTCAAf/wAAAAWCVazty/8AAAAJkAMojHT4vo8P/wAAAAKbDAAA88EBAKve TpskPN10clQ6TeCFqlq51jhB5ZhzPSq64ChB7p8nAQCa9aJZneQOvMDquN/1vpJK MvDHHXB+EgIsuAzL0DtfL8b/AAAAUgQAAAAAEwgqhkjOPQMBBwIDBJlMJ17cQb0G Pp173bgG3etujZmLIUVYuB1CxkPXwB4yqn5XeKlpPe6PoIGQwJ4UCfyZt5Y7V69/ 0qLF1LEoewDN/wAAABY8ZXhhbXBsZUBhbm90aGVyLnRlc3Q+wv8AAACNBBATCAA/ /wAAAAWCVazty/8AAAACiwn/AAAACZADKIx0+L6PD/8AAAAFlQgJCgv/AAAAA5YB Av8AAAACmwP/AAAAAp4BAACIEgD8C80DxHrkiIBDHF5EWguzM+gUTb4xmIdTAJ2w GUOnTOoA/RpWuJNKU3kdtnnmqce88//jN8VF1Ho0BONH1b7dRV4izv8AAABWBAAA AAASCCqGSM49AwEHAgMEyfb375CDU05C3BXjFY3tGbGEmGrTgNj0lAzdbi7TVm5t iHidcNWPHSQPS8aMmygH23OvIkTBmJdCHR38lGID/gMBCAfC/wAAAG0EGBMIAB// AAAABYJVrO3L/wAAAAmQAyiMdPi+jw//AAAAApsMAADzwQD/ahaSqogMflSlGJRU Z6Qb51EAaYBB5nL/u1ckWLh/CCEBAM83CFzh1qJXzYnl5DJNAPnj4jJgJKtSxOhn bvlk62wx =Xjs9 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/e2e-p256-1-prt.asc000064400000000000000000000035161046102023000202670ustar 00000000000000pub nistp256/03288C74F8BE8F0F 1970-01-01 uid [ unknown] sub nistp256/A6ED196C7C513F1E 1970-01-01 Passphrase is "a". Taken from https://github.com/google/end-to-end/issues/326#issuecomment-123585977 -----BEGIN PGP PRIVATE KEY BLOCK----- Charset: UTF-8 Version: End-To-End v0.3.1342 xf8AAAClBAAAAAATCCqGSM49AwEHAgMEmUwnXtxBvQY+nXvduAbd626NmYshRVi4 HULGQ9fAHjKqfld4qWk97o+ggZDAnhQJ/Jm3ljtXr3/SosXUsSh7AP4JAwLJdqYd 6K+4XWACOPArMgQfaUFtQY54pRS1Vo98N4Jpw7o0iYAr80y40s5DaBIcUD5UuMHM p5no4vv8/hVCkIWJvoD/08rIzJDYEc9h2S4Lzf8AAAAWPGV4YW1wbGVAYW5vdGhl ci50ZXN0PsL/AAAAjQQQEwgAP/8AAAAFglWs7cv/AAAAAosJ/wAAAAmQAyiMdPi+ jw//AAAABZUICQoL/wAAAAOWAQL/AAAAApsD/wAAAAKeAQAAiBIA/AvNA8R65IiA QxxeRFoLszPoFE2+MZiHUwCdsBlDp0zqAP0aVriTSlN5HbZ55qnHvPP/4zfFRdR6 NATjR9W+3UVeIsf/AAAAqQQAAAAAEggqhkjOPQMBBwIDBMn29++Qg1NOQtwV4xWN 7RmxhJhq04DY9JQM3W4u01ZubYh4nXDVjx0kD0vGjJsoB9tzryJEwZiXQh0d/JRi A/4DAQgH/gkDAsplyBF6DNuBYC3tTyYEL0QQjWrcaaeTk4JSb93mog6QlL610EO5 +muowWT9Dl8Ll77BjQSpj7mmqGHIj/IxJubOYqa+iW1e4pj5qlXCaBbC/wAAAG0E GBMIAB//AAAABYJVrO3L/wAAAAmQAyiMdPi+jw//AAAAApsMAADzwQEAq95OmyQ8 3XRyVDpN4IWqWrnWOEHlmHM9KrrgKEHunycBAJr1olmd5A68wOq43/W+kkoy8Mcd cH4SAiy4DMvQO18vxv8AAABSBAAAAAATCCqGSM49AwEHAgMEmUwnXtxBvQY+nXvd uAbd626NmYshRVi4HULGQ9fAHjKqfld4qWk97o+ggZDAnhQJ/Jm3ljtXr3/SosXU sSh7AM3/AAAAFjxleGFtcGxlQGFub3RoZXIudGVzdD7C/wAAAI0EEBMIAD//AAAA BYJVrO3L/wAAAAKLCf8AAAAJkAMojHT4vo8P/wAAAAWVCAkKC/8AAAADlgEC/wAA AAKbA/8AAAACngEAAIgSAPwLzQPEeuSIgEMcXkRaC7Mz6BRNvjGYh1MAnbAZQ6dM 6gD9Gla4k0pTeR22eeapx7zz/+M3xUXUejQE40fVvt1FXiLO/wAAAFYEAAAAABII KoZIzj0DAQcCAwTJ9vfvkINTTkLcFeMVje0ZsYSYatOA2PSUDN1uLtNWbm2IeJ1w 1Y8dJA9LxoybKAfbc68iRMGYl0IdHfyUYgP+AwEIB8L/AAAAbQQYEwgAH/8AAAAF glWs7cv/AAAACZADKIx0+L6PD/8AAAACmwwAAPPBAP9qFpKqiAx+VKUYlFRnpBvn UQBpgEHmcv+7VyRYuH8IIQEAzzcIXOHWolfNieXkMk0A+ePiMmAkq1LE6Gdu+WTr bDE= =Sgsj -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-1-pub.asc000064400000000000000000000016611046102023000211130ustar 00000000000000The key has been generated by the first GnuPG ECC version at http://code.google.com/p/gnupg-ecc. The sample key has ECDSA top key 0xBAA59D9C and a single ECDH encryption subkey 0x4089AB73. ECDH subkey uses SHA-256 and AES-128 with KDF. -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2.1.0-ecc (GNU/Linux) mFIETJPQrRMIKoZIzj0DAQcCAwQLx6e669XwjHTHe3HuROe7C1oYMXuZbaU5PjOs xSkyxtL2D00e/jWgufuNN4ftS+6XygEtB7j1g1vnCTVF1TLmtCRlY19kc2FfZGhf MjU2IDxvcGVucGdwQGJyYWluaHViLm9yZz6IegQTEwgAIgUCTJPQrQIbAwYLCQgH AwIGFQgCCQoLBBYCAwECHgECF4AACgkQC6Ut8LqlnZzmXQEAiKgiSzPSpUOJcX9d JtLJ5As98Alit2oFwzhxG7mSVmQA/RP67yOeoUtdsK6bwmRA95cwf9lBIusNjehx XDfpHj+/uFYETJPQrRIIKoZIzj0DAQcCAwR/cMCoGEzcrqXbILqP7Rfke977dE1X XsRJEwrzftreZYrn7jXSDoiXkRyfVkvjPZqUvB5cknsaoH/3UNLRHClxAwEIB4hh BBgTCAAJBQJMk9CtAhsMAAoJEAulLfC6pZ2c1yYBAOSUmaQ8rkgihnepbnpK7tNz 3QEocsLEtsTCDUBGNYGyAQDclifYqsUChXlWKaw3md+yHJPcWZXzHt37c4q/MhIm oQ== =hMzp -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-1-sec.asc000064400000000000000000000022411046102023000210720ustar 00000000000000The key has been generated by the first GnuPG ECC version at http://code.google.com/p/gnupg-ecc. The sample key has ECDSA top key 0xBAA59D9C and a single ECDH encryption subkey 0x4089AB73. ECDH subkey uses SHA-256 and AES-128 with KDF. The password for the key is "ecc". -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v2.1.0-ecc (GNU/Linux) lJ0ETJPQrRMIKoZIzj0DAQcCAwQLx6e669XwjHTHe3HuROe7C1oYMXuZbaU5PjOs xSkyxtL2D00e/jWgufuNN4ftS+6XygEtB7j1g1vnCTVF1TLm/gMDAmHomSLb9NbE oyWUoqgKTbZzbFR/SWmiCcuiQEhREcTyvyU1hAglj7FsBJoQ6/pbeAEQZ3bVzlNM 8F0nF8KPLPuEADF1+4CntCRlY19kc2FfZGhfMjU2IDxvcGVucGdwQGJyYWluaHVi Lm9yZz6IegQTEwgAIgUCTJPQrQIbAwYLCQgHAwIGFQgCCQoLBBYCAwECHgECF4AA CgkQC6Ut8LqlnZzmXQEAiKgiSzPSpUOJcX9dJtLJ5As98Alit2oFwzhxG7mSVmQA /RP67yOeoUtdsK6bwmRA95cwf9lBIusNjehxXDfpHj+/nKEETJPQrRIIKoZIzj0D AQcCAwR/cMCoGEzcrqXbILqP7Rfke977dE1XXsRJEwrzftreZYrn7jXSDoiXkRyf VkvjPZqUvB5cknsaoH/3UNLRHClxAwEIB/4DAwJh6Jki2/TWxKO7gHKWIcOcxYZp CRWjlUghbKb6Q83p8GLPjKRN0USl/U1tObWdksqMXhUO0ePLWUnrbwoWYfYXg9Er ADTgCYhhBBgTCAAJBQJMk9CtAhsMAAoJEAulLfC6pZ2c1yYA/3eJRirPQZmBno+Z P/HOBSFWmFt4cUBGUx3oqiUd5loOAP480pb+vXx9ipljJWCJDSl/boRSuqB4hePP qt9Rd5gNdQ== =O8Dg -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-2-pub.asc000064400000000000000000000022431046102023000211110ustar 00000000000000ECC NIST P-384 key taken from https://sites.google.com/site/brainhub/pgpecckeys The sample key has ECDSA top key 0x098033880F54719F and a single ECDH encryption subkey 0xAA8B938F9A201946. ECDH subkey uses SHA-384 and AES-256 with KDF. -----BEGIN PGP PUBLIC KEY BLOCK----- Version: PGP Command Line v10.0.0 (Linux) mQBvBE1TBZITBSuBBAAiAwME9rjFrO1bhO+fSiCdsuSp37cNKMuMEOzVdnSp+lpn OJlCti1eUTZ99Me/0/jlAP7s8H7SZaYhqOu75T6UfseMZ366FDvRUzwrNQ4cKfgj E+HhEI66Bjvh5ksQ5pUOeZwttCRlY19kc2FfZGhfMzg0IDxvcGVucGdwQGJyYWlu aHViLm9yZz6JAMsEEBMJAFMFAk1TBZIwFIAAAAAAIAAHcHJlZmVycmVkLWVtYWls LWVuY29kaW5nQHBncC5jb21wZ3BtaW1lBAsJCAcCGQEFGwMAAAACFgIFHgEAAAAE FQkKCAAKCRAJgDOID1Rxn8orAYCqNzUJaL1fEVr9jOe8exA4IhUtv/BtCvzag1Mp UQkFuYy0abogj6q4fHQSt5nntjMBf1g2TqSA6KGj8lOgxfIsRG6L6an85iEBNu4w gRq71JE53ii1vfjcNtBq50hXnp/1A7kAcwRNUwWSEgUrgQQAIgMDBC+qhAJKILZz XEiX76W/tBv4W37v6rXKDLn/yOoEpGrLJVNKV3aU+eJTQKSrUiOp3R7aUwyKouZx jbENfmclWMdzb+CTaepXOaKjVUvxbUH6pQVi8RxtObvV3/trmp7JGAMBCQmJAIQE GBMJAAwFAk1TBZIFGwwAAAAACgkQCYAziA9UcZ+AlwGA7uem2PzuQe5PkonfF/m8 +dlV3KJcWDuUM286Ky1Jhtxc9Be40tyG90Gp4abSNsDjAX0cdldUWKDPuTroorJ0 /MZc7s16ke7INla6EyGZafBpRbSMVr0EFSw6BVPF8vS9Emc= =I76R -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-2-sec.asc000064400000000000000000000020051046102023000210710ustar 00000000000000ECC NIST P-384 key taken from https://sites.google.com/site/brainhub/pgpecckeys The sample key has ECDSA top key 0x098033880F54719F and a single ECDH encryption subkey 0xAA8B938F9A201946. ECDH subkey uses SHA-384 and AES-256 with KDF. The password for the key is "ecc". -----BEGIN PGP PRIVATE KEY BLOCK----- Version: PGP Command Line v10.0.0 (Linux) lQDSBE1TBZITBSuBBAAiAwME9rjFrO1bhO+fSiCdsuSp37cNKMuMEOzVdnSp+lpn OJlCti1eUTZ99Me/0/jlAP7s8H7SZaYhqOu75T6UfseMZ366FDvRUzwrNQ4cKfgj E+HhEI66Bjvh5ksQ5pUOeZwt/gcDAkrFTsfF6LKsqD/tW6Eot2DDE8znJjnQQ/Nr H98XT1WQ9V0ED8l9DDIIj7z80ED3NR8XMSI8Ew/A/0w6NDPL978BX0MGvpaeBaWV tEuH1EPAxiA+hFALwftY+a8s1zLktCRlY19kc2FfZGhfMzg0IDxvcGVucGdwQGJy YWluaHViLm9yZz6dANYETVMFkhIFK4EEACIDAwQvqoQCSiC2c1xIl++lv7Qb+Ft+ 7+q1ygy5/8jqBKRqyyVTSld2lPniU0Ckq1Ijqd0e2lMMiqLmcY2xDX5nJVjHc2/g k2nqVzmio1VL8W1B+qUFYvEcbTm71d/7a5qeyRgDAQkJ/gkDAqqmkngPLoJGqI4O rHyyU3wrrPzDDDURkseoUEZlDZINjyto26A8N825mqLqeFytJuuABYH1UnLs4d2x ZJZIYjEoFMPcFPuUtx+IZnECa1Vcyq2aRFCixVO0G/xrSFar =a4k3 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-3-pub.asc000064400000000000000000000025421046102023000211140ustar 00000000000000ECC NIST P-521 key taken from https://sites.google.com/site/brainhub/pgpecckeys The sample key has ECDSA top key 0x6B4184E145AF2FFE and a single ECDH encryption subkey 0x07EAAA48A81C4838. ECDH subkey uses SHA-512 and AES-256 with KDF. -----BEGIN PGP PUBLIC KEY BLOCK----- Version: PGP Command Line v10.0.0 (Linux) mQCTBE1TFQITBSuBBAAjBCMEAWuwULfE2XoQmJhSQZ8rT5Ecr/kooudn4043gXHy NZEdTeFfY2G7kwEaxj8TXfd1U1b4PkEoqhzKxhz/MHK/lwi2ARzW1XQiJ1/kFPsv IUnQI1CUS099WKKQhD8JMPPyje1dKfjFjm2gzyF3TOMX1Cyy8wFyF0MiHVgB3ezb w7C6jY+3tCRlY19kc2FfZGhfNTIxIDxvcGVucGdwQGJyYWluaHViLm9yZz6JAO0E EBMKAFMFAk1TFQIwFIAAAAAAIAAHcHJlZmVycmVkLWVtYWlsLWVuY29kaW5nQHBn cC5jb21wZ3BtaW1lBAsJCAcCGQEFGwMAAAACFgIFHgEAAAAEFQoJCAAKCRBrQYTh Ra8v/sm3Agjl0YO73iEpu1z1wGtlUnACi21ti2PJNGlyi84yvDQED0+mxhhTRQYz 3ESaS1s/+4psP4aH0jeVQhce15a9RqfX+AIHam7i8K/tiKFweEjpyMCB594zLzY6 lWbUf1/1a+tNv3B6yuIwFB1LY1B4HNrze5DUnngEOkmQf2esw/4nQGB87Rm5AJcE TVMVAhIFK4EEACMEIwQBsRFES0RLIOcCyO18cq2GaphSGXqZtyvtHQt7PKmVNrSw UuxNClntOe8/DLdq5mYDwNsbT8vi08PyQgiNsdJkcIgAlAayAGB556GKHEmP1JC7 lCUxRi/2ecJS0bf6iTTqTqZWEFhYs2aXESwFFt3V4mga/OyTGXOpnauHZ22pVLCz 6kADAQoJiQCoBBgTCgAMBQJNUxUCBRsMAAAAAAoJEGtBhOFFry/++p0CCQFJgUCn kiTKCNfP8Q/MO2BCp1QyESk53GJlCgIBAoa7U6X2fQxe2+OU+PNCjicJmZiSrV6x 6nYfGJ5Jx753sqJWtwIJAc9ZxCQhj4V52FmbPYexZPPneIdeCDjtowD6KUZxiS0K eD8EzdmeJQWBQsnPtJC/JJL4zz6JyYMXf4jIb5JyGNQC =5yaB -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-3-sec.asc000064400000000000000000000022271046102023000211000ustar 00000000000000ECC NIST P-521 key taken from https://sites.google.com/site/brainhub/pgpecckeys The sample key has ECDSA top key 0x6B4184E145AF2FFE and a single ECDH encryption subkey 0x07EAAA48A81C4838. ECDH subkey uses SHA-512 and AES-256 with KDF. The password for the key is "ecc". -----BEGIN PGP PRIVATE KEY BLOCK----- Version: PGP Command Line v10.0.0 (Linux) lQEIBE1TFQITBSuBBAAjBCMEAWuwULfE2XoQmJhSQZ8rT5Ecr/kooudn4043gXHy NZEdTeFfY2G7kwEaxj8TXfd1U1b4PkEoqhzKxhz/MHK/lwi2ARzW1XQiJ1/kFPsv IUnQI1CUS099WKKQhD8JMPPyje1dKfjFjm2gzyF3TOMX1Cyy8wFyF0MiHVgB3ezb w7C6jY+3/gcDAv+CotECRPpSqGkqKrz+xAhAqswHXzFIBprFF0XiDooWktZSTAUR JVB2U6m28wC4rE3RkqFeR1B+kg4nxEAJ9k6BI8oDE0iyOY5aklF2TxPpTs/BA+N2 O4hnXb1l5qXfuyd3bSwDeyfq3CdFe4TeKp7vtCRlY19kc2FfZGhfNTIxIDxvcGVu cGdwQGJyYWluaHViLm9yZz6dAQwETVMVAhIFK4EEACMEIwQBsRFES0RLIOcCyO18 cq2GaphSGXqZtyvtHQt7PKmVNrSwUuxNClntOe8/DLdq5mYDwNsbT8vi08PyQgiN sdJkcIgAlAayAGB556GKHEmP1JC7lCUxRi/2ecJS0bf6iTTqTqZWEFhYs2aXESwF Ft3V4mga/OyTGXOpnauHZ22pVLCz6kADAQoJ/gkDAki71k/zBW2qqGyScDNNuWaA 9A5aWhpNNyRrFembt7f/W+b591G3twdNmdCIh29VoOmQw3fO8wwgsPTUxQFgd8J3 ncft0zciEcDZi/ztLZA3+rIIP2myZLIs9xLG+k+gf3nXpeED4uYqQX3GL+32PKwg =Qnd8 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-4-pub.asc000064400000000000000000000012241046102023000211110ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- xk8EZOCbFRMFK4EEAAoCAwRI6QrAyzsLRhdeT+qIm77vBpRNhD7GkQF6FyPj2xZ4 6bbT+xEnDa+y8CK21o0vaKT5iq+Fo3OMtlAgP56SiBpHzRhNZS1YIDxtZS1lY2Rz YUBtYWlsLmNvbT7CiwQQEwgAMwIZAQUCZOCbFQIbAwQLCQgHBhUICQoLAgMWAgEW IQRi7HmfNzWzQlRzcoThWpuxWiOkPwAKCRDhWpuxWiOkP7JaAQC97Ag6txz+gSUf jVa3albk+FyPLjF4G89feLL0J53c5wD/bumD3u2Tpx3hDMIdNRtcMmqfkFsNCrmT LaVeaix7uanOOARk4JsVEgorBgEEAZdVAQUBAQdAhsveEHNtALI3yjZhpN3XwIDU 18DKCE8URvxu1LZbgWwDAQgHwngEGBMIACAFAmTgmxUCGwwWIQRi7HmfNzWzQlRz coThWpuxWiOkPwAKCRDhWpuxWiOkP2ZlAP0dHvRxa1cGUOF8CG+7JwOEH2g2IZaT qCwBMGu1I5lRTQD/etITcEKD0Ee/VpJOBlyvOxdNtD2M8S+LhCuLK0ZK8p4= =MvON -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ecc-sample-4-sec.asc000064400000000000000000000013741046102023000211030ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xXQEZOCbFRMFK4EEAAoCAwRI6QrAyzsLRhdeT+qIm77vBpRNhD7GkQF6FyPj2xZ4 6bbT+xEnDa+y8CK21o0vaKT5iq+Fo3OMtlAgP56SiBpHAAD/bDuap2f3hbU3wNi6 X6VGd+am4oEyDfuyfIibj6RgZw8STM0YTWUtWCA8bWUtZWNkc2FAbWFpbC5jb20+ wosEEBMIADMCGQEFAmTgmxUCGwMECwkIBwYVCAkKCwIDFgIBFiEEYux5nzc1s0JU c3KE4VqbsVojpD8ACgkQ4VqbsVojpD+yWgEAvewIOrcc/oElH41Wt2pW5Phcjy4x eBvPX3iy9Ced3OcA/27pg97tk6cd4QzCHTUbXDJqn5BbDQq5ky2lXmose7mpx10E ZOCbFRIKKwYBBAGXVQEFAQEHQIbL3hBzbQCyN8o2YaTd18CA1NfAyghPFEb8btS2 W4FsAwEIBwAA/2kmu8QRlqbG+TC7Oq8g/A8LlvqIANIeA2HiyyFDQHggD3jCeAQY EwgAIAUCZOCbFQIbDBYhBGLseZ83NbNCVHNyhOFam7FaI6Q/AAoJEOFam7FaI6Q/ ZmUA/R0e9HFrVwZQ4XwIb7snA4QfaDYhlpOoLAEwa7UjmVFNAP960hNwQoPQR79W kk4GXK87F020PYzxL4uEK4srRkryng== =X+kB -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ed25519-cv25519-sample-1.asc000064400000000000000000000016161046102023000216070ustar 00000000000000pub ed25519 2016-06-22 [SC] B21DEAB4F875FB3DA42F1D1D139563682A020D0A Keygrip = 1E28F20E41B54C2D1234D896096495FF57E08D18 uid [ unknown] patrice.lumumba@example.net sub cv25519 2016-06-22 [E] 8D0221D9B2877A741D69AC4E9185878E4FCD74C0 Keygrip = EB33B687EB8581AB64D04852A54453E85F3DF62D -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mDMEV2o9XRYJKwYBBAHaRw8BAQdAZ8zkuQDL9x7rcvvoo6s3iEF1j88Dknd9nZhL nTEoBRm0G3BhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldIh5BBMWCAAhBQJXaj1d AhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEBOVY2gqAg0KmQ0BAMUNzAlT OzG7tolSI92lhePi5VqutdqTEQTyYYWi1aEsAP0YfiuosNggTc0oRTSz46S3i0Qj AlpXwfU00888yIreDbg4BFdqPY0SCisGAQQBl1UBBQEBB0AWeeZlz31O4qTmIKr3 CZhlRUXZFxc3YKyoCXyIZBBRawMBCAeIYQQYFggACQUCV2o9jQIbDAAKCRATlWNo KgINCsuFAP9BplWl813pi779V8OMsRGs/ynyihnOESft/H8qlM8PDQEAqIUPpIty OX/OBFy2RIlIi7J1bTp9RzcbzQ/4Fk4hWQQ= =qRfF -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/eddsa-sample-1-pub.asc000064400000000000000000000012131046102023000214320ustar 00000000000000pub ed25519/97965A9A 2014-08-19 Key fingerprint = C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A Keygrip = 0DD40284FF992CD24DC4AAC367037E066FCEE26A uid [ unknown] EdDSA sample key 1 (draft-koch-eddsa-for-openpgp-00) -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mDMEU/NfCxYJKwYBBAHaRw8BAQdAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJku Q+47JAa0NEVkRFNBIHNhbXBsZSBrZXkgMSAoZHJhZnQta29jaC1lZGRzYS1mb3It b3BlbnBncC0wMCmIeQQTFggAIQUCU/NfCwIbAwULCQgHAgYVCAkKCwIEFgIDAQIe AQIXgAAKCRCM/eEhl5ZamnNOAP9pKn5wz3jPsgy9p65zxz1+xJEr/cczFQx/tYkk 49tkeAD+P9jJE4SFD2lVofxn1e22H7YLvcVyHDOA9gpYWTNXiAU= =Jbi7 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/eddsa-sample-1-sec.asc000064400000000000000000000014311046102023000214200ustar 00000000000000sec ed25519/97965A9A 2014-08-19 Key fingerprint = C959 BDBA FA32 A2F8 9A15 3B67 8CFD E121 9796 5A9A Keygrip = 0DD40284FF992CD24DC4AAC367037E066FCEE26A uid [ unknown] EdDSA sample key 1 (draft-koch-eddsa-for-openpgp-00) The passphrase is "abc". -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v2 lIYEU/NfCxYJKwYBBAHaRw8BAQdAPwmJlL3ZFu1AUxl5NOSofIBzOhKA1i+AEJku Q+47JAb+BwMCeZTNZ5R2udDknlhWE5VnJaHe+HFieLlfQA+nibymcJS5lTYL7NP+ 3CY63ylHwHoS7PuPLpdbEvROJ60u6+a/bSe86jRcJODR6rN2iG9v5LQ0RWREU0Eg c2FtcGxlIGtleSAxIChkcmFmdC1rb2NoLWVkZHNhLWZvci1vcGVucGdwLTAwKYh5 BBMWCAAhBQJT818LAhsDBQsJCAcCBhUICQoLAgQWAgMBAh4BAheAAAoJEIz94SGX llqac04A/2kqfnDPeM+yDL2nrnPHPX7EkSv9xzMVDH+1iSTj22R4AP4/2MkThIUP aVWh/GfV7bYftgu9xXIcM4D2ClhZM1eIBQ== =+9EF -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/issue2346.gpg000064400000000000000000000066031046102023000176370ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v2 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 =njf7 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/no-creation-time.gpg000064400000000000000000000017231046102023000213400ustar 00000000000000ฦภเ๙ฉ๐-๖*๙ำFŸPc5”ษ๙‡้ Jr ๖ฉฅโ*โc๒”Uำ’ž,Sh—๗ูง€ศขW/พj“`ฎ๙w>เwหSŸ,ิ9~เ†์๎ย+กBภ4กญพษOเพะHท๐– vRW-ห7๔ฏ’hฺูชถŠŽ{‘e?๒)(ฑg ฤ9C“(๏๚พ•šทbU๘ฬœข๎Šิjฆz*๎๐๓คvˆทDฎC๒pใศOษoeE[=uฯfF9”>าฑปา\,Fห้ๆM2aK็ชตœJesaFฃน๛?ซoฎLด] ถ้Uฟ#Aษž k-s ๏ /ฯb>มื>cAZ.Nิ/น๘๑ัใUVHl‚เE๐ž๒ถYk€๙ฐจ๏g๒`ŸเSจึ8’Bฐ&46g6โต …žญึƒษg kฑศๅ,Zิtย$ํ=Gb?t2ฅษJ”๖Œำmะ๚ํ๏ฆxฬx๐œฅTZ;giฐัIุ๒mห๕.y๒ŸเTเXษIฏnฎ_ฅ“่š-|xใU k3}ศ๓fžNๆ^Š:Rk6a>išอšจ`'f|Y๓-Š#h^ึๅGๆSแฬตีจ๕—rร๙ซาUส<ฒฝi–IัWjฮูwะ•ฟต>ี‘๚ผ]0}€}|g๋ฦ0Cยา [=๓ี}uฒฝw˜4?จCถ\>Gโืtู‡S/ฑปn>W๙=๛pDTฮ+๑NRJW}อํO๗ปCฟฦุƒื฿พ&QOิRZO‰๓‡Gc ฝŒ็ม๗ยFIeฮq  †|ฑz฿ๆนž#fRzS๊+ๅํ‡;~ ท๓‹ัŸv๖๏๕ซ—กaW`็zœHpgp-0.15.0/tests/openpgp/samplekeys/rsa-primary-auth-only.pub.asc000064400000000000000000000021401046102023000231220ustar 00000000000000pub rsa2048 2017-02-14 [CA] F74B4029E6906D12EBDA8EE3BD7744900FDABC8D Keygrip = AB1BB1843677AF7CC4D6C14444320C3FF4147E98 uid [ unknown] ssh://host.example.net -----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFiizWgBCACi28riS0AaC7UvXaZfoafEvcXq/MAq6akiowPf3eY4zz5DkBPf Ep3kGuDMAFqULvchIt9vpg719Zar/Xldi+UG+/KsDz+TT5k+nP6CwvBHbAXXtISv S51TKKnTFpvjcgJc1BMFN0pGf7JnZx1QfRfsZO2BvS4qVzYCWbSS9hlpMq4aIgOc ERBMsZYMPnI4ijbXysksecDC91kbJH0q5j8aGir5sDyrDwfVLp0SUAubRFU5gXuZ SEv9QmeV7XoXKXzk9KEYy7GUgoAJzabvbF0rVXqd3DE8KFkwK7rKBe8sGC04DWlK j/sHJcAfMSqCi/SZyYpO+FSfnB+uJ1BNc05hABEBAAG0FnNzaDovL2hvc3QuZXhh bXBsZS5uZXSJAU4EEwEIADgWIQT3S0Ap5pBtEuvajuO9d0SQD9q8jQUCWKLNaAIb IQULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRC9d0SQD9q8jZBrB/41MJWUeclV tM60+ydPNgUJwyRXpKdLIm/AtM1zOijlFkwsaMmzbFSFJJX98HGASHdU5OpL2Lv3 1NNDNMbUuFumApVrLzJUBugFRb+8/uY7H3Z0/YKQ9g9OC3z7+uqFFv/+/wA+VdYX Zy6uim8E4OlJ41S68fQcMiTxbLTCDkvBbpf505t6JhNqF6JB+SBFQJXvRqjoydXf dyoiDz9N1V0ERzmGEiPewvHg2zWcVia07NGhxN3slQ3klOfYJQ8Ye72feNq1zKCy AyU3X8fL10XKWooCAU+t4hR5hXYxYTSZse5q0FHZ38Lt9c3ApMSZ2+ueeOtGbsH9 kV8icGkI6KXp =zMXp -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/rsa-primary-auth-only.sec.asc000064400000000000000000000037441046102023000231210ustar 00000000000000sec rsa2048 2017-02-14 [CA] F74B4029E6906D12EBDA8EE3BD7744900FDABC8D Keygrip = AB1BB1843677AF7CC4D6C14444320C3FF4147E98 uid [ unknown] ssh://host.example.net Passprase: none -----BEGIN PGP PRIVATE KEY BLOCK----- lQOYBFiizWgBCACi28riS0AaC7UvXaZfoafEvcXq/MAq6akiowPf3eY4zz5DkBPf Ep3kGuDMAFqULvchIt9vpg719Zar/Xldi+UG+/KsDz+TT5k+nP6CwvBHbAXXtISv S51TKKnTFpvjcgJc1BMFN0pGf7JnZx1QfRfsZO2BvS4qVzYCWbSS9hlpMq4aIgOc ERBMsZYMPnI4ijbXysksecDC91kbJH0q5j8aGir5sDyrDwfVLp0SUAubRFU5gXuZ SEv9QmeV7XoXKXzk9KEYy7GUgoAJzabvbF0rVXqd3DE8KFkwK7rKBe8sGC04DWlK j/sHJcAfMSqCi/SZyYpO+FSfnB+uJ1BNc05hABEBAAEAB/wN0yan4HIdQ+fU5i2c v0uknI9+i9zW8mWUi84Puks0K15CZ1VTLHC8JQ6hgq4twhw3HeS7GkJO3X2K4BuQ tggdIv94slqtQKaQ9XbNgYraz/AMXZtIiNy0FdGaGmM6rY+ccwxM9w1BFXn+48v4 lzCUCq/2wX53wwDSC5dpRPw8km6+uksFh3dfY8kgfpjU/lUCCwQiooYrQhut1EGB lDLRHp2ntC1xsnowtdPzluIHFetFSnmn2ehGqXqXtXLAMF0HOirViO5dUVMuj2Pe ra3IYVYANYK/7FEsRXHxU6aB/BSnubb5EiqB1Oi1JNyMrvYZnRsoRUaMjVgjA4ne RwD5BADBZN2USYGgciDVh7kvTbrtS1igPhoe3xUUQsM0hVIEwBzG4A4pWXznIQyW BziVTnRNp953EbHJIYdn7vmJzdiRKI+hOvrF8dfvVsq+fp4pWxrc+zrC6qptpo6H IhkHWUpyfIPuTI8d+glIUIuDshwKau0UZ8VDTOYuRYEZX9PrAwQA15RdS3geA1cf UK/ZaKs5VnohcLtEE/z3BlvlQaEdHxSQJSLYC4By7zKVOFZlZkHk36IPikwYNTgc P57aLe7rwNZqPhADue1ZN6Ypetvrek55lAYL9XoPJ/mWaYz6oDWWW8vHYqEPk8OL N8/8a6DhK0iydXi9/ztHQllbOt0EUcsEAJBjX84FgIi3VRotRSEDN/tIhekNo8p6 Pl8YF4V8A1hCVBEKRIcsPVx603DFiGFRcQQcBbblqVG4fpOYYgiBtEgJksRiMg/o kmVkl8BPrIhBGe2ez7byhhFvJDAoOWCdH0MWGaPGUoCGTDvd046GE8B3UWN9TSmo qAqfrUG0hQVQLEa0FnNzaDovL2hvc3QuZXhhbXBsZS5uZXSJAU4EEwEIADgWIQT3 S0Ap5pBtEuvajuO9d0SQD9q8jQUCWKLNaAIbIQULCQgHAgYVCAkKCwIEFgIDAQIe AQIXgAAKCRC9d0SQD9q8jZBrB/41MJWUeclVtM60+ydPNgUJwyRXpKdLIm/AtM1z OijlFkwsaMmzbFSFJJX98HGASHdU5OpL2Lv31NNDNMbUuFumApVrLzJUBugFRb+8 /uY7H3Z0/YKQ9g9OC3z7+uqFFv/+/wA+VdYXZy6uim8E4OlJ41S68fQcMiTxbLTC DkvBbpf505t6JhNqF6JB+SBFQJXvRqjoydXfdyoiDz9N1V0ERzmGEiPewvHg2zWc Via07NGhxN3slQ3klOfYJQ8Ye72feNq1zKCyAyU3X8fL10XKWooCAU+t4hR5hXYx YTSZse5q0FHZ38Lt9c3ApMSZ2+ueeOtGbsH9kV8icGkI6KXp =3QG9 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/rsa-rsa-sample-1.asc000064400000000000000000000037221046102023000211450ustar 00000000000000pub rsa2048 2016-06-22 [SC] 5B83120DB1E3A65AE5A8DCF6AA43F1DCC7FED1B7 Keygrip = C6A6390E9388CDBAD71EAEA698233FE5E04F001E uid [ unknown] steve.biko@example.net sub rsa2048 2016-06-22 [E] 4CB4D8C018C57E60EB3847901D777619BE310D79 Keygrip = D69102E0F5AC6B6DB8E4D16DA8E18CF46D88CAE3 -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 mQENBFdqP+gBCACoG81sddF9ZZx6TsN7lenDxs53wqJt1bawToXZl6qJ+hO8tMNy /aUgaqqi8pC5FX3HlSRQhjRFDQXq4jR3+jecFK3wfwmxTKXMKhN52zhSIWClED47 56B3wPITuwAG2WYFccClhrtWX8j+wBK5IpLVVAXQnORZLOP7fzUZkO1KDu3bP4D6 f1LQyatIzgS08dnlp6WvsJDrkUeGY6R5smpx9f+PqBVfUVpmckbMOR+BYPJtplZT 0lez4qWsmdWbqU7ZhdvnhMGcTbBbk9WbfR1IJptigeuK8vTU24Jp2FQj6iIBV9OD jUfr11EJ6W3TvHaWuddd0hfX9DnyH9rghrDFABEBAAG0FnN0ZXZlLmJpa29AZXhh bXBsZS5uZXSJATcEEwEIACEFAldqP+gCGwMFCwkIBwIGFQgJCgsCBBYCAwECHgEC F4AACgkQqkPx3Mf+0bd5kggAphS7UDycKadfaRH5JENmKXeI+UUd+E0iERwv7eXq RcgjNK1oHQSXN+ejDEXzZv2fcCRB7rWEvEXL0pCtPveyzDAQJdhZTRVgmfCXTr1m 9pJfVC3B20jgx6ZxZO8jKDL+bqvufWJczWDT0iHP0Jv04SqASLRs2JRPy+a+w3GJ +DzG8orfAKiIE1Qycovr8Ol+jdo9ZV9blRA8/j4eqZYg4b7AOf8/mDyXsx3xzSPV uwkDSluhaOrsV8N0suZ51rfdpapv6VJsXlyQbceJwwgSt2A1n2Sw3ZINwpO7BODy wO6J44751+qY4cmap4NItyqGQTT6TUEL9ANfrZFmPWmFWLkBDQRXaj/oAQgA255C UJxFEKLVwEoSgwZqXd94AhjGUbMY6NXdFj5cCq0JmWZrbpT/5OblTrymiH1iLmI0 ymo+/s8vh6NtB98dhr1syH3asNQfXZRfF+u5X5hLDNPF4sUelsl4+EUef0Hbc9U+ e+8F8A9TMxELSqQ8Ul3Hu42hc+/ugkc1G/8++Sv/f60TqWcUR2GmuiAvkuS1WmdA TMhwPr7vMfssV0X0mboz32//b/UfuOyctso5FM+bRaKrEJDQ2WDg57yqnaqsKEga jW0jElpAVIn792W6YWKOk4auYSpO5f7BVs40Z+bxKGxiH87z9fnmlYAsQwPOOxZw WaCSrReeheK6c6emAQARAQABiQEfBBgBCAAJBQJXaj/oAhsMAAoJEKpD8dzH/tG3 baoH/0KI3pIUiIYiLESGXqF+s/W2BmGNwdkYldcyFwkXz84VXoG0B3k7nrwT2DOJ AEeToavzd3J+aZ4PmxBRAMtDhah0wsMXrwCI8y9Stmm6PIssnu9IP9+jgr4IkKIR UB/Wn6nzgseaNd7vN4JChCyLSvF+vLd3D56Wzq+hBjybaE+zcEusVLdKYDm2i0YC pkBkmSuC18lLxhNC8oSCCvVOiyw+TqGHhLnrpA4nGi0MLjAR3OgJ5d/TclYgkLcp yOupg9GplQsAZUFfQPrY80SJuN9ijBp4xtA1U+WCGKh4ySv1+odpRjPX3eOGUFKZ sJRKpZupoGWfVN78wm1nPLBKTvM= =6N/A -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/silent-running.asc000064400000000000000000000166061046102023000211410ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v2 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 =tU5z -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplekeys/ssh-dsa.key000064400000000000000000000012401046102023000175350ustar 00000000000000-----BEGIN DSA PRIVATE KEY----- MIIBvAIBAAKBgQCx0bAMKBKzYJugVtUFRRiF8jV4eT8mowj5C0q4QRPuPAGgPdqq g1PKmoIpCKLynqH29+BFErp1OOenWKRdu9claTu0lmIrMYeYw8liKsyMTg5/DxoV sRXD1DFoKdeZPDVUxOEQWsLf/IuuLXy4c9GxzET88wUDeieV+GcYQFADoQIVAKS7 giO+VWOnwqr0p/csUWltpo8TAoGBAJcVpe9riXRuxJtmy1sbJJzOvtPtXk5MCpGs T/KEXJuVZvu334zkySDd9Is1ML2g5e81ONRCgCGHpwNOzoLC4+yp+pr1E+B2xkUY ouEtZWhKlbaYw7UdHiRRMEVJqvu+CdyI2gwOveDSrVhoXmGyz9PQVNoiuRXP2hMF C21jNnBrAoGBAILRAY0/mqsaOTII3uC8KvqwbKlmPnYMJr0COmU1PbOXvaeyWLqG NHhwPZg6OEhqEk+WMIwb2Dcv70AIYKQU8jX0elh0lk6pE8bomn7/ZIkqa60VG1Cx 8x2GUNag78LvnLfmUPAXOrrCPfbGuqdogCymUz1qrtEzdOSbeBvCMAAFAhQr1sV4 +UWhlUoExLMDdIyT/ohfxQ== -----END DSA PRIVATE KEY----- pgp-0.15.0/tests/openpgp/samplekeys/ssh-ecdsa.key000064400000000000000000000003431046102023000200500ustar 00000000000000-----BEGIN EC PRIVATE KEY----- MHcCAQEEIF8Mt42n5l2eJB2rk5TSnS98xAtR2VfmmI96WT5OtFrdoAoGCCqGSM49 AwEHoUQDQgAEsphhghltvEj+1rFEcIlSNy2ze7IMHdhGsH060PwOzjKTy15M8zHI uaH9SOMXTzn3Bial8bxrXLsOYEhRZhYSrA== -----END EC PRIVATE KEY----- pgp-0.15.0/tests/openpgp/samplekeys/ssh-ed25519.key000064400000000000000000000006171046102023000177730ustar 00000000000000-----BEGIN OPENSSH PRIVATE KEY----- b3BlbnNzaC1rZXktdjEAAAAABG5vbmUAAAAEbm9uZQAAAAAAAAABAAAAMwAAAAtzc2gtZW QyNTUxOQAAACARyDcsgSrXAdihOuO5lN+qVKVPdwsXCmOZ61XYVUA1MAAAAJAOqdhVDqnY VQAAAAtzc2gtZWQyNTUxOQAAACARyDcsgSrXAdihOuO5lN+qVKVPdwsXCmOZ61XYVUA1MA AAAEATyEkvuhAExcEet+Rc2Qz2Fxg4iIi4XXJLpZFKwWsY3hHINyyBKtcB2KE647mU36pU pU93CxcKY5nrVdhVQDUwAAAACHRlc3Qga2V5AQIDBAU= -----END OPENSSH PRIVATE KEY----- pgp-0.15.0/tests/openpgp/samplekeys/ssh-rsa.key000064400000000000000000000032171046102023000175610ustar 00000000000000-----BEGIN RSA PRIVATE KEY----- MIIEpgIBAAKCAQEAxp4sIUtrNBl4Vbd4075CmtHmwxTc0FhQIGw36kptbrWReLb9 Np0RQylKyc6qUruxZlCdPVFo7iX3vs272/0GEakPv0DAsKGbe1nTsMyxxz0o3dP4 JQOlOGEnpETa0ybfPLMX1+qNiBdm7HLjqcP5+S0Exb0Z0deFNIhEP6XckUEgHmwA /AdDdUUKwwvZeZOi4XyBVt0vXzwM/+84ro27O+CZm9Du3qe1jTIsX7jUrqsUBhp9 eUwa1jXfXuJJo9b4/GeP4S9x8U7ho+BQ6/HH03dzcKaY3FftanCZkcwxfGBBUiCK pIA5WgKimLcgP2R75Y3jilDoBh5HyIdGXo0aFwIDAQABAoIBAQCBXLIHeXS4eUJc KeSjnQ8KgV4Yf3UWqf5+L533lkRSUCYQhrbDpGeC49kXOejLe/4eUrEnJ+f8/HOx LZSGwvT5+bAM9CLMqGV5YNc1Fw1PZHFCkfXUPdyVrQnBvyr7Th0mDsuf0OAf3IYn yOipQMCGX6D1HaY8e3AB+CLjhab0X1vAwvqzPb/HIdtMhRWlJxzbuqnE3kr+Ccvz us3vmD4VBp0CF0f+yblcibMCHdHY6j8Ir6Qeq6Mbd6lEXRPW1TgUqP15idVaJ4AF 1kGXDW9O0ycgrbopGZfk5yY60fEHGdr4QYjx2Gtx2xQcnPcjJ+j5kGgubKWxNhJE Qx7DPdYxAoGBAP29S+wD1df0U+Tr0x06N6M/nSjNacGs12Oq/ehNJHhTYUO9fWUl M2X/MXRMMMGsnGaLNsrLao9Jnq0ZU5GFICWYeVBvaCvRrGngbqJBy8jRv+QYyaQs AckLcdgLGvjhcXonHDcbcxpug7/qFwakT+KY2s11FrHBEzbAIuDiSSKfAoGBAMhj KPkrjWJh3xxpFrFnGYj5aF86ExrPe2LAP/8F6Ez7dQN+4bA6O5F4hpJ/X0q/6s0n IBljo/DgARCBjbwDSaAMEWdm8HDeBhJsSCdQHW38ylaRDi8CQDKR60N3a/tV1MRJ 4fKoHZ+7HH3wc+Bjv3oDovwVyUMG7ekCjeqbqI2JAoGBAOkhYX5Jz9KJBAPSwLeb 4760FfuFL+PooEVMt9kV96ouQbFxiqLB2UWfgJqv3iQ0Kcb1pbQRzag1Jfs4x9Vu ESk5vEyw729DSDxHHp8qAMhUHxC9zZZvcHx9bW3oVjHRQOfQw1XGfK0OWTKdK+bI VTWG55HaQK21DahCREmG31dVAoGBALBH80KHmsAioziGBi2YKjGCXtvu5eGfBsdP orzBQKOATmb91qLGB6MoaRI1NOo4POGu+qD7M7xyAt23aq0sIzfFhgX1260e1C6e zTawVsNsL7/JqbWXAEy8az+VrguTbTIkYL2sQStEWoM75WRPu6El09p5e+0YCnEC C0CJINUpAoGBAPF1fpPINHlUW+Bvo4Nj3935QgZI47yTplDusptyfYgFYXw6ZYel y5Zgv9TWZlmW9FDTp4XVgn5zQTEN1LdL7vNXWV9aOvfrqPk5ClBkxhndgq7j6MFs 9+9V06HJDIsSrC0D/ajIkP+iT9Hd6eEZMkJ6y6XtTbkJGYt2zOtnrpb6 -----END RSA PRIVATE KEY----- pgp-0.15.0/tests/openpgp/samplekeys/whats-new-in-2.1.asc000064400000000000000000000173761046102023000210110ustar 00000000000000These are the keys used in the whats-new-in-2.1 document. The private keys are in ../privkeys and protected with the passphrase "abc". -----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v2 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 PTgzPpanbg78WYNuT7+ZqlZYqj13 =44AC -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplemsgs/clearsig-1-key-1.asc000064400000000000000000000012051046102023000210230ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 You are scrupulously honest, frank, and straightforward. Therefore you have few friends. -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQE0BAEBCAAeBQJXakWmFxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH /tG3OiIH/18NlMSXXRFRrxXq9OZySzJxgLI7BjGilRTqb4ALeFzNjmCwu3Y+Gkdg t7NjYjSe0erWiKYDEmALICwcpmSmXHA//gol3QkHJKIlKQGXJP1qLvIde5+lnK8K YVwLKLBQBQtlGMkMXPdUEn9PgzSoBFoFIqrzQmAdLO3yijSdm0Mzl9wyIhtbUXk+ VgX2d/6DRIwcKcFoX2QbFlM/z1kdrS6cOYFbJWavEpLDz9ON8Q8a8uqcBiqRlSpW eGOMMsysJs+44+qX6uE3hu2KJE9xvHwhSjJOxqtw8dN3KZ1+8IkxsDrvDAhn+Klf Hbtj647f/iTOF88o1ihO7goDi93Bpv4= =xAv4 -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/clearsig-2-keys-1.asc000064400000000000000000000014201046102023000212060ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 "The geeks shall inherit the earth." -- Karl Lehenbauer -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQE0BAEBCAAeBQJXakX/FxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH /tG3g1AH/iQakK5FoXpNQs6Nj9NR4NUwtIPmlLS/Tas21CDs1Lo1Fum1gjU0VUFN 63+FTnbRg8nXfee9RPddLnec9lYWVqWSkggTFER8qQrj/EurltLMv/tHAZ+B0ueI mh2XkNHA6KXu3DFipAXQezWaUqi485TGTY6Qv9JtG/plOZBakcRTgCSAamyaDPBA PHgp85bPf5Zu4aFRBfmJp+IUH/EFLNFIHNXpYyZZy5ZdB3GuhAHGFp6tlpRFk4Z5 vRU9BtdoeiIeoRHp4orMESGlbeZxUXG3CCrgzVk0e1pab0NrehwQ23+axMxFipya t6mi8Zrxpp7eFc9+ozp+7r4cH//uw8+IewQBFggAIwUCV2pF/xwccGF0cmljZS5s dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0Ko1YBAKVC98xZvGsNoaq0yDHG AJKmsvjnc8z3qmEHzGtxOQCiAP92ffXZr0EM4qNqbDR0EAws9qNo0XlDPcm0LDxy 0JVcDw== =Ta4l -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/clearsig-2-keys-2.asc000064400000000000000000000014641046102023000212170ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 The very remembrance of my former misfortune proves a new one to me. -- Miguel de Cervantes -----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iHsEARYIACMFAldqRlwcHHBhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldAAKCRAT lWNoKgINCubRAQC0VyMKKFXWWxLOwCFO5ovhONxq2VLQ6c7jklZt0AAETgEA8ikc doPxIamOCta2QwgS0JHPhvgmL98GWM1dMLfD3gOJATQEAQEIAB4FAldqRlwXHHN0 ZXZlLmJpa29AZXhhbXBsZS5uZXQACgkQqkPx3Mf+0beYKQgAp60uW2OmVAyaP2MC F6alWqWVkxw66L6QW6ciOpiuqjEoc9TN6pNIIP+MeSPu+SE71kw4nD0Vvu5mgH/2 74dZMf7vFX3vERL/g8u7lTOv2GkXyKpFKAwvMxqPJ7zKUH9z6LxeBc2tNImjQ4mS 7OL30n+SPrsY4FR3BS/d/EY2y+L9spi92oiJeXjgNHH7iIr5iWiSSXS7AwBla0zu r+mkX2Aats488CEfENACugg79q7cNLpUioeKdOHcqDxCS9wSpYK5Y2+IBqmFEv6t DKZ1iZnLlk6rHpkZ8aQi96PFbZVZPGnxsOFKkNPWwHjniKeJzoJwd7FqR5i2vrsJ UiWYwA== =gWAP -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/enc-1-key-1.asc000064400000000000000000000005231046102023000200010ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hF4DkYWHjk/NdMASAQdAPDV6Y3JTfAGDX8pfZcT6YggC7qV3g8B1ezijcfIcdVAw +hCFGXS1EikBbZ21v79GtGh6Wp3fmyZFRQcsJZciLE/EFcbf9Mv4Q2qfRhKYHlqj 0lwBRYQrwTJbMNspOwd2MidjYYUxb/02PNiqZSrWUeX0iPsgHFToJol9RVAqs4Zz bZNKL6y/GeRIRZY12Lzo2TIXSLfjvbMTdkoz53mMKiUXsi/fCKXkTmgIheni8w== =kmqY -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/enc-1-key-1.gpg000064400000000000000000000003171046102023000200110ustar 00000000000000„^‘…‡ŽOอtภ@วŸช๖‚พดญณโฬ138J๖๒Eต~Nรi&0o1ฌNŸ)F๏๚ ษ๑ }J C˜fHvu‚Jฬ์โŸ๚๏MHŽM๕”KO ณ าmฃ1จ๙รนสเv5/ฉฅžฦไGuwุp๙—ฑศัR>ช่ฮ2&k<%Aฏzl+˜gฬ\งulmTxvHปฬธ๛0ฉว Bถ] ๘€ถรฺ๎{ญS-z-{๒ญ;ท(๒ŒŸ5˜cี฿vpgp-0.15.0/tests/openpgp/samplemsgs/enc-1-key-2.asc000064400000000000000000000013361046102023000200050ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hQEMAx13dhm+MQ15AQf8DKnGFmadCHP3k8blxdRa73pC3BL0fn9YSp2+EvKP7n4Y KsVHmKSZ43RL2pq24y5CImLCu6gPkyFGzTn/vmxq8E2Ul8WOvyJiEuRTczNr5NNs rZiF7dRMSjeZXCEHme24XIXKGzbnlkALHxh83GpgxVmLqKIlHEjgXYn9fneH85M4 KTBxIxpAhIKzninnGk2ikmAS2C6z370tRLYP+tQ6gcP8BbehCZFM+TRqyS3aXjdq WaV3OgY7uWzj4P0PBXBWx0V829tfgRF9Z70Zx+HA1BpOqvmOcsztah1Jq/pyAaeR 7t2FunUZuUwbBIYg67/cxStYAXF9ih70tjSRfYBiotLAEAEvZfW1G7lMnfFCWxx8 S8L+AD+BEdycI/kUZhgxFVde985CSYcpIcQZE4IuTYCoc96ZXsvil5Zlf5I//KDz toq+bxa+VU4Gr+h4lbcq8Sj8OPkx11/P4dOyydiYKLqEThig5l/h5IiROL8AvIMf TpNhu8TnECbjaEDaDt3RE3vIFP7ZV8zfpsibSFDaK9K0UhniSt/wF4NekBltUcBc kozlxWbvQ0k3A+xl1dBCBEpFaJrywRYFvz2sY5ISJS1X3ePJ4c9fsPXePTiy9a3W ItE= =rFeH -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/enc-1-key-2.gpg000064400000000000000000000007461046102023000200200ustar 00000000000000… wvพ1 yฮz าจ*๕-อƒญฎ๘บNคมHซVีD[วฬ๑ฬ๕~6ณ!6_œ„ฌ๗ร˜ญฆš‹ฺƒ: .n3๕ซ,{—E’}DำJRฤบœๆญแŒBฦR”๐ฝŒ่ิ ศf9€4ƒ… ฌ฿>ฦ„Œ?ฤฮžศ`l ~คข>มอีๅฯ๚bษiKๆ †5lœ฿šƒA าŽห;-็Šฬ~ฐ”ึค„Œ๕I^Lg@$+ ไ›“‡Fฏ3‚L‡wŽๆ#ษึ“Ÿ ปuชโ”wƒu๙ˆ9รlฝีI—’โŸŠ่DŸ๒, &yปQก0™ J๊Tฌฝ้เกฝOH๔cšCาภืฏ™๊2Bฃmˆ้oฮฺๅ‹๖ญภ$@ hŸ}ะhำผq!๙าจซ&งŸฝN0œ๚4ก้'vXgั$ฃคเ}˜:็Ÿ3žb05๏O—.&๐_้ด ป๕‹ํp”?ณ‰Ubฯฦ–O‰สq๖B๔pฉดeูy jH›‰L?"๒๐ซJํ Y†ะ:ั ‘U0ฺ:็*ฅR YฤTTฺ/๊Cฉ@$Rณ’~ธPx฿{ง”z˜,้Vฬว์b†US๗b{ฃนษแห\ๅƒYฆ5–ำpgp-0.15.0/tests/openpgp/samplemsgs/enc-2-keys-1.asc000064400000000000000000000014731046102023000201720ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hQEMAx13dhm+MQ15AQgAkI1KV+RVcuDJlzwXShDT9d2r+1GlV2r16z5vp0aDLETz Ga+OCTSiDR8So9xqM8kNKp12t2OrhmIerYu3dHQxZAWuqbhj/xkxfh0OyAP2wZb4 MtwXIcRKWgUz5pUPYcp/7+Eo/dlBs1QaqxF8Lnh5jAlpxDeQvfSgjTZicZAS0rtY XONLWaX4nuuHb2DNrQWLDsMvDrwu8fJLPMNy7+tEzECs1G7Tv7D9xu/QHbGw6Zvk fxjWlLsD2nUQYwn/GpqitD02y7BHDoZKXIO8GccHdPhPOxZHLCiGIHQ7r61ResHA 3SlqEsNF9OV81RaIg55ndM72ZLbDTC8ZQDIu/5cXaoReA5GFh45PzXTAEgEHQIFu PbA2WmzBGnzmBfXmRg8AVKE2JVvSYLjBynfTPbtKMAUbz9U2grH/0BdZPWaGuYUh HNPg9vmmzL5Ch3rSSunzhtxadesh/Gsic9ETkFz/d9K3AVzb9WEneFuEkk43lJAu X+btUyQ8rBhkmBQPorvZN+1i+NL0XOP3UJ0iIpo3bn/J7Dy9IEDojQAFtdOBuw6F hbWOMoRVodE5aA6JcRDR2HLj68X3TAou91a8krHJ8NAK84ilrZd07XEwGtNbaom5 rZK9xNFIUV0Ddog6r5rJ/pqsN6o3iEYI2uhh0KYntbIHrRD05ZWRCXhQIGPb6qp8 wEEydtbQpfJFRru8q7Y0V6MlzYflxI1H =m6X7 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/enc-2-keys-1.gpg000064400000000000000000000011321046102023000201710ustar 00000000000000… wvพ1 y9EHš฿ฅl.ณ๘‘ผนส™ภฏฯ–o฿vŠg…จ‡%ํ”V๓๗BznFึoสˆ8|&%˜ะชลโJ6๘็=๎ว†จ‰๘>m๋^k'๔่อาฌส๔ํ\่`ฏ'}zภNลฌ๗}ุ›Nฯ‚žGa๏ฃŽฅค?AX#.ๆฅษgหŒฅซŽ๗ปdhž\ใกgุŽฃฐt†ึภy=‘๖ูเGWbl9x=–eฝฬMํเ}BC^^‡ฑท)…fืbฑชโHU 1ฏจLW‚ฺ)ix๑โกŸg{l…ž.๚‚\ฝ!/…๛e=สs+๕ืRŽaw’BCg฿W๊]ƒUศขณฟลšu๖๗.ADฃ dาภ(ค1ะมHMๆงr>?1ำy[ไbฎวรกฆSฦi2#ปั฿รzใผ;#NušJLึซฝง“จ@ ™;้…š&šข‚T]efE๋ภ็:*๛{“sIผ3iŸ๚>jBซv2แมD‘ไ›ด;™ฝ๔›6d—ภ๘UEi#งdM ›ณœิaิฅ~Lž้(ตข?1’$ rฃฆ่ ฝ*n†่$Cะ=v|ฆLใDƒอœ๑ฆ8ฯ1ฏn`ต๗šผ‰‚M&=ษ%าMDFA[8 ป&DใจF๖6Mธg2 pgp-0.15.0/tests/openpgp/samplemsgs/enc-2-keys-2.asc000064400000000000000000000014121046102023000201640ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hF4DkYWHjk/NdMASAQdALju99o8iXdJNYTuUNrk3ZgfLNvw4GuaLed/2PDLbLUEw LaFnwh5u4djUOPPtZHbNzmJimOobJxYg3gwDew3ERLBqweQqRcqFaypu9+Ss86Df hQEMAx13dhm+MQ15AQgAwHCbQ5TeyLGsrs+oC/dB7AZphqWwsSoVXTuxAi3NPbEF upvp3mu19HpBJFXijsjysaMbwUGB+DRVhMYwAANfnJJ2oxltNbhMeGic/vRsCjHx cJhjv/T0Jc3Yuh3YFlp4V3wMiTa7METMBL/2CQtT+MSQbBubkegcNPBkB5ss1civ WpQckerDKtv9ik0+gvYCgHw0wLyf7UmHRekiJigUats0IhEHoZYv/qa3kvcmJaKV WffHsOwxoS0jCwj15eV2YHQVJp7nnyxXlX9E7z4gzjxH4MbXpi+tVvBLGM8pHEg6 EJ3U7koABqQ8446CnWC+OJKWO5cHoJjkOSCGALDoENKRAenz/t9qGzMWPInAx2iH lNg2brHS7UM8z53ESeqpYfaHS1QiMvtZWo8Wl9QPJa8vfrDw/bCtNALYU/OHw95N k9E+/JgWk9oQFc+syNHDJzw0qfEzblxzng5/d6W8vjggFkIrKwMwE1/6x1w6ZLoV MYG0TXjnLNBGzGCFRSoDx/RuzybgdDSySV/6OFfPAMSo1g== =iPxe -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/enc-2-keys-2.gpg000064400000000000000000000010421046102023000201720ustar 00000000000000„^‘…‡ŽOอtภ@„<„ ’Gzืsฉ†๔ษ%zไฐlไG/4ผ#0,ธYื@>8ส๋}ภ ]ฌlน"ูฆๅฐาํ]„™YTฬi๊๋qkhยน6x… wvพ1 y9“โ}อ —>ป)›ซงฬk?ฬ":ฐ6ํ–ป1ถfU †ฌ4ฦธiS๚ำษ้|ฺtZiAรJ๙š %…ฆzท–สC๚ว}•Fโ0V้6ชAy\E‡EK๔๙UMษ้์ฐ:†อdiธู“๐าฏe๓2aุƒp;k˜UZ‰sวไโKŸ;ศ~๘9Cฉ2iๆยฐุuuxบ{~U๋ๆสžุศฮ๘ฎฟ”LูฅDพ.ณหD‘V e๒Nekq็  ข๙€•:ŸRzœINyiŠ ื;ๆ*า/'#ผžNทเs๛ศVxœาฑยŠ S้@Š]ฎำn”ZW9ส\F-ฝๆ๗ว๔gEgฮ๏ซจ€W์F๓V)yาฅz็ฐฑJขgnƒฦš\Hqุ€๎qท›ผธ‹โฮฺ๛d—fns๗ฐŒC๔œf๘์น‘ฎภ 5็k ฝ)ZC Xธfฝรฉฏฐ%ยeš–,W^Swฎ%ฯยB.ชุตฉ๏ZอŒO-ญ6#)ฮZ‰ยˆธ๎BฃJ้3ด5ๆRnm:Œ#Kฆส7๋i{ฅๅ† ๆ็x]ฉฆ|มภMฉAJญ‡,ย๗jท,Fpฃ'0?ุVฒพ๒$f„^‘…‡ŽOอtภ@ฤ\ฉ’โษlŸห.ป๘ื๔Œสc๐ๆ6–>kำหšbi0ฆy๗้|ภะ ูaไ3ฦ9ฝ—9+ ๙W’6Xุทไ๙c๊฿m2ด“™์oผภา้ฎm๖๘…,พ Fบf+(/ืแฺŠ[^"6๊$NAยใำNำ0 ;ซ˜U(๕‹GmเT55๛%6m5๗4 ’Žแwฺ oณฟqpฏ๎ˆA}Ž[ดQ—vJt’ช‚ค๒ANฦษฝDัฆzn$๕K๏2MKjš’โ~Uว jฆ14าฬkF๒,๋๓+ฅ๛ฆBคข0–ธ–d!w€‚S&<้จ%‰xšงCษ•$ํˆZฅWK-q”hหŸๅยวFฮZoโ€.๒N‘KvCˆEฦ C6ทbu้%‹ฎ[พšญฐwe5ซ}].๎ยฺ6ฏเฤู๒a๎\๖ นv๐2g5— บบฬa—เ‹ฟ๒lแ๕๕ศชf>1ดp‘œ๕๎B;J๚uฎฑW.ฮ]7ฦ๚"ั”*2M-Pโฺ„๑t๛8Yพตต‚Nสฎยญ๋สd ึ/@89zG)เ$p"ศ…[พŠ“ๆัf#ฺอาyํ†˜ฦfx1—g@l@ส›ŸYภR๑ˆ>ูX€CB3’โPว้ไบ!?;ำQXกL๕Ÿ๛ยษuโXq๓"ท)R๖%˜ํ„O–gg–๚†Vฤœ“€+S1$ใrF‚์%yj!?t ๐ ไPอqา!๙{ฦ๑ ‘ํœถ‚wG… wvพ1 y๛ฉ\[๊n๛๘8ภํ8Nฝžำไ์๘ท‰ญG๋+G๋›฿บg&\ฬ}—O็ศ`‘[%‹s#Kซ‘ๅ:1็tหธก^รฑCžmฃ๐ะCoAšลuฆฃS3oถฯภฦฝำ ฒทก๗žสKdโ7lฟ9ี๐bกežhM[ผไ#ฌS(อง๖ฒธๆฆ"๕๛uiŒ๐’ รX,๑ฏ๗fqอม=‘A^ฺQ|๋–– -๖๛ฒ๎YMช cยA'žƒh๒‰R#ง@เตฝฐ}์‡†หt)K9!-€fแRi-$จืลข1โ,Wš/Cวแ๚Jกา้?(Dรศๅ!#bcจฒ2ต‰#ณ5็TUู-ํห2m“ก0Š7K^Kฑ ดxUงค้๚ะปแ์:ทญœSxศ.„{…๎Ny๐๘฿ุ6๕๚งห`ฯเOฟ2‚“p]?ํ๐ธ. HIฟ…œokโ?ฝ-กQฑH` ู pฬะRฅ“๗_ฌ.'๐thชe๓<2’ถนp™ๅ๏‡‡=M9ไwซz Jค?26Ywขฮ•ฆ pม๒๚ฺฤมZ}'zf–g[ysศ"YKMŒ=Vฅi"B`W๚)์ฯSGAK;ญwโ5ˆqิจ๐#U๒ทืawี,I9#ัขฯๆ)„8งFVP้6'cพ[` €ทฟ—–ไำม 4 ;ํ7กญ์ึฃ๏พ{QF4นฝ๑RฑณoVBะ†•ร[Ž6‰฿ฏญn๑‰,Vปซ™บcN~ฉใXเzงหZ‘ฺ๊0ษ ขๅ&lฑ๐Zไ๊฿ถ๓ฤKQ4Œ๘EิPแืฬll\I`Hฑศอฑอfู็าร4ู8่hอ่เ5๒ฦฤ$ึฒWG๘mœ๕วLj*UH)คพฌŽ`ภ>ณล—ีขีŸฒ‘Pœbํ\1ข7ฦุŽ/2Rฌžgibล!ย๋a}†ฎึำขmั$ู่ญšคด7ำŸœ๎$ลฒ(l^`=”’6ศท๑…ฏƒฏ๕˜5Zญ จ‚Qcs๒I>P‡ผง”„GIผšฝŸ~ฝ›ฟQฟ9•{ดฆ%’—v)n˜™™ถ"๏lœS‘]|gย๑hD[9๏๔ใษ๖Oใ%ฆ™šผ-( ท๑‰O€–๏kpgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-1.asc000064400000000000000000000016301046102023000206700ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hQEMAx13dhm+MQ15AQgAiZPJa/zmtJ6cDpHVze6zBS+4OCbGeEpzcHBkpWiLKV91 6CiwLTtL6Fhs7P/i5lEUzWQnRp0IGmUe8Ft5tugAL3ibv3Xm9PstXPZ2Q6EGzDCY 98x1aQooSuiUwIB4uQ8zFqA2TYGNfRcDCGdHHLpWAps4F/QkZkQGEWmy7KQZetc+ mLP6z04fQz5XemL0MaJcarLRE0OK8FI4+413DqQB3RyZsMFiFDAY46g3rA7xymuo Elum8PjMDXtAEpYAs2NHR29okFMinB7rR/DFGabQtzWIJPlgyGOFUVXs7YWj0Git SgEje73u8eEYAJYTpud1zup/KPUYOqJzyIMvOHDMz4ReA5GFh45PzXTAEgEHQGSH 2coczePYstzayq418VjtNF+0ohoFKm8lrR9THREYMFJ4oA6/e7r3g38CWlb8kKxN butxPKCcO2OjZYU5PZMk03CwbpSWM0FTNJEzXfqdKtLAOgHgccG9wgBqAbcTejiX FQBBsLXRybq8Bra8qW+RVJ5noCav3TH06h8ZVXz/jJMLSUfKt8l+xRQDkYZ88cN3 GhWNSc1eBOjS8e3JwGYaGs4vuoRVECbzee1DWNk3CUQOgeqZKLoSYHDRwHMpzP/N suXLpGTV7EoN4+qOcF5q/6cZV4gaGxgokoCUrM+IYfhOjmqK3lfo9/1GUxppyE+x XsWKiUMta3tJ6zhWYJPCZCqIZvzmkSfk3pNtOnsmmhF9gzwN8ehi/FHGFyHc8/gW qxx0KsCG7FO4Y514pdoa70KqA8QO63YjxTaFBH858yZr5ORlhzElwctgivU= =cWGf -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-1.gpg000064400000000000000000000012231046102023000206750ustar 00000000000000… wvพ1 yฤ4 ƒrYŠœสฝo๑.eyFคy”WฌDฟภถ†ƒื?ฮภ‚๚ํœ|œ?!๗’๗>ใั๎ิ2oyํู๘q๋XOไุ`›ce1ฆฎ„สฃ\#Tbdi hึ?mllQ ^eฤE๖ฃ?7rฝล{ŸO2M$OŠ๋ล,#YcหP!~dNFีWํสํใีโ+7๒š_ œPAธ7/rฯใ์Xีฆp}Zพ‹้๓รฌฆซะ-ะศ 8C๏}n|dAฉxˆ‡ฝgaปฌไน'ฒeฐ˜่ฦผ‘ zaพ๖X๙ ~3™tดฒัsA*}fค^"ฒย+˜๎Š–„^‘…‡ŽOอtภ@cR„๖@ู๋gึf๋ฆู n;‰ซHญดรยฺั_0ใูbืง1lฐุ‚€=kฯ(ึั{๚ผwัi0<Š‚Dา๙:๐“๑ช.wPสsพšาภaส6.a5ฯนDK-_๒ฦณด|ช๐๋DBn๊‚}2๑d[ๆ…"ตOณƒ'ฦ๚gฆฆZ'า4zh2ร– ~ญT_6ส4๚้kll?k๖?A฿บ„ฯรu6ฆกั 2๕LyEๅseŠ„lษ„•‰HW?แารe\0 บุถฌฎฎ๎ญ|qq+ณœ1•b •G+ ‚ฮo„๕xบgำ๕G๑~!vwฟˆ’jอ‘”ฏL[' †’^ฑ พญ›M}#ืJ*ฅฤM8ซ’ฝ*ิุLœ`5ดปฌH˜)w็ซ๎ฌWiื‚/๛ยดdKx7zฅa0หl“ตWย$วโ‡8ํVKคคIุB„".€ปDนศฮ„ˆ~|๗ๆ…pgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-2.asc000064400000000000000000000016341046102023000206750ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hF4DkYWHjk/NdMASAQdA9op1WNWUj4E0PZ2h33tolomYTag75nRNg8qLo/2xfXcw QrekSuMoLtkv1KO6/tLIohqYYYdZL5cGadTxlBLyIEj32ISVj7El6DxJrmqKIK3y hQEMAx13dhm+MQ15AQgAnY6drrcce7MeloBIECLSbFIDjKOloUT4xtqspTg3GM1d wkXtTJOdEm1yLcNQsb+d8ZdZZfYZhotCyMlZ5QQtvf+0XOieb/FlitUI0twAMsj/ kwjN9dop+KGLZadFoar5A8TBXUz25PfWmwEzz2qSmIPuoIUzhK90B3eGUG6foGzm 1zEAawfyJ9w7XVAV6pNGJWG2LHSQr2POaMbZs/3iqxQl8p2yb25SlKrg3I35UClZ 0FC9Hidw8bZ8/rZCyX9KYtHIENHzqT5+XEpaXwN4hBqwpVgUn6DcESv2BAR7KCHD ZwRRNVZtUvrftj05UIxAgnSAdK5GAyhLfWjCsH5Q3tLAPQGFdlgyYU9q+hWrrqwW 1tAvUJQpSW97WyK1Aa9RJOLPNpfU1wzRGzzOuNuuqbL4l9OQktJ81Mihh4IWCXQD 4mN7+nvltCm13bANdujRvZstGGFefRiwkBlEQq9uQMM2SVXA+JAff+AvD5F1Ofq8 DPVMf/WDsKcoTTdqJahk/zoX4yFHprS50tO2z0Mb9souX14+AN+JJzAGQaGRlXXD TWeEkUXD18HcVzHfooqLUlYYr5zD2f2gNNVskPYH/iP3FGllvzBeQI1NCznAj+Zr AdOEXHKOkCJmj2RKnxXeOWTJSczoBlQgIQGd/yP/2TPsGesd4SbqFStYuefEZtw= =hq0A -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-2.gpg000064400000000000000000000011731046102023000207020ustar 00000000000000„^‘…‡ŽOอtภ@\Dฆ3C๊€ึ~,ีิ๖ ิิ–s๙ฒŒ_/๔๏_ฝa80์V ล› i๒๛‡~s%’ิฤย†c”ฯo/}–ฬA43ฤuค+ผ๕ผด.[YโFล… wvพ1 y~Fน=v` ๔„Š8ฒ –๐œด<ื๒,มFEt<ัปฒl5“๏}Lผ‰Ll/˜;P"-†ำ@TR„|vช†๐หžR็(ฬp$ศถrศนxพl๙ฎ ิ9หdnpซ•dV‡ ง ๘Rš์ํฟˆ‡ฎ๎!ึญŠD้[!GัษกdธVถหaF—a"ซŽ<‰!/L`“ซ†ฯห<ฒฟr/3๛๋ผฮ•}œใ๋น&#ฆ jเ!ซ๓\&y#ฌฝcธขไ้_ีโ>ืTฯZJฬ^ZปU๘Ž5๋ฉษพ);\oมŽ‘Q๊[พ.jาภI q๓v,฿ถž”แJ‹n๐็Z์s_ฆ'แCC*M€‚ ๒ุ”’ฺYุฏ๐ฆดw–ย+3mN-Yงืˆ/{้œ๓ขŸ?m฿๒ทฃ|๖'ไŠ:‡3ฟ3~ใฅฟŸx:ล๔‹๘ี<ชฏ#G้ิู๋ิ ทยํ‰W6gม Tขq*ฺQลb‡ำ; G@ฯลA๖bัผ25โฯ ณฑ"nฮU[‘#ม,E:Ž๘ง)ฦๆบๅ๑46็oรสZw๚จ~"ผ”ฉ๑Bำ_ZBไn…๐yฝ„ŒถฉŽฮงŸ-:MaฬžF๔pgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-3.asc000064400000000000000000000022451046102023000206750ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hQEMAx13dhm+MQ15AQf+KX1A2pYF9HnvwZZU6kmiOKs6NL/d/8Y+kwfiLot5SnQW S/2JJm0b7ijyxBOoTyXu8UOqyaPa/eIJWeMqNANExkX83S1hoKfzgrBluzZR4sUB r6bZ5E26pn+gy+r1RvQJnxUWMX41ux+DSc+oqf36cZ5A4R1Ai6cD9jqW7vE0KINo jn6Od45NHNG16Q7igH9HgJiOXaibHFyiAfV5du0XB0HxpBlBKIBSV/4ewFUzxVy+ oR4/3F7SkaUtGwcEi+PUEU26KuYz2ltYA9Ex/yTd59YcYbPTiiq+ynGRpOTgB0ti y7aYzJVOPWGCKn/TFy69QIoJZgcWTrmUJK39wxFNM4ReA5GFh45PzXTAEgEHQKqL epFBazPDtJvYGye9GW9gHMSjuTFuEm3yuo6kPIggMBRK/vWfTa7emGniukdA/8Bn hXrpSZUBab19RlT/mDhC8+CBE7MvEQMHsZvwsEWzt9LBAQFgEPLmrwSchnzw5+vN bcfeBye2n5STluKZ5IrW4XwZAvmp54w2OI/FDzf5dL1r+KCNiZpcmVO6IVVbEIeL eZj++YAPDS0cf/bPfWbyfvC/MLNM6IFICdkdlKQ30FC801Xv4OuXvgctjIkZBEDR CkDvkyrIEUtN9jJaAWjP3KopsCsxGtZ/ZPVU2yv8ekPRZ1paUIb370/NhEz9l2kK GwmqNm9g6/ekJwIF6kZKoEzncX7cpF0diSTHCyB/CsWc1ncWgn/nktZDsd7UicKP ypHScloUZfXDiQBcKV+0p6BxYib1MJOFrRbJTu+0Xu3KjcbecQ/mymgfDlkVUwXP QeGaQNUgQzO+iAW1hPH5Qf8eB8n2DlbqsFEWIXG7B3pGCI0eBWPeR/JpuCnIHMTh 50YOwGqNQLjqRnl6hFi8amSIK5jRvRMzRWYO8TSZaYVh7uLh83cKkSV2e7d2pax6 CqubZsoiaX71x+r3NaPYf+4hzAQUxPDZET2hTR4GOeEGT14t9RhqMPLTS+f9Ij7D /LbCpm6sc6eSmbKXZF/XAPpkBmnRIpgqJuA0TgNBnU7a0NEQP6nsicOpviH9SFEL waeu =6uha -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-3.gpg000064400000000000000000000014541046102023000207050ustar 00000000000000… wvพ1 yจ‘RษP`œก๘รฟLปีDMฉDV,,อšฤ๙SfอะCต๙ณ้+oวญC4>ฮ‘โZt ใฒ…0*F#ƒr คล๘มฒถฝฬฎ†t[ ”b‹พ฿O๋ธงี‰dุภง๑ด0†$฿ไ@„*ฉ6ฤk่ยDจ ชณฎ๋˜h‰<ทษ&AŠ7ภ~’๎ปg)ณ ž2ydฑาภ๚.V๑‡‹‘๖ †฿ุ‡ จแึŠy+Ÿ6ซ๓"พ Zจ jŽ่ฐ,:฿ฎX9ผ๘๊v"ฬOŸๆ‹ฌ๔ถx™}&Kกjt"…อจๆ๋›p_(s-๘ัณ!~นK5;d–๑ค|0ž*ีณฐHซŽb{ ฯcHZ/^ƒฌเ$่Sฟ;็vศฺQฎI6jO)ทs\’dj๘P๎"t)YWƒp^Fญฅใx้/ๅิุ{ํs่U,ฮMชัR b &ทi–ฒm๔‚Sอ}rU†=๛๙^บz”›ฯ{uๆไx๐ง2[ฅผภโh™?ผ gฤ5ัท๓uโาฏJ5–d&#ฏbฅh4wฤ|W ็v'X/ƒžว*_Mฆ4์ฆsวง-‘_ุำฏ๖ฃwฅธเ๚ลศฐ๚KสJฮาํH+อittuŸษี5žžMeฯ†,TŠtS'iพ๋†‡2๛Bณภ๏หภ๐yฟฎ5ฑถ๎๔ck5ฤ?ษ1uH28๙๏—H…๐`$ซ˜ฉ-K`?าิ %<สbWa้Fต๖กุ#ฒถ:หefiLpgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-4.asc000064400000000000000000000023051046102023000206730ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hF4DkYWHjk/NdMASAQdAM+CNEu/KZIBKoKmvE96atl4CEdxThqamGsRt9IgeMxcw Te0hTUQf5LrrK9MhGymBcB2nCCy0bPtqVhA8TdZ6y3CH0QYMObkbSbIcVnGaVmGd hQEMAx13dhm+MQ15AQf9FcEbvw9ocsmqrteF2Cu6W2ChxrNy6ay0gcDwvd2QfbAE muM+OcKrvXhgDikOt3gAv4ES+2/ACzsqIZZJGUVWlrkSXYq9Uon+YX1zeK3BfmOK GvfLqc7p9x0YtrC8KEeMaqpd8z5bRhpF0ZPF4WbvZyiauDAa62FJiH/r4YngGLoY 2hXFNZ2FFHa2EuobUfJUJwfA7VC13IdvqZ76bixrSSjxJjhntiswxYQI+OaXnEg8 S/UwxR06GT7vOra1O9TGIHYwTcRGQT/3NHcIO3aJMRCHVP2dOLBMkFqkYf44kGeA e718nBN1UB7cfgv+n2bj7SYGdlEH0bmmpNTavEsDZdLBGQEcNlkdz3CqdqRhXUek hoWzCKTzOhIkoIhdyZd0stBlYJ54dT+9470JogkVqkNCWjAP1svI6LprOAR5b1sV m5ar5pCspumNRfMv6oDjXIsjCaux4zJfJV8XO38wmMn30eMPg1CzbKjhqMW+IfXe Tn8yxDBVGScIKkmaks6AE1v9WtfBSz+zT8sFe1ZFUMRcJ4+vohYmLVZXqkXGFJu7 F3j8URhctnGb88h33y2+xglaqptso7XpM91OR17e6Vhh4dNAWB/GdKy4VviVY3W+ fJ+zoimrPTFmPo2Ag+mveTsnTzmGdy4FHDDQCKE6QVcJPfVcfN0+yiPIOx/XacZR ZnQlI9Z+iYuN5yEchnVK65XZGQkdK+4/5Q/QGq7vLwaOHkMtItplIsretCGHAGEj XcCeHIY4pVZOd8Of8CSSPvtcaz4+FbZ/cfKXXf1zjdxg5BRkVvBAAtAYqquDUPJn qcG7tcUD6pQXVDHq+s0j8BofK9BXjjicrTI64RZw2RYntdbRSqd82offshvF4MJm 72hIMbg5ExZsvdUa+IcRw49PoX/fEhKkmElZCI+5fsMG/NJuTfAtNjG5RbdgrYzQ eR6eIMr6BnY9ZZQRPbuv0te4di55B+HqmTry =/grx -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/encsig-2-keys-4.gpg000064400000000000000000000015551046102023000207100ustar 00000000000000„^‘…‡ŽOอtภ@dn™ คผศa2Z ’2Ÿฤdfc็H˜^@h5|–`B0ฺ)y+&œXhI–+จฉ–ผ%iฺfดCVm๑€ญฌ@ฺ๚ฑแไR๖ดF๕`ญธD… wvพ1 ynT)QD˜ช 4๎ึ.™ท“~ปqWรiJpัีNuYm์ฯ/ีxj๔BTŽ+นฝคm—๏Ž๖็N™Kญำ&B๑™š1yHQc์uผื ŽฎํธlWpำiRถ้4(๏คHŠ๒†็๛Ÿ}5ดฉ"‘˜jีฬŽS]}ฬP8†ำมๆFฯภŽƒฯQ0ำฃVปCX฿าฯ›า0"w8` /ก•ษœ‹unŠNฉ“J้พJฌโXF˜\ฬิ˜Rึ๖ซy‘Bผ๒—2a`;ใ˜A˜ู฿ถห@Cฐ๕ ๙ž+\ฏ๚^G่Q์eS-‚W?R›YyŠ“8uึkRศ”เ ึาม;๕ฒkx^ธเู ณฌั‘ณ•{ฉf–4ษ$E…จ4๙Lะ)zTลYใ”7}z"?ค๕ิษาฃ“Bฆ ้ ž ณ…ใŠช๙๘ู:›‡ฅ๚OTXช*ศb*‰Y}9G2Nัv์ฤmึฆ‘”ข๙๋  ikฑ4ญฬKi MรH.ฉ”๖A}sZฯขNaฮŸ ?ˆ†ำ~๒วศ‡๛"}E’Œ8*m๘ซกœ\พฑฮŒช%šุ4นJ)Hจwำ KBรQM‰ีๅMEษVŒaฎLe{V9xZ๐9ฮ๒โ=oŠ"Vก๓l์=iคห็W-‡e sSO8บช็jโ๐Ž^ ๑œ๊๑”ข ~zธฆ!ธงฤ#s๔`อyยะ“กoX[๒ท3ไีRRš…}"Žhเ9>RzW ๓น[B๛ธฺษล_jYdฤTfiAžc(๙yืRษŸี—:R๚ย†ภ/@่|œะั1wเcfวใไj+กน๏ัฉ๒ฦ.ำN-๓ส๓๐(๓NGรZะ—ิฌะทดญีxN`JทD๎lsd’dฟ๙ท&L~rB&ซ๚’ ๖i้}ฬงทาฬ2”A‘ฅŸh๑[ƒ๎๘‚ิ™Bเsข ฿[j~ €ู๐ฃ8]นc5ฤ6Tpgp-0.15.0/tests/openpgp/samplemsgs/encz0-1-key-1.asc000064400000000000000000000007661046102023000202640ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hF4DkYWHjk/NdMASAQdAPo9H2rEUOisFYLfLQu91wGJCSIGs9jFiYwQsKlhsZlMw itRELU7+unvpPp8bIINqu4X6FP7hDzkZjOlQM/5JS0Z/q2jaWo4av8DCxYCK+yHU 0sATAZtMvHD99HWEAis3GUlFBzf/jxPBmayNElVyifc5eH4d2pRfCqlZPx9gKX69 OYymTKuUkkmzCgBxVfA7XPdIdqTmDbSjVwQ2LFeB8hQv6PsYFHY1vqs4xVmeotIu pgG1a40+6f8HC9YDNn2lUzktui/mi/VNqDwV9vOHYklGqpVDd81nHAl1wGkAzgBs 8sYAcQjRAArAPKBaPTCtn6PZF4p4sDcabGImGR8cWwZHb9yxkHIomJRHUVTF1Uz4 MUANuPQHpJE4eqKHUaE6wyTXyGEqJQ== =UB/1 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/encz0-1-key-2.asc000064400000000000000000000010371046102023000202550ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hQEMAx13dhm+MQ15AQf/WO25gVi//kxCs0RH+BbJ5OWRRkyZ5fD7mYUs6anJ/zRE SE/SKwNk4KsWi4ajRR7b7txj7HQN8l6RpjUFXDJwd0onkb5JoCcvVIdaSTRR8z3s 5tkI/KTkPhlDPN+E5jCllUnJNSLoUwIIMw5Zgn0gRXxZeR6pUCB00+GmSPpoV+6X pEk8yuP5gcCFz2uiPmRl6QBezq6QLwlzYS6Kj+m2k2zqgEEgBc31aVnze8FTElbf Mm2wQ+w50PVaqHKkH7206PMIAd3Jsv2QP4XfgDDRxOe1/s6dHiCOfnhdrx/Fblp2 VjluZFc/yL2YfofqqEWAxLLzh47aVN6JLr3bhdAVvNJEATedhlr+GTfhfI+KYO9r rZlP9aDHzvMKkqyX4WDD0O6a+698AnoseFVmrrBIsokdIt1RjLcpycE4BsCQOXHe EDBJtGo= =O1Fl -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/issue2419.asc000064400000000000000000000002111046102023000176140ustar 00000000000000-----BEGIN PGP ARMORED FILE----- Version: GnuPG v2 Comment: Use "gpg --dearmor" for unpacking AA== =YWnT -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/samplemsgs/revoke-2D727CC768697734.asc000064400000000000000000000004001046102023000213210ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: This is a revocation certificate iGAEIBECACAWIQSg/0WQu2Ei7e9uPFQtcnzHaGl3NAUCWEaoMAIdAAAKCRAtcnzH aGl3NISuAJ9rsxoazHvPs89Ki33o/SgKMjOg/wCggbFG8V5wXU1njwuiviPUKap3 uqA= =79yW -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/samplemsgs/sig-1-key-1.asc000064400000000000000000000003761046102023000200240ustar 00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iHsEABYIACMFAldqTEMcHHBhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldAAKCRAT lWNoKgINCu0XAQC6VSdsGyTbvFPp5e6BmkmBzPcb5Kex4ar722k0jzhLzgD+Js2q Y1JIdjfW4GnFhdzqyUbuGTlk1wNY7Re1uNyD6gw= =c0oW -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/sig-1-key-1.sig000064400000000000000000000001751046102023000200350ustar 00000000000000ˆ{#WjMJpatrice.lumumba@example.net •ch* ฤฺbึฝุVค\ˆ… Šญ+‘I7nnRไœ[๊Sฦy#แeฃฅ .พธyhก ๛ก† พW9v-ฏCๅธ๓๐;o ๓pgp-0.15.0/tests/openpgp/samplemsgs/sig-1-key-2.asc000064400000000000000000000007721046102023000200250ustar 00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQE0BAABCAAeBQJXaky2FxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH /tG3LSUH+gJ++JOZuy5GfHwK+5GEGmeVbex4U9N84tYYAwZOsOpQsh4JxT44IH8S OG9OViY9xUaUmeSvVsuDR890RiZtKOXO3hCMwUo+HCDFLXgIXxosLlS55G1vfi8X NPl78Y9NFdtwtAkirpOT0oULJcbZ9NItkPjhoxZ16TlgG3GUE6lZzlZJLFAVCw7u 6twOtPnq1AB4xB49rsIIW1XhCNrajwzBCghhl/PD4uM7ptSpGkZur5uOJ7nLjNEM Qo1mF+jQ6rjWA4OrvpmtW482yvNWejAS+JMlhNcP63hlBySjX3tFhGm8tWtUauCT 3Ky7iF4dFFmhpIXUBT6mMmci4WdA3gE= =VdOj -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/sig-1-key-2.sig000064400000000000000000000004671046102023000200420ustar 00000000000000‰4WjMSsteve.biko@example.net ชC๑วัทไๆmt@ดวว\D€๘’ฑษ9qO6 6๕น“ฤ็0S=ต{๑4โ–ีฝ๗rœว~฿1“@Eƒ€ฃ”yา9กำ5S0†ฐ๋IUŸ๛…@)M,์.d:ำโ็บƒ้< $ษิยยjมN%b š4๖฿Ÿฟmื๔”aห-๕3ัํ sgV›,๔&ะ„๘ ‹ะJนะ.็ฯน๎1KŠ; •ํ่ษH่ว‚<—“์kว%F*๐I๙G+iIzจ„"ฝษŸ „ฟถ;‚šKฮเ6~จ๐ช๎-*{Ž)Z^jMŽนnN*/็žZ…,*ุn7ย%ช›R‰O'ถuXฅVh pgp-0.15.0/tests/openpgp/samplemsgs/sig-2-keys-1.asc000064400000000000000000000012451046102023000202040ustar 00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iHsEABYIACMFAldqTMccHHBhdHJpY2UubHVtdW1iYUBleGFtcGxlLm5ldAAKCRAT lWNoKgINCgcQAP0f1yNJcHiBvy3nK7SSuzBf1EgSpy/lFlVSjZ1e/7CEKQD/W68C Zs8iGAyZplpsXKoz/g7LWSU5z/K3lLWwfre7gAGJATQEAAEIAB4FAldqTMcXHHN0 ZXZlLmJpa29AZXhhbXBsZS5uZXQACgkQqkPx3Mf+0bdg8wf/ff4tEMfqdwk1dXJm 4+iyrNvKyCfv/T5W8BVL16wc8jn+80HJkHK/pSw5Rr6nsEf1P00u5AnothUPfUl2 Yqvjg4+oQYvutePo1uLq0LA1lyWfQ1PV6I14B/dd9rBYdPjYIJJsPjr/k5N3Qz9M 8RNtDp/rPDVNVHzDbZN77oGE2jokGRfodRo6qnurqU4CnJYinrnzKV4wqrilNKlE R2CBieb3riDFUH59PH9S9fHuTHBV7q0HlxNJkI6NeoFwtRcS2f8P5B7FK7VCMrUB R46JExeWhvUlY2ZkKLU98bI3TLnFD0aQHRzKgJj8sWjD+Akzf408EmnOIyyf6MF8 H7uIHg== =ErBQ -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/sig-2-keys-1.sig000064400000000000000000000006641046102023000202240ustar 00000000000000ˆ{#WjMgpatrice.lumumba@example.net •ch* /ะ์จ#rฏRaิ๖ไha์ฐX฿<๙6B฿ๅ:‡ศLฦwืล`0ฬ‹๊$wG'วัgP“Šาxูz6\nt๖ ‰4WjMgsteve.biko@example.net ชC๑วัท ฯ`‚Dค๚เไ๘าCำำูwก๔2VŒh๚ผ:฿>‰y•;m๙ว* ]€ว๎5/ว๘\ezฏO็|"ำqRเ{ปcณh‹_…H„จ่›t)ีฝ’iษg์\B†ิซqœ}(W-Y„f‚J๏ช$•ซ8+แ”|ผฃ๘Œmอ[V•้๏@ฝ1oSึ“ย7D^=>ม+ Ž‘V›฿ะฏ๗กฏzŽO-t„P{S๏<ฅ๛ F6ยSDย‚kUC๐๔$ข^@0xด^œฬ฿Œri`SลCจ,|,งŒoi|๋ำ๋1ฒAฬTปC?ญŽกŸ!•:“bMrษ๋Rq(‚D&pgp-0.15.0/tests/openpgp/samplemsgs/sig-2-keys-2.asc000064400000000000000000000012451046102023000202050ustar 00000000000000-----BEGIN PGP SIGNATURE----- Version: GnuPG v2 iQE0BAABCAAeBQJXakzUFxxzdGV2ZS5iaWtvQGV4YW1wbGUubmV0AAoJEKpD8dzH /tG3B8EH/247hq+cJ8eR8eXb1mv1Bdj9SwYI4yDs/xCZ7FIkU8vVSRYQpeYz59ie 3WZw8Cj1Sd44tr3+viVK682lWXwpHIAl3xUizP+HTFs23tfyH3er7IhDO/aApZ+V Wd+0oDJY7E/ztsD3CpU50ptKU9D72CgJT8K1/pwBtivzOiMto/scPwVFNDzGlny8 FC06j+2FyXFkXCLwvz/Xdk+hJmv8lQRGNxnSIB5bU+0/GLEd9wJUFTV3WSs5enEM zqtGBh6v395BXnqrDHpOmT+EkWrpBOSo5vkPZrbN4bOC9nKSa9isCvU/+fjHW3Dn GpHVTH1hCWsKRhQjxuOOq/X21YpvgJ2IewQAFggAIwUCV2pM1BwccGF0cmljZS5s dW11bWJhQGV4YW1wbGUubmV0AAoJEBOVY2gqAg0KPJMA/0+3s4HPotwYw8K8pug3 7Mxgd9LNIBi/d0nSpBnZTHySAQDURAoIZp0IZI/PS7Jc9A8M3TgWdm1LUkj+qU9x 3L6RCQ== =3oWb -----END PGP SIGNATURE----- pgp-0.15.0/tests/openpgp/samplemsgs/sig-2-keys-2.sig000064400000000000000000000006641046102023000202250ustar 00000000000000‰4WjMqsteve.biko@example.net ชC๑วัท•อซธัๅขํ{y@”^œิHP ฌปŸŸ๑ฯXGธ,ิ์๋!พํเใฺ'้nB}๋"!่`gถรQQ,lฆeŠNxr‡4‰e‘gH[ƒ CT_ชข๚e^i๛‚ณุrาeqNน-ฌyPฯฦ่H>B6แ`ย—‡จ0BเUก“:ฉc๓zožๆีe™คฬUก–š}๊˜ฤQฯ…m›ฎัฆ W’~เT|ฑ*YกFๆ‘ฤฝ7sเY!ˆๅp•๑๚Qkฮ๖B:G ThRไ แ#ยฤณ๋hk๓Xn8\4ฃoณ—ืุAF<™FW/pฃใฆœ3Dิฌหˆ{#WjMqpatrice.lumumba@example.net •ch* 6c๊สฌตฟฤ š3ีแ‡Jฒิฉ@๕@้w`n)Tk˜4ึ ั๋ึn‘H&๊0ๅ_บ–ผง…Š`\ž‰`๘แร pgp-0.15.0/tests/openpgp/samplemsgs/signed-1-key-1.asc000064400000000000000000000012411046102023000205030ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 owGbwMvMwMG4yvnjneP/Lm5nPJ2exBCe5XbZI7E8O7UyVb1YwTk/LzmntDgzP8+K i9OzBCiSl1+ikJpYXKlQkq9QkJMIpDNSFZJz8svzFMozUvMUKvNL1ctSFdKByoAq ikrzwArKM/JzUrk4kzOLkkuL9bg6GU1YGBg5GORYmUD2icsUl6SWpeolZWbnO6RW JOYW5KTq5aWWMHBxCsAcl9zJ/od/6lrXa9snvZR9wrpXuEblNq/F3pzYWed8DZd8 aApUzgkTy1K64+QU7HuL525G4vM3Yibfvq+VLTf/aFx46FSc7I2MpE2vElhvztZ5 8SQ2ZWe7m5apT9qu7UfXyhrxxfutyt+ot3daXp3hyxuVPzdfKD147N8djoc5634y 6n9Uvfa7Uec030zZjae3VHScMDY1tD7yQjrFNnXptYQXP+RPtD1l+Kn33I87jeHT SYnUk8r3zD71zahJbfZYwem0c+WbOzs/+qQeKeE/kaL+Y8GHeY9vbkq6eGNKWag+ Y+Ydhac6bccZHEpXHFBfy3iBJ9OrZub93Oulx4Tnz5U5tZuL31VZOSzlyESvoJeb /0kDAA== =T94L -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/signed-1-key-1.gpg000064400000000000000000000014451046102023000205200ustar 00000000000000ฃ5RkhTGด‘์ฝข๘ฃโถ]ไจSูLึวF_1Iฃ˜๕A|d๖๎l๎d๏ฮฌwๆ๎fUฤZTิถT#Z m}‚ ขฑ?Dษ[bฺ๐–ศBต>๓CDั๖ฬ.›9็;็๛ฮwฮใ>๖๙KN/yyฏ็๐ๅ’›bพๆึบฃkl หˆTT*XJ”(hเฐฤฆRš†NฦX p’ข.x…แฌp8ˆX LB‹/ห\ส-ป˜1Sบน[iุถ‰ธŒ{.ใ-03R‰Hˆ!/ๅ@มฒy.คD†b2ฤ\!ธdcหษโฦ+๊I:อ HาB“0• ฤ๋ˆKมฅ–pใ4„วA ณจ–re{’ก2 )’+ ธTฎg)ฌg:ุยY‚YK8IK๚arKคR™8;~๊อrฐEŠJฒจฎ8“Cฌdท่ dmฆhiฬฌฆŠh8ชขqqตiTี่gด*„๑ฦฐiT# ญฉ˜WณL#ฌ WU#ณMฃYwา์ฅKึย%š†Oโฐ-ฺZeใ $XBู3p]ฎ‹๑Œp2ิค k7บ‰b฿YzS(}ิ๓9ยแด›=J9ŽeTTภjEำšฑ‰94S๕m,"ฉก๕ิฬย;bއ‚ฆš{Kยฅพฟo๒˜๔‘M โz2ด2ฦ’b!m#ฉดC+9U>ำ˜๐แ"_u”ฝŸsฒฎkฦ'_ถๆห—?๋ป๎OรคหYฺ;|;ขv~›ฺ9ลOเซk ัw‹>oิถ๖?\ูัฺ๐}ว †wบณdฺKƒ3Ÿ]๗วฎšถo/ฝณg=ผb๘wwNธ๘kU๒Fp(–บ:r!”T็+ซํ_ฟ`‰ฝฅูgซง ฟ๚๗์๙šฯvต๚๚z๏๘๏ึvฎ-:> อ|แิื๛GWฺต_<ุt~ไ@ค๛ะžŸึmฬ ๖ T พน๓๘๖5๚d๋ฯม›;^ศ[๛Gู๑myฮ:T๎&ส๛ํลŠ Cฦ๋[ฮ…j{™‘1*–_u๎ศ%1๒๛ฃpgp-0.15.0/tests/openpgp/samplemsgs/signed-1-key-2.asc000064400000000000000000000010261046102023000205050ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 owGbwMvMwCEmPDU5Q4uJl4vx9AG9JIbwLLcnnCHl+Qq5qXkKOfn52akpCvmlJQpp Rfm5CiUZqQoFRZnF+XkKSYlFxTpcnP55qQrFieUKuaUpurpcnCFABflAVUVgweIS oCI9Li6//HKFnNQSoJEK6UCqJCOzWKEoMz2jxEqhBGgTxMTUomKFxKJUsJ2Zeelg S0H2lWfmpeSX63GFZ2TmAA0H2pefBpLIVShPLIarTixRSMzJAWsAOkVBVxfMhDgF pCc9v0QhI7OEKzMPLJGRmpiix9VRzcIgxsGgzMoE8rWMTEFiSVFmcqpeTmluaW5S okNqRWJuQU6qXl5qCQMXpwAsoD78YWRY1rZ/7kOLr4GrbvSU6HqKnVy6+1BllLYd c5ebbu2ltZ89GRkOBN6327Z+J4eaa5ppOGeA08P8xgvlcft8tz5u9i7jncwKAA== =uuW/ -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/signed-1-key-2.gpg000064400000000000000000000003421046102023000205140ustar 00000000000000ฃ›ภหฬภ!&<59C‹‰—‹๑tXCx–๛ฒ ิคิœœฬ<…œฤJ…ฬ<…Œฬb…๒ฤJ…ฤผ…ŒT…ดR #ณD‹“SWW!<จ:1W!8#1;ตธ 5ฑ(UGAษ#5ฏจRม3L‰ซฃš…AŒƒA™• dบŒLAbIQfrช^NininRขCjEbnANช^^j งฬ=7g32๋๎จR=C๛ฮc“๕[Vๅ๘Lg่™ปีฑ_1Aง๛Ru~,ฎMz^Xš{!ซBฬีผฦdsw]๙/<วV๖้)ไณpgp-0.15.0/tests/openpgp/samplemsgs/signed-2-keys-1.asc000064400000000000000000000014631046102023000206750ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 owGbwMvMwMG4yvnjneP/Lm5nmADiiglPTc7QYuLlYjwdm8QQnuVu45iTo+CWmZeY npOq4JNYXqyQm1ipkJSqkFRZkFhcnJoCZCjkpCYW5WXmpSuUZKQqFGfmFgDVJhaV KOSnKaTkA8W5yjNLMvJLS4DymXnZQAE9ro5qFgYxDgZlViaQJTIyBYklRZnJqXo5 pbmluUmJDqkViSBj9PJSSxi4OAVgzpoVw/A/fBVnTGzGFd0DUzZcu6HNcm/6mpaZ CeuOc+89eOsmg9YGRYb/5U3LTx4pf5Ru3ceW/X+Vkdq22kuGCxqaVwYJHZSL/xfN 08lowsLAyMEgB7FdXKa4JLUsVS8pMzsf3WJY8LR2sv/P9VLy+VZyrvhebd6WMyoz V/kIXW+p2WbcI1vw58xdofBbU9eHtM2Y47ft6Bm5bS0NL6d6zzl7YsfLl5qKLFJb s/cVKFe1MM7POqrEqzEr7cqe3amsN08ntDsvbLr3tc1ATKhTgMVKMIhjznseR54F L1tyl7eUv96SYCbIf+uzu5vZnjWHvulP1zm579qel7afa77Enc94Nnn+U4Xf7F8W PA5Kumj01S639ux3PcYFLR9+tey0bTDyNPhkqiddvLY9O8ztd94SDw4ph4+bbol+ 5S1+5dJ1vl1w7VSbtSf5dPfV1uxLr7UQnvGiwplnVpzt8XOvFXbHZ6yx2Hm52Kry 0TndFZfZqkRzFGxn7bkOAA== =iswv -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/signed-2-keys-1.gpg000064400000000000000000000017461046102023000207100ustar 00000000000000ฃeSlEƒึ-›ิ๖ะ4๕qG iฎงT๊EฑๅบW[^้]i)8ป;wป๎ฮeqVLŒmŠ•ข(6J441–€ˆลŠๅฆUมjH4i*&ˆฦ 5ŠDg๗l4๘วnf๗อ๛พ๗ๆอ๎e‹ท๋ญ๐/37ง฿gvาโฝ‚Tนh๋๚์2ฯt=ู๘U$ฺ๏lใ ก)๎Œลธฤณw‘ืมต…้~=๏โธ6hฅ_}[tE้*ไ๑Wฏaู’…๕ ษ!ึำ‚อี(TคาDศgฅcศ"Sd-IAžlณชขA|c ชa–$ภ”ฐcู€V,oงค*ภำๅฦ))Ÿ™ชเ‹JHb์ ศี2LVฒt3่sจ6Q$ฏ`H๋Ž3$˜R”D8ฎ%ๆ่ฆ‘ฌYถAว†a์Lำช๊QสสŠข •“@’€!‘tš2vu4ฏ“DAšiซi3gGุ$าy”ฤ*kdXัhDวHtBRvฆƒฉHVh)PำeDA‹"Uฅ" Kร:R Jฅ1Jูฎi%d%ฌQUึdCpบฯหdย้๛๓ขRމ”TŸmBภ๔ัr>šบ•โ ฒ’า <$ฌM#ค4ฺ7”‘E S@[AำูMz้)ธ ณ๏ึNBk26LงRขๅcHภŸ–ฃน%๊ +๏ัIE)๔41Œดดถ*‘่ฉ$ญญ—Rฒ๖THศf๑ดม’uม2ƒ์ ฝLฉ›๑.ฒ'ฟฌ,L]pPฑTKๅQ†ิด‚ƒ6ึSด๐Vถen”10Rืr้ทM๗a่เฤฉตทพ{3ัค฿RฦรCฏบ˜}๘xE{แช๑๖+=ฯl<:ำผฅ|๏๐ทำื/kน๙ณeฬืšฦๅfส๓๊2รฤไๅน]xแอ^)s3็–พ<๘tq๙|๗ษห฿ผ็V`ำ@๓บฆก๋ฟŠ#Sฎ‰s๛kฦZCƒ›๛งŠ>ศ๚ท.‘รž)่<ถrEธ้๊วฝ๖=๒uาญฝ๒๚ุ 7ผo_ษ‰‹›ซๆ&…รอ๓ฉg๘ฅ-žยุG>ีfต1ตนžบƒPwํวU5ตวง7ผ[Zy๒Oพ่๎+:›1๚๏=ฝkษไฺŠนไ๒‘๓ฅ฿w๏LFfg/}t่jอ/3ศำ{๘ฯ]๊;ฎ-พฑ.๔๛ฯฟ8๊ํ+ฝ๋ิƒwmฅฟqๅ…ฑ๑žจuโฅแcฏํผ๚”:๚Dตฯ๗7pgp-0.15.0/tests/openpgp/samplemsgs/signed-2-keys-2.asc000064400000000000000000000023761046102023000207020ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 owFdk21sFFUUhqcf4O7wIQQLpi71skoKZFj4wUdrgiwYxVaUFrZUvkzuzJ7ZuezM 3M3Mnd2OEpNiTVGTQlSKUn+A1WjBBFMDRIWAKG0qJYEWhVKgkECqBkrQ8AM1u96Z hVT9NTmZc573ve+5d8eEIiEwdcpORZtTOEEUdnhlwb5n7lzqzp49XHDqV1mo37xi ZTC8jjrIAGxKiKjI5QXWdZpBTANkYJuBhRhFMiDHVEia6JJXMgsw85pFbLqI6nGU wS7iEzpJgi0hbMa9NmLaju73WShOEiZhruSBTeTDXRQHMHyMSpg3oAG2kEZslCaQ QVTlzcRM2EvDYjBc6xAGvi2FmszClhtByDfv2IyTVOCivhQxGSQsXwzbtmNwhOgd TMNpGP3p6eWnOGe549v8D4tbMqmsc4pJGZJdkRiEYcZpvkWaMZEXlAycS6jFKVX3 A7QAJcBkOqCMBrzgnvmARZ2EJolktClFde9M/27iKVOHaaMxZYiuIwsUyuN7FfKj tpiijAsQvioXZajFNDcvzwfiFGzP8SiC+DXC9/fJU1H5J+YtWhJxPjV/HSqAjlQL wMsmSZSkf1CeYYQvIDh3LopRA62msswXK6FwNWGcIzsJVAOW6hgQFt8qWFAsFASE sjGF3u2aFuKCaYjIJEmj0ICNlA4RE5ggBic9uIpd6kPZyjdLVjSdbP+96b2J2rhc 6bKGZXtvnJv+1L7wY4MZdSC06tOxx74KzS7rosOTWn6MbN8wPHT1txnNVwJjRnpz j7wxs7uxV5+8dsPWRzsbetK3bx0emD0wuWfhJ92pNT8fbNh1oO5O1clXbo9r6u96 ePDQ3ujiwc9PPP3n+x+t7r320xKnONu3deXGlmhh4+nhDyraXv871ifYtUvGt7Wd jw0PdexeVDLyS1Wd3tizqXx/y/XpFaj1h7e3dLofJ7+YX8NK9xRFrweaZ/4hvTy2 dekL+w+tiu3JFlX2GJ+VH6m7cXHdc3drl3//+MXO6tx3E53si32nDo7ULO5o73qp XbnUG2xtP13XX7roKB3Z9lqxMDUgPJFPLRRKYWYRBSK6YziGjP8f3YNHXV4v5BTt 5qbStev/6ghX7xz/4e4jQ09Wtm5898Ss4LfbmkswuyDkttyc9807ZRfmfX3m+Vv1 /bO+HIzB9sv3pGjwzHGlv+JZ8R8= =pstx -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp/samplemsgs/signed-2-keys-2.gpg000064400000000000000000000010451046102023000207010ustar 00000000000000ฃ›ภหฬภ!&<59C‹‰—‹aˆหธส๙ใใ.ng<“ฤžๅ~OOOOก$#Uมรำ#1R!ณX!71%U!ฟดD!?MมวำืUมหีวว_!1/E!ทRมร฿ฯลค,Q!)ฑ()ตฐ4ต45…ห?28ฤ5HQA!ฒ4W‘ซ“ั„…‘ƒAŽ• d‰ธLqIjYช^RfvพCjEbnANช^^j งฬEYุ๋4/ไbพ7โ๗AฝทอโM)ชRVำw ๎โฬ๚ๅ๕bใทNอ"žY]:?•mนณa็ตŽ๓wหl๛ศ’š{~แ้๗MŸปoYฎ›H฿ษผmกทYชŸOตycฬ6ํšืuแฐๅ๚,U^•–๋๏ญาณ๖vณคŒo"ฌ:vฺฃๅภธฦษ๖เั๎'ฟ๒๙บ3ŒŒVล'ํ๚u๋๏โู!ฯขขoX1หEŒyK๊ƒุr๕“ๅJs๚š๛*ใ…Dฒ‚o4งฬ้<6…ฎV๛ฏœ'‹้INฎดOึณ™.ฟ(๊2ฦี็-žิ[ŽTผ)e๎$*€ใ eซŸn‘|ภ฿…z q‘KEv‰์ˆ=9ค(ฬล’พุ&ฝใ›จ?^ศฏฤฐ‹ฟNุ}ใ๓ใJ19ฒ*๔ƒBธ๔C'nญpgp-0.15.0/tests/openpgp/samplemsgs/signedz0-1-key-2.gpg000064400000000000000000000003341046102023000207670ustar 00000000000000 •ch* หNbWjพ๛If opportunity came disguised as temptation, one knock would be enough. ˆ{#Wjพ๛patrice.lumumba@example.net •ch* =+/ข ๘0#'สSษ.ฯ๘ พผž…h ฌู%b’&:*'D\ูล)๋สแีŠrxE๕ี+ทต+c@‰4Wjพ๛steve.biko@example.net ชC๑วัทฤ:?ป๕ŸฯˆEDฑš^^พ๏bจ๘’tจว _6%ธะY๊QbฐcฬP่ญusZ]s฿๔ป4%ืฦเcจ๑๒ก›๕”ศVS;r]…€h&š_‚ฺj“N•jฐ็็อปwโ๐@’]“+&งyฑถ็Sdฑฝ?ณšiศสกขใธ๏ไฤฝ๋Jธ3?dฏ๊XB๏ž๓ลค๎eชู๐ฬฮสž#ีŒw๋6‰ชM_โ็€RGฌฌšgฏ๚‹]ฅŸ}ฎŒ-TJ7C'$9’ำ >@G.Pฦะเ„’ศฌ,ฅH Jถ2=ล:œัฤDM๎bG๓๑ญv=3D9/0pgp-0.15.0/tests/openpgp/samplemsgs/signedz0-2-keys-2.gpg000064400000000000000000000011111046102023000211450ustar 00000000000000 •ch*  ชC๑วัทหubWjพ๛An expert is a person who avoids the small errors as he sweeps on to the grand fallacy. -- Benjamin Stolberg ‰4Wjพ๛steve.biko@example.net ชC๑วัทxiSš€WวduB.9 –y-j๋Y8:๒ŸbภRฃ œ๐}1?rตŒเaซโ•'๙YกB"ฒU –r k๎ฐชผฮk,&iTฺัUัp๛ƒqq5ๆtˆฑ๔ูม๘ยทGฒ#oฆˆลeใคyฤ\‡’)ธ}ำบมSLh!โำ<ีำ๑๐~ภ)ht†A‚ O๓จก๐^‹ ๙lgท%๛šj 'VฬฺฉGf์R‡ฦ ู>)ๆ๙ฐa—ชฃ๕ž Tj%ข้ˆ{#Wjพ๛patrice.lumumba@example.net •ch* lฐ`;[{X้pk1 ปzถ[?˜฿งW.FํŒcขฆ2ศค†Xy฿๔cšM“FŽ๊$๊ฏY•ใฝpgp-0.15.0/tests/openpgp/samplemsgs/unicode.sig000064400000000000000000000001671046102023000176200ustar 00000000000000ˆu !ๆƒศซถn€จา๚†ฏ; d5ฦ า๚†ฏ; วริSล,1t’์B}หR๚หจฉฃไT•ัก ๔hฆฺ๖ฌฟตdŸ)ษ’฿๐`ุฌ๏F_Šโ๔u•ฯ%ป pgp-0.15.0/tests/openpgp/secdemo.asc000064400000000000000000001333111046102023000154200ustar 0000000000000026 demo keys (passphrase is "abc"): sec 1024D/68697734 1999-03-08 Alpha Test (demo key) uid Alice (demo key) uid Alfa Test (demo key) ssb 1024g/46A871F8 1999-03-08 sec 1024D/1AFDAB6C 1999-03-08 Charlie Test (demo key) ssb 1024g/BC43DA60 1999-03-08 sec 1024D/FAEF6D1B 1999-03-08 Echo Test (demo key) uid Eve (demo key) uid Echelon (demo key) ssb 1024g/7272144D 1999-03-08 sec 1024D/8FC282E6 1999-03-08 Golf Test (demo key) ssb 1024g/9DCAD354 1999-03-08 sec 1024D/04259677 1999-03-08 India Test (demo key) ssb 1024g/61F76C73 1999-03-08 sec 1024D/43C2D0C7 1999-03-08 Kilo Test (demo key) ssb 1024g/9AF64D02 1999-03-08 sec 1024D/A9E3B0B2 1999-03-08 Bravo Test (demo key) uid Bob (demo key) ssb 1024g/E29BA37F 1999-03-08 sec 1024D/EB9DC9E6 1999-03-08 Delta Test (demo key) ssb 1024g/B0C45424 1999-03-08 sec 1024D/7372E243 1999-03-08 Foxtrot Test (demo key) ssb 1024g/EE45198E 1999-03-08 sec 1024D/34C6E3F1 1999-03-08 Hotel Test (demo key) ssb 1024g/D622AD0A 1999-03-08 sec 1024D/D2699313 1999-03-08 Juliet Test (demo key) ssb 1024g/35F8F136 1999-03-08 sec 1024D/B79103F8 1999-03-08 Lima Test (demo key) ssb 1024g/FE56350C 1999-03-08 sec 1024D/BE5CF886 1999-03-08 Mike Test (demo key) uid Mallory (demo key) ssb 1024g/4F31EAE8 1999-03-08 sec 1024D/30CEC684 1999-03-08 November Test (demo key) ssb 1024g/8B70E472 1999-03-08 sec 1024D/6D9732AC 1999-03-08 Oscar Test (demo key) ssb 1024g/2681619F 1999-03-08 sec 1024D/3FF13206 1999-03-08 Papa test (demo key) ssb 1024g/63330D9C 1999-03-08 sec 1024D/3C661C84 1999-03-08 Quebec Test (demo key) ssb 1024g/A029ACF4 1999-03-08 sec 1024D/777FBED3 1999-03-08 Romeo Test (demo key) ssb 1024g/11D102EA 1999-03-08 sec 1024D/A3AE3EA1 1999-03-08 Sierra Test (demo key) ssb 1024g/0F1B50B4 1999-03-08 sec 1024D/85A81F38 1999-03-08 Tango Test (demo key) ssb 1024g/101C0402 1999-03-08 sec 1024D/653244D6 1999-03-08 Uniform Test (demo key) ssb 1024g/5522BDB9 1999-03-08 sec 1024D/61F04784 1999-03-08 Victor Test (demo key) ssb 1024g/07287134 1999-03-08 sec 1024D/EC67DBDE 1999-03-08 Whisky Test (demo key) ssb 1024g/FD6E27F6 1999-03-08 sec 1024D/567FB34A 1999-03-08 XRay Test (demo key) ssb 1024g/41E408BE 1999-03-08 sec 1024D/4B11B25F 1999-03-08 Yankee Test (demo key) ssb 1024g/F7B080AD 1999-03-08 sec 1024D/54ACD246 1999-03-08 Zulu Test (demo key) ssb 1024g/A172C881 1999-03-08 -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v0.9.3 (GNU/Linux) Comment: For info see http://www.gnupg.org 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 =P9+G -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/secring.asc000064400000000000000000000100501046102023000154250ustar 00000000000000This is a test secret keyring simply stored by GNUPG so that it is easier to make diff files. sec 1024D/D74C5F22 2003-12-31 Test one (pp=def) ssb 1024g/47BE2775 2003-12-31 sec 1024D/C40FDECF 2003-12-31 Test two (no pp) ssb 1024g/B27907AA 2003-12-31 sec 1024R/ECABF51D 2003-12-31 Test three (no pp) -----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1.3.5-cvs (GNU/Linux) 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 IHWHiQ== =52aT -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/secring.skr.asc000064400000000000000000000024761046102023000162400ustar 00000000000000This is a test secring generated by pgp 5 beta Type Bits KeyID Created Expires Algorithm Use sec+ 768 439F02CA 1998-03-17 ---------- DSS Sign and Encrypt sub 768 CB879DE9 1998-03-17 ---------- Diffie-Hellman uid pgp5 test There is no password on the key -----BEGIN PGP ARMORED FILE----- Version: GNUPG v0.2.13a (Linux) Comment: This is an alpha version! Comment: Use "gpgm --dearmor" for unpacking lQFbBDUOrE4RAwDbbxWAbWsheUJprK6VryMTpwDiYwMfL+92nrHqSfPqlpMWgDTia8qnpRSXbyEm Sppp/6/Ygp+N3n32Kznq7PjHXiuWLlZGvZMtzmvaMA17y0GY6oLBxS7rhASXIKa9hEUAoP+KBFly qNMdsK8j+ZO0A8rnImGrAwC1ddDme5iZFkTEWHhrtU97sEu2GDkSQB8HdX8CoRcrOz/B2WliF6qf BKhcZPFVBIhKNzjTfY7SEYAZk2zcsCm8elnwSLaGEzxKFNFBqKDNXP+a35spcqsHSGzDVw4VuKMD AJNnAP6skpHlhVAmecLZT9eRzVoOq1ivUIntK2Mh47qsL74q6BBwz2sviPU2Y3pDlbb6Ed0qJAXv dCT24hlfoGoXzkoDInkPJTJeL0gCnwmQPjvXFFd71Cvg5LaL4lIQLQAAn3GbgsWo+7E/hWakzstp TXzI2kDIDIm0GXBncDUgdGVzdCA8cGdwNUBkZXYubnVsbD6dAO8ENQ6sVhADAP8Fa5TbD6k8VmW1 IjK1DfDI0xUdsVIbk8N3Hb0YIlT1E/6tZdfiNwqaKVQcf17gJIObBwfNM3OqWYOudmBVd3S6E3Hk u64nW+ZNt7B2toWRgnk6OgHcSDsud4Igjwz/RQACAgL/ToefzlcVKiPuobKfXHDhIUQPTfGic2Az 47wkMoYHo9j9ZE7AWaliMdPz4jLyLfqqoU9mH8g+vJhyAc7UnAF2Sk5466FDypdPm5F9PTW3cqqI wJM4WgkSlM8J2hxH4YtlAADlG+pxFXNFuDPmcq6jL6dug2ikZ7hcHLAy7DddSS8OAA== =1UWo -----END PGP ARMORED FILE----- pgp-0.15.0/tests/openpgp/signdemokey000075500000000000000000000004441046102023000155550ustar 00000000000000#!/bin/sh set -e if [ $# != 3 ]; then echo "Usage: signdemokey name user_id user_id_no" exit 1 fi name="$1" user_id="$2" user_id_no="$3" echo "abc" | ../g10/gpg --options ./gpg.conf --homedir $name \ --sign-key --batch --yes --passphrase-fd 0 $user_id \ $user_id_no sign save pgp-0.15.0/tests/openpgp/tofu/conflicting/1C005AF3-1.txt000064400000000000000000000005261046102023000204470ustar 00000000000000ฃOฐ ฬ2๓Z๓หbXEf1 ‰3!^_ุW-|Dชmฮฬ2๓Z๓XEf ฬ2๓Z๓Eศ€ร p๐‚Q’หฎb๕4gญveo๘xŠไc๓VตมVea์9-ฑk๒ Q๏ะ{/ฌฯšฐ๙Ux(‘‹zW*>*‰ฆู`uB๚Pˆ๛ขเ๛{ู๋ธ%f-JพฏP์ชถl7ฦภฯ"ZWทgReนณ๐ฏี&งไท$>dJ] โฯค:&”|ีฐึCž +:/ตNผษ๚2ึuฑ…จฮ“๑ใญ_DCญฆV]ฤ—–K ่๊,\โ=0ร…•ฦ๎ˆ› ci๎u๖วเfญ๚ศ”ๅ<ึ˜\rข‰fกV8‰๗ฺซฐ#60แh๖OฟR˜5u™ฦa”Epgp-0.15.0/tests/openpgp/tofu/conflicting/1C005AF3-2.txt000064400000000000000000000005221046102023000204440ustar 00000000000000ฃ›ภหฬภมxฆื่ณ CิgฦำI ฎi์F\Œฦ, Œ ฒbŠ,b,q๑7ยuk\Vๅžƒ)eeฉcเโ€‰จ9ฒ•ุzuVsญ์d‡gE:D:”หงGฯi64|žsBQiM๒l}%…ถ ฝSuz›…-.ญ้1‹ž~ฮฏ๙ุ~%ฝ๓โNYฌJหซถaEjd„‹ลsื@.@ถfฎฐพ ๛ท>๔๕ฒXโR๕//&บ˜ฺข๏žรฉไe{์•‹LJP{ŽAซ"ฏ๔ชร);ฮฬ.ตtใหl๑kำ/w0L|zฝ&ๅW›๛~‹๙๗4Ÿ<|<งญึ ้R’ม๓ใŒ‚็๔u{hX<ญนท>ปo฿…๔๗Ÿตfr๎sปใ_๐๘ซง๐ฎ eทํๆtุฅtฒbป๚a^ k๖cmd%ตสYงนNM8่็ฮ pgp-0.15.0/tests/openpgp/tofu/conflicting/1C005AF3-3.txt000064400000000000000000000005231046102023000204460ustar 00000000000000ฃ›ภหฬภมxฆื่ณ CิgฦำI ฎiผฦ\Œฦ, Œ ฒbŠ,b,q๑7ยuk\Vๅžƒ)eeฉcเโ€‰Xคs0lา๙"iนิ\GอOบเฮํWฮท^Vbฝ๕BC๑‰~ีท[9Ž›ฆŠ๋x„๙ฮ์i‰เj7Vg๑๓ืฝ"ๆจุtl>iWผ๒กณีขุuแ–ณX#–อT|฿3_๑ฤEž/ฤkœ.-Y๋๚ูฐฬdWYsRdฑ_๐รv พญดนฐpgp-0.15.0/tests/openpgp/tofu/conflicting/1C005AF3-5.txt000064400000000000000000000005231046102023000204500ustar 00000000000000ฃ›ภหฬภมxฆื่ณ CิgฦำI ฎi’ฆ\Œฦ, Œ ฒbŠ,b,q๑7ยuk\Vๅžƒ)eeฉcเโ€‰ฌ๒ๅ`X็s9ฤGฉ๑aๅใƒ/„6-Š(๕ฐ6Q™ถ๔‘๖ษa;าbอฮ6ํฟฌณMŠ+/lท™;ร๓KKฮฦ4ไJํ^น่fNษfแำ&v–ฃ ]๏๗Gท๚ืปkŠ@ใ\9๖ผpฮหณ๗ถฏydลฃwNฬjฎรซทาnoฯ5ีะ]๑ตdฦนศพ๙ฆ“~•3š`ก๋RฝiรอyIN|ฟู6ๆˆ+ฎZเVฉ>ใx‹๗Kเ#š;ฟl™ส๙ฑgำผD™็ f–|‡ฦNฺ2า๓๙–ป™ถnaแฎ๖ฉš๐:AฆB>/๒"_Lฮ๏Sš์EฺO’]๒,=>ฏํ๒0O๘บ0{‡฿๗ล“m\ชWpgp-0.15.0/tests/openpgp/tofu/conflicting/1C005AF3-secret.gpg000064400000000000000000000047511046102023000215360ustar 00000000000000•˜XEV#วJฒซำZซd๒V`ฉ8ฌ9ุƒqKx ฬ:w)ญP&"ู•๛‘สี1LŠฮฏgซ˜†2QF iC\/o๙h|G/ฝฑศ฿สeJหp#๖ษ๑ฤ!Žั]ws15"uN_?Xฐk>@ž,˜J7 Hห$๘UˆbฑHtžŒ`ŠN<–ทฃZ๘ิ*/Gู%=ŽEดจbฌKศ!ี,-'นฐกก&6๓#fSท!แ…กE ๗ไน˜์4๋eคŠ‘N๗–& ฟว ฯซ ปI่๙ฑ6ิ5qh„t8–ำIG^HTน็™Sศ/6 } DS)€ใ—7&ิฒณpฃฟุ=‡L[#าฬˆฆัเx8‚jŸK|+ิƒ$๑ษJxy3ขKงš๎฿Xฎ}อ<ซ^ฟิ'p๑†้‘€ฮัLH1ฌ๚“ ฐ[(„3ฬงผF:–๙V._&J“อ"ใ~œ๏—œJ6ง,{ะธระภจL๔q: …ไ*Œ๒D`,5ฬ๔‡๔ฐใƒ?C#ฤิ6อฮŸ~ใ[ސvคk ช-$ฟ๘ภŒQˆย‡๚ไุxฬำœ๓ๅ/!xฌOป˜†škt๙XkษLํ™_|e˜.yล  ใๅฯ„GOสืs9Gสป์‡ดœฮถ]Yห๕ร†+[๚tGชๆฆลoลG0}Z๙9 ๘šตฃ๖ขIฅ“ha?ตจ–”Xๅ๑ez'ซpmฆXฤฏ‹ซ”?„yา๚คdjบX4ั=S๊ฃ^RL<ฅ›7ฃฟ็9ฎฐ#๒๏าฝkฏ6&u๊Ÿ%z็@Llฅ…็@Y๘ืA;ื_Bก1ูฆซ๚^Jrlฎ็k[จZ&ื=›ŠE์ศใU‚—Ž` ๘ถ(vvต๑ี ๖ๆAP=uผทsฉ‘>;{/~๗Z#If^ŸŸVo$ื)V’ฯก #ฃˆy-๏—๙„ษ‘' +~h†‘ฆฏ›๏ิ“š}ER9S๔์๗{‚‰N8!^_ุW-|Dชmฮฬ2๓Z๓XEV#  € ฬ2๓Z๓รzŠ ษ=ฮ™ื’0uณห จN%ฃฃฆ0DพzvYAนฤJuPบC1ฟ\๑๊๕Fฦ|<•?"–่i๑vศjh่คัv?)4Ÿ๛š๐ƒํขณ๛nKี‘lบ‰BUคr5นO<ค_ืฅ .?Inัzv\pฎฝษWปšกqฏ<ใื๗๘— ตืผํ jฮllปบ'—+8^yP)ฉšฺ'๋ สบ/„F%=|ฯอE/R[˜XEV#ตฒ˜\เ๙่"›๔ๆฮงC-yOV้fOย ๕(yhํก—0ฆ„จŒhุRtM‰[e[&๓ฯig&wžฝ+,Tฯ็#l,Mุag›xภ™?,SำI•๋Lฮœa๗ >5S๗ฤ™ม๗ขq)XืKE•เมŒBืTฌศW"0ฦ‡ฎ]ฃ—‰ฯ"Š2‰๗/žศปd+[โeฬ<ุM๕šสผ๛2X่Vช [๓ตผ’‡)ตหเ๐เฦ^j  l/’๖}jRลRช๔ๆgื(^ฟ`ฺV_Mฤท+@>yz0แฯZ๓รcธ—^ตๅฝ๛~ิไย่•zก9ž66ดํ•๑ฮฤ‚„&VGซฉ๒ฅsฅคjร|๗ธึ์#้6^šCษ่X1eบ–› ๗R๒ฉni6ศ+“\œ ลD 1ทYRวโฅๆi <“็SA(w}‹Ž7ฑัBT๑ฎจŸ ีrnŠ{z๗)๐/JJhํฆ์ํ Z`zX€<,๑ั๐6บคฦ๔ถLบ> Uั}\ณ๐Hูwzฮ’์€ช( โ่ั9RŒ@’u“ํฏ‘อ|ะํหd2ฆ„9ึ~ฺNvqภN:TQSi"›Žัืqml$žrฯE”กRหžxœ๋Z-๐Lž™3ะฑ-m‰3=eaฝ85˜Ÿ‡ฑZzyฑฯกํ\ฯ;R3ก๗ฑ:A|_v0 –่ฦฤ๊ฮ2๓๙>๗ฃ๐ึตJ–Zซ๏%นƒ]< ไฑ๋VOพ™rcq<cภœ‡Z#yiใฅี$žJค‹oD4) ษaยฐŒตฬ@ฎUืi• @ง"vn๏&าฮ5฿œบv‰O1ๅŸ๑๐wMฤ“>“oz๓X†๐•ลตCŽ| Fฝฬ[tฬX=ืฐ๊ใWร้นํฐ9d5ำืNœ’ฐmTJญคšk<6ฎโ๎ฃŽะฝK,#hy=ฬถbx 4‡ U=~เซ๒ฮญxหPิิๅSะ[ั๕• q}ŠXศํhcIฉZ“ัc&•ืผึหลษๅOณ˜/แฒญ‘›{ท.Dยฮร1DŸ‰6 !^_ุW-|Dชmฮฬ2๓Z๓XEV# ฬ2๓Z๓Kมฏ๒ฆ* ๋ไ๔ฏ'ๆeC^%ล%8๕ต~pƒ๐|ลz๕๘หQซ}!์”k›๋ํฃ„(fuWบ’ผข^n`r>)ฯfw๔Ÿ„ๆฒt@ฬ4“/มน๋ๅุ,่พUถัP/ข๔Oฃ!ซ๕™ฐc†{v}ไหํ:m%† ฆผร+ขํต๗Jฯ}‘ภฯtEฤณ๗ฮฌJ็]QQ=ถื—ึลฅ&D‚ํ/฿€ƒ๑—็:ณ๘๐V=Ÿ‚|Rๅแ๐?€ฬฒuœซZ`'B„—I‚๕†ขNDฮtG๖U"ช|ถภฃ(Oe4Ÿi4hธ+!žหbj}y*ลั๊mjว(ก˜pgp-0.15.0/tests/openpgp/tofu/conflicting/1C005AF3.gpg000064400000000000000000000023231046102023000202440ustar 00000000000000™ XEV#วJฒซำZซd๒V`ฉ8ฌ9ุƒqKx ฬ:w)ญP&"ู•๛‘สี1LŠฮฏgซ˜†2QF iC\/o๙h|G/ฝฑศ฿สeJหp#๖ษ๑ฤ!Žั]ws15"uN_?Xฐk>@ž,˜J7 Hห$๘UˆbฑHtžŒ`ŠN<–ทฃด'Joke Factory ‰N8!^_ุW-|Dชmฮฬ2๓Z๓XEV#  € ฬ2๓Z๓รzŠ ษ=ฮ™ื’0uณห จN%ฃฃฆ0DพzvYAนฤJuPบC1ฟ\๑๊๕Fฦ|<•?"–่i๑vศjh่คัv?)4Ÿ๛š๐ƒํขณ๛nKี‘lบ‰BUคr5นO<ค_ืฅ .?Inัzv\pฎฝษWปšกqฏ<ใื๗๘— ตืผํ jฮllปบ'—+8^yP)ฉšฺ'๋ สบ/„F%=|ฯอE/R[น XEV#ตฒ˜\เ๙่"›๔ๆฮงC-yOV้fOย ๕(yhํก—0ฆ„จŒhุRtM‰[e[&๓ฯig&wžฝ+,Tฯ็#l,Mุag›xภ™?,SำI•๋Lฮœa๗ >5S๗ฤ™ม๗ขq)XืKE•เมŒBืTฌศW"0ฦ‡ฎ]ฃ—‰ฯ"Š2‰๗/žศปd+[โeฬ<ุM๕šสผ๛2X่Vช [๓ตผ’‡)ตหเ๐เฦ^j ‰6 !^_ุW-|Dชmฮฬ2๓Z๓XEV# ฬ2๓Z๓Kมฏ๒ฆ* ๋ไ๔ฏ'ๆeC^%ล%8๕ต~pƒ๐|ลz๕๘หQซ}!์”k›๋ํฃ„(fuWบ’ผข^n`r>)ฯfw๔Ÿ„ๆฒt@ฬ4“/มน๋ๅุ,่พUถัP/ข๔Oฃ!ซ๕™ฐc†{v}ไหํ:m%† ฆผร+ขํต๗Jฯ}‘ภฯtEฤณ๗ฮฌJ็]QQ=ถื—ึลฅ&D‚ํ/฿€ƒ๑—็:ณ๘๐V=Ÿ‚|Rๅแ๐?€ฬฒuœซZ`'B„—I‚๕†ขNDฮtG๖U"ช|ถภฃ(Oe4Ÿi4hธ+!žหbj}y*ลั๊mjว(ก˜pgp-0.15.0/tests/openpgp/tofu/conflicting/B662E42F-1.txt000064400000000000000000000005241046102023000204630ustar 00000000000000ฃ›ภหฬภมจ%ถผ[า}ฦำI ฎiŒ†\Œฦ, Œ ฒbŠ,๙&ึkฯhํณ‰าำŒ†)eeฉcเโ€‰4ฐ๗สพ™8C๚อ ปึ]_EX žฎ~yขn๚=›๙~ืR;53_&่บ ท,สฑ๑=–zmU๗3Zฏ์fQาป%ำ๑ฬ๐BZตฃpS์อ:อู_=ธ๗qNWบภ–[V>้.ยMJโYKอหษ;ƒหแุผํkfพŠป /ฑlาI‹}ื…ฌัะPOx/Vนฅฐะnล’ซ_ท•๕[’ก[gธA 6rส้ค{฿ T˜ซฎบ๛๖๋ซnฯิฆf{˜˜ตe3‹๓มฯ๏ฃŽ<ฉy":้๛lง ้S฿šว^q‘“ำŠฐYฑ๋šณ^-฿ฑw๊ผฎ๛ฑฮว*๊•๒j #&Nปz๖๊pgp-0.15.0/tests/openpgp/tofu/conflicting/B662E42F-2.txt000064400000000000000000000005231046102023000204630ustar 00000000000000ฃ›ภหฬภมจ%ถผ[า}ฦำI ฎi์F\Œฦ, Œ ฒbŠ,๙&ึkฯhํณ‰าำŒ†)eeฉcเโ€‰˜Oa+ล่“ฒภ1แ๑d__! ซ‹฿ž=—ž่bนnฮ๗+}ฏŽw=สŒ^๐p;v๛&ฝŸE[,ห)[๘–๋๋ž%Ÿ<Ÿญฮhy)ศvOน5งโซืั๕9/ตฉM๕ ณูgMŽWก%v'žฬญd*gMy๗›~wsญ6Ž๖<ผIงผ# มuNpc็ vฏ\}Qี€7๐‘ภŠ_น!Sf‰tZฉ”๐ฅเ฿หภ„5S›ื6.ž>ว0ึพบHตุ_v@mยซ–{krื N฿ป7ฏoบ๕ู๋yœ™ฆž?ข,‘้V]Z๒บผ>]ข๚โŠ๚Ml|ซ^K~฿›jี^๚๙ษโจpsepgp-0.15.0/tests/openpgp/tofu/conflicting/B662E42F-3.txt000064400000000000000000000005261046102023000204670ustar 00000000000000ฃOฐ *งถbไ/หbXEf 3 ‰3!o4;ญฬ*พn\M;X๗ฝ-ื๗yi˜ˆƒ.m’งV)9 šKะนบชVะŒ๋ฐ"ขทT›Eฦœฺ/J@กฒ๓เŸwy‚ีNุู‘ณะš๋Uา‡™ฤผh฿!๖d‡๘N0์žษa[มMนb‘ศFฒƒf๐G€ &Pธฌฆ]โฯ_qฒ~™1ธKZ ฯ่‘kDฑx๑a.ู•wv๑ํF๎.ฯัVAึ?h๎Š‹ถฤ{ๆ‹ILลฒ๊๛”สุโ*ฉัd0กIชMŒœฦฌ0Š4"ุg๘Ž/ต๒)5ฦwpgp-0.15.0/tests/openpgp/tofu/conflicting/B662E42F-4.txt000064400000000000000000000005241046102023000204660ustar 00000000000000ฃ›ภหฬภมจ%ถผ[า}ฦำI ฎiย&\Œฦ, Œ ฒbŠ,๙&ึkฯhํณ‰าำŒ†)eeฉcเโ€‰(]`ง+ไž|Nีษqu๏ฬ—แ1ด่nš|_ฦฦ6ำ\~kบn็J+:oํhๅนฌฐูว๙วใณ๗:ญŒ=™Xซป๚v่‚ฒซohœดp฿—๓ซ+ภˆaอ1฿R}Wม{ืิคsคT๖๒E™๘*}้ย9ญš๓๔๎งย‚ีน_๒z"—ๅY=ี~ณ ีs฿๒/WE์ใ๓ažืป‹™ฎL•๊๖ˆาป็t๔รซ็–‹uoไ้?™โฝGฮ(7,b฿[fฑt‰E|‹ฯ>7Pพ๔b‚”Nษๆ็ำ| wฟผ๔ขีีซอํใƒต1›_ฒฬŽ๕าYา\พB5g‹%‘ูํŸmuึ,ซูpgp-0.15.0/tests/openpgp/tofu/conflicting/B662E42F-5.txt000064400000000000000000000005221046102023000204650ustar 00000000000000ฃ›ภหฬภมจ%ถผ[า}ฦำI ฎi’ฆ\Œฦ, Œ ฒbŠ,๙&ึkฯhํณ‰าำŒ†)eeฉcเโ€‰h&q0lส;S“ษตด`ลโKหพ>žพ}iฺ๑ชw๒ฒ๖5?Vู๐F+' |]๓$ํ/Ÿ๔jืm•ณำJฤ฿–TjY‘ภคมฃ<๘™iปฝ6%ฦ|ช๗ขa๛GVkgห4eตฬฌธฒๅ๋ฯีี%๎ํkบz๙ŠN๋์lสณ๊ืžŸšžฉ:ๆ‘Šฯ7z›žฮะ\oตs™๚Jลs1ฺ้๑๛pgp-0.15.0/tests/openpgp/tofu/conflicting/B662E42F-secret.gpg000064400000000000000000000047511046102023000215540ustar 00000000000000•˜XEX.ํ•ว„ศ๔io— หeแฉ่ ฆ—ซจ๓ม๐[m๖d 0nแัD๓น40่5ึฒบ~ุญn_1€Pเหว ้ะอะ™FขcŒG›ญั๏ล%vฌโSpj †:ฤ!n‰"…NCŸk\าpHŽกE’/โI „ๅ W[m1ฉโ๏•˜_;•๓.…์N-•พC‹Gเ "บีRVผ๖้เ(ƒบ\„`xv้BฬLr3o’<v?sขงๅMะ้๖ี ‰์โฦ ฆ‰่ิ3{ฮt>ป๎‹”ฺฌD‰า†ี๔yW …ช้ไxu1ี฿\ป c!ำฝฟัVจ"”ฉžฮ๘e`˜›=Ÿ$=X[›~ฮx!๓ŒขVฟๅ;ฌ5๎ˆ––฿Yฬูธ<าฝ๔ฎว๗X(ะS้ข5 4$)3‡}G์วBะ ฎน|dฏkัBRIก{ฮ็Be bแ‡‘>ฦฑ92-—B๕๏ูฟ)8ญ7 e›ึฯb•ภ“แ/๕าžAVษ.-D—ถX‡€ผแง4†B :มƒซไYe ]S๐,& v๋qธๆm๑ผ‚เHฃš”m=ฟmด๏ฎ~Y•ยC$ฎ>ฅ~ไCŽงึืด"PยTœ๒’{กึฅ๏†mใ้0 ๔ฮรำ]ฆ![ญผ?’‡˜๙˜0‘ชฉ/Šฬ‚4ข็šรoๅจleำr'*ฬ^&š ™Yึ/›’้_่๑\้ะณฬาiœaZฑV>ๅปฺ6'รจฺภz๕3o=Š๔ฌSภZŒทป๚ผŸ”ล^.sั0ntnฑซจมฺฯ็@บf… "<ต&5oš๔Sฏ…rฎ™ึพ ๘่xYฌพูสเะฮzใาแC&…~HGNƒฤ+โfย๋๕t_บโF4(ฤ.งvกM=FาhะUˆง S3แRtฦฏfบ฿ฟ๐>u„H0lˆ™;๑Gุ„ฆา)ลฃ๓ม&๙h๑ฮ?‰$dB‘๓^[๓๗๕ฌ6คขลฉๆเ'ดบฺฑ`Žภะwˆ‡g+ภฝ$–C๑‡ต๗Gอ†Qบฬj{Fa^‹ฦขป™K˜ป0ญ่ฉผ๋Œ \ynเซw1z๊๖2~ญ_ส๎าแ๑C‘ด'Joke Factory ‰N8!o4;ญฬ*พ 4%0ยฑหฅ0ัฒ€‚\E•YFจอถ๛ผฮŸiฆyB‚้เmG…รทN‡๘nN„œ๕Cฤ€ygM}วjs—sฉ [ไว{$˜XEX.ืว—SHO Xš~โ5ลq์FM„$oX‘mZอโQE …™0ืˆ๐=๋ฅ่uฯก๕&ืั|Nœเ jeAัง€~Cผอ]Žฃถ@.ูw’4:์๕+]มใธzGใู๓กyโลŸŒJฟl<ห9ๅ&ˆณ+ญdq้ๆƒdbVBฟช‡โ†#|y–มZ;AหไธAOX:V7ฏ>lข!D๊*N*๏TRA๏=^ข‰๊ฅdœ๕ๆ}Wฃ;๎ณ‡Y—#^o๑TฎนB๊A…uf&:ื•XsNuา_ˆo;?A๖qล+Rลฦั\u‡Q๛ผDYงKZ q™ุa‚~้/ 0šŸK0 ุ“Ž.x๋ฟ`ท‰ฏ5h:ง๑๐ปฯ%๔˜๘hnŸ2 ช๓–.ต>]%;์“ไw`Oฏ)๑-JGxbžาฅ2€ฝูคฐ๚zฐ‘r3Šฬa ฅ="`ห†อ‡dQ(p9{˜ญ๕uฅ9๘ฬ‘!)ธd OสT)ณ๏'แeกšOฃฒฃ‚ีœ๚ฐ]ช1Cแ 'z>ผ๊้U&โิ1ฤ์ …ษE(จ๐Y.Cศุ/ฌํ_T”aYUญNRฦ50†[๊t]R^L5L2ำm฿ฮSญฉ“D0บ}ฯ_๚่}ซ^jถา‚๘–3J3ึ™uŸrบ?ช(ซˆR}้Ÿ|mลึ๏ป‹Sไ „ฯญkต…†ซส๚๋ ื‰ฌUฯguCjqs’1ป*๙›กp€o‚”+น้t.็O฿ส6๗ญ%ไlจCถฌhoฐ๙wฬr?AOฃฎ๗H`บ‰eณ1ษ!ํ™TO…Q๘Œอ่L'kIŒฮ,์ูโIึM“ด๘หDธขฒ”Nb—สKtนฺ๋EIจ‚ฟ‡๖R‡๗สฝ:‚โyเKhโd๒€ะ%L่วขHฃ]@คโ๑PๆษะQ—Dl™0?น}๙_hณ๊้&ถsVฉ๒๑1E€1 อำซ”ง`w;Œฟpลภเนa`ภตž#*„฿_สใฎYไ8๊;zŽ’๛1`ุNF5บ|YeขพKi ^!'ฐ|m๋–ซส#า๛‚-ฮm}‚้+\ฺd+MCฤฌP๋ว์ดI.ถ5AŠพžfN๚™Mถ#DFp‰6 !o4;ญฬ*พป๎‹”ฺฌD‰า†ี๔yW …ช้ไxu1ี฿\ปด'Joke Factory ‰N8!o4;ญฬ*พ 4%0ยฑหฅ0ัฒ€‚\E•YFจอถ๛ผฮŸiฆyB‚้เmG…รทN‡๘nN„œ๕Cฤ€ygM}วjs—sฉ [ไว{$น XEX.ืว—SHO Xš~โ5ลq์FM„$oX‘mZอโQE …™0ืˆ๐=๋ฅ่uฯก๕&ืั|Nœเ jeAัง€~Cผอ]Žฃถ@.ูw’4:์๕+]มใธzGใู๓กyโลŸŒJฟl<ห9ๅ&ˆณ+ญdq้ๆƒdbVBฟช‡โ†#|y–มZ;AหไธAOX:V7ฏ>lข!D๊*N*๏TRA๏=^ข‰๊ฅdœ๕ๆ}Wฃ;๎ณ‡Y—#^o๑TฎนB๊A…uf&:ื•XsNuา_ˆo;?A๖qล+Rลฦั\u‡Q‰6 !o4;ญฬ*พ–ืฺŒง9’"\ำ น:Y9dลYฆ_ู๋นมพัu‡งL)+HงLฤŠ…ฏ์UŽŠœ๏‰๖฿p`)าt ึp‡๗"ฅš฿žง}อ?Vw^Žกษ๛ฯฬ™>‹๛๔๒w๎’ฎ{qฤ8ณกศ่ญw๗ ึญœฐNม๎๛ฎ๓ฅ–‡ฯrซปท}‰๒<ŸweNV(fจฏ+\ตกาkอทj๖๛‡VW~‰Y.rqjบŒ๒ณ['ฦ๏{uฮ9r›”dฒฬ*%แคm 3–Pฐ}ฮ้๎u_ูล ฟถฯ]wร๕uื๓‰ SฮdฉI๓ฏqOฅกนถxง๎^ƒหgSxbุ=cz๔$ชjkโฎ\๐ฺ~;๎v&๋๗C๚}ฝ[ฯ\ึd'๒นj{๚ƒnอืwžž๔]๑j†upgp-0.15.0/tests/openpgp/tofu/conflicting/BE04EB2B-2.txt000064400000000000000000000005261046102023000205130ustar 00000000000000ฃOฐ ๎|}คพ๋+หbXEf2 ‰3!—ึŒนฐ?7๋ˆI@๎|}คพ๋+XEf ๎|}คพ๋+-ว๐ณ%fณW๓ลs–ั~ะIซ^{lqŠ๑QHจ5๘2›ท…p๚๗๖ป K5r๔3p/ํจ3ฐŸjณพ_vส๋๘๋ Gฅ3 ภ\<’~fyอ฿โEลงœาZ g‰ปDU+ๅCI 6{k๚๊ะปแ์?ูณ๔nอฺŠg‚‘=]KDฉเVฤNฒpมŠฃ๋ฦ`ว๓wˆีˆธŒ9แxแž+ฦ„WF•} ๊;ฯQ(๋%.ฃโ?ฮซV๒แIDA๎‚UพLO#6 ฃt๚ฤญๅ˜เจ๋บภ็gaข‚gอ็'…hค5่‘y9˜nฮpgp-0.15.0/tests/openpgp/tofu/conflicting/BE04EB2B-3.txt000064400000000000000000000005241046102023000205120ustar 00000000000000ฃ›ภหฬภม๘ฎฆvษ>–ืฺŒง9’"\ำxน:Y9dลYฆ_ู๋นมพัu‡งL)+HงL$จ†นัฯ|ป˜3ญvแ^:UฆWY~yค ๗ค>?ฺu?๙ฯด๊„%.œผR?lr]ฆw8‘=R๕j้Ž U6ๅžๅ/'ป^PWก!๛ฃ;Aฃi_B?ซฯ…1ณ }๖ัL0›๓vkK™เฦ)ๅ>Y—ูŠ—[ษ}–ืฺŒง9’"\ำ$Mน:Y9dลYฆ_ู๋นมพัu‡งL)+HงLdS ๛ศทน๗๎[!\1—๏yF?ใG7‘ฺ=’_K~-š๒ฉ๋฿สšฏึlึ<๐Vา52L็ศ๔คฐ๕ ฃ๖ํmฯ น]ตฉKศศขโƒ‹‚c#u๚ฮmn*๊‰ภVโฏ #NTŸLR„ำGV`i‚K…t+"าƒด๋Œ;EปZY8$ฌQFn‰juผ งB‚Eyžห8ˆข๋็jฤณdDทะ๐ไ€นœแฑฅ‡Dษถpบสšษ0Šฆ`ใงTโˆื,HyH nต6 ฌ็ํจน 1๘œ•r6oิ†Ÿ ำVaภ๋BXฏ&ส„—i๏๎†๚"7๎fI๛0Tึผ นโbUJ1ำๆ) งJ!ุQฺ๋ฤgเ#oPฟ คLj)F๕หTธำศOูC‹„‚b‡3\0W0†rwK3แo๖็็w๘5ฮฦธ๐ถxƒvaโ!ฦ’—ฑัVpค ใบฮอ่a‚hสตžmฟใ๑5Ph‰+ &{ญฑ :ผ]ข*Aฦ ฦH๗+—ิœึ2ซP[‚ศ^’ฮฟ/ฅŽ์Qเ”=ึ่aฒ0@ูห4ฉ]`w๓์ฐโF‚–kiขQุ+>ตวm๗ฺ‡%มูeจXYŠข8q๏Tf0…` yฐ rJ;T๖Bg ถX5ื O๖๗กๅูQ5T j,N็ฝข฿7ุI๔[ห  1:ใํ๑V"J๙™ฏง‘จ\Fš๙--N2*AฯXŸิc๑\šภ๗!aิ,่ศคƒ๋่GR๋€ิ …ภ๙ฺ'่ก็IŠT๋Jyษ#๕ีKp—O>๏ัภbwdฉa๔๓‘9ศ2%ไvฉ*+e5‰N8!—ึŒนฐ?7๋ˆI@๎|}คพ๋+XEW  € ๎|}คพ๋+าูฏจอฃ„ก|U_–ž}ญTE๎“T‘vox ~.ณฬb€>,฿ๅึ๖Šd—ฦ_’!> F6™oTขF99่B็ไ่ตสํ—ซ{YๆกLฃ…hฎ 7`wP์ฌ˜ทgŸ์ LG๔8‰ฆ5~_w. %-j•รแZ๐T‘;๏ใ t…!ว 2.'X7๖Qž3rรpำ‘šำUๅ”คษ๚ัuไฃ€0ณ๖,Ÿœ‘ *า็‘ห#ต4R๘JŠƒ…๑&๙O'ฐŽs]$เ&็^mฮ0ุvSO๘ฝ4ฌy$@r’ฝ๕,Eท.ผ*Œเ_8ๆ฿\—฿$ํ cx– Vเไใ๏I>d;ฏSหEŒ™##ฺยŽACm ูโช่ZญA@ž#๙จt‡ษE๕bรมไปp3jd1๗๙•ัRฏู{dCค๓šน˜๓€ฦ|žkŽhฮŸ๋JขbP\ใšhƒ์๓z์ัำ’@>_fY|/>CN้ษDh;ขิ$- ู๏QgำRผ ค๖˜อ๏๚ฬเงปถŠ‘,฿%•Zฎ๗oฺVYn‹dผจsฦ่gN?;๚hฺ‚๘)ห ,<}vผข™-(0kด4ยrษเต]เ3@ช‚†ฃZ)x)uไAUรๆ Vป"IE”’("h์ƒaฯ฿Ob$ห–ญ๋6SŠ|Qƒ‡๗๕AŽž ˜Uไ๛ถรฤSYฦนญM‚Pว|l‹จฺรXxฟ๎6๊h}ฯลqqณเ๏ฉFงQˆฐžฏดษ๖บผฅอั๓ฌa_{œ]ดฅามœyP6ถ๘y 16ž›_/็ืผ“บปRgŽๆ้ะ_Ÿ0dvGฅng"p“>อํR5‹V~Rล/ฯสิโ""Tขfฺํ ›ทา H8ทmๅหถฝๆˆ™Xsืฤ.hๅpKX็pyXกจ)|๏:N˜™’?p—iห0h™‡ซิถถ“N[TVว3V"–ฅฎJ‰6 !—ึŒนฐ?7๋ˆI@๎|}คพ๋+XEW ๎|}คพ๋+ๅซฦฮผJ"‘aฯHŠ๕ด๓lขุš)eฐ9(P{0m%ชฅŠๅๆ์bR™7ขJำ7ๅt)bโŒืวi๎อตฎ5ˆ*[ใ–๒X‡อา*j’oj›)|ฬผ๒ฮนSnูฉ๚A5า ๋ฏฅWSU_V็q๎ wดษุƒ#พ3htZ็๓9%ว€ฐCฮŸ^ƒk?฿o@ี=ฝ[4XฺT๕€MAุยผMgL]”*ฯg–5=P’Vw๚`H๚sจ:œอ"3คLดAPw!2“ญน่๏[š›Š)ˆ9๘ฯ็m†s†@จ วy๙xS๖Ÿฤqธลค1œ์C€ฤฒ&„W4'๓pgp-0.15.0/tests/openpgp/tofu/conflicting/BE04EB2B.gpg000064400000000000000000000023231046102023000203070ustar 00000000000000™ XEWๅค78+๐คMz•ฆ0ไกSF|ฟl"lคฐ๕ ฃ๖ํmฯ น]ตฉKศศขโƒ‹‚c#u๚ฮmn*๊‰ภVโฏ #NTŸLR„ำGV`i‚K…t+"าƒด๋Œ;EปZY8$ฌQFn‰juผ งB‚Eyžห8ˆข๋็jฤณdDทะ๐ไ€นœแฑฅ‡Dษถpบสšษ0Šฆ`ใงTโˆื,HyH nต6 ฌ็ํจน 1๘œ•r6oิ†Ÿ ำVaภ๋BXฏ&ส„—i๏๎†๚"7๎fIด'Joke Factory ‰N8!—ึŒนฐ?7๋ˆI@๎|}คพ๋+XEW  € ๎|}คพ๋+าูฏจอฃ„ก|U_–ž}ญTE๎“T‘vox ~.ณฬb€>,฿ๅึ๖Šd—ฦ_’!> F6™oTขF99่B็ไ่ตสํ—ซ{YๆกLฃ…hฎ 7`wP์ฌ˜ทgŸ์ LG๔8‰ฆ5~_w. %-j•รแZ๐T‘;๏ใ t…!ว 2.'X7๖Qž3rรp". The keys are stored in KEYID.gpg. The secret key material is stored in KEYID-secret.gpg (the secret key material is not password protected). The files KEYID-N.txt contain messages, which are signed by KEYID. The message is "N\n". pgp-0.15.0/tests/openpgp/tofu/cross-sigs/871C2247-1.gpg000064400000000000000000000022251046102023000201570ustar 00000000000000™ Wท๙ฑC`ˆBถ5Vฯmกั(ฏฑํšG`สอ๐ก((แt&W†้Lดาฺ็ฅ W๐•Œ้_ฉ}”๊Q(QYnP_+y.ทp‡™ฟUึdฌถูžhvฐ.ูภ1_ื”ซฃธ’-๏๐ภ44ัzLCฐฯ" …5ู{9๒ขระRฮ๎9iYณถ›Z˜Šอpิู:&WX+‰7!Wท๙  € ‹Hฦฝ‡"Gัฐvขาู=,ฎ“ukyr>แD๒ิ%v ค?irฬ-š๖‹าศภซ๚๐๗œคุjJEฅ2๓\iก ž๛อLvอ ™ว$7สh6|ฐทp ๔ิf๗ฮบ]ฤŽฯ฿–๒w/รZiง๙_ญfฟˆ\ศฃ8||x Bชƒˆฯkๅ;ฺ{Š๛หีะฅuชตW6วกUศ‡ะ›ำqๅีBฑWวœฤVฤ$'ำถfjšทศว-;;3A>F‰า ขํำ•Œž.ืEๆฆ=`TยoNษ{ขจ Tฝช,{าม9(€Oช ๐@Yรยg2~WF๛.TลำžE-‰%Uน Wท๙ัิ๓ฆpG6 '…•AฉE"j ฏ>น"IควbหOตศํv/จt๋Œ๎œสย่๓แฌ…T$G๖ล๐iœสZมVnd@9ตซ๋Lไศk๋ฮยR3Eo3(• ‘PO‘ัeF„  w(HุŽไแˆ฿{K9ีไ@v[=˜อ"IP0jŠˆรฃVLd๕ฅฎก1ีJข @)MY็กืH}-ฬ้7aไฃ–ฺ๕มmN'—ืa(@ G‡5WGKฉ™ํp@,ˆ๔๛ีTิศW Pา็kฌ(๐ปR9R.cซฎ\odITZu@f{lp>ณฯ ๏‰ Wท๙ ‹Hฦฝ‡"GY๏ “t•โ‚‚lKภ j๑‰ฅวธ1๙0๎‚ำ.ฟJ-ๅŽ-kOไ)rNT?eIp3;ฃญ9bœ๕้ใ*ฮบOyนŠ^ฤถคrอ˜šฮาลใคŒฆ฿’B›dท็„ฟqŒ+cรlผ˜=hฒ‰ะล#ทL˜\"—‘์ะM‚ˆ9Hzpgp-0.15.0/tests/openpgp/tofu/cross-sigs/871C2247-1.txt000064400000000000000000000005011046102023000202140ustar 00000000000000ฃ:ล ‹Hฦฝ‡"Gห bWบ๚foo ‰Wบ๚ ‹Hฦฝ‡"G—ULาูอ0R5`ฑŒฎSเ~,Dlแฦvย!8ฉ™vโ@RวXคœb1Lฬc๋เ*3nํยฆ๗฿:nภKr&œ์7ุ+Ooฉ>wฟย1ณฆ rZ๙gYnz:œnห  ๙๗&ลง๐ญทฟ 0_‹„šนฦกOฏrŽ>ณL-รห#| ๘ฉg`ฃ`๚ศVJ“๘ฦ˜‘!๐Jู|๑_1เyฬ5๘r ๔=”4Lิ๋3ฑ#ลyzœฦธิ น|ภท\k๋๊8Fาž‹- GัฅŠtฆห˜ฐ๚ัX€’ž}วc04ฌDy๘ปฐO„ škPD์„iทpgp-0.15.0/tests/openpgp/tofu/cross-sigs/871C2247-2.gpg000064400000000000000000000026641046102023000201670ustar 00000000000000™ Wท๙ฑC`ˆBถ5Vฯmกั(ฏฑํšG`สอ๐ก((แt&W†้Lดาฺ็ฅ W๐•Œ้_ฉ}”๊Q(QYnP_+y.ทp‡™ฟUึdฌถูžhvฐ.ูภ1_ื”ซฃธ’-๏๐ภ44ัzLCฐฯ" …5ู{9๒ขระRฮ๎9iYณถ›Z˜Šอpิู:&WX+‰7!Wท๙  € ‹Hฦฝ‡"Gัฐvขาู=,ฎ“ukyr>แD๒ิ%v ค?irฬ-š๖‹าศภซ๚๐๗œคุjJEฅ2๓\iก ž๛อLvอ ™ว$7สh6|ฐทp ๔ิf๗ฮบ]ฤŽฯ฿–๒w/รZiง๙_ญfฟˆ\ศฃ8||x Bชƒˆฯkๅ;ฺ{Š๛หีะฅuชตW6วกUศ‡ะ›ำqๅีBฑWวœฤVฤ$'ำถfjšทศว-;;3A>F‰า ขํำ•Œž.ืEๆฆ=`TยoNษ{ขจ Tฝช,{าม9(€Oช ๐@Yรยg2~WF๛.TลำžE-‰%U‰Wโ/ ‡(์8'~$ซฤIย ฌ~<Ž_โlฤ†€Kต@แuฌณR s#\.ูฆ˜๗PuA2ศŸ;๗‚ษ‘็^“yษฒ}e฿žจ';‹“%ๅหQB‰H%๕5!œ(›„qX˜ฯธL}ขแ1ะ–ždฒ€‰-7 ๓šพวlฐฆ e1ก๗Bฆ‚ฅถFLo>eืะฦEGNว#สl8฿ซN๖@ฆ"ปyร/๔ภๆษฮ”}ๅฆlฅฮaŸE/พโ‡u†ย(ง>๊๋Šล™ฅ‚ษTทาQH7Žœ”‹คR฿ ใฯ‹3ฎu5ŽvŸe.ˆwฉ๕=63๊ฬa็Q๔ˆ๛๋ฦhDน Wท๙ัิ๓ฆpG6 '…•AฉE"j ฏ>น"IควbหOตศํv/จt๋Œ๎œสย่๓แฌ…T$G๖ล๐iœสZมVnd@9ตซ๋Lไศk๋ฮยR3Eo3(• ‘PO‘ัeF„  w(HุŽไแˆ฿{K9ีไ@v[=˜อ"IP0jŠˆรฃVLd๕ฅฎก1ีJข @)MY็กืH}-ฬ้7aไฃ–ฺ๕มmN'—ืa(@ G‡5WGKฉ™ํp@,ˆ๔๛ีTิศW Pา็kฌ(๐ปR9R.cซฎ\odITZu@f{lp>ณฯ ๏‰ Wท๙ ‹Hฦฝ‡"GY๏ “t•โ‚‚lKภ j๑‰ฅวธ1๙0๎‚ำ.ฟJ-ๅŽ-kOไ)rNT?eIp3;ฃญ9bœ๕้ใ*ฮบOyนŠ^ฤถคrอ˜šฮาลใคŒฆ฿’B›dท็„ฟqŒ+cรlผ˜=hฒ‰ะล#ทL˜\"—‘์ะM‚ˆ9Hzpgp-0.15.0/tests/openpgp/tofu/cross-sigs/871C2247-2.txt000064400000000000000000000005151046102023000202220ustar 00000000000000ฃFน ‹Hฦฝ‡"Gห bWปDfoo ‰(WปD spy@cow.de ‹Hฦฝ‡"G๑Q๓ู่คจ#zี^ซ<–…ysาI_ตi* ฟ‰šP#จ"…Žื…ยPฝ{๑n^ๅ=q ฒUNPs0z@ํญิ?7TX มއVcˆื/cท~)๎Lษ'WGlิoํ2ง!#[ วžgxฉ_‡^ž%ธา‰wco๗๕Z;๙ฅ ๐๔%gฬ/^ ษิa,ฌกฝ…^eš@h\F‚ฌ่ธx![ญ/ๆ(เ๗Ž๛.ลธ_t๙l 2ช{^คิmIกuถฝKษ+๐)ฉHโถ=‡ฒT‰7!Wท๙  € ‹Hฦฝ‡"Gัฐvขาู=,ฎ“ukyr>แD๒ิ%v ค?irฬ-š๖‹าศภซ๚๐๗œคุjJEฅ2๓\iก ž๛อLvอ ™ว$7สh6|ฐทp ๔ิf๗ฮบ]ฤŽฯ฿–๒w/รZiง๙_ญfฟˆ\ศฃ8||x Bชƒˆฯkๅ;ฺ{Š๛หีะฅuชตW6วกUศ‡ะ›ำqๅีBฑWวœฤVฤ$'ำถfjšทศว-;;3A>F‰า ขํำ•Œž.ืEๆฆ=`TยoNษ{ขจ Tฝช,{าม9(€Oช ๐@Yรยg2~WF๛.TลำžE-‰%U‰Wโ/ ‡(์8'~$ซฤIย ฌ~<Ž_โlฤ†€Kต@แuฌณR s#\.ูฆ˜๗PuA2ศŸ;๗‚ษ‘็^“yษฒ}e฿žจ';‹“%ๅหQB‰H%๕5!œ(›„qX˜ฯธL}ขแ1ะ–ždฒ€‰-7 ๓šพวlฐฆ e1ก๗Bฆ‚ฅถFLo>eืะฦEGNว#สl8฿ซN๖@ฆ"ปyร/๔ภๆษฮ”}ๅฆlฅฮaŸE/พโ‡u†ย(ง>๊๋Šล™ฅ‚ษTทาQH7Žœ”‹คR฿ ใฯ‹3ฎu5ŽvŸe.ˆwฉ๕=63๊ฬa็Q๔ˆ๛๋ฦhDดSpy R. Cow ‰7!WโX  € ‹Hฦฝ‡"Gๅ๎ฆ>vฐถ™ื`Œ๕ฎิ}z7ฟ#/ทHศˆ ††Gชศฅฎด๓X“ุo๊h7*w\,BถนํP3[Fฏ‰่$‘… ุU๊ฦะšฅXภojšYนชRฅ˜ˆ ๖ฬ2:‰š#r""\Šh`ุ–๖3ƒม%Jภนภ@9. ่๑$=ฆh+ป็ฯp—จc่เ}มx๛'ั๓&a่[ฎ๓ฺ๑่ชr€๑œPมx›ญeะV์รฏฦ jใZบ#จP]ฮ}c๛OH1D๖2jH๚* W๔hu>ฤฺEN๏:žอ๋-ฟื‚์ฦvU€cผf!‡Žmคฏ”น Wท๙ัิ๓ฆpG6 '…•AฉE"j ฏ>น"IควbหOตศํv/จt๋Œ๎œสย่๓แฌ…T$G๖ล๐iœสZมVnd@9ตซ๋Lไศk๋ฮยR3Eo3(• ‘PO‘ัeF„  w(HุŽไแˆ฿{K9ีไ@v[=˜อ"IP0jŠˆรฃVLd๕ฅฎก1ีJข @)MY็กืH}-ฬ้7aไฃ–ฺ๕มmN'—ืa(@ G‡5WGKฉ™ํp@,ˆ๔๛ีTิศW Pา็kฌ(๐ปR9R.cซฎ\odITZu@f{lp>ณฯ ๏‰ Wท๙ ‹Hฦฝ‡"GY๏ “t•โ‚‚lKภ j๑‰ฅวธ1๙0๎‚ำ.ฟJ-ๅŽ-kOไ)rNT?eIp3;ฃญ9bœ๕้ใ*ฮบOyนŠ^ฤถคrอ˜šฮาลใคŒฆ฿’B›dท็„ฟqŒ+cรlผ˜=hฒ‰ะล#ทL˜\"—‘์ะM‚ˆ9Hzpgp-0.15.0/tests/openpgp/tofu/cross-sigs/871C2247-3.txt000064400000000000000000000005161046102023000202240ustar 00000000000000ฃGธ ‡(์8'~ห bWโ`foo ‰)Wโ` spy@cow.com ‡(์8'~%‚ร92›dMเVฺ&zะ๓ฅฟภ 5ว#แ”xพUO4˜›8hศทภGrถฆom๊๓Dv„~†s'Wมธื’๘}อผ\ฌ2‘ af1œ1ณจˆ}๋"ฒ ‰7!WโX  € ‹Hฦฝ‡"Gๅ๎ฆ>vฐถ™ื`Œ๕ฎิ}z7ฟ#/ทHศˆ ††Gชศฅฎด๓X“ุo๊h7*w\,BถนํP3[Fฏ‰่$‘… ุU๊ฦะšฅXภojšYนชRฅ˜ˆ ๖ฬ2:‰š#r""\Šh`ุ–๖3ƒม%Jภนภ@9. ่๑$=ฆh+ป็ฯp—จc่เ}มx๛'ั๓&a่[ฎ๓ฺ๑่ชr€๑œPมx›ญeะV์รฏฦ jใZบ#จP]ฮ}c๛OH1D๖2jH๚* W๔hu>ฤฺEN๏:žอ๋-ฟื‚์ฦvU€cผf!‡Žmคฏ”‰WใG ‡(์8'~ผŸE™•iTโ้/*๒tึๅ.ผืX 5;ํ"๋' |๖„€€บ„ŠD™Uฺkfำz•›นบึฆๅ5ี‘‡ˆ0U6 ^ํ€ตคg=ชž;$FศนŒ๐ฅฃEB(ๅGZฯๅึ 4–๛sๆ๗>†›™=J`๚๙ฤอ๔Ot37R~`W๒ พ›XภžK?วOบ<๔ผหฃDฮ4!ใก3‘1J๋TF€฿#!DGEaม %ฮฆะึธAณžมต˜*Nh{๕…ZฯบๆฝIˆœ”K =”’p,รAQ~zŽฤ#ศPœoจsG Uฒ“ดSpy R. Cow ‰7!Wท๙  € ‹Hฦฝ‡"Gัฐvขาู=,ฎ“ukyr>แD๒ิ%v ค?irฬ-š๖‹าศภซ๚๐๗œคุjJEฅ2๓\iก ž๛อLvอ ™ว$7สh6|ฐทp ๔ิf๗ฮบ]ฤŽฯ฿–๒w/รZiง๙_ญfฟˆ\ศฃ8||x Bชƒˆฯkๅ;ฺ{Š๛หีะฅuชตW6วกUศ‡ะ›ำqๅีBฑWวœฤVฤ$'ำถfjšทศว-;;3A>F‰า ขํำ•Œž.ืEๆฆ=`TยoNษ{ขจ Tฝช,{าม9(€Oช ๐@Yรยg2~WF๛.TลำžE-‰%U‰Wโ/ ‡(์8'~$ซฤIย ฌ~<Ž_โlฤ†€Kต@แuฌณR s#\.ูฆ˜๗PuA2ศŸ;๗‚ษ‘็^“yษฒ}e฿žจ';‹“%ๅหQB‰H%๕5!œ(›„qX˜ฯธL}ขแ1ะ–ždฒ€‰-7 ๓šพวlฐฆ e1ก๗Bฆ‚ฅถFLo>eืะฦEGNว#สl8฿ซN๖@ฆ"ปyร/๔ภๆษฮ”}ๅฆlฅฮaŸE/พโ‡u†ย(ง>๊๋Šล™ฅ‚ษTทาQH7Žœ”‹คR฿ ใฯ‹3ฎu5ŽvŸe.ˆwฉ๕=63๊ฬa็Q๔ˆ๛๋ฦhDน Wท๙ัิ๓ฆpG6 '…•AฉE"j ฏ>น"IควbหOตศํv/จt๋Œ๎œสย่๓แฌ…T$G๖ล๐iœสZมVnd@9ตซ๋Lไศk๋ฮยR3Eo3(• ‘PO‘ัeF„  w(HุŽไแˆ฿{K9ีไ@v[=˜อ"IP0jŠˆรฃVLd๕ฅฎก1ีJข @)MY็กืH}-ฬ้7aไฃ–ฺ๕มmN'—ืa(@ G‡5WGKฉ™ํp@,ˆ๔๛ีTิศW Pา็kฌ(๐ปR9R.cซฎ\odITZu@f{lp>ณฯ ๏‰ Wท๙ ‹Hฦฝ‡"GY๏ “t•โ‚‚lKภ j๑‰ฅวธ1๙0๎‚ำ.ฟJ-ๅŽ-kOไ)rNT?eIp3;ฃญ9bœ๕้ใ*ฮบOyนŠ^ฤถคrอ˜šฮาลใคŒฆ฿’B›dท็„ฟqŒ+cรlผ˜=hฒ‰ะล#ทL˜\"—‘์ะM‚ˆ9Hzpgp-0.15.0/tests/openpgp/tofu/cross-sigs/871C2247-secret.gpg000064400000000000000000000046531046102023000213130ustar 00000000000000•˜Wท๙ฑC`ˆBถ5Vฯmกั(ฏฑํšG`สอ๐ก((แt&W†้Lดาฺ็ฅ W๐•Œ้_ฉ}”๊Q(QYnP_+y.ทp‡™ฟUึdฌถูžhvฐ.ูภ1_ื”ซฃธ’-๏๐ภ44ัzLCฐฯ" …5ู{9๒ขระRฮ๎9iYณถ›Z˜Šอpิู:&WX+ภWSคผ>\{‡:ws๙+1 ‰ฬฏU]Cขz[ ไพˆ๋๏ซฃ}L9™ImŒœฤ{๒qึิn์ฟd™=Vฎ๐คฃDปLc`…ร€Pภ<–พ Œ™ญGฮ้-h๊n‚แ}C ˆภ๚เ๑TฯัKีตu1 ฟ|”mงr๕๘๖๐–1๑ๅ:DN ณฟ%๓ํœJบ+no บ๔กถœ=7 –z7ฒF8ˆMi…ธueี`์&^๗๘๓ทพวช็™า-มฒ’Yaš†uิ9X3ศ1ๅษ๏Ÿ„,โฝจœ๚ว๚Fฃ†6๗ผึ จkแš๋Kู‰%ๆคŽdlL๑„ืšฟ้งู:"๘^G+ฮ‰€ฟส <ูฒาดผสB˜3วำt”ไงฟ๐3~ฤํอ^Yษถ%w<ฺโJ‚๚+›ƒฎณ†Xผฐ… *,’ค(}๙M{ฦV ฉลโรRƒN-BฃP{zcŸ)W^hžˆจ ผ ŒE๋๛๘ฺอgB(—a<าดSpy R. Cow ‰7!Wท๙  € ‹Hฦฝ‡"Gัฐvขาู=,ฎ“ukyr>แD๒ิ%v ค?irฬ-š๖‹าศภซ๚๐๗œคุjJEฅ2๓\iก ž๛อLvอ ™ว$7สh6|ฐทp ๔ิf๗ฮบ]ฤŽฯ฿–๒w/รZiง๙_ญfฟˆ\ศฃ8||x Bชƒˆฯkๅ;ฺ{Š๛หีะฅuชตW6วกUศ‡ะ›ำqๅีBฑWวœฤVฤ$'ำถfjšทศว-;;3A>F‰า ขํำ•Œž.ืEๆฆ=`TยoNษ{ขจ Tฝช,{าม9(€Oช ๐@Yรยg2~WF๛.TลำžE-‰%U˜Wท๙ัิ๓ฆpG6 '…•AฉE"j ฏ>น"IควbหOตศํv/จt๋Œ๎œสย่๓แฌ…T$G๖ล๐iœสZมVnd@9ตซ๋Lไศk๋ฮยR3Eo3(• ‘PO‘ัeF„  w(HุŽไแˆ฿{K9ีไ@v[=˜อ"IP0jŠˆรฃVLd๕ฅฎก1ีJข @)MY็กืH}-ฬ้7aไฃ–ฺ๕มmN'—ืa(@ G‡5WGKฉ™ํp@,ˆ๔๛ีTิศW Pา็kฌ(๐ปR9R.cซฎ\odITZu@f{lp>ณฯ ๏ ัdsแNฯนฐc๏๛Šœตใd๖7ส7T S†ตsซ$vณนPผ„v™= ๚ฑคn-ฃฎ2าพOžลŸ‰€ฐ Eฏ&Cง-jgฦcฑ7ƒ้ฐฃeœฟ'๎ัU๓ฝxจ{ยึ"ƒNFรU^()#ส๋luqz‚๒สุ FŠžZ๏ฏqfำิ!&@-!”่…ใršWญZ\ฒฐ?ภกผอb|ฮ๑„ –ฅUะ€Zx1”ntn„ฃlDณ๓` 4Yw๘›iพิS้ฝBฐ(ฤ‘#ค๎๛๔]<€รฯi2[h7ฆึz 6P๖ไm„E4 3๘ าW๑ฮ‹สธศ้=๏ุ้‘9ญ ŒูZvฒญ•์+1T6ืา๙Ž€ U๘6)D,/ xhฒ๐w๑'๗œ†๗ฃa๚ŸK๑_-Y๏ฆ†xJื้l`‹haุY๏ž1ฌฑL๔\เ”;ฑ๖<หu๐eh|ูBฌK6…ฏ€ถ&s๐ใgD๗Œ- วŠ UะPuป{’0zฎ๖sk*ฃภG6$ุตXธŸหนUฺjpซrณํІFื? “ัชlูืข บฺๅ_›vฏgjEŸp2สp„ึฅถ๗ู<ส๋Piง๛{๛ื๏ษฐปZ๗ใป ญi!๖:!o^Iiˆุญœ๒K๋รฆปำ7ุแ‚#้ธ๒œ=]…จG๑‰ Wท๙ ‹Hฦฝ‡"GY๏ “t•โ‚‚lKภ j๑‰ฅวธ1๙0๎‚ำ.ฟJ-ๅŽ-kOไ)rNT?eIp3;ฃญ9bœ๕้ใ*ฮบOyนŠ^ฤถคrอ˜šฮาลใคŒฆ฿’B›dท็„ฟqŒ+cรlผ˜=hฒ‰ะล#ทL˜\"—‘์ะM‚ˆ9Hzpgp-0.15.0/tests/openpgp/tofu/cross-sigs/EC38277E-1.gpg000064400000000000000000000022231046102023000202230ustar 00000000000000™ WณYๅU‹m’5„E[xAๆ๗L#Pญ ข…C๎(๐๚ิ™[ฬิืด…‚ึฦฌ›Y/G์d 6=6บป‡้ช}รn`”ฐ‰็Mฑ่*ขf`ฺื…ใ์,เƒฟ[-Cห[{ฺ็๚ฦkฯUา_›ญภๅ>ะw…>ๆ˜H/†฿1Bn๘๔ก๒่ฃ[ง>รหดฑจ/M˜;ใี„ู๚ป๎ั๐์ผ„zn†-฿1/รๅะ˜}๖.‡a|1X$ณน}๑ห๐ พข8 `wเ๗}?7ฌฃ/ธc]๎qฺ ถ$ฮำาTJ#๏ˆW˜}™‚‡c0V๋ภ‚ฦ–…)P๒Z4โๆด?ดSpy Cow ‰7!WณY  € ‡(์8'~b:+ษล&bบ"ฒNใ๒}ํ๐šษL๗ท๋7ู๘’[%'†ณธ’H8ผ(ฦ… ๆ A˜gฦษนž๐ภษpรn๚ฑ€4ู๊‹@f+ Eิb"a•$๒{ีIรUซึ ล๙อๆŽศiพ'ุ˜ฟ>mZ a6‰ท#Š7š™~J3S'6 ลฬ๓่ไฃvmk"5ืฑ!ฯวฬ๎ฆ“\ู(iฝNmcƒmjH ~\ ดeค“yŒVำ9]*๏˜ฯz@rกqฑRฤึuณ=Bฃ วณรฤชNผ๗ทm4‡)&q=๗ณ^[ุึฤฤุVฃ22›‹งฺ๔V%๕น WณY๊cž?ฯLH †ัย")jƒT ึ-บNอโ2!š3Lก Yโ†ฏ}=บอmิC›W"าี+Vูc`฿kัาฮวล1›๖Q้vส™Pคฐ~ฎ๒หต๔ซฆศ_&†x\ฬํฒะภฅ€.จ™W๐^€ฑQ๔หฯ ต๔๐Lฤด}_ลล๔ช?‡hถQ{ฅั [๓eR‘Š๕๛๖>ฑ๊ื0สZbn๎ณgU^egO ๊o2:ณสฒล]ษ˜H|ศj6qผœ๊#GbD= --C~Wณผ๚)ฬฑูc=พs‹p๖>สCwูTeiด/๔ะyฯXIม‰ WณY ‡(์8'~nr ‚ˆตy$ฃkp(YไŽŸฃฬyเ3LloZS8•Wฌ๐wJ‹r'่ม๏์IญFฃฑŠ2สแaฉa<šเัว๚lบ<ˆœ,งlฦี.ฒสD฿Dฦ|[ก$ชBั 'ฟ<,ˆk๕”tb8>sฯ'|Wุ?ป+>ๅJไB†” v๒ึ4ิ๑ฤฦ„dฐK<๋}ฬๆ่Bi—๑฿3เำއhษ‹€ e’ฺicœ,.€ปx.ปสul=ฤถ“5เณ[ปะQ๗ใ€1ร9-ะ5ง}นfฮ‹ี[kๅ๒„๎ฐผฮ๎&นน9)=งpgp-0.15.0/tests/openpgp/tofu/cross-sigs/EC38277E-1.txt000064400000000000000000000005011046102023000202620ustar 00000000000000ฃ:ล ‡(์8'~ห bWบ๚foo ‰Wบ๚ ‡(์8'~—ฒซบยรฒˆีHP‚63ภqŽูj”ฮ'H~[ร๗๚Ÿืƒ4Uส~๛;~`eถ๕จฮ๒๓Xv|*W•ก์ำ๕sฎ@฿ำw%ๆ…#หลฦšGท–0˜าำธฉ’๘L๑‰ฅโaศT—.ษr๑” =฿+๔#e…๊ˆ{ฯŒๆe šZCe]_}฿จžฺ่ZQ3คŒLiวŒ0Iโ6VŸ๙ํPz>ˆ›ชZ‰Diyv4-ภงลณd^ว1–KฆOŠYUDฯ™K˜`ช-EX$d‡็ถW์$œi;wำ—H๒%JXh@Jc3›L๗ อ…Š1พย…ƒฑpgp-0.15.0/tests/openpgp/tofu/cross-sigs/EC38277E-2.gpg000064400000000000000000000026621046102023000202330ustar 00000000000000™ WณYๅU‹m’5„E[xAๆ๗L#Pญ ข…C๎(๐๚ิ™[ฬิืด…‚ึฦฌ›Y/G์d 6=6บป‡้ช}รn`”ฐ‰็Mฑ่*ขf`ฺื…ใ์,เƒฟ[-Cห[{ฺ็๚ฦkฯUา_›ญภๅ>ะw…>ๆ˜H/†฿1Bn๘๔ก๒่ฃ[ง>รหดฑจ/M˜;ใี„ู๚ป๎ั๐์ผ„zn†-฿1/รๅะ˜}๖.‡a|1X$ณน}๑ห๐ พข8 `wเ๗}?7ฌฃ/ธc]๎qฺ ถ$ฮำาTJ#๏ˆW˜}™‚‡c0V๋ภ‚ฦ–…)P๒Z4โๆด?ดSpy Cow ‰7!WณY  € ‡(์8'~b:+ษล&bบ"ฒNใ๒}ํ๐šษL๗ท๋7ู๘’[%'†ณธ’H8ผ(ฦ… ๆ A˜gฦษนž๐ภษpรn๚ฑ€4ู๊‹@f+ Eิb"a•$๒{ีIรUซึ ล๙อๆŽศiพ'ุ˜ฟ>mZ a6‰ท#Š7š™~J3S'6 ลฬ๓่ไฃvmk"5ืฑ!ฯวฬ๎ฆ“\ู(iฝNmcƒmjH ~\ ดeค“yŒVำ9]*๏˜ฯz@rกqฑRฤึuณ=Bฃ วณรฤชNผ๗ทm4‡)&q=๗ณ^[ุึฤฤุVฃ22›‹งฺ๔V%๕‰Wโ/ ‹Hฦฝ‡"Gโxl–[๕ชuเ^ึ‘)ร9`†‰ผŒF?อk%๓ฌ็~)บ็ตข›a@% ‡๊4ั้64บŒูdถธ๋ภะbุ๓™GเT;kœส๖$4ผvi’ˆภ์๓Vฯ‚~๎"Sว18n่~แ็ช0tWๆ…D[๛)—วŽฤvยywpฉXฑq‚ำ8ปJ3๘E™ภล๐ีฮำ๚ใPT –ล๑ƒIฤ2jAใโ$๙๊‘^„š&A@ูอฟ, ัh]ึฆ{ๆด฿ๅSฎtคx๊0ษญeA ฅR”T ื˜J z'p7#˜า;ุ4พฐ/๊ๅแน WณY๊cž?ฯLH †ัย")jƒT ึ-บNอโ2!š3Lก Yโ†ฏ}=บอmิC›W"าี+Vูc`฿kัาฮวล1›๖Q้vส™Pคฐ~ฎ๒หต๔ซฆศ_&†x\ฬํฒะภฅ€.จ™W๐^€ฑQ๔หฯ ต๔๐Lฤด}_ลล๔ช?‡hถQ{ฅั [๓eR‘Š๕๛๖>ฑ๊ื0สZbn๎ณgU^egO ๊o2:ณสฒล]ษ˜H|ศj6qผœ๊#GbD= --C~Wณผ๚)ฬฑูc=พs‹p๖>สCwูTeiด/๔ะyฯXIม‰ WณY ‡(์8'~nr ‚ˆตy$ฃkp(YไŽŸฃฬyเ3LloZS8•Wฌ๐wJ‹r'่ม๏์IญFฃฑŠ2สแaฉa<šเัว๚lบ<ˆœ,งlฦี.ฒสD฿Dฦ|[ก$ชBั 'ฟ<,ˆk๕”tb8>sฯ'|Wุ?ป+>ๅJไB†” v๒ึ4ิ๑ฤฦ„dฐK<๋}ฬๆ่Bi—๑฿3เำއhษ‹€ e’ฺicœ,.€ปx.ปสul=ฤถ“5เณ[ปะQ๗ใ€1ร9-ะ5ง}นfฮ‹ี[kๅ๒„๎ฐผฮ๎&นน9)=งpgp-0.15.0/tests/openpgp/tofu/cross-sigs/EC38277E-2.txt000064400000000000000000000005161046102023000202710ustar 00000000000000ฃGธ ‡(์8'~ห bWปDfoo ‰)WปD spy@cow.com ‡(์8'~‹uGiก™vฉช˜WPๆŸัฦหฤ฿ไ135ใg1nกํ›;4 C^bdนfบะษะ9x\โGภ+€2ผฦGu๑†€fล๑>†˜มIบ›ำร-0œ*y'”ป๘Frฏ•’ํœํ’’๘ูษj ฐ'Jล4%pg-ดษ8ฉh QฯFฏฎซ๕ uๅ ๛0z ‚ถœvล&vA้!ˆ>KฑšO๊‡9(’๓F`Vๅฒb่‡ร[ฦEทลUฤิ่pš<ิะ2ดต2ช"พWๆ Bน *ยๅ๒o.n3kpฒฎ‚บ\ฐนGh้ T€ไมpgp-0.15.0/tests/openpgp/tofu/cross-sigs/EC38277E-3.txt000064400000000000000000000005161046102023000202720ustar 00000000000000ฃGธ ‡(์8'~ห bWโ`foo ‰)Wโ` spy@cow.com ‡(์8'~%‚ร92›dMเVฺ&zะ๓ฅฟภ 5ว#แ”xพUO4˜›8hศทภGrถฆom๊๓Dv„~†s'Wมธื’๘}อผ\ฌ2‘ af1œ1ณจˆ}๋"ฒ ะw…>ๆ˜H/†฿1Bn๘๔ก๒่ฃ[ง>รหดฑจ/M˜;ใี„ู๚ป๎ั๐์ผ„zn†-฿1/รๅะ˜}๖.‡a|1X$ณน}๑ห๐ พข8 `wเ๗}?7ฌฃ/ธc]๎qฺ ถ$ฮำาTJ#๏ˆW˜}™‚‡c0V๋ภ‚ฦ–…)P๒Z4โๆด? ™ๅ;—๎)๑Y(—อ Ÿmไv?%/;~Sไ‚šL&พังก“ š$ •ธฒุi| iอ้ึ,T>hj @)นถ]‘"u}จs0XU)ห-ณวžฃฮ๕2†๗@8๘3T๏ย%hcิี {^k๕qๅจXฦ9{สถm๔ฯบูา0?ภ˜‡ไฌฒ”œ3 ƒfภ๘^รัษah5ส=อ๐…ว‘•mฉฤฃ4‡Uญว|๋c๕ฒฎZ$๐olx.๊h?แ๒ธ8)‹จ๎~>ขk๓D†&:† Tynฐส/nboภม$nsfฏ{™vS๐< Jบม๊\๕_ž็รRe๔}Y อ;”ฃ ลŠชtJ๎๏ฬฯ.~Uคqแ–ฅ‰๐๐ะG%2ฟล<๕ซ.ดะฐŒo์™ง8˜“\าซงWื+ใŸ๋ีuEYฺูDPR`๕‘C$/œw‹2๒p,ํt#่ืlู‚Ÿต๔ba™}๔‹Lข๔ |๗๔Ÿกah`bZvข:ฐๅ~ๅุvไ”<๊^N@ส9cS #bฬR๙ถ4ีJุ1WqW5คJh๋rbฌiq้P.ีฦ˜า;ANคฤขPp['มถ๛^ฅ"ี\ผีp;rb์๎6P,Tq$'ฌbค› tฃํ[ๅž&5ท๒นฬ’ศะŒ๐ถFฌQัำ%ยฝ\O—WžgรธŠ’@O#m ฮถmhp–†ู @7๗Œฯ^g$.ฯA:ซ?ษผะ๊Z๛)๐๖/4๖,ฐz•h๘โ๗์Qญา๓j˜9ซ๛์(6ปhฑบ๒˜EทดSpy Cow ‰7!WณY  € ‡(์8'~b:+ษล&bบ"ฒNใ๒}ํ๐šษL๗ท๋7ู๘’[%'†ณธ’H8ผ(ฦ… ๆ A˜gฦษนž๐ภษpรn๚ฑ€4ู๊‹@f+ Eิb"a•$๒{ีIรUซึ ล๙อๆŽศiพ'ุ˜ฟ>mZ a6‰ท#Š7š™~J3S'6 ลฬ๓่ไฃvmk"5ืฑ!ฯวฬ๎ฆ“\ู(iฝNmcƒmjH ~\ ดeค“yŒVำ9]*๏˜ฯz@rกqฑRฤึuณ=Bฃ วณรฤชNผ๗ทm4‡)&q=๗ณ^[ุึฤฤุVฃ22›‹งฺ๔V%๕˜WณY๊cž?ฯLH †ัย")jƒT ึ-บNอโ2!š3Lก Yโ†ฏ}=บอmิC›W"าี+Vูc`฿kัาฮวล1›๖Q้vส™Pคฐ~ฎ๒หต๔ซฆศ_&†x\ฬํฒะภฅ€.จ™W๐^€ฑQ๔หฯ ต๔๐Lฤด}_ลล๔ช?‡hถQ{ฅั [๓eR‘Š๕๛๖>ฑ๊ื0สZbn๎ณgU^egO ๊o2:ณสฒล]ษ˜H|ศj6qผœ๊#GbD= --C~Wณผ๚)ฬฑูc=พs‹p๖>สCwูTeiด/๔ะyฯXIม๔ํก8`ztDrr*†,—ผๆดIeดW,“Sn€วึN๓ฯ็่f๏kBฅ—Kฎ ฬŠฤํฏึ๗ +ก *ฉPeนFcหPF5wQ๕ #]ขmข๒้qห ห•SŠ5S๗Vณ$ือํ๏ฐ˜ๆฐฒe๙,.SpŽ9๎6R]๐ืั’๖Kำ๚๕ฮ;๙MฺUWคึ%•…ฺpึเmŠูUW*Y?ม}ทผพณฒ=P<'ฮn Fฃอ+Jม7'?Kญ๑s#œขˆVNmoŸ<Jˆป-แGA;Xธ)ำฯ-ํ–šญ$˜™ใ–dฃ{;y%šเ›ฦŠ\๕๐uผธ|eL!ดXqœ…/รๆฝฅD0ทธบM๋เ;+8้ฏ>=Šํa5๕Z| DHJKฎฅrZืJr/ตr๐›0ฬY6)บฺ[Yุj‡OฝyEtdส]ผC70{฿]ญ^ซi„ึW‡Ÿw๐C:| ูฉE–ใSeยE๙ˆ้ฒ5อ)ฺJ—ฺปกมิ  $นภไ_ฐ า?WŒธฅดึุ’์ ๓–0Aำˆw๋(กฑ™ฌ‘ท๛†-W๛&๑ฃœ”IH8rE;อRIืHๆภAp4oุไp%ืืป๔ะ…นDขb+ฦMฏk๔YU๘‡c%ิLวAูŸM‹a`Žก([ >๋ช˜ภฺ2Hj(๚฿@ษ(C9้ jK•!ฟqนjใW—ฒฦ%ฑฉ*&&่๖๗ฟ‰ WณY ‡(์8'~nr ‚ˆตy$ฃkp(YไŽŸฃฬyเ3LloZS8•Wฌ๐wJ‹r'่ม๏์IญFฃฑŠ2สแaฉa<šเัว๚lบ<ˆœ,งlฦี.ฒสD฿Dฦ|[ก$ชBั 'ฟ<,ˆk๕”tb8>sฯ'|Wุ?ป+>ๅJไB†” v๒ึ4ิ๑ฤฦ„dฐK<๋}ฬๆ่Bi—๑฿3เำއhษ‹€ e’ฺicœ,.€ปx.ปสul=ฤถ“5เณ[ปะQ๗ใ€1ร9-ะ5ง}นfฮ‹ี[kๅ๒„๎ฐผฮ๎&นน9)=งpgp-0.15.0/tests/openpgp/tofu/cross-sigs/README000064400000000000000000000044241046102023000172440ustar 00000000000000# How I generate the keys and messages to verify: # Generate and export two non-conflicting keys. gpg --quick-gen-key 'Spy Cow ' gpg --quick-gen-key 'Spy R. Cow ' KEYIDA=1938C3A0E4674B6C217AC0B987DB2814EC38277E KEYIDB=DC463A16E42F03240D76E8BA8B48C6BD871C2247 for KEYID in $KEYIDA $KEYIDB do gpg --export $KEYID > tofu-$KEYID.gpg gpg --export-secret-keys $KEYID > tofu-$KEYID-secret.gpg done # Sign some data. echo foo | gpg --default-key $KEYIDA -s > tofu-$KEYIDA-1.txt echo foo | gpg --default-key $KEYIDB -s > tofu-$KEYIDB-1.txt # Again, but with an issuer. echo foo | gpg --default-key "" -s > tofu-$KEYIDA-2.txt echo foo | gpg --default-key "" -s > tofu-$KEYIDB-2.txt # Have A sign B and vice versa. gpg --default-key $KEYIDA --quick-sign $KEYIDB gpg --default-key $KEYIDB --quick-sign $KEYIDA gpg --export $KEYIDA > tofu-$KEYIDA-2.gpg gpg --export $KEYIDB > tofu-$KEYIDB-2.gpg # Cause A and B to conflict. gpg --quick-adduid $KEYIDB 'Spy R. Cow ' gpg --export $KEYIDB > tofu-$KEYIDB-3.gpg echo foo | gpg --default-key "" -s > tofu-$KEYIDA-3.txt echo foo | gpg --default-key "" -s > tofu-$KEYIDB-3.txt # Have A sign B's conflicting user id. gpg --default-key $KEYIDA --quick-sign $KEYIDB gpg --export $KEYIDB > tofu-$KEYIDB-4.gpg exit 0 # In a new directory (so the keys are not ultimately trusted). D=~/neal/work/gpg/test echo 'trust-model tofu+pgp' > gpg.conf gpg --import $D/tofu-$KEYIDA.gpg gpg --import $D/tofu-$KEYIDB.gpg gpg -k gpg --verify $D/tofu-$KEYIDA-1.txt gpg --verify $D/tofu-$KEYIDB-1.txt # With an issuer. gpg --verify $D/tofu-$KEYIDA-2.txt gpg --verify $D/tofu-$KEYIDB-2.txt # Import the cross signatures. gpg --import $D/tofu-$KEYIDA-2.gpg gpg --import $D/tofu-$KEYIDB-2.gpg gpg -k gpg --verify $D/tofu-$KEYIDA-1.txt gpg --verify $D/tofu-$KEYIDB-1.txt # With an issuer. gpg --verify $D/tofu-$KEYIDA-2.txt gpg --verify $D/tofu-$KEYIDB-2.txt gpg --status-fd=1 --batch --verify $D/tofu-$KEYIDA-3.txt | grep TRUST_UNDEFINED gpg --status-fd=1 --batch --verify $D/tofu-$KEYIDB-3.txt | grep TRUST_UNDEFINED # Import the conflicting user id. gpg --import $D/tofu-$KEYIDB-3.gpg gpg -k # Import the cross signature, which should remove the conflict. gpg --import $D/tofu-$KEYIDB-4.gpg gpg -k pgp-0.15.0/tests/openpgp/trust-pgp/alice.sec.asc000064400000000000000000000007401046102023000175730ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv 9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOAAEAgOZk+WDjrmum 0OygJdb6qJp27qsyXvMVZ8AGlsdYtUgS37QZQWxpY2UgPGFsaWNlQGV4YW1wbGUu b3JnPoiQBBMTCAA4FiEE/Zsg3TyYEj7ur4zFG6QVONLmVrUFAlltvlsCGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQG6QVONLmVrU7PAEAvOqeIRMiJ8Ne0tz+ K1aRz/np/umCQxO8ddm9mnr4M7EA/1z4YdD06wJXp4RXUI0G2QOHTY+QXMShCFrp ySArWQqN =3+Iz -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/bobby.sec.asc000064400000000000000000000007401046102023000176130ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/AAEA6EzyQYtLOL9v 4SErBRic7MmQfxFbEJIQSu2vtbWos/0QFLQZQm9iYnkgPGJvYmJ5QGV4YW1wbGUu Y29tPoiQBBMTCAA4FiEETT9Z9NgDD9LYRK/rpbrD7RJcyuUFAllt1ooCGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQpbrD7RJcyuWUjgEA9UreuOxgDzhSCGAQ 5GtxBiXkmp/IuH/rvNI8qZaVnoIBAPs/VUgy3eySjF6g9wf/UzvqwUdtoaYvkyC2 a25O7Lxc =76RO -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/carol.sec.asc000064400000000000000000000007401046102023000176160ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEIAAEA2QzHlkxFJkTg QvZuimqU0AySYsleRUaO9B9UARiUbOYOwrQZQ2Fyb2wgPGNhcm9sQGV4YW1wbGUu bmV0PoiQBBMTCAA4FiEEbGJzXkVMzdefpspgEHkROuwSgv0FAllt1q8CGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQEHkROuwSgv3MygD+KdusoDvz7WZbsjjB WI/HLhWfWfXsoAR9mN/5rZ94HDgA/1VqbvUcM+vPU62g7/0qoGqWCda3SURB6263 Kirbk6hY =wkQ4 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/common.scm000064400000000000000000000045131046102023000172530ustar 00000000000000#!/usr/bin/env gpgscm ;; Copyright (C) 2017 Damien Goutte-Gattat ;; ;; This file is part of GnuPG. ;; ;; ;; GnuPG is free software; you can redistribute it and/or modify ;; it under the terms of the GNU General Public License as published by ;; the Free Software Foundation; either version 3 of the License, or ;; (at your option) any later version. ;; ;; GnuPG is distributed in the hope that it will be useful, ;; but WITHOUT ANY WARRANTY; without even the implied warranty of ;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;; GNU General Public License for more details. ;; ;; You should have received a copy of the GNU General Public License ;; along with this program; if not, see . (load (in-srcdir "tests" "openpgp" "defs.scm")) ;; Redefine GPG without --always-trust. (define GPG `(,(tool 'gpg))) ;; Helper constants for setownertrust. (define MARGINALTRUST "4") (define FULLTRUST "5") (define ULTIMATETRUST "6") ;; Assign OWNERTRUST to the key identified by the provided ;; fingerprint KEYFPR. (define (setownertrust keyfpr ownertrust) (pipe:do (pipe:echo (string-append keyfpr ":" ownertrust ":\n")) (pipe:gpg `(--import-ownertrust)))) ;; Force a trustdb update. (define (updatetrustdb) (call-check `(,@GPG --check-trustdb --yes))) ;; IDs of all the keys involved in those tests. (define ALICE "FD9B20DD3C98123EEEAF8CC51BA41538D2E656B5") (define BOBBY "4D3F59F4D8030FD2D844AFEBA5BAC3ED125CCAE5") (define CAROL "6C62735E454CCDD79FA6CA601079113AEC1282FD") (define DAVID "A0607635198CABA2C467FAA64CE5BB42E3984000") (define FRANK "CE1A0E07CF8A20CBF8DC47D6DB9017DBAE6CD0EF") (define GRACE "B935F4B8DA009AFBCCDD41386653A183007F8345") (define HEIDI "0389C0B7990E10520B334F23756F1571EDA9184B") ;; Initialize a given scenario. ;; NAME should be the basename of the scenario file ;; in this directory. (define (initscenario name) (setup-environment) ;; Make sure we are using the PGP trust model. This may no ;; be the default model in the future. (let ((trust-model (gpg-config 'gpg "trust-model"))) (trust-model::update "pgp")) ;; Load the scenario's public keys. (call-check `(,@GPG --import ,(in-srcdir "tests" "openpgp" "trust-pgp" (string-append name ".asc")))) ;; Use Alice's key as root for all trust evaluations. (setownertrust ALICE ULTIMATETRUST) (updatetrustdb)) pgp-0.15.0/tests/openpgp/trust-pgp/david.sec.asc000064400000000000000000000007401046102023000176050ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z 5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvAAD9HITG0iG5SzeW cGMfhzGuXEn2P+9arb0OttTUcj+eGBIP8bQZRGF2aWQgPGRhdmlkQGV4YW1wbGUu b3JnPoiQBBMTCAA4FiEEoGB2NRmMq6LEZ/qmTOW7QuOYQAAFAllt1s0CGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQTOW7QuOYQAAJtAD+JxiDZttAb51FjB5o J1BksmzIrgL6ouorbLLRjVyk7rkA/0JqyLhh1K3vn4rYDbuKtvQAcfQbCndzwF9X uGQ/7gbS =EC4L -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/frank.sec.asc000064400000000000000000000007401046102023000176170ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXzAAD+Oybk8/6x5nc8 ZNHkRIbfHW8oKh7jxbpob9X7QIfBpf8TcbQZRnJhbmsgPGZyYW5rQGV4YW1wbGUu Y29tPoiQBBMTCAA4FiEEzhoOB8+KIMv43EfW25AX265s0O8FAllt1t0CGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQ25AX265s0O+nDQD/RplCmAPQgMejhs2/ YmOqWrekyd4IWNj9zyI2n228WXYBAJ1/Wf1vBviOEqzs7t+C0iBExxJXViPlG0nN Z9aoiX1G =vnHF -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/grace.sec.asc000064400000000000000000000007401046102023000175770ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjAAEAzBLT+dB5ga7S Lh7PepOB9yObDHrHAvXGXg9AUvEm3ZkQ6bQZR3JhY2UgPGdyYWNlQGV4YW1wbGUu bmV0PoiQBBMTCAA4FiEEuTX0uNoAmvvM3UE4ZlOhgwB/g0UFAllt1vECGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQZlOhgwB/g0W2AAD+KmW2DQALWTnsVnL/ QKdJ1J8DsaR1l+y2h7FUYuFttQsBALZYs2vUwOVBnAYyqbHogqgbPSxKRXeAxNqo epx6csv+ =05c1 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/heidi.sec.asc000064400000000000000000000007401046102023000176000ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lHcEWW3XBxMIKoZIzj0DAQcCAwSINFpTZUYnxDDj3k16ljZIt58rh3cuUNIvUcqR zR9kdlmudQTaf1zUsW6F3r+t91t88kaA2Fcci3wkU0CAob0WAAD/eTlMM3JTEF6K yh8gxk1+mXRVUAmcGwr+1PzC3nzJAkgPALQZSGVpZGkgPGhlaWRpQGV4YW1wbGUu b3JnPoiQBBMTCAA4FiEEA4nAt5kOEFILM08jdW8Vce2pGEsFAllt1wcCGwMFCwkI BwIGFQgJCgsCBBYCAwECHgECF4AACgkQdW8Vce2pGEtwXAD/SVyIRiGnYPkqBVqG fI2MlTgN8+uirur2JdkcPoylCEMA/j3OeLRRT1docnEnvST1srmlXxZTbNUclnAl a2OZd7ME =1goe -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/scenario1.asc000064400000000000000000000071711046102023000176360ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv 9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ A4dNj5BcxKEIWunJICtZCo0= =rf4w -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T O+rBR22hpi+TILZrbk7svFyIdQQQEwgAHRYhBP2bIN08mBI+7q+MxRukFTjS5la1 BQJZbhAyAAoJEBukFTjS5la10+gA/2wr/lG67+xA1n3+2tQkIf1254lnwr8NXhwg w4UAAbajAP9hOXzltmmHV4BaBm35GEv/A2iAABV6lzgvApmM9c445A== =i2Va -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p 26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg apYJ1rdJREHrbrcqKtuTqFiIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl BQJZbhBhAAoJEKW6w+0SXMrlPYgA/21rYq9iItnLASDCdt4ZX6gPKEZVBFDk6850 Gyvg3TrEAP9/9bjKEFCSbo6vFKONOEpKqA/9B85Ff+2jq1lvfafV4Q== =mwVS -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z 5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 9ABx9BsKd3PAX1e4ZD/uBtKIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl BQJZbhB0AAoJEKW6w+0SXMrlARwA/RiqKRh4rYtW5gP20PoQNYfS1qh+lDRTlhfp SSF5aKKFAP90s5/fp6n382IjbOhmQiEB9N4gv4pZT3YP13NQwAABbg== =bLxR -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS IETHEldWI+UbSc1n1qiJfUaIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl BQJZbhCEAAoJEKW6w+0SXMrlepAA/3+AAaRQVfsU+zQtGg43VxAcfW+ezuUVCYUY IW2Lv+GkAP0WF7Nh5N4nDo/gC3WBW2zdWArlRaWa5NxcCquEUaE7Tg== =SWmz -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjtBlHcmFjZSA8Z3Jh Y2VAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQS5NfS42gCa+8zdQThmU6GDAH+DRQUC WW3W8QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBmU6GDAH+DRbYAAP4q ZbYNAAtZOexWcv9Ap0nUnwOxpHWX7LaHsVRi4W21CwEAtliza9TA5UGcBjKpseiC qBs9LEpFd4DE2qh6nHpyy/6IdQQQEwgAHRYhBGxic15FTM3Xn6bKYBB5ETrsEoL9 BQJZbhCyAAoJEBB5ETrsEoL9pVoBAPGc50vXiWmSAx8U573pqAyBsVPPMUlfrrgc tVZZQ9DyAP9LCpG1kJOnB1Fia1M6M/37FAwVjUerWTrp6XoG1888PYh1BBATCAAd FiEEoGB2NRmMq6LEZ/qmTOW7QuOYQAAFAlluEM4ACgkQTOW7QuOYQAB3HgD+Kw+R WbH8RcSlNbwlGWCWYwKvik7ukIMcTXXYD5azTYoBANF5Ym2n5RExmEd8nTrWu9MR TUlOgAXfzm/iH4+TNj2yiHUEEBMIAB0WIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC WW4Q7AAKCRDbkBfbrmzQ7weXAP9OyFxzdpbq1R+V6T5WEckR5OtE6Va/7CHRPRW+ kMNVjwD/YQZVbOCRxKybVbvPuF+29w7sWp4iAmmrmCFnKfgxZsQ= =r9Ly -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/scenario2.asc000064400000000000000000000065001046102023000176320ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv 9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ A4dNj5BcxKEIWunJICtZCo0= =rf4w -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T O+rBR22hpi+TILZrbk7svFyIeQQQEwgAIRYhBP2bIN08mBI+7q+MxRukFTjS5la1 BQJZbjsoAwUBeAAKCRAbpBU40uZWtVGlAQCgHkwmJSATJbrqV7+h/1ByLDi4+thQ ApW8nRinGuwkxQD+NgjOVmkPGZtpvaBzLXJS/IdPAYBWAriAzDZEV2GchWM= =4Xcm -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p 26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg apYJ1rdJREHrbrcqKtuTqFiIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl BQJZbjteAAoJEKW6w+0SXMrlkJQBAO19erLoHXOqUI01Wl0tcaKIwEB5HkIHLh0w cCTOG4bDAQCCG8a8D1mg9jVPukBzTBUZGpDZmg/U3JGW3XE6rKlKXQ== =Df0N -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z 5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 9ABx9BsKd3PAX1e4ZD/uBtKIdQQQEwgAHRYhBP2bIN08mBI+7q+MxRukFTjS5la1 BQJZbkUBAAoJEBukFTjS5la1zSgA/A6ei6bus+VtQtL1rsJfovwoxnyAq+QzCcJL ZheUUK3LAQCK+rVE1Yn9QsFoNYZUgLHrnQDtSVq9ClJvNw/Wuz7DpQ== =No85 -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS IETHEldWI+UbSc1n1qiJfUaIeQQQEwgAIRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA BQJZbkUwAwUBeAAKCRBM5btC45hAAJF0AQD3lBQszLXrlSnCLuHfQxbS/p05DURZ HRi8MbTqkrcgrQD8Cs3gwQCBkPUrx8boAyjcuX1BK/TYZ1Gg8hWkozNr1lI= =HwV/ -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjtBlHcmFjZSA8Z3Jh Y2VAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQS5NfS42gCa+8zdQThmU6GDAH+DRQUC WW3W8QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBmU6GDAH+DRbYAAP4q ZbYNAAtZOexWcv9Ap0nUnwOxpHWX7LaHsVRi4W21CwEAtliza9TA5UGcBjKpseiC qBs9LEpFd4DE2qh6nHpyy/6IdQQQEwgAHRYhBM4aDgfPiiDL+NxH1tuQF9uubNDv BQJZbkVQAAoJENuQF9uubNDvyrkBAICiFq2dTFzLrXNsItwpPrB20trzEPM/JAxa lzSyknJMAQDBCj8nyEtlpkYh9t9ovy/x75D1OUBFFYHOQXCMy0QyRA== =yoqI -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/scenario3.asc000064400000000000000000000053711046102023000176400ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv 9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ A4dNj5BcxKEIWunJICtZCo0= =rf4w -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T O+rBR22hpi+TILZrbk7svFyIeQQQEwgAIRYhBP2bIN08mBI+7q+MxRukFTjS5la1 BQJZbmYmAwUCeAAKCRAbpBU40uZWtSQhAQD2HLi7PUipgcO9N+KEJLKl2T9ralzj O1PMy8IbxnG86AD/Ya541TcH9oxZUWm5dsHd/eoBnSu2WwWkLPNHirRkzwE= =R1uZ -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p 26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg apYJ1rdJREHrbrcqKtuTqFiIeQQQEwgAIRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl BQJZbmZIAwUCeAAKCRClusPtElzK5YuLAP0b5nCuz6p6DDrHB0rtwfhEfJQgvsEc zGE2Hh5P5fXP/AEA2Gt8LEWiHYNGWu6ZN02oyCoNUEfZZFva59IIPrzPDHU= =S6Nc -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z 5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 9ABx9BsKd3PAX1e4ZD/uBtKIeQQQEwgAIRYhBGxic15FTM3Xn6bKYBB5ETrsEoL9 BQJZbmZ0AwUCeAAKCRAQeRE67BKC/eFYAQDaKoyQZYnNH/62hydWITZ1nOYM/h6i 6L/b+XqB9DD0ewD9FAbO1wzassj6FmZMZDaraqdljTX+94JY5E3GJ8EQXo4= =kaec -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS IETHEldWI+UbSc1n1qiJfUaIeQQQEwgAIRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA BQJZbmaiAwUCeAAKCRBM5btC45hAAMcRAP9dcKO3ETB52AsFdBp2iJVjqJ5JiftN B/2FZBxPtSjXpAD/YdDzs+zNaAUlFIFmXzP9EmIqmXhC6XSiASrNd5EW33A= =DXNa -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp/trust-pgp/scenario4.asc000064400000000000000000000077351046102023000176470ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW2+WxMIKoZIzj0DAQcCAwQnUnqiwvOPU7gGepFTew8Fk5kmVexr+PvaqXgv 9wKxNzZrs4GvamULk9pl2euwJGKPBRJRz8RSNpW6HIIzAPoOtBlBbGljZSA8YWxp Y2VAZXhhbXBsZS5vcmc+iJAEExMIADgWIQT9myDdPJgSPu6vjMUbpBU40uZWtQUC WW2+WwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAbpBU40uZWtTs8AQC8 6p4hEyInw17S3P4rVpHP+en+6YJDE7x12b2aevgzsQD/XPhh0PTrAlenhFdQjQbZ A4dNj5BcxKEIWunJICtZCo0= =rf4w -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WihMIKoZIzj0DAQcCAwTtUYI84wfNPCwa/r2ke7tXz0uv/En9LQZbW0QE nzHigEvMXLfyjfjCf5tQ2eVbKLbABxtKwDtC2bv8dMcmgqd/tBlCb2JieSA8Ym9i YnlAZXhhbXBsZS5jb20+iJAEExMIADgWIQRNP1n02AMP0thEr+ulusPtElzK5QUC WW3WigIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRClusPtElzK5ZSOAQD1 St647GAPOFIIYBDka3EGJeSan8i4f+u80jyplpWeggEA+z9VSDLd7JKMXqD3B/9T O+rBR22hpi+TILZrbk7svFyIlAQQEwgAPBYhBP2bIN08mBI+7q+MxRukFTjS5la1 BQJZbm5IAwUCeBqGPFtePl0rW0AuXWV4YW1wbGVcLmNvbT4kAAAKCRAbpBU40uZW tb+2APsFKgWxiLtSbpcekarOlPrw014LVinLGah3VE1Izay+tAEA+0INHdcNoz64 kRE/2siUnx1ksrWcWvJbvNMteknXhzY= =UQni -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WrxMIKoZIzj0DAQcCAwS4HzEJ0YwXZ1SWciHOmWdfnESTvwC3Zb/sWRu8 zdIeZzxAwu8lYQaDq/eOgKeXQVW5gxkQG5rCWUazbG+gCBEItBlDYXJvbCA8Y2Fy b2xAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQRsYnNeRUzN15+mymAQeRE67BKC/QUC WW3WrwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAQeRE67BKC/czKAP4p 26ygO/PtZluyOMFYj8cuFZ9Z9eygBH2Y3/mtn3gcOAD/VWpu9Rwz689TraDv/Sqg apYJ1rdJREHrbrcqKtuTqFiIdQQQEwgAHRYhBE0/WfTYAw/S2ESv66W6w+0SXMrl BQJZbm6PAAoJEKW6w+0SXMrlWj8A/2UdgyhbV+tLjyFb87iBiaWxSIVfiVyjhLZN htPTrKb2AP4yIRxJ3x0LmRSDLkZ/QIQmgahlAXRmKCXSRAB8x2KRsQ== =Zbpr -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3WzRMIKoZIzj0DAQcCAwQrTeILyHVpkkDsAyAlY7wz0PYjG48ShCYeTX2z 5f2bLxZGeepQeMiOXznPvCwRNMNpr63048+LGqu34Q9di5tvtBlEYXZpZCA8ZGF2 aWRAZXhhbXBsZS5vcmc+iJAEExMIADgWIQSgYHY1GYyrosRn+qZM5btC45hAAAUC WW3WzQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBM5btC45hAAAm0AP4n GINm20BvnUWMHmgnUGSybMiuAvqi6itsstGNXKTuuQD/QmrIuGHUre+fitgNu4q2 9ABx9BsKd3PAX1e4ZD/uBtKIlAQQEwgAPBYhBP2bIN08mBI+7q+MxRukFTjS5la1 BQJZbm5uAwUCeBqGPFtePl0rW0AuXWV4YW1wbGVcLm9yZz4kAAAKCRAbpBU40uZW tYGkAQDcxaTENxUFCcwyuv/pOpNr51Q7bhCcWVPd3Zn1t3yurQD+KDre0hsrR0Rf kiq5JYhqh8sEejmFQ1EtcCNI2x8CvHg= =W5g4 -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W3RMIKoZIzj0DAQcCAwQs0QS2PEUXhpmsPlaTFOsXd8AoYqpa6xcc0+AE Mck1EzlqRlxeibvYeh/+yxjl18Ouww/BERB+PcoABXp00zXztBlGcmFuayA8ZnJh bmtAZXhhbXBsZS5jb20+iJAEExMIADgWIQTOGg4Hz4ogy/jcR9bbkBfbrmzQ7wUC WW3W3QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDbkBfbrmzQ76cNAP9G mUKYA9CAx6OGzb9iY6pat6TJ3ghY2P3PIjafbbxZdgEAnX9Z/W8G+I4SrOzu34LS IETHEldWI+UbSc1n1qiJfUaIdQQQEwgAHRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA BQJZbm7vAAoJEEzlu0LjmEAAmT0A/3kZ3vms9aDuS2OD9yE/KoluBQi1UWR59V/2 JHomhTiRAP9GI/01N3pRty986m4dVBbrXpT39ZkEj4q+zkn1uNeQHA== =UqlD -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3W8RMIKoZIzj0DAQcCAwRTGb7wRrdPa+mXxUNJoYgWbKfMDQH9M1H366PQ ga8L32TYccFzyCD8DuRYOQxzhnCtSHtdzK4QAwwGLaJV6GRjtBlHcmFjZSA8Z3Jh Y2VAZXhhbXBsZS5uZXQ+iJAEExMIADgWIQS5NfS42gCa+8zdQThmU6GDAH+DRQUC WW3W8QIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRBmU6GDAH+DRbYAAP4q ZbYNAAtZOexWcv9Ap0nUnwOxpHWX7LaHsVRi4W21CwEAtliza9TA5UGcBjKpseiC qBs9LEpFd4DE2qh6nHpyy/6IdQQQEwgAHRYhBAOJwLeZDhBSCzNPI3VvFXHtqRhL BQJZbm85AAoJEHVvFXHtqRhL6N0BAPjsViTQhc/t9zbC7Jf3bRLQTYjwR5EtW4Wu IZZeByYXAQDw0Wofsq945J5oRLoTPdc264dBv8ojBr0/1uFWOvci/w== =q1yC -----END PGP PUBLIC KEY BLOCK----- -----BEGIN PGP PUBLIC KEY BLOCK----- mFIEWW3XBxMIKoZIzj0DAQcCAwSINFpTZUYnxDDj3k16ljZIt58rh3cuUNIvUcqR zR9kdlmudQTaf1zUsW6F3r+t91t88kaA2Fcci3wkU0CAob0WtBlIZWlkaSA8aGVp ZGlAZXhhbXBsZS5vcmc+iJAEExMIADgWIQQDicC3mQ4QUgszTyN1bxVx7akYSwUC WW3XBwIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRB1bxVx7akYS3BcAP9J XIhGIadg+SoFWoZ8jYyVOA3z66Ku6vYl2Rw+jKUIQwD+Pc54tFFPV2hycSe9JPWy uaVfFlNs1RyWcCVrY5l3swSIeQQQEwgAIRYhBKBgdjUZjKuixGf6pkzlu0LjmEAA BQJZbm8aAwUCeAAKCRBM5btC45hAAPABAPwLtRtV1gnk6qbyb9DvvHbG1kd2sqQ5 mBM7cw6rPmf2EgEA3V3J9D7/4hbF/tulACVEpW9yvZq3wnEj0GSMpF6qQDE= =7uOj -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/AUTHORS000064400000000000000000000004711046102023000160370ustar 00000000000000# This is the official list of End-To-End authors for copyright purposes. # This file is distinct from the CONTRIBUTORS files. # See the latter for an explanation. # Names should be added to this file as: # Name or Organization # The email address is not required for organizations. Google Inc. pgp-0.15.0/tests/openpgp-interop/CONTRIBUTING.md000064400000000000000000000026541046102023000172250ustar 00000000000000Want to contribute? Great! First, read this page (including the small print at the end). ### Before you contribute Before we can use your code, you must sign the [Google Individual Contributor License Agreement] (https://cla.developers.google.com/about/google-individual) (CLA), which you can do online. The CLA is necessary mainly because you own the copyright to your changes, even after your contribution becomes part of our codebase, so we need your permission to use and distribute your code. We also need to be sure of various other thingsโ€”for instance that you'll tell us if you know that your code infringes on other people's patents. You don't have to sign the CLA until after you've submitted your code for review and a member has approved it, but you must do it before we can put your code into our codebase. Before you start working on a larger contribution, you should get in touch with us first through the issue tracker with your idea so that we can help out and possibly guide you. Coordinating up front makes it much easier to avoid frustration later on. ### Code reviews All submissions, including submissions by project members, require review. We use Github pull requests for this purpose. ### The small print Contributions made by corporations are covered by a different agreement than the one above, the [Software Grant and Corporate Contributor License Agreement] (https://cla.developers.google.com/about/google-corporate). pgp-0.15.0/tests/openpgp-interop/CONTRIBUTORS000064400000000000000000000007301046102023000166450ustar 00000000000000# People who have agreed to one of the CLAs and can contribute patches. # The AUTHORS file lists the copyright holders; this file # lists people. For example, Google employees are listed here # but not in AUTHORS, because Google holds the copyright. # # https://developers.google.com/open-source/cla/individual # https://developers.google.com/open-source/cla/corporate # # Names should be added to this file as: # Name KB Sriram pgp-0.15.0/tests/openpgp-interop/LICENSE000064400000000000000000000261351046102023000160010ustar 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.pgp-0.15.0/tests/openpgp-interop/README.md000064400000000000000000000102421046102023000162430ustar 00000000000000# OpenPGP interoperability tests This directory contains simple test cases to read OpenPGP keys and messages generated by a variety of implementations. The tests are declarative, and any implementation can write a driver for these tests to check for interoperability issues. These test cases are not exhaustive by any means, and should be viewed as a simple check that messages and keys generated by various implementations can interoperate with each other. ## Format of a test case Tests are based on a naming convention. Any file ending with `.json` is assumed to be a JSON file that declares a new test case. It _must_ have an string field called `type` that declares the type of test case. There are currently two types of tests. An __import__ test, and a __decrypt__ test. ## Import test This test expects the implementation to read a public key, validate it, and reject any invalid userids or subkeys. An example JSON file `mykey.json` { "type" : "import", "expected_uids" : ["e2ekey@example.com"], "expected_fingerprint": "099c5e5d3ca82dac59deb9431446c4a316225086", "expected_subkeys" : [{ "expected_fingerprint": "43c788799304b2737511b41e66d2f1269199e424" }] } The public key is located by a naming convention, and found in the same directory by replacing the `.json` extension with `.asc`. So in this example, the public key to read is `mytest.asc` within the same directory as the JSON file. All the fields in the JSON file (except for the `type` field) are optional. But if a field is present, the implementation must confirm that after validation, it has the same information represented by the field. Unknown fields must be ignored. `expected_uids` is an optional array of strings. This contains an array of (validated) UserID strings in the same order as was present in the key. `expected_fingerprint` is an optional fingerprint of the primary key. `expected_subkeys` is an optional array of objects representing each valid subkey (in the same order as was present in the key.) Each object may also include an optional `expected_fingerprint` field for the subkey fingerprint. ## Decrypt test This test expects the implementation to decrypt a message using a provided private key, and verify it if (an optional) public key is provided. An example JSON file `mymessage.json` { "type" : "decrypt", "decryptKey": "mymessage-decrypt.asc", "passphrase": "test", "verifyKey": "mymessage-verify.asc", "filename": "hello.txt", "timestamp": 1418941207, "textcontent": "hello", } The message to decrypt is located by a naming convention, and found in the same directory by replacing the `.json` extension with `.asc`. So in this example, the message to decrypt is `mymessage.asc` within the same directory as the JSON file. `decryptKey` is a _required_ string field, and is the name of a file within the same directory. This file contains a private key that can decrypt the message. `passphrase` is a _required_ string field, and provides a passphrase to unlock the private key. `verifyKey` is an optional string field. If present, it is the name of a file within the same directory. This file contains a public key, and the message must be signed by it. `filename` is an optional string field that is the filename indicated by the message. `timestamp` is an optional numeric field that is the creation timestamp indicated by the message. `textcontent` is an optional string field and is the expected content of the file. ## Attributions These test cases are a community effort to improve interoperability between various OpenPGP implementations. Copyright 2015 The OpenPGP Interoperability Project Authors. 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. pgp-0.15.0/tests/openpgp-interop/testcases/keys/e2e-001.asc000064400000000000000000000013301046102023000213740ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Charset: UTF-8 xv8AAABSBAAAAAATCCqGSM49AwEHAgME5D5j84R7ngjS9Zpu631VC3oTDf6vqz3x TUcj5qv8zGBGi8LGNriyNadfKlVzl8zWNPSD+cF5C5m6RWAi4Q1htc3/AAAAEmUy ZWtleUBleGFtcGxlLmNvbcL/AAAAjQQQEwgAP/8AAAAFglXSSrL/AAAAAosJ/wAA AAmQFEbEoxYiUIb/AAAABZUICQoL/wAAAAOWAQL/AAAAApsD/wAAAAKeAQAAOMYA /1HSZSJe+umnm9DGuKSql1oxxD6SaHFoh63avcITgcVzAQCb7KazBzAHuHPcMK2z GKk+2tO9ehQPgf2w/wry8sF3I87/AAAAVgQAAAAAEggqhkjOPQMBBwIDBPZ2x6Gt k2VF5BS4tlYKPVtEazFJ3uiNLngvpfBimk8f6MXwAuU+WXpB1//MUeY6sOODKakh PoFYQ74xLMkrlKUDAQgHwv8AAABtBBgTCAAf/wAAAAWCVdJKsv8AAAAJkBRGxKMW IlCG/wAAAAKbDAAAQVcBAIrP/tLo8/in5TsYTohMg+RSz3z4KkLpr64+mUJhuD6+ AQDWN6DYCyQTSHDGKfULHBQjnrQdM2PETTuO7x8LB1mJVg== =B6/M -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/e2e-001.json000064400000000000000000000003611046102023000216020ustar 00000000000000{ "type" : "import", "expected_uids" : ["e2ekey@example.com"], "expected_fingerprint": "099c5e5d3ca82dac59deb9431446c4a316225086", "expected_subkeys" : [{ "expected_fingerprint": "43c788799304b2737511b41e66d2f1269199e424" }] } pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-001.asc000064400000000000000000000045001046102023000223670ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 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 =XyBX -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-001.json000064400000000000000000000004061046102023000225730ustar 00000000000000{ "type" : "import", "expected_uids" : ["Android Security "], "expected_fingerprint": "5e31485bd84e3ca6e1f6e604731e6b9f00540fc3", "expected_subkeys" : [{ "expected_fingerprint": "6834b09572175adadda61ba0708cd053a11a9b3b" }] } pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-002.asc000064400000000000000000000025721046102023000223770ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1.4.11 (GNU/Linux) mQMuBFJ8K1oRCACv4QL0+GnScNvFhZB1sMrRxibowhwv1UAAxz/nygIaTWcj0cvV IA2d4/5cyuNC2LDb193Id9ODR6J8nG7GuZpTOCXPMx05VV5LzNfVMiVe+8Sx6nh+ O6C0Am9o23wZHFMDUqX/c++9WC+DxkyBkeH0gbeE/aWb0eIGyxbw3YmiYvg7km+T gUyN5bpSpcEFsaWzL9+PayI13P4ZGRKqwhoR00HJ/oiFep4v1iTnlf/PdzKW2wTQ 3nwOHKsbsrP7MN1CYBfuHOfOstWmbyAkROACbzoFOhXoRtHJjR0Kng+Hhbroawzu fgMCxmgHYKN4krtKyiTQ56JG9ORUuoFm+AUfAQCFTiit5Q8M2ChfnmGPVD/g+1BC 8QdAT5KAe5Qkf9KcsQgApWF3Aa8Y/MAycSyjS06+cXxP/KqGuP2gpZfpFbVPk3z1 Ams3YzJuT4OUGMia1qp8xilch2nnZS3TJmIelHTthmjY5iw/eFN52JvPXXHJJgyb 3Q9d1l08J9BYwDnXKqM45lW4EY2Iswox91STj1r3GFWWgPpUrLGpdd/FDNAVL6EU G6PWn2/g/sGAAueqPpbpmgiFXZrF3pXnm6H/LlHNlbqBvhI7kk5Wj9NHm6hJHzdq m5IgoQDOfgMeOjE/jbJnXLjZiYh4eKQ0ruCOL37sYLmQvd1tC8Pc6Ld2MNW/66Wk ph40mUNig9cjZ1GBtf2Ql6aTfOCr98gy6B6S9U/RNgf/UBBkh1FVB/TayNroyUxA a+xUodRgaLNTfs/VVrYjxqUXlwxfPDtH0fRGELfAukXD1MLqeXSNjoMc2he2xJ5a oqpuOFLWqbP6U6MdcUlIeS4sPsjpq4/z1O0ZL5YtRFwTVgpC+1tjVFSNmS7wtpt8 stpuH34qZ8Is1V60hPGNrocKsiRHEsLyDzGoHoSmHS8z/SZ+Hg4vJiWCBnC3ao9l niyzXxhOx94oiyfxOEfePH3QpTtQbXs5J+hpS+2e29AQGONUTA/JgZ5FNapfZN9T dDWPTDOKM7p3vL3X7tXdOCnf5pdxO1OwMbp9IIFxuZBSJXYTEQ7d7s9wFj3HZ0p6 yLQIZHNhIDIwNDiIegQTEQgAIgUCUnwrWgIbAwYLCQgHAwIGFQgCCQoLBBYCAwEC HgECF4AACgkQcvZy0yMm+1KkmwD/XSHbZfWqSyUIe6Q/yDSYA8gZUKtoL+eX+DMH 6INFXCwA/iNvh3PtgrS+urB+oU+/9Ey0hzzkisOR2nEfznYNigW8 =MNsu -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-002.json000064400000000000000000000002431046102023000225730ustar 00000000000000{ "type" : "import", "expected_uids" : [ "dsa 2048" ], "expected_fingerprint": "a8c3489ad6e31f81f8de9f6672f672d32326fb52", "expected_subkeys" : [] } pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-003.asc000064400000000000000000000142151046102023000223750ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQINBFOR5PUBEAClTPqRQvt1JlMiBVsR91D0mvN7ZMZ62DDtdEPWwgR3sEku6QkO TLiwwsXUnoff9ayAGxqq2zGe7p09KbJb2apjSxJsDl2k5mtBTp293l3qDjjFv+fl 9/259MGx857Ykt1OCHOg32b/Rv2SNtKRwnbOafuXL17yR0a2eUoPcOBpRme53lc1 MzDHMnM8xtXyTNdyxcfVvbd9wKW26dPuA3IUZ3jNphRJduMwZvxXv7UV7zl7OqiC wL3gLRn3oy33sRlcsPMubnRVrBmfpDQ1Xw+kMjDlI36abg/2rVshtNiSxvw4QniL pIsCDuhe3RNc/ygIeA6DS12UzCwrX6dHFnoggUWJ1/Aw7p+KZpc3vbBj5rC4irD9 dFTAP2lnih3ZlELP0L9iC8W2iWzW4rUf3s9Ux+Y2jBHHDzAkROydWhfOqstKmsPD fbNHj4+wSmefCVejaX6NkBUgCJJ8dRs0Fgxy51fvyFBT3YZziTH9NRzxNCZuQ279 ZKFLNYaQQBCAgoR/f1IVYo5/ZlE4Ca4PZupz0B9f2WUULNt4YCdtTCD69xbECuBj LTsYATdDjLlSVzJ2BwOPs7gvdlVujdGGt3wvUbC/3XVS8WjyxOuQhE/cBc8jmldp AiWQM5l4OtNzaJHtuHdFoRgOBHQVJjhARcLeA8RjxDsn1at//W0OzMwknwARAQAB tCVqb2huIGRvZSAodGVzdCkgPGpvaG5kb2VAZXhhbXBsZS5jb20+iQI4BBMBAgAi BQJTkeT1AhsDBgsJCAcDAgYVCAIJCgsEFgIDAQIeAQIXgAAKCRBMBzrgyERcDHxj D/0VtU/KEX8bHcB6BZclEEtqdhL4iUh2dOuLIs/rlYBwlxuSfjWPXciuIg0Z3dM4 bLsvJafLjS0RawXFd86ohqD8tUMmcOwm31Yc/+HpE3IYrn/4HA9fLje139lrF4yH xzB1fyWzv/rNk+aTMboGFJG/ivIVgKzdya+O972Vdzu4Ahopm5YB2Sh2pLTwKhgb dnCgXzlUwZ5ddx9DYYQO7U6Gn5lX4Wkn1vwLRpgxieXIxsmJCEk60v9WLOD2f7By I/FSPF+NgcTQutVtV3FGxoXmNfoSCY8wDX54wAzC1SA+0AMoAQby75P4CR34T2Hg 3ANLcL0Vb/By65OyZVpl6vUFy5eJo/eV3yaurhxx/oyD2jBp/RAoItedAuItszE0 nA9K9v9362ShbpcHv2aS7M5l41VzM2q57V3dNkEuyeocP50MlSKoRs0l8dRdcEjK hVPizS5Ff+uYIZX6qYprPlaCThb2q279fJbxFatQgBm7RpgYWE6YxVgjQYnruSF0 Vuv+aF553hIH+/oT40Qz+yKngzfwn/jXwqtuK1HaR+A7P9sqSiK0+6Aytp0364I9 uy2PE78o4Q4Bb3xuUniItfMoUZwHGylg2idW4YiXHPMdZCgU9vcpU5WaHlF1A70f JpLahVJxFZ1+pH7C0c20VrOakgxMDkCN8025SW9Vxrn1GtHD18PVARAAAQEAAAAA AAAAAAAAAAD/2P/gABBKRklGAAEBAQEsASwAAP/hAIBFeGlmAABNTQAqAAAACAAE ARoABQAAAAEAAAA+ARsABQAAAAEAAABGASgAAwAAAAEAAgAAh2kABAAAAAEAAABO AAAAAAAAASwAAAABAAABLAAAAAEAA6ABAAMAAAABAAEAAKACAAQAAAABAAAA8KAD AAQAAAABAAAAtwAAAAD/2wBDAKBueIx4ZKCMgoy0qqC+8P//8Nzc8P////////// ////////////////////////////////////////////////2wBDAaq0tPDS8P// //////////////////////////////////////////////////////////////// ////////////wAARCAC3APADASIAAhEBAxEB/8QAGAABAQEBAQAAAAAAAAAAAAAA AAECAwT/xAAkEAEBAAIBAgcBAQEAAAAAAAAAAQIREiExAyIyQVFScTNhE//EABcB AQEBAQAAAAAAAAAAAAAAAAABAgP/xAAZEQEBAQEBAQAAAAAAAAAAAAAAEQESIQL/ 2gAMAwEAAhEDEQA/AOYDSAAAAAAAAAAAAAAAAAAAAAAC4zldLjjb1nsltt2BZq2I uOVxu4uWNx7+4MgAAAAAAAAAAAAAAAAAAAAAAAAAst7b1suOrqdUWWy7gLMd3Vuk tt73Zbu7qAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAoIKIRBUUAABTSEQXSdfab ADWX1prL60pANZfWmsvrSkA1l9aay+tKQDWXxQABQAAAAAAABrUVrjF05V1rA2FK wmo6WbTjCjGoajfGHGFPGRsKVzy6R08OSYy+9Z8T0VvD0Y/jWes6omlaC3QF6TYE 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 YUBHrkkYH+e9 =4JBj -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-003.json000064400000000000000000000004671046102023000226040ustar 00000000000000{ "type" : "import", "expected_uids" : [ "john doe (test) ", "john doe " ], "expected_fingerprint": "56c65c513a0d1b9cff532d784c073ae0c8445c0c", "expected_subkeys" : [{ "expected_fingerprint": "c6a10a838a716176d5e808de1b00ffe4bc1f8cf6" }] } pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-004.asc000064400000000000000000000040741046102023000224000ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 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 =80Vy -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/gnupg-v1-004.json000064400000000000000000000004031046102023000225730ustar 00000000000000{ "type" : "import", "expected_uids" : [ "revoked " ], "expected_fingerprint": "7f03a5f84557bef41cf1e81d1875ff0b267cdc0e", "expected_subkeys" : [], "comment": "The caller should not import the revoked encryption subkey" } pgp-0.15.0/tests/openpgp-interop/testcases/keys/openkeychain-001.asc000064400000000000000000000057261046102023000234130ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQINBFYkWagBEADB41n2Ona5JVojJQhn+UX0JMq/iEUqmCwARPlnqhnMhBuNstN1 6ooN4Y53lVXPbxp5B50O8N094/kBkGjQupmEWVdHPjq71s+q26PfoqjijcISrNjf kfFbKoBjD7HaX8jk5VGMxfaznc2SQMXdkkNy0d3JmqJ8s/lVWcM0RVJO+D/tvpPq qTu4WyXxY3CTepNzUGvl1LU2sM6iGM2g5DhI97TK9Nu3QVClUjpfGzTC8MZSr/oO XwH9EwyO7C1OcsJD4d94bQfHaJCLWltmbDGJaKU3TJ0dnufzKk+gQYVzb5Pvcx5y wO1ZLeAgNIwvIC4WSmPTzeXTCMgVkrgPpeJf2Sn2BoBo4464v9ZVnyuEDwztJzeo NBNTIJQFIJI5WNh8+5jeNSgawfS5ch3rDm6kPC1rPftEOZeM4UBP3aMUO2nXYQA6 OKnokOgsbzq4/gpfX1PyXw4A1lIZHQN0XLTu94wFdzWc6Pi0xaSr+bUheTvwKMzW dFBr3+Q6yLZnu0WBLelRWKNyC4SoccnbxopXwnzJk9xO4IPZIZZ7Z3OQe5eQJcJ+ CAqDe471qfZgCL5ezXj6oQjDbEHn/fhYq/T/fJXn9moYrMd6MhFRBafjY/pf2CA6 rqfWyDizOXXkMvhXfOWC2jydKN72+km5c9oYQVJSYy8pkF0xExpbOlgDOQARAQAB tCJHb29nbGUgVGVzdGluZyA8dGVzdGluZ0BnbWFpbC5jb20+iQIwBBMBCgAaBAsJ CAcCFQoCFgECGQEFglYkWagCngECmwEACgkQeczZjSZjB7jC+w//Sv02nSa7HX8/ OScXWneKo4W12Rlss9UHMMEvY8AnV0z+yJ6HFmG/06f2ha5tJcZ02gIyWUX0fqSX vT1BseWv2fTJrlOBfS68mcTlten/CFekIN4o+HQqXF63IFRdfo8vjSGyRP9V/BjU PMSbeCzRTjNIsk1C2XIRoLiDnuYkEHi+GDA1WEfX+7htcPiassxEWgm3ueYnEF+8 5EvYcB0uhxP7mg1dg4KhRKkxNIYfKKrcHyTlkRdfHi6hQa1CuEh1OguJlT6j8WnY qZHu347D0meBCunvJ7nax+oj828/wPm9g/uu2PXL//GaTh0ft9nbeqan86lwPHLA 4P3diArowGf3I8ttjngNDh6BHBHZlD7RW7jKCM42CqkMnCJSIQq+ijtSevDRziZ9 xgqnSV7AiSh8QpC4bTtXc4MZkbG0UuszeiR6l9IEfMcLXxUs/YqSrewj2/B+n2FY zlkmFMR/7Occ+kDBG+2dwRrvsg2QvulF+K2B+3NV3zr/KBmRJYSGgifOtzGs3EFW l9B6jTobVSQajf72Cm5CVBZlnW7TjfyeFFWxxxuL/VtkFPvpPKp2OiBmf0UzD/NV lNwK4yPvsI+dVcOoKo8SgOqUzjcAy0pkiPtI1yYbnbaDFsHWshknyBh7CboEESMO b1Dy+UhJr/HSCYLXArCcqlq1ZNtE4wa5AaIEViRZqBEEANYjhngkQQNRGUMD2QKb CCI4qZUdQZl+inL7k1+D4WBzdZnJb/s7ojDHT1E+K2W4+AfgomiMIzdOiuW+nY+2 hDTVi9i8/3ONPsDemD/rBVyl8bcdDnxuIVVlJS5P9zwASHsUy32zqUF4XPgePm75 qYZJYyA0NASttea80c7Jt/avAKDbKs1cvll8jFgQMtMkgywTJoWkrwP/Wn96Sh03 UJNcgJdlXPHBSUaH9Imb44LWPknct8fe1zapHgI+DC6PXcBiMskUpyAY6AA6CKv8 0hptQcxtB85NjiD4xVHNVUuwGvYcSIQhWFkxzyVvhQLkocS+QY+UOjalFQ0QLANP lJzoXVVl5wI9kdiEJTIDH6IoTmqFiSDOEHwD/RV19TZPn/Ls5sHLujY2pjcIKXEm KUhNHSXP8XmFSitNdwq/gUq/gPnroZgea1/PFzTXk4b6oNOJ6hgLGWnDsvdPe55O yMQURjLSeRBJRiZhvfx99yoJQ6Hx4zTKtyqvEev+9zsWhUTZK0DokOv4qFwIXfg6 81DuaKNX6/V88BH/iQJnBBgBCgAJBYJWJFmoApsCAFIJEHnM2Y0mYwe4R6AEGREK AAYFAlYkWagACgkQT3ic47WOOhAWpACggf64c+hXvYWjHYsfIjAobQ77Lu8An3Za PL3DKnMZE3gOLDwKYCrBnoiaBO4P/jWtVNcLRLjcxZKPE20+FUdioZSlvPavkX62 roYAZNts4r4hPgJ6vkmqUVN8Etzr22lK/t0/p6260HRqv+VTr89NVoX31tSTYqfp XmV0yk4MYhUImxqe269IblmCclyPCpyTIm8FWq8zmjOClTdzJv40z4wmV7yaeuPN AFSsHXnP18imbxrnUU3F1W8hqD8Xeuw3pd554T2G3Dkt4mdY9ZBgVZoXEjOrF0zC lvLULChQ8Jq7uaPvhRksq8vfgfN5Ae1vConbBaa7eVU/AS8O9Amh3gyeu5s+jVK7 it/J1ieGigufq6rQX314UWHZKwQNgy7NC/i2mBSnYe/HtDNj8Fwu4ZcIfkGVaD2W pZ+tp4WO25ExU+NVB391kAO79rkvXg4jfy+OQesyv3d7bSsDKErimD0FSmHRPPN7 9yxFucCD47zPctYIg+HsjYBkuFR7+TgI3tD1vsK7Cdb0JUX8X2z5QD9N4kt/okx5 Cy9MubMuLwi2FMm8fyQzR2FN4slup2UWLZI+4IkWVWdJ0fFCXNZeQ7V6uJhmsf6m xtHmShYHhMLTBtaJxxuR8++JFBhBIcjIWOVnGkoZaE9MxXV9KRMY5DtCFhhEyTnk Wb4EadfOzs0YxXA1eh1vkZ4nVNPh9i8VOHvHYo3w+i3Hxff46wwH/caPIgo1qMdQ /PDmVZ/y =Z54q -----END PGP PUBLIC KEY BLOCK-----pgp-0.15.0/tests/openpgp-interop/testcases/keys/openkeychain-001.json000064400000000000000000000005731046102023000236110ustar 00000000000000{ "type" : "import", "expected_uids" : [ "Google Testing " ], "expected_fingerprint": "ffe63e2309c6742b49bcb5e679ccd98d266307b8", "expected_subkeys" : [{ "expected_fingerprint": "6705343ec2ebb90ea60f89f54f789ce3b58e3a10" }], "comment": "This key uses dsa1024 signature with a SHA-512 hash, requiring the signed digest to be truncated." } pgp-0.15.0/tests/openpgp-interop/testcases/keys/pgp-6-5-001.asc000064400000000000000000000037071046102023000220260ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: PGPfreeware 6.5.8 for non-commercial use mQGiBDhOs4ARBAD4vdJ5svhD3JsV/pimPvwqtXK6z1fZFUhLWJbNEo+FZkp44D94 ehQDSyRmOfZtUlm7BdQRK5hHWiJHA2+pzl440O7mPffoOre0wmMXMSg8m+NekaA0 BjTqYr6cfPu1DAQHcMrGL0xSMNDQPxh6vDH2OjZLNNoJbAafPyTz9KXYawCg/2MJ 4vpPRmmkeT5uuDn0eaj8AZ0D/1qJxsBABP5wfn9CLlAPkQWajjmlbELRsbFZpItp jwSKLmzEXRbf7uusCb5eSumISJoF0wLNlhmwYpv6tg8LeANpZ4ngrPFLEJ480d1P vHktvlC6HusPyNrN2rGY4LKCTU31YE6WQxRy3fNUu9GlszfZOAD4AMBgKZjSi26U ISS6BACN2mHSsJFRfTH9NAqRvqMgh2T1Z7FuKoxV+q2qK7NzzmjGyqI585T1wyg+ gdSwmGPyo8+db9dWt/3ApudfqlAwoEQELuGhtDfXzumhata1O61pswZi0ZhCIypi T/6vMDgH+64b/70xu1ifzW8hj4quT09jveVEaai+eM8U10UJR7QyQW5kcmV3IERh dmlkIEhpbnR6ICggRHJldyBIaW50eiApIDxkcmV3QG92ZXJ0Lm9yZz6JAE4EEBEC AA4FAj3AFa8ECwMCAQIZAQAKCRCQFMqZLaBeeHhoAJoC2/6hvvoyDeympCQ7g58u yuCUoQCg52qYFAfESgKAEcRzquKHRbpDHsKJAEYEEBECAAYFAj3ueNYACgkQwpK2 kTfbg5M0CwCfW7yMaC64YvUImQNGrJksTKU1EGgAoK1mXv4/V6tSxymB/xTbJy45 +4QUtC9BbmRyZXcgRGF2aWQgSGludHogKCBEcmV3IEhpbnR6ICkgPGRyZXdAZ3Vo Lm51PokATgQQEQIADgUCPcAVrwQLAwIBAhkAAAoJEJAUypktoF54irIAoPCP/tvm HMcApJLxKOaHqUnFayRvAJ0agT/RFKFzyoRHU6GK6mqaxGSdebkCDQQ4TrOAEAgA 9kJXtwh/CBdyorrWqULzBej5UxE5T7bxbrlLOCDaAadWoxTpj0BV89AHxstDqZSt 90xkhkn4DIO9ZekX1KHTUPj1WV/cdlJPPT2N286Z4VeSWc39uK50T8X8dryDxUcw Yc58yWb/Ffm7/ZFexwGq01uejaClcjrUGvC/RgBYK+X0iP1YTknbzSC0neSRBzZr M2w4DUUdD3yIsxx8Wy2O9vPJI8BD8KVbGI2Ou1WMuF040zT9fBdXQ6MdGGzeMyEs tSr/POGxKUAYEY18hKcKctaGxAMZyAcpesqVDNmWn6vQClCbAkbTCD1mpF1Bn5x8 vYlLIhkmuquiXsNV6TILOwACAgf+OEcphl83z0cl5w7FXUOfLgIyOvhy0Ahvys9Y M61/TwaOAMccgfR3IG1+gNXNkmZl0h0eQxFBfYE86HW8n3GjizEyuWMxwTXTQ5tQ Mn6rL4bEjalANzrAwuUbfdoRI/iFU8erfs6+PclAwipjtwd2GaOkN8AHQQvwtqpd f/GZ6JEBIQwi1y3MUd+z9htqJ/eMhRlTZS/1+OQosd+vuT0wn65m4qOJYw+99QEL JraQDAICpZvKn98jPgc2X2ntbvKhgD+/653/eI/lss/EfaAMip9Ysw68c6CPlP8s rA0Db3c/9aT2DtBuim8eFUsraPIv2bokElZ2iJR0gMVPbmS+JokARgQYEQIABgUC OE6zgAAKCRCQFMqZLaBeeIWQAJ4z7E01KQUSX6u2VnKcvx1tePQZ1QCg+SjJ0O+Q TqjmnXbR7ZWHvyF8lI4= =bI+z -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/pgp-6-5-001.json000064400000000000000000000005201046102023000222170ustar 00000000000000{ "type" : "import", "expected_uids" : [ "Andrew David Hintz ( Drew Hintz ) ", "Andrew David Hintz ( Drew Hintz ) " ], "expected_fingerprint": "3c6cf7120a52bd33c51857989014ca992da05e78", "expected_subkeys" : [{ "expected_fingerprint": "4cb29c377dbfbbedfcf493ec610abd91b645a031" }] } pgp-0.15.0/tests/openpgp-interop/testcases/keys/subkey-001.asc000064400000000000000000000070501046102023000222300ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 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 GaCBprbH6O/s/ag= =Gl00 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/subkey-001.json000064400000000000000000000004751046102023000224370ustar 00000000000000{ "type" : "import", "expected_uids" : ["revoked-subkey"], "expected_fingerprint": "fcf583ae030924c5ca3520fd134974721f4867f9", "expected_subkeys" : [], "comment": "Import should ignore the subkeys as they been revoked. Revocations on subkeys are permanent, so it cannot be undone by re-signing a subkey." } pgp-0.15.0/tests/openpgp-interop/testcases/keys/uid-001.asc000064400000000000000000000017071046102023000215120ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQENBFObauUBCACxtJxdYZajVULp58pTK8oYRsxGrLs2t/2ybc0T1ojsRKa8HKth eIPqzEs9IegEaEz7kZ+A3dVdkat8qe3VaLnzFvoLoxKiQyigMmlkd/8ImcDwfPhb SpifVvN1BMZbTIvcMKp87lem/kutmP4mELflnwBa8DI4ari9Vradsp8OibkXiKo4 h/gcotALGcwvb8I2UrobKKWpm1DOtAi7G6Rvzhp4JlwkkII13u9u9UhiT5xKz2RJ 2b9PDMM1FmOPf7ILSxICOnOEGt1yZmshdFRsdJYRywNUSP6gXyEd7rVM7XJ3UZMw gjyz7cvvZATTJmJauIHddZXtZC597VuDK4edABEBAAG0GGJhZCB1c2VyaWQgPGJh ZEB1c2VyLmlkPrQaZ29vZCB1c2VyaWQgPGdvb2RAdXNlci5pZD6JATgEEwECACIF AlObauUCGwMGCwkIBwMCBhUIAgkKCwQWAgMBAh4BAheAAAoJEFziR1JVJq1DG4oI AKjySAa71tZIFPRDLUmvwmGjCJAAe6d3JqFXcK5S10+4j8O5AoiGjCil7hUfMZLm 5YUf73F+wH1+ih3Oh2xJbT64qrDegoLrqx0rFJ0pB/A4irSwKKNRq5Qk9qfl6uSb rT2htMinmsrW+4tr9s+Kbj16GGC3Ts7e7gh+HSCd1lV6dEgx2zVe+ENBEQ4LJWBy B5K9nB3d+fnLMaX3eOOiTSuemiHXc8qBu/XER+VNIcoV2IF09gyDOQTvmRQDoZ9A Uhjw0l4WORgwaSmZC+rzsjal79ark94jMKPzKnr3wdRH4uCol34BXV2gvHh0nIXd PNiEy6UV9QayOXi62EWEaOY= =KP+A -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/uid-001.json000064400000000000000000000003471046102023000217140ustar 00000000000000{ "type" : "import", "expected_uids" : ["good userid "], "expected_fingerprint": "25d1a26429b45e34f58cc3a45ce247525526ad43", "expected_subkeys" : [], "comment": "Import should ignore the unsigned userid." } pgp-0.15.0/tests/openpgp-interop/testcases/keys/uid-002.asc000064400000000000000000000015501046102023000215070ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQENBFPioBYBCACZfqpYZEBIJE8nmSEWAMwuZmlgT2e5BG5OtIJZpRhNlK14kGvF FZRNTdoYEmKekR9L12t1oew2gNVnS9eZLrN7MfRm6z6yoJh/4g5ExgdE2xoyQeF0 IbWAj7iQI4Ac/sTNpijjV+UTqnO89bVChGgf9qsiWuyQm5T+VUSPeIglS6U9mLli Ki0AXLov0KO/FkbEi/KUClC6MGdS7D0nRYqxuXedeiwRaOEVAOMo+tmkWGNAA6Zw jWGeZPtQBxH4L/Cx/nHuU/qYRRXx9RBwqD9Hd7w1uWclCQRcVXCGKA35M4lPFf8J EnIPx12hFRkgGrzV24JEQf8dx2wTK0uUWfZ3ABEBAAG0DMWQcnkgTcOhdMOpIIkB KAQTAQIAEgIbAQILBwIVCAIeAQUCU+KgFwAKCRD4VP6P8X84E2D6B/9AWGh3O/TB mNF6FpNpNKNicj+E6GeRTnPxQ3LzdXpFF+XEyVc5TqPdz1/vQ4vnfq1NebR+BcSG Z4mz9Frh4s9aLjOmKk+sZbLA7JOWSDBSSqa3GONldn8UUvgZpKKv8An33ABkFtGG TNSn68HJg15e+/dzQdLX2jcqUtDpocjtd9U+TBFPznqWo4BXBQpG88jDJn3CZ0Cr tfc+dayb3gcCg3iP9X2EI1wwIK8wHht57FdIeWmoZfFpfhOJZBP1BTUOHCGcY/OA uSRaHik/xvxsh8zOddWhrgyJCcCfL9VtbKOpK1S5kl56A73hN4oRXP5JbDts2Bny LDt1ncaXpjFs =OXNI -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/uid-002.json000064400000000000000000000002531046102023000217110ustar 00000000000000{ "type" : "import", "expected_uids" : ["\u0150ry M\u00e1t\u00e9 "], "expected_fingerprint": "e0f7644b5f5c515e8c2501dff854fe8ff17f3813", "expected_subkeys" : [] } pgp-0.15.0/tests/openpgp-interop/testcases/keys/uid-003.asc000064400000000000000000000025611046102023000215130ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mQENBFObauUBCACxtJxdYZajVULp58pTK8oYRsxGrLs2t/2ybc0T1ojsRKa8HKth eIPqzEs9IegEaEz7kZ+A3dVdkat8qe3VaLnzFvoLoxKiQyigMmlkd/8ImcDwfPhb SpifVvN1BMZbTIvcMKp87lem/kutmP4mELflnwBa8DI4ari9Vradsp8OibkXiKo4 h/gcotALGcwvb8I2UrobKKWpm1DOtAi7G6Rvzhp4JlwkkII13u9u9UhiT5xKz2RJ 2b9PDMM1FmOPf7ILSxICOnOEGt1yZmshdFRsdJYRywNUSP6gXyEd7rVM7XJ3UZMw gjyz7cvvZATTJmJauIHddZXtZC597VuDK4edABEBAAG0GGJhZCB1c2VyaWQgPGJh ZEB1c2VyLmlkPokBOAQTAQIAIgUCU5trRwIbAwYLCQgHAwIGFQgCCQoLBBYCAwEC HgECF4AACgkQg8LUR+sm0qOzZgf/VPrUqoYJGcrML8oJ3qoI8v1H1wSWgAOfjkVm gRbvhTFGXAPOThA/o5eVGFAIYA4YnMI7sGLeONAFEkWd+jLHKDJyFN7yMBNw2nZq ASEyLhjdIe4vI7G9FKe0tfQim7MjZsZfHG58r32izPZ4c4UN5zAfaMSZZc+1gd3S 2G0Vpw7ibhb6ujjW7/ZSatVtH8QMS+6tToWlkxWVo/4vUZ+9PZgM3rEWcRC3DXwk wgPrfmYBnhvqHiGicfUcY8NcVvLi+J6mh4RHwAweIm3pd4Wk4/nnwN3GJXa7IbJK 3znfCTl3yzH6DVsh2hklV8qSJB+fDSYerYJV1VEX6nZjSRBz6LQaZ29vZCB1c2Vy aWQgPGdvb2RAdXNlci5pZD6JATgEEwECACIFAlObauUCGwMGCwkIBwMCBhUIAgkK CwQWAgMBAh4BAheAAAoJEFziR1JVJq1DG4oIAKjySAa71tZIFPRDLUmvwmGjCJAA e6d3JqFXcK5S10+4j8O5AoiGjCil7hUfMZLm5YUf73F+wH1+ih3Oh2xJbT64qrDe goLrqx0rFJ0pB/A4irSwKKNRq5Qk9qfl6uSbrT2htMinmsrW+4tr9s+Kbj16GGC3 Ts7e7gh+HSCd1lV6dEgx2zVe+ENBEQ4LJWByB5K9nB3d+fnLMaX3eOOiTSuemiHX c8qBu/XER+VNIcoV2IF09gyDOQTvmRQDoZ9AUhjw0l4WORgwaSmZC+rzsjal79ar k94jMKPzKnr3wdRH4uCol34BXV2gvHh0nIXdPNiEy6UV9QayOXi62EWEaOY= =4zoY -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/keys/uid-003.json000064400000000000000000000003651046102023000217160ustar 00000000000000{ "type" : "import", "expected_uids" : ["good userid "], "expected_fingerprint": "25d1a26429b45e34f58cc3a45ce247525526ad43", "expected_subkeys" : [], "comment": "The uid with an invalid self-signature must be removed." } pgp-0.15.0/tests/openpgp-interop/testcases/messages/camellia128-001.asc000064400000000000000000000013001046102023000235540ustar 00000000000000-----BEGIN PGP MESSAGE----- hQGMA3wvqk35PDeyAQwAvP1dJtgZrl4SlRbIiIeNxa2h1KtJVQqnyLim1H2HjnTs OocLpSZqJ7wk2ft22tBF+eumkp08VLNhd2NTFj8+9csZWM1cSXe8+cZcNSa5rYFJ fJY7ZSPDiV3Eg7k6AqC4r8tw3GEjw/VhcCirupp1WMA15EBjirm9vlkkae6VmweQ yxSCp26DljyYBRnj/U9iUhFYk857sUu2Z5RzO7hR8s6/swkeBOq3tX71ck3P+JwK 2V4yALMe0ZSAZUjgc8o/JQItP81Hcwy8cERjjMTw4hdhiiJPpdwwFIjNQSjtOKjH C6BO6unig1AivrcW0X1wjD9K76d2qEDt2SsTiEXcbDuiwjEb3+4rGnjn7j3QH1me lRRgYM9MOCxurJhxDjrryoGF3RTdBcrwGUJ2AY3VoG3Oft10Ca4LMjHLkhbQvxPi bMajbk5gXhrT4TPYUZK4bnR5rz6expJbj8fBF77sshd/xQV9KCLs2ruL7fStqcSD bixo41JJMOTOXznwlaTI0kkB0oj4LM7XEYBd0S40hVmKUp9lvpio6jfdxQhVP5Lh by2PgLx6uOsW9QfJWQVFC/SnRkKKVG7H49kNsgOKWEvy4fD86ykDMm9N =Rc9L -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/camellia128-001.json000064400000000000000000000002731046102023000237670ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "../../../draft-bre-openpgp-samples-00/bob.sec.asc", "passphrase": "", "filename": "camellia128-001.asc", "textcontent": "Hello World :)" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/camellia192-001.asc000064400000000000000000000013001046102023000235550ustar 00000000000000-----BEGIN PGP MESSAGE----- hQGMA3wvqk35PDeyAQv/dmqUkX41389v1472STyI+LsLPA1LrTkuBEQjFTgAfo5c kLI9Vfo2pDcy/IDVMVu1/sthX4WRbMMng6lfXt7809Ba2XA4JwxU1IaXLvNh7ZFT m6gEqleJP/FTVajmBUBKs/O7cieXjoJGN1mZ4cSDWLzwK6AFR3k6oJXODrZMZ630 M697jSkNk+yNzprMrOHM2H0BjoeHRD6o20Mz5RmrUYDbM8OHFox68vPu0KHtFqmo Oqxz6SpaFL1BolhX9kM7UqQGCcio7nRqWhMKtY3JOCCEtQgsLCjnkNMqFFDxDnKR IdwMiMSyqg3QLo0xp2jgKOmHRaHhL6Icj3uE86P8fq10qSxsQkEEvGh3695bp3hk zHPC7ONTNrVw0LFsOsjYUZgxQ09reORR/t32kCjiIjqGTbDBKrvPdancDXrAoLAn 2ne85hx692UbcAZbeiEv7Ig69a0QEDaOppPInx38H0sFMKyCXIy7e9LA9L3he+iR cELJJDd4rVV+amjWrqoB0kkBvQ/JBAh/nDlS82SHdh91axvj7M7yndQ+hp34c50g Ni9TVll8fcDZIk38kk7MXk2ABp84wvzpeF0r5UaA8uyH1X8nu/nOUJiF =H8d7 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/camellia192-001.json000064400000000000000000000002731046102023000237700ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "../../../draft-bre-openpgp-samples-00/bob.sec.asc", "passphrase": "", "filename": "camellia192-001.asc", "textcontent": "Hello World :)" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/camellia256-001.asc000064400000000000000000000013001046102023000235560ustar 00000000000000-----BEGIN PGP MESSAGE----- hQGMA3wvqk35PDeyAQv/fpz3Nc3rl4cKEM46+yAYSjm8eoXPcdGBTlvivteJG6Gn IN9aIFKH9nZWv/3DvGGl1lwS/bJNbFqF8oz2BXO9bggMdytfqNOhvQV2+qy9GjIW 6ciY4rx7FiEesNiDLUhUGPksf0abZ+y3i2wLYsxwl00W0Z7xfyQMd57DFgMP1xMX zGZMIgWXzz+YIn7fDEYDZ613Ko0RGWPU4MFnYRk5br0QbQAa55gdRxODPTfQU72O EAU1kR9uon3FlmTa1FkoHezPJelHsAqAd5whRXfCb3LH4PkizOxEe/1t0XtZXpAP n2a1cL6nwty3OTHpdUkeYwaoMWKxP3dVQjBSdWnkq3QaECzBrsqOK8FshwBALbPc QWX3+yI+b/d8La+MBr2/NHY8hBWr5pg4HBWxTaJaQYYUTLps+s9zafFTaKxxkMJr jV7F4F+URTQXTQe6n7izjcjqkgYw4rHpsBYIyasBf+gQArB/wDR1bj9/uLp/+Mwj rtm3eNtbWEogiZPXLHQ90kkBiq4EiQqGq9hpNFGxV1Vv2FqxbTl7nMtU9y/HfGOk s0acijafNR/RO5iclSYNUoHvMHdvNiGTNQvGceKw3Ikbl8AVQsCs/ZWV =CrCz -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/camellia256-001.json000064400000000000000000000002731046102023000237710ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "../../../draft-bre-openpgp-samples-00/bob.sec.asc", "passphrase": "", "filename": "camellia256-001.asc", "textcontent": "Hello World :)" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-001-decrypt.asc000064400000000000000000000014771046102023000237140ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 xf8AAAB3BAAAAAATCCqGSM49AwEHAgME5D5j84R7ngjS9Zpu631VC3oTDf6vqz3x TUcj5qv8zGBGi8LGNriyNadfKlVzl8zWNPSD+cF5C5m6RWAi4Q1htQABAPe5PbtM EUl2I8QirZ18XKoC0CxUcl0W0i0x263qBlPFDpHN/wAAABJlMmVrZXlAZXhhbXBs ZS5jb23C/wAAAI0EEBMIAD//AAAABYJV0kqy/wAAAAKLCf8AAAAJkBRGxKMWIlCG /wAAAAWVCAkKC/8AAAADlgEC/wAAAAKbA/8AAAACngEAADjGAP9R0mUiXvrpp5vQ xrikqpdaMcQ+kmhxaIet2r3CE4HFcwEAm+ymswcwB7hz3DCtsxipPtrTvXoUD4H9 sP8K8vLBdyPH/wAAAHsEAAAAABIIKoZIzj0DAQcCAwT2dsehrZNlReQUuLZWCj1b RGsxSd7ojS54L6XwYppPH+jF8ALlPll6Qdf/zFHmOrDjgympIT6BWEO+MSzJK5Sl AwEIBwABAK7ZDVqEVkhHnekZmqv15WOumNlVUsgXDb/+okhYbsUxEI7C/wAAAG0E GBMIAB//AAAABYJV0kqy/wAAAAmQFEbEoxYiUIb/AAAAApsMAABBVwD9E3fF+Xot jQ4M6EJkqRhGg6SCKpb/hFAYiiR+mIUbE/EA/3Yx+Pa3hciKEpJzraq9pIYh+xrD 7E/H+G/7nracYdil =L13w -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-001-verify.asc000064400000000000000000000013331046102023000235350ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 xv8AAABSBAAAAAATCCqGSM49AwEHAgME5D5j84R7ngjS9Zpu631VC3oTDf6vqz3x TUcj5qv8zGBGi8LGNriyNadfKlVzl8zWNPSD+cF5C5m6RWAi4Q1htc3/AAAAEmUy ZWtleUBleGFtcGxlLmNvbcL/AAAAjQQQEwgAP/8AAAAFglXSSrL/AAAAAosJ/wAA AAmQFEbEoxYiUIb/AAAABZUICQoL/wAAAAOWAQL/AAAAApsD/wAAAAKeAQAAOMYA /1HSZSJe+umnm9DGuKSql1oxxD6SaHFoh63avcITgcVzAQCb7KazBzAHuHPcMK2z GKk+2tO9ehQPgf2w/wry8sF3I87/AAAAVgQAAAAAEggqhkjOPQMBBwIDBPZ2x6Gt k2VF5BS4tlYKPVtEazFJ3uiNLngvpfBimk8f6MXwAuU+WXpB1//MUeY6sOODKakh PoFYQ74xLMkrlKUDAQgHwv8AAABtBBgTCAAf/wAAAAWCVdJKsv8AAAAJkBRGxKMW IlCG/wAAAAKbDAAAQVcBAIrP/tLo8/in5TsYTohMg+RSz3z4KkLpr64+mUJhuD6+ AQDWN6DYCyQTSHDGKfULHBQjnrQdM2PETTuO7x8LB1mJVg== =B6/M -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-001.asc000064400000000000000000000011171046102023000222330ustar 00000000000000-----BEGIN PGP MESSAGE----- Charset: UTF-8 Version: End-To-End v0.31337.1 wf8AAAB+A2bS8SaRmeQkEgIDBH/1a579gEywUHd7Wq0XZ83f8B5CZNCV/LNwP/rx K2hXqdVLjZGCD9yhcXsMYOJ0CcmfggO/LuYu8FukaUZaZyAw3f3rZbQYVXRHeTs2 aJMUUxIsSsXstXp6k8bQjZEdjT9XEOdYvgIocHTLrqkDdeWW0v8AAADbAZ4G7M+v bYzLHrckQrKTFJQ67L+16PWSR22zshWY8UsWjppXjd1IX3NwcDh7evSetrYTGfj0 WxR4R9iBqCZqQfKyjOQHvdWuUUWE+5VpVfMcoFrp8+pg8C61SneZxADenogWAmor VVL+RudJoJzNHJDSOiZgTNzGa3GjIbpPgRxB284m3/5CqzIkc39YUaKZVSv/TJ1k +s8mFFssgMYfJqlXr6qcgE/iFrx3YZ/ta2mL/Qcc4Iz+TpcGS1RaNTP4WaWizop/ l4CqN2kHKPbS1r7G/BTvnl119y7f =tpVH -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-001.json000064400000000000000000000002451046102023000224370ustar 00000000000000{ "type" : "decrypt", "decryptKey": "e2e-001-decrypt.asc", "verifyKey": "e2e-001-verify.asc", "passphrase": "", "filename": "", "textcontent": "hello" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-002-decrypt.asc000064400000000000000000000016751046102023000237150ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 xf8AAAClBAAAAAATCCqGSM49AwEHAgME5D5j84R7ngjS9Zpu631VC3oTDf6vqz3x TUcj5qv8zGBGi8LGNriyNadfKlVzl8zWNPSD+cF5C5m6RWAi4Q1htf4JAwKh5ESG yPLKnGBcMR8UCrNpPZrYwd1lwu6TdQJsxYqMMpOm07yTpGTJ/zpXowOrikIflbh4 3DP8l3utqt++BkFy+XBTAJ8w7y10RWOvXXHrzf8AAAASZTJla2V5QGV4YW1wbGUu Y29twv8AAACNBBATCAA//wAAAAWCVdJKsv8AAAACiwn/AAAACZAURsSjFiJQhv8A AAAFlQgJCgv/AAAAA5YBAv8AAAACmwP/AAAAAp4BAAA4xgD/UdJlIl766aeb0Ma4 pKqXWjHEPpJocWiHrdq9whOBxXMBAJvsprMHMAe4c9wwrbMYqT7a0716FA+B/bD/ CvLywXcjx/8AAACpBAAAAAASCCqGSM49AwEHAgME9nbHoa2TZUXkFLi2Vgo9W0Rr MUne6I0ueC+l8GKaTx/oxfAC5T5ZekHX/8xR5jqw44MpqSE+gVhDvjEsySuUpQMB CAf+CQMCTlMZHwjV04dgAwEG2HPRBloqTopj7dXwx9FLJUvDclUXbtL5w8y0To07 XCJd2c9K6QQl2lmgflZr7qkaP/kc0kp9w34+tTd/oogFJHZ+rML/AAAAbQQYEwgA H/8AAAAFglXSSrL/AAAACZAURsSjFiJQhv8AAAACmwwAAEFXAP0Td8X5ei2NDgzo QmSpGEaDpIIqlv+EUBiKJH6YhRsT8QD/djH49reFyIoSknOtqr2khiH7GsPsT8f4 b/uetpxh2KU= =JolF -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-002-verify.asc000064400000000000000000000013331046102023000235360ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 xv8AAABSBAAAAAATCCqGSM49AwEHAgME5D5j84R7ngjS9Zpu631VC3oTDf6vqz3x TUcj5qv8zGBGi8LGNriyNadfKlVzl8zWNPSD+cF5C5m6RWAi4Q1htc3/AAAAEmUy ZWtleUBleGFtcGxlLmNvbcL/AAAAjQQQEwgAP/8AAAAFglXSSrL/AAAAAosJ/wAA AAmQFEbEoxYiUIb/AAAABZUICQoL/wAAAAOWAQL/AAAAApsD/wAAAAKeAQAAOMYA /1HSZSJe+umnm9DGuKSql1oxxD6SaHFoh63avcITgcVzAQCb7KazBzAHuHPcMK2z GKk+2tO9ehQPgf2w/wry8sF3I87/AAAAVgQAAAAAEggqhkjOPQMBBwIDBPZ2x6Gt k2VF5BS4tlYKPVtEazFJ3uiNLngvpfBimk8f6MXwAuU+WXpB1//MUeY6sOODKakh PoFYQ74xLMkrlKUDAQgHwv8AAABtBBgTCAAf/wAAAAWCVdJKsv8AAAAJkBRGxKMW IlCG/wAAAAKbDAAAQVcBAIrP/tLo8/in5TsYTohMg+RSz3z4KkLpr64+mUJhuD6+ AQDWN6DYCyQTSHDGKfULHBQjnrQdM2PETTuO7x8LB1mJVg== =B6/M -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-002.asc000064400000000000000000000010541046102023000222340ustar 00000000000000-----BEGIN PGP MESSAGE----- Charset: UTF-8 wf8AAAB+A2bS8SaRmeQkEgIDBDADuEbxHWU6uVgGQ1NgWfsr5t+Y0vG8FKFRHFnI URzfK2r++PiTC5g+RXWjxb5AQIvaiBijtUh5MfLyhiojc9owz6XIhpzWSS4/S+L2 3Ei0vB8SV8FV9nrKnWwDk7YBsvcPknJxIGZDj7NyK+s7mbT20v8AAADYAUtgllVr etD5OHZZQVVQ4MeGQmih9kSztdkJPY/Knweu0EDutpdbSIDYgFKUV92pvCqz9x1h pWZnKupzXpGGKWepYwNn5iDF5dAmeEw0yV54HJI6HohFHpoWW7jn9ZJ3BBCUbFkH eddmaPW/7hHmq0nGq1REO/VxnG+ZF4ehABpa5cURYFlKd/h8XGTfpY1OHRsKOqYN c/9uVvz3H+BabS5cIefARNaMmI00XdNCYP1HecsAmf1riPurLvq10JyvGaFZhHSI 5T4/Jm/qvV3iYB91gO5H7hXl =YAqr -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/e2e-002.json000064400000000000000000000002511046102023000224350ustar 00000000000000{ "type" : "decrypt", "decryptKey": "e2e-002-decrypt.asc", "verifyKey": "e2e-002-verify.asc", "passphrase": "test", "filename": "", "textcontent": "hello" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-001-decrypt.asc000064400000000000000000000036701046102023000247020ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQIGBFQPSZEDBACa+JwIqOqEtTYyaLrIoGghGUFjy87u0tkh9fO90ZJSiRHHseUV 3OiGVAnhYdu72KRojFbB59/PY52WI+MXWxvKhrHRKuTk+/mlt9VJP0aNp0T0rPxN E60tgzmP/CDX3wLfgvO8Bfku3EGzxHhjigU3JlhqqsV+K2bAT5d1cWoMcQARAQAB /gcDCMsY53iE8vBVYCJx9xivcNO9nWDCrtlGm2euydlp5MCZULhFBdUt4/jaB80G /9oCSF5/5VOibbk5d0feuY7to031oS4rOCZMlsjisfD8v9kVfc38aN7c32DdmfJs M5Cujqx0vwwYPnU99dZeCfXIskEsCgLeEeCi3daAa3jgQOJqGVTp3Nu7MQqBaa6N ybbkQs9qbHHON+t+S0+119Q+m6Fh3E7/FgLoFWwNxanQWDpK4qximayeOI8NyOQT 3urrKB36ldcuOXuLn3vpAvfZALos0Y9fLuzMzkYgQ8ghweLkbH01r4GUykjLM7jb kLEB0ihHuRDvwgy77MvkrgqoOReMRYDzgWTisiSVj8OQRhzZ4nHYiyPMKAqUuAhh DNB/X9fA9FSkdf3S3JZMypuZdqsLf9+fqGSsJ0wXD6O0TXoAnoJpKHcp3Py+ps1h +SFqw/2/PKoJShgRXCwbzEO+YTgqNAtTfFHas5BrY45ggTxGug+XMSC0D3JzYS1y c2EtZGVmYXVsdIilBBMDAgAPBQJUkx+RAgsHAhUIAh4BAAoJEATHhwPvv5QWp8oD /jDlPbR4AgpEwLqYOI5dUO0gQoG2G+2JK2qCNuy8SMTMBfiPz1TW62HnmOFz1wWR gwNwIl4+F1qC4o8nxORIKyXJBngUhekSifWoWPyMzp2om7Ipta/dQjKUwZV2fVSt iqqK1u7l1t0pYLs3Giy8V0PAflDKkVIZqw9xCJegK6RanQIGBFQPSZECBACROoHb 3Ayw3PzuW/gZYf/Hv3wEcXAwaUibDhPOp+zdj673txWte7AU9k9aTwzogd2JkL+q RwtWnxR2+ap7BWP+Wkt5qfs7JjVtC9qA+L0mNEEZyiMwYd90Gb9g4uZCnxTSDhoD KL5rMlyEmWHgMLJyw0kk27IB4xkfH6ncn+wWhwARAQAB/gcDCMsY53iE8vBVYHoS jBkk3Dtxz27pYZnbYLVyQjSsT+O55w8fU/kx88txHbyuljhIKK/R66/ejErGOP6v yKptsEnjglZjspyNWd4K4cxx9mkdo/2iNcrvH96pDprmWs1hQEqae8kUmx52daCS ljT+VPrEv1iDgDoJ3QpQ5x56EQnb5w0LYYshOFpWeQuvuklRwIjvSAVcZ6sNm2lB N+uwgjH/Gw+I3i7yoSHiQucfUpqrmczsDxQ0LrfdWeBKTFLjqgNzDiOAh8RSX3A6 0j7nAKZVqWwC3WInGs1YxdBmQ5nCioCaplOLlJmc2+HMGQmFqjoSxdul1RGCt0D8 QVsaU3n/zIbOnf1vLYTYWyALg/KbV4j40STSHA2zQm772X2BxAOP6wzERbXJ1MUt o1Zt7aYRtU6MBc739H32XtxoGbyIGmAxUUBljUq+oMk5BoZo2YuCD4nk48ry+lrR UrxgQ1AVisxye9dLSXekE4MCCGP1ysMjnCGInAQYAwIABgUCVA9JkQAKCRAEx4cD 77+UFiFKA/wOG2PxB1iDtDeLAUfOP0zMx6qBQfWCyWldKze/bom5SwbLT42+Aks9 B0RU6JKdd8WfwTlJyQeM56aUe1wPwVHBe+zTG+XvsYree3rQHFEgHTN3KEPHc6Ec QqrhcYJ4IBFau0avBvi7QjsSOvePvIKFO/DuDIECRpLZjRW+VKisag== =hU9G -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-001-verify.asc000064400000000000000000000016671046102023000245400ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mI0EVA9JkQMEAJr4nAio6oS1NjJousigaCEZQWPLzu7S2SH1873RklKJEcex5RXc 6IZUCeFh27vYpGiMVsHn389jnZYj4xdbG8qGsdEq5OT7+aW31Uk/Ro2nRPSs/E0T rS2DOY/8INffAt+C87wF+S7cQbPEeGOKBTcmWGqqxX4rZsBPl3VxagxxABEBAAG0 D3JzYS1yc2EtZGVmYXVsdIilBBMDAgAPBQJUkx+RAgsHAhUIAh4BAAoJEATHhwPv v5QWp8oD/jDlPbR4AgpEwLqYOI5dUO0gQoG2G+2JK2qCNuy8SMTMBfiPz1TW62Hn mOFz1wWRgwNwIl4+F1qC4o8nxORIKyXJBngUhekSifWoWPyMzp2om7Ipta/dQjKU wZV2fVStiqqK1u7l1t0pYLs3Giy8V0PAflDKkVIZqw9xCJegK6RauI0EVA9JkQIE AJE6gdvcDLDc/O5b+Blh/8e/fARxcDBpSJsOE86n7N2Prve3Fa17sBT2T1pPDOiB 3YmQv6pHC1afFHb5qnsFY/5aS3mp+zsmNW0L2oD4vSY0QRnKIzBh33QZv2Di5kKf FNIOGgMovmsyXISZYeAwsnLDSSTbsgHjGR8fqdyf7BaHABEBAAGInAQYAwIABgUC VA9JkQAKCRAEx4cD77+UFiFKA/wOG2PxB1iDtDeLAUfOP0zMx6qBQfWCyWldKze/ bom5SwbLT42+Aks9B0RU6JKdd8WfwTlJyQeM56aUe1wPwVHBe+zTG+XvsYree3rQ HFEgHTN3KEPHc6EcQqrhcYJ4IBFau0avBvi7QjsSOvePvIKFO/DuDIECRpLZjRW+ VKisag== =fTBV -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-001.asc000064400000000000000000000011271046102023000232250ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1 hIwD12ikFTpzJsMCA/45blJctJzKPQ1n5IUiCaOqEB4x+Vd1XviFD6mYqCnIbu2n zA6KdVDmdA865N/PUwDzvUIijvIOCZtcm+YjYewzQZ92O9JNqxvfIGdTILxL5LOd k9N07DMjIN+b4vh/2H2E8bWctYrni48qG7oR85F80h9InPxlRc/y0aS0wo26GdLA LQECgYWF77t7FVRBIPewfJHlacJsgqJFeuFw2K1SYYMGB9kbcdUJbkKzD0AX5gco WGoSlEPhoTMin20KQ48mochf6qEL+jI1XCPTAlwURm0Ifd4bthLzfApVFtCbc+f8 66AKIGi7nnZIwdApN6GalEql6hH5KEiR/s7eNfZ3ZHig2oi4W03nSCiDbHE50GD4 jF0vUEorTLm0Si2rG7adQNWJL+HgLSdS9vvG7kI3vla5lnpTlvcbuxTDGHl3JYoz zbHR0aWTnV3UspMr7xkuXGRrf6bbRcRsYageinoyItK9Of6W/iFI/sKk/yAXsg== =UCdE -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-001.json000064400000000000000000000002741046102023000234320ustar 00000000000000{ "type" : "decrypt", "decryptKey": "gnupg-v1-001-decrypt.asc", "passphrase": "test", "verifyKey": "gnupg-v1-001-verify.asc", "filename": "hello.txt", "textcontent": "hello" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-002-decrypt.asc000064400000000000000000000026241046102023000247010ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQGqBFXSGM8RBADT7HPZcqdDWFQ+QAdm2YbfWmzSrpThJyShrpRj3ldQ0TgKBYI7 lv1Ey5+d5Tg7tyWBM0k2kH+dSt5did/u5P3QZEGOvxglb7VQDJDRtP7Rcnhl9+cg 7mMkJlvX5J8aVxC9IaYytS8KfAsBYq3y1yFrnKzuGhCwyYLW4qvTKOdkIwCgsFdw AyHthz2OYH3kgSzMfrFaZjcD/RN5HkNpr9y7sd5IwNclt2SrROchvh6/m3ikyWDA 2MC4j8c0ZaEUYPqi+Rc4iN61VR+efEc3ObKQLYk6/RLP2fs+a8vmycXwovQxK4wT qv4LPFh+elOBas2nCHlxr8cYkToSn3rQrT0U6vcVvbzpqaAXGon3qfKw9itq5BbP MRk8A/9I4702YIjPaTCMgm2OlTFnDQ4cbGSaNec8/1hnoAS9kdk8SHs7kNZNT6sm b7YJDZ4oo9J5pMgE8FR68yoMfxNxc3xq+g7RsoC0LXW5lfcIFmyoX/IP7USTwSzh cZSIrO1yVIiM/RveLOT+fVSE0yfDmQjLkIBQTFhb5+OXgfMg3P4DZQJHTlUBtBtk c2Fkc2EgPGRzYWRzYUBleGFtcGxlLmNvbT6IYgQTEQIAIgUCVdIYzwIbAwYLCQgH AwIGFQgCCQoLBBYCAwECHgECF4AACgkQXSenmCSA0wZq9wCgm0HkB7E2noY4gapo wd0QE3HAG5AAoJr3GqGGACSwbsOzOyOQiq76svTfnQFYBFXSGM8QBAC01kOkveFc e9Xy2KAJNhqM4KfJUuVEzsyQB7ho3lNDCJ/bR6z0zIcYH9XQaUcA/PPsiENBlEvo RaeEaJkWsEyM0Y3KUynqVjQHQtvSQvLbdIyHFWsBBJug64h/QvcMNBtCe5eHDHeR YvWKh26Xvankn6Py64/LZCFe+uBhOrnkJwADBQP8DwD+TGRqNN4BgGCdGIXjbgPs MK8Ym88p3I/9LKAplCf9ccOpkpPW/PYyDIrZVvcLPMLXFT36Y7Fgu0WqL+f6PkA9 0wFnoghF87SA/USrtGBNdKkGd815dVIMXV6FM8sCCpHhx5ZM0XyEvvUbusQoZh88 iVVdDwN9LgATd+eRD3v+AwMCEzw9Dc0KfRhgGr3VKRRBeb2eHW996rDiS40WqhYS SxjMbKTPu2pYTGwmowMoLRkXSgqEnedfH7eQ2RsGubL0odF5rU1uZoCISQQYEQIA CQUCVdIYzwIbDAAKCRBdJ6eYJIDTBgu8AJ4+uAc83lGBDj+/VWv+1i36S8r81QCf Q6kFRmk+3A9TmKjG4gAhie6qP20= =vQ/w -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-002.asc000064400000000000000000000010471046102023000232270ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1 hQEOA3Zq//5E2JjsEAP+NZeNQ4Q6NY1u9O12sbZlWWDWHwOmtFDiNShyH0u6orX4 WMTPM+/NpQy+ZTnAqhF1cn012wX6vo9Wdfqgf/k/YcRCKXjOT9VMv8APm5fouV5T U11HG+gW1j/IZlRBuM4GXX8M6ebbBlYPrmfsVzy4HWeiXRR2sdkMT9CUzHS7J+ED /3EU/vJXywRN5Do6pJiIbT2THrXixmz3/WL7KyOsydLQq1R/lisStvpb4JFUh3pq PCj4c+XPu2X2JHjlOtMjdOsI0o8bRGN+fgf8TYdvy2303V4aemugmyGO0Obd2Rd2 40yjQ13bqkLUlgYNm1NzLZlb7MUuWQ0WB3gfzthNtiVv0kcBtV8pWPtBN0xBn0Ti SqreJYcNQANZSUB2DmjPGhqPD4S8ilFk1Gtf3hRLKNMZJQLg14GpowdNZDLrggG1 E5VIby30oJ8ZEw== =mqRb -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-002.json000064400000000000000000000002241046102023000234260ustar 00000000000000{ "type" : "decrypt", "decryptKey": "gnupg-v1-002-decrypt.asc", "passphrase": "test", "filename": "hello.txt", "textcontent": "hello\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-003-decrypt.asc000064400000000000000000000036701046102023000247040ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1 lQIGBFQPSZEDBACa+JwIqOqEtTYyaLrIoGghGUFjy87u0tkh9fO90ZJSiRHHseUV 3OiGVAnhYdu72KRojFbB59/PY52WI+MXWxvKhrHRKuTk+/mlt9VJP0aNp0T0rPxN E60tgzmP/CDX3wLfgvO8Bfku3EGzxHhjigU3JlhqqsV+K2bAT5d1cWoMcQARAQAB /gcDCMsY53iE8vBVYCJx9xivcNO9nWDCrtlGm2euydlp5MCZULhFBdUt4/jaB80G /9oCSF5/5VOibbk5d0feuY7to031oS4rOCZMlsjisfD8v9kVfc38aN7c32DdmfJs M5Cujqx0vwwYPnU99dZeCfXIskEsCgLeEeCi3daAa3jgQOJqGVTp3Nu7MQqBaa6N ybbkQs9qbHHON+t+S0+119Q+m6Fh3E7/FgLoFWwNxanQWDpK4qximayeOI8NyOQT 3urrKB36ldcuOXuLn3vpAvfZALos0Y9fLuzMzkYgQ8ghweLkbH01r4GUykjLM7jb kLEB0ihHuRDvwgy77MvkrgqoOReMRYDzgWTisiSVj8OQRhzZ4nHYiyPMKAqUuAhh DNB/X9fA9FSkdf3S3JZMypuZdqsLf9+fqGSsJ0wXD6O0TXoAnoJpKHcp3Py+ps1h +SFqw/2/PKoJShgRXCwbzEO+YTgqNAtTfFHas5BrY45ggTxGug+XMSC0D3JzYS1y c2EtZGVmYXVsdIilBBMDAgAPBQJUkx+RAgsHAhUIAh4BAAoJEATHhwPvv5QWp8oD /jDlPbR4AgpEwLqYOI5dUO0gQoG2G+2JK2qCNuy8SMTMBfiPz1TW62HnmOFz1wWR gwNwIl4+F1qC4o8nxORIKyXJBngUhekSifWoWPyMzp2om7Ipta/dQjKUwZV2fVSt iqqK1u7l1t0pYLs3Giy8V0PAflDKkVIZqw9xCJegK6RanQIGBFQPSZECBACROoHb 3Ayw3PzuW/gZYf/Hv3wEcXAwaUibDhPOp+zdj673txWte7AU9k9aTwzogd2JkL+q RwtWnxR2+ap7BWP+Wkt5qfs7JjVtC9qA+L0mNEEZyiMwYd90Gb9g4uZCnxTSDhoD KL5rMlyEmWHgMLJyw0kk27IB4xkfH6ncn+wWhwARAQAB/gcDCMsY53iE8vBVYHoS jBkk3Dtxz27pYZnbYLVyQjSsT+O55w8fU/kx88txHbyuljhIKK/R66/ejErGOP6v yKptsEnjglZjspyNWd4K4cxx9mkdo/2iNcrvH96pDprmWs1hQEqae8kUmx52daCS ljT+VPrEv1iDgDoJ3QpQ5x56EQnb5w0LYYshOFpWeQuvuklRwIjvSAVcZ6sNm2lB N+uwgjH/Gw+I3i7yoSHiQucfUpqrmczsDxQ0LrfdWeBKTFLjqgNzDiOAh8RSX3A6 0j7nAKZVqWwC3WInGs1YxdBmQ5nCioCaplOLlJmc2+HMGQmFqjoSxdul1RGCt0D8 QVsaU3n/zIbOnf1vLYTYWyALg/KbV4j40STSHA2zQm772X2BxAOP6wzERbXJ1MUt o1Zt7aYRtU6MBc739H32XtxoGbyIGmAxUUBljUq+oMk5BoZo2YuCD4nk48ry+lrR UrxgQ1AVisxye9dLSXekE4MCCGP1ysMjnCGInAQYAwIABgUCVA9JkQAKCRAEx4cD 77+UFiFKA/wOG2PxB1iDtDeLAUfOP0zMx6qBQfWCyWldKze/bom5SwbLT42+Aks9 B0RU6JKdd8WfwTlJyQeM56aUe1wPwVHBe+zTG+XvsYree3rQHFEgHTN3KEPHc6Ec QqrhcYJ4IBFau0avBvi7QjsSOvePvIKFO/DuDIECRpLZjRW+VKisag== =hU9G -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-003-verify.asc000064400000000000000000000016671046102023000245420ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: GnuPG v1 mI0EVA9JkQMEAJr4nAio6oS1NjJousigaCEZQWPLzu7S2SH1873RklKJEcex5RXc 6IZUCeFh27vYpGiMVsHn389jnZYj4xdbG8qGsdEq5OT7+aW31Uk/Ro2nRPSs/E0T rS2DOY/8INffAt+C87wF+S7cQbPEeGOKBTcmWGqqxX4rZsBPl3VxagxxABEBAAG0 D3JzYS1yc2EtZGVmYXVsdIilBBMDAgAPBQJUkx+RAgsHAhUIAh4BAAoJEATHhwPv v5QWp8oD/jDlPbR4AgpEwLqYOI5dUO0gQoG2G+2JK2qCNuy8SMTMBfiPz1TW62Hn mOFz1wWRgwNwIl4+F1qC4o8nxORIKyXJBngUhekSifWoWPyMzp2om7Ipta/dQjKU wZV2fVStiqqK1u7l1t0pYLs3Giy8V0PAflDKkVIZqw9xCJegK6RauI0EVA9JkQIE AJE6gdvcDLDc/O5b+Blh/8e/fARxcDBpSJsOE86n7N2Prve3Fa17sBT2T1pPDOiB 3YmQv6pHC1afFHb5qnsFY/5aS3mp+zsmNW0L2oD4vSY0QRnKIzBh33QZv2Di5kKf FNIOGgMovmsyXISZYeAwsnLDSSTbsgHjGR8fqdyf7BaHABEBAAGInAQYAwIABgUC VA9JkQAKCRAEx4cD77+UFiFKA/wOG2PxB1iDtDeLAUfOP0zMx6qBQfWCyWldKze/ bom5SwbLT42+Aks9B0RU6JKdd8WfwTlJyQeM56aUe1wPwVHBe+zTG+XvsYree3rQ HFEgHTN3KEPHc6EcQqrhcYJ4IBFau0avBvi7QjsSOvePvIKFO/DuDIECRpLZjRW+ VKisag== =fTBV -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-003.asc000064400000000000000000000011271046102023000232270ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1 hIwD12ikFTpzJsMCA/45blJctJzKPQ1n5IUiCaOqEB4x+Vd1XviFD6mYqCnIbu2n zA6KdVDmdA865N/PUwDzvUIijvIOCZtcm+YjYewzQZ92O9JNqxvfIGdTILxL5LOd k9N07DMjIN+b4vh/2H2E8bWctYrni48qG7oR85F80h9InPxlRc/y0aS0wo26GdLA LQECgYWF77t7FVRBIPewfJHlacJsgqJFeuFw2K1SYYMGB9kbcdUJbkKzD0AX5gco WGoSlEPhoTMin20KQ48mochf6qEL+jI1XCPTAlwURm0Ifd4bthLzfApVFtCbc+f8 66AKIGi7nnZIwdApN6GalEql6hH5KEiR/s7eNfZ3ZHig2oi4W03nSCiDbHE50GD4 jF0vUEorTLm0Si2rG7adQNWJL+HgLSdS9vvG7kI3vla5lnpTlvcbuxTDGHl3JYoz zbHR0aWTnV3UspMr7xkuXGRrf6bbRcRsYageinoyItK9Of6W/iFI/sKk/yAXsg== =UCdE -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-003.json000064400000000000000000000003271046102023000234330ustar 00000000000000{ "type" : "decrypt", "decryptKey": "gnupg-v1-003-decrypt.asc", "verifyKey": "gnupg-v1-003-verify.asc", "passphrase": "test", "filename": "hello.txt", "timestamp": 1418941207, "textcontent": "hello" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-001-decrypt.asc000064400000000000000000000070631046102023000252620ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Version: GnuPG v1.4.11 (GNU/Linux) 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 /+yGzcqh =no9X -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-001.asc000064400000000000000000000010431046102023000236020ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.11 (GNU/Linux) hQEMAyMlJx+Vv4ahAQgAqbwswoFj74SdQZNLE/yUDV2tmNBmMgBIwSVTg3Rn0hUT pFsxeEs/uM7GIurwXeiqja5dZAHaLIqCEnH+E1D1+CHB6ndqYnvro/hfk1AnT2gS SjTmUEsYPgIMSX3rKCtZS/pb9JxvrhodNePZogAvgNE4lwu6zqNmEe8yKGs5wFiL TtDw/XD29e/3NSrWHd0TKyERNuM3TR0K7zjJcSFAV2VGoXdXcZEgZXUzCqnAOboi G/KTgPS4p0Gm81Yt3mEMl/XcW3x7dcFbK7uT4rZQVVWukYgQHMSFY4boJcA+UwuS Fp9e2d/DoYWDlkde43+QJ4/FNAMGwzn5I5LfTyhoG9I7AUmTdjb70bfOyHk8d8oG 4o4zSSr+f3ix2PN3q3Hcp/5UDJx8PR2EqbwByLm1bAx01RZGoBtYDhZdu3I= =ME+d -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-001.json000064400000000000000000000002231046102023000240040ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-002.asc000064400000000000000000000010471046102023000236070ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.11 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/bRV1Hn0enCwM7oTy9381kSTC/PKATJH4za6uJsReTWo3 tQNizwBF0oa5ZEq36OSB3oOcmqmdF5asUCXX1/hR5/kxqnTrhMs4hqrgXj+rQkCf ecrp/LMceiVCHcgav7j4eLF2YABE+ABAHmyyi7uiZJVV/Y8EkCL7bh98ypUxXCVW Tl3BJuOdw0nhdIh7JjAghrQeikrSKoTgsQCVMBfosDqXepdMfCIZ2kt80g6ELVXs fKILr5DXGz6ueqVvxIjBbdAeP21+tBNq5qMMFnCooQGq4F+rABfDKbDrAF4EugVN VV2taK4FwW4ye1qZ0zc3B8wMQYopLyPQGJ3oQguWhNI9AYpP5cj2aR0D7qZ64v4X Qi8oEg3FpLI936JxT46ukkSeMD35Nvc6JZkjpmF93b9bqDfIHEJNvJl1B90yGA== =PSpi -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-002.json000064400000000000000000000002231046102023000240050ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-003.asc000064400000000000000000000010371046102023000236070ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.11 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/Rz9MUT6vO5CMuA5TpXeHWHvOI5BKyYWK62dLAFFMwA+5 BmT9SvD6zno0qcXc9RcyshfifLl7RJ5WFRw7qCqTNSUORTCs3SzBonz6GBl6Q22y ej4A1I3NHaE04P9MS7rqgTIR5A4Bsl8ddBXwkzIisfL8Tln95V5KWbFCSrAPQW6y tQkVWRsW3Evgit3ncZaZuCfQRnyHKgTISmgxi5c6CFKuDOKjqXH+vNeeJXB8UJwk srD1WG65xfz3jF/1bS93dVSFvap8/IBmbc8yJD25kG+nzvIwy5lguO0Hnbmybu7Y Rac3C6KTtmDhF/mMlMjEezHUUdKBURbqFM/QnJSmB9I5AdlXZyhC0lbn2sAVNq4L zdjmaEazJ+6JKx7Wqkh3i0RrWrik86Iy46o6Ou9lCTrqb/eBA1JOZfK6 =JUD+ -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-003.json000064400000000000000000000002231046102023000240060ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-004.asc000064400000000000000000000010601046102023000236040ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.11 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/bPA19e14IKz1IPKk8yZ2EcB88XOGhJmoxsHDxB3e9dCf ZHo6dnX0zLwxZO4q4oIGjVBQRwD4LoMmFIZM11xLBEufvUth+jxVZofHT0aI4sBT zYnB+VOT8rAXeoZpCh3Ytgy/zSQ04DuYtCL1sKA+fnwiIRtosbQEh5ybGvoGBjuM 9hzQ390NGnaTkTfSPFE+qhdkCFWtt0ptZ0JmInBX/eU1gftEydU96wWLGJn9HzPr byI9IWOMI3d5eVxCHHDlqgHiSLYdEMHZZQ8e01AUAIQt7PkE8gywOGfpkCP00Zcx PNtES/u/qg3YmAMa7JCsMlu+sU6l076Tb8HV8RnSCNJDAaIemQkcjpyB4cqYLP4W knwSdO5eZmAVZCXSd4FlvA6zmIel7dTeu8QEht3D+492+1b4xuS2sapDWsctdTAZ ZK0eBg== =v6ko -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-004.json000064400000000000000000000002231046102023000240070ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-005.asc000064400000000000000000000010331046102023000236050ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.11 (GNU/Linux) hQEMAyMlJx+Vv4ahAQgApvhFQD1nK7fhjNLTtyZnXKqdhBfj/X8Jfy+qe3sVjwcM HB0VqpJz2fQ92QcMA9c4teg/p72JTldxow1iaiJgGYUW4mGeXX1IvnV04jO1NaZL /ZECPjcgmtjUePzyS/tWZ+am9ag0iY/Q1G4PqlgtWxI3XWGKk/fDcUp7suopNTD3 9xADS//cC4OMq14Pgd5LN9LYyoj51fCEN671Yz3//DfRUqlpKM05apPE1u8wHF3b svNOjIXN3eqa4RxZFzP8xcGeIcERw+aWH/zi5ffmHIMgd5huiKfO70mmXZLQPj3l SbHL3Gq5B4ryzBV6zUu8LOrv/YUGUik8h3lFEaZqwdI1AfrZ3VQNN30G/VE+iJxT 2KFIFVt4ktH5eYJ4a49f0KXNyWBKkBrhj0QfSBbqBrClyS+dcjY= =TXu/ -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-005.json000064400000000000000000000002231046102023000240100ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-006.asc000064400000000000000000000010271046102023000236110ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v1.4.11 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/T4OLPgmLU6T+PCT3NEUuIGO1/Sww+2c6qsx1cLMCe5p1 U8fgja4qAZc0b9Nao4qxLzJajoQL5dEH66lhrFNcPYoi3iug2766MD5ZklQH1wzC gM6ZmwzgxnG+QAHrktB7h9SfmxTBf51Sf0BuxBhmWdOO4BTbfhkXHEZXlHw/k6hm AycJO1G2B8WKh5J935mqOHQPzOpmDCUGX5hWm6rjwQciSjGnhXqp2paLa/FIKTm4 dv+5TGINdW2KEi59IiJVmF79SoDg71bg6socRLPOBETY5Xg3s76Y6TSUKZL79Zky CUy+vJlOE13cX5h3pl1dK2BMhgpy3zrDCF7I8AfIPNIxAUuy0u4ywgh0/bIzsoNr n0SnSiGPKK39YtzHg3hajfFUJu093VKahZbClIOmuxQtfA== =Ir/t -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v1-4-11-006.json000064400000000000000000000002231046102023000240110ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-001.asc000064400000000000000000000010271046102023000236070ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.17 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf+NaZdd6Rs3YAYrNyqmtr2ZspCrIZPZYbIR02ObLOXC0SF Z8NON7OaI8DsHAfyDwqukzb6JwS8Vzg5lE2O27bvXIR1IpWucz5uqFdHpxqUgf0P 6hOESH+pL4yS+NU5TzDf7HFby+8srLjfC4Ppml4WVD9EjzyVNpTJNTwg1k8XLDmx sp3ttUNHb2sxKK52ovCxDdSgd/GS43dZ2MxZPS+o5IdxdKsVGSu3wqo3HILWDRYC cbToWgIT2McwdaS97nLVINUAkLsMx6alSn6Rc05x7omct6Iuwd9zIZH/f2wwzaj1 YozrQOXFht0G8t84Tzf+4dHtsLG0xHVb08M0RUKXrdIxAXOZwQ8QCnqeW388p8xs EimOf/a7yVnK/EJpqSzbjM9aS1jQC28xdNK7M9jwPRKBbA== =R3Gm -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-001.json000064400000000000000000000002231046102023000240070ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-002.asc000064400000000000000000000010471046102023000236120ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.17 (GNU/Linux) hQEMAyMlJx+Vv4ahAQgAk4hSlSX6O4FdZlVo4gbrpmMUhiySST2bbvipt+WbBZo5 A8VadC3JUjdsAYhRl5ieQkounqBkPycPsDgwnDzB8hStJEHtx0wuR4UMVoI0bzJZ hzGktEQqfmc7tnGkyFTHPfvG2L9/odiFJavkC7Z4ih3+aGUdhWXeaGswoODzFT3n LKuKXvMOXnFww1NUOWnfpZVEpNNIsboRdxKxKnytkpxOzTWAMNOnfdviaFzHfKR2 tA4sLinkkYAj2QcsiaRZv8NVLF2sF4gVb4aAjkxMSqQbgcuBVigNj4AOcCxbV6Zq ZycZTRQRzpqlIvA3bmCBHPz++mozL5nCwDPCXxay9tI9ARJTesk2kucgKGwz7Sa4 RUA8C3Fif7l8/lnx8FualFRBD4GqrMo0x6SOEJiKHjVa70VAnd5wvFwVIubEAg== =z+1Z -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-002.json000064400000000000000000000002231046102023000240100ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-003.asc000064400000000000000000000010601046102023000236060ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.17 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf+OWfXfgVqDuqlLgcx+4zqO9BHblmkykaBELnXgDHThMqo rmDwk9aFLceCcfzAgnBKZJ1bv814hlxgfMlCSzIJATmJ9eu5qneJdCrZAgh7MUGD UjUVX/B7Z8zGl6CjYbc3RQF3Lr1ARy9xL0hiani5+5O+XVqq5+MTWS/NJgW19fEw uHXdIWPHCXlThQi+gOSWWGMG5mlGdaFebmHTIEoG9Ve6XVX1cWgW7k+f07MIKHJW HrGsbivCChrGk8ziucGIE+DxxQVEu/gS4epCotzs51arcwQ61UaN+ExVS39TJ0af AD6YIN4pXJ/am04zhPYxi4vu4PZDl4xjvgzfLWMEqNJDAUmzTD8zEWvO0C0nyYKT ibDD/eVmi3kxVlEeXrrtk5RaeMdWmwyFUjrL7sSW6oDyYQRlJzkJgoRECUmsg+7B VFZTZw== =9i8p -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-003.json000064400000000000000000000002231046102023000240110ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-004.asc000064400000000000000000000010371046102023000236130ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.17 (GNU/Linux) hQEMAyMlJx+Vv4ahAQgAspD3RYFI8wumXMDRLTwvVdyMZYoRM6KAX1zy1X2h52kA k3Xl/BVIIkQgwKtv5Nsz/0sragK6Q+ay25BDPwgMqGaiGWE/nTrU82GvJ9jcqESO 5EFtxlaD1H5KMb4NqFESxiE4I2A3gWMph8Byw7ZJmMvfxgDf9efSLVqTAqOI7AQl t93myZP7h+olJ2PxSGjgiK3xLGrz7sv+hPwz+fw0t2Dyd36yWFSIQ4lTMHWpxDdB BhvHEZBnldJCDUzqZq6HyDpyhCj3SdFkBWd46vmlJtf07E0fiDz2V7LCKNIbcREw B+df36xTXSIwgH0VwW3pFkflYcOwJ7ARCbY4KJ4I/9I5AdBflhX42hMrgVv7unAl C8vACYa9mRkZf0nCv/nhXGvznxt7V3Q4vGF4Kh2knr2mjRA/EFJRxUvI =bX7G -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-004.json000064400000000000000000000002231046102023000240120ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-005.asc000064400000000000000000000010331046102023000236100ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.17 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/Z9VvqOX3nMVC78YlsuHR+ZTh4Qx8RBq/6hcw+DtCwfLK ssjmj0XemXwC3Tdzbdx6/AXsrUWT2VJ/3AlHyf7Vo2NnKx/WIBygfBd5FgsjR7ZY ltAnufQLMj7m5/a/uxT2amcEhCGR2ba6MdMp5oWpbigpZO8RiuhHSl8vg0eeu0Ms U9JSu7mBv6rOE2E7gi6yNflXAZmTT1DNNsbg3Ta5glMkBTG2Zh4/+gzd4IU3E1KT KG+6dJoC3CUI3qSJHkbX3jrEn6VTdXffhmQ51QphwOpUrlIMGVeKlaYySleC1jeU ZIxOHkO1cUOvJXEsrI3ECKgqtU/mwBhkDqOEdLP+T9I1AUJ8x86q5rJV4CDxAEh6 4nxinSZSV+4N+/odyACTq/px2qo3IovfDI6da10dBohYydzuEdE= =69PI -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-005.json000064400000000000000000000002231046102023000240130ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-006.asc000064400000000000000000000010431046102023000236120ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.0.17 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/Xp7JthwgYyc9fpuyoOU8STN2fUyfuYxaiSi3yVmGNMXP IDs99IgOwwcIzRigj855t+Lx9lkvP2M0pmhtpA2PZ7CQAfcQ8OVV6t2zj9Yzlysd FFvfalUdARGJiKasG5f3pUvcXYvrU3n9+Xjo8LxGC5QP/u3s5K/7qFsoMalpH1rE ey3p/pVnLSInbILqQnvg94Ps9wQ7PBwl0Li/1YgLsFN1QXRpzjkc+9XpBzY9J6uE E3ZfH2Bm27rpHsS+PaFTKnMS4bRRLANSCyXH06u2CBGYMKgiRYqHVIro0vZ70t8M 8o4L2rD9TZct6fHBHSP8gF9Uhi3GW2nT4G44IHC8YNI7AcR2cl3mu6b1VUMGhRZL XqK648IMIjf8Ic0omn1m3jkr/SdCDVSTtqZH7SXblLtIPQ0MiIYON8esv3A= =DBjN -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-0-17-006.json000064400000000000000000000002231046102023000240140ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-001-decrypt.asc000064400000000000000000000016671046102023000252070ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: GPGTools - https://gpgtools.org lKYEVYfzzxMIKoZIzj0DAQcCAwQEkXu4nElf1Kfa+aP0rb9CJHWYFv9mgqvysuwH 0Hwni0EAFx83YYTQSRBUkbqCysbzjhORwYBhualBtMr1kHFS/gcDAoSM9kn/OTjn 3pUu5j6WBSzUOihk1cPMnqcaUC3ME1sfxh26xLSvMtBbcWG6jzGdqf2e8OGjb50r /xp83kY25gRwz6ZJ71oBFhF4AxbxDusXtC9ncGcyMV9wMjU2QGV4YW1wbGUuY29t IDxncGcyMV9wMjU2QGV4YW1wbGUuY29tPoh5BBMTCgAhBQJVh/PPAhsDBQsJCAcD BRUKCQgLBRYCAwEAAh4BAheAAAoJEAgYyjpVxmauVRABAMf4ZCDDdDp+1scv+NGB 7k8r9dtc/9QcRUUnsiNa4yRGAP9LK5ITIA+PV/vtB09QmpCP/9aOpSZzKyfjceQl e7CWopyqBFWH888SCCqGSM49AwEHAgME7mKFDQJzG531qYVj8NV6vhQL6bKpgpPl 5FqayFy1BhFv3+2EBZWJr9T24zSB1frLY14iTss5Mt3rY3ySVwiPugMBCAf+BwMC cJF5wcOj4hLe0sq3Tke6GLMUaoQ9WIvBxI8EQTvzpeCC5CDvFdE9br6dqXKd9tgY 7Brh4jHQjxAP2coq9LEzfCIAeb8GHyuj4koI3LXplcKIYQQYEwoACQUCVYfzzwIb DAAKCRAIGMo6VcZmroLRAP9Hp6IOOMn9EVpsciIEykv74rLmWN/qFAVplmgx2Ttv ogEArLOz1qvB+ekNqKjuootKKy1TF3bY6q3VAEAzGq5CPtQ= =AZJ5 -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-001-verify.asc000064400000000000000000000013221046102023000250250ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mFIEVYfzzxMIKoZIzj0DAQcCAwQEkXu4nElf1Kfa+aP0rb9CJHWYFv9mgqvysuwH 0Hwni0EAFx83YYTQSRBUkbqCysbzjhORwYBhualBtMr1kHFStC9ncGcyMV9wMjU2 QGV4YW1wbGUuY29tIDxncGcyMV9wMjU2QGV4YW1wbGUuY29tPoh5BBMTCgAhBQJV h/PPAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEAgYyjpVxmauVRABAMf4 ZCDDdDp+1scv+NGB7k8r9dtc/9QcRUUnsiNa4yRGAP9LK5ITIA+PV/vtB09QmpCP /9aOpSZzKyfjceQle7CWorhWBFWH888SCCqGSM49AwEHAgME7mKFDQJzG531qYVj 8NV6vhQL6bKpgpPl5FqayFy1BhFv3+2EBZWJr9T24zSB1frLY14iTss5Mt3rY3yS VwiPugMBCAeIYQQYEwoACQUCVYfzzwIbDAAKCRAIGMo6VcZmroLRAP9Hp6IOOMn9 EVpsciIEykv74rLmWN/qFAVplmgx2TtvogEArLOz1qvB+ekNqKjuootKKy1TF3bY 6q3VAEAzGq5CPtQ= =6AIQ -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-001.asc000064400000000000000000000010051046102023000235210ustar 00000000000000-----BEGIN PGP MESSAGE----- Comment: GPGTools - https://gpgtools.org hH4D+Jk05NgROxsSAgMEmmA2SWhvLNxtvvgM7UTS3wHKT+9Qv4nohN068VclO99w wt8gXklfc4jMuer2N0alB6j9lxz+bF9s0CDJXar2QjAVj6L+7vSnlTUbRgeaA5+/ tyKbxTeiMjMXN3AVpJbfJVFxIzbZDrb2WC7E68yOAZrSrgFosdNQtnDLR6z7dtlw 0aBBf71JC7K5OpnHCNxHG6yfuqwJMtdsTSPxxvq2OlQNO2fA4NEdOO5nco+ux4eX PlBJOeVq+NiKUwXLl2IH0N+9fgTnUCyXRabmOMvGtck9YyjPSayyFhIiVKa+Am49 xPX3qHTf9i7qJ2VGK+2B/h7ReJaTx7E4o2vzlGwRWJ/xvb1Qui1ixKRwjn2/+yut EVo2ay/cyIJZs8+t7NaE2g== =zSfU -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-001.json000064400000000000000000000002751046102023000237340ustar 00000000000000{ "type" : "decrypt", "decryptKey": "gnupg-v2-1-5-001-decrypt.asc", "passphrase": "test", "verifyKey": "gnupg-v2-1-5-001-verify.asc", "filename": "", "textcontent": "hello\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-002-decrypt.asc000064400000000000000000000021621046102023000251770ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: GPGTools - https://gpgtools.org lNIEVYh67BMFK4EEACIDAwT89Q3wJJMbkWpn6K781MjmCCaXsO2Yrni8nRqUO0Jy /IRRvyQUQFwkPlOFGls9Jow/wuQ+e+LzpilCAiCsjIabVOn8E6POrk7aX+2hEVvP h+fWX5FWFQVHhRHlTE8YwJz+BwMCTbZcGgevVRreMw+wcWl/KTZ5A0bHEMX5eYtT 5of9t4CNogLFw1clStLqq+veG0fJWxY7T+GYJxVj/MtVNzNK1fZfquzr9OwkSjGh Iy0dB6QZb99qt6M22p9IjoEtgoG0IWdwZzIxcDM4NCA8Z3BnMjFwMzg0QGV4YW1w bGUuY29tPoiZBBMTCgAhBQJViHrsAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheA AAoJEG73wu4hz8jwLLYBgOAqkyN0pUAhCpBeep/q9bJ8Ngqpjm19Mpt0SPMK/WCO bSEyGSf/gOs0GFdeRvYtbwGAg03eKfIxh8WuyoCltVxD4DLXfaDcHpJ8Ljnqr11w f+iOzeDFbvTnI+xvyFKkGQjynNYEVYh67BIFK4EEACIDAwTrI7z0pCt93EAbYtV4 0HD2uuyMfVkoUVBrNvOyRQn1cXF6bO55YoLLVg2Q9TcKoR8GE84lSHl35Y+piAgS vn3V/tgD6WKT0DGok67WW7GmI7pptGoDUUhSXb5nL1kYEi8DAQkJ/gcDAk0o9zrJ iX5s3lev87Po5GrLI8KyLzdaFe01Vqoq3CG7SWIRSxXZSTXwrCDJ/wqEqx7SeQBC ljn8pbgzPDmybFm19K6QC6+7iX4h8AGyF7pIxr1/rJNxHMTbuYuqGtgTiIEEGBMK AAkFAlWIeuwCGwwACgkQbvfC7iHPyPChsQF/bppdagCf6/JLRa5nWJAYxtDospe6 kwCpS/+1xb26oiI3rSpjpZ8UN/QSb9GECImbAXsHTUFmPPNsvTeXvn7kNxWgRjqd 88E0lsY//WgGGLP83B2OLNkLb3emRpDQx0xMITI= =prJM -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-002-verify.asc000064400000000000000000000015441046102023000250340ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mG8EVYh67BMFK4EEACIDAwT89Q3wJJMbkWpn6K781MjmCCaXsO2Yrni8nRqUO0Jy /IRRvyQUQFwkPlOFGls9Jow/wuQ+e+LzpilCAiCsjIabVOn8E6POrk7aX+2hEVvP h+fWX5FWFQVHhRHlTE8YwJy0IWdwZzIxcDM4NCA8Z3BnMjFwMzg0QGV4YW1wbGUu Y29tPoiZBBMTCgAhBQJViHrsAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJ EG73wu4hz8jwLLYBgOAqkyN0pUAhCpBeep/q9bJ8Ngqpjm19Mpt0SPMK/WCObSEy GSf/gOs0GFdeRvYtbwGAg03eKfIxh8WuyoCltVxD4DLXfaDcHpJ8Ljnqr11wf+iO zeDFbvTnI+xvyFKkGQjyuHMEVYh67BIFK4EEACIDAwTrI7z0pCt93EAbYtV40HD2 uuyMfVkoUVBrNvOyRQn1cXF6bO55YoLLVg2Q9TcKoR8GE84lSHl35Y+piAgSvn3V /tgD6WKT0DGok67WW7GmI7pptGoDUUhSXb5nL1kYEi8DAQkJiIEEGBMKAAkFAlWI euwCGwwACgkQbvfC7iHPyPChsQF/bppdagCf6/JLRa5nWJAYxtDospe6kwCpS/+1 xb26oiI3rSpjpZ8UN/QSb9GECImbAXsHTUFmPPNsvTeXvn7kNxWgRjqd88E0lsY/ /WgGGLP83B2OLNkLb3emRpDQx0xMITI= =Z9h1 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-002.asc000064400000000000000000000011361046102023000235270ustar 00000000000000-----BEGIN PGP MESSAGE----- Comment: GPGTools - https://gpgtools.org hJ4DHGTZqboOYrASAwMEtYUeDDJwqxZtXs5yl57p4r09P1dkJmYa5/OLAFlP2OSJ 84kDtk9YxA76XK0dsuiK8nqPwtMhfJyMAablGHWYXYaOchWOPNGPcRcGfNwDBQ6y kWmmlFxW86RWj+Hhp+auMN3hTp0KmxtLWSrqjbsR41EhXdNURgsAAJ1C/w2ERxhw M1XpaF3di/XbRWwLpkIRMNLAEAEzoZLHEmyrRUgWGIz3+28XABGgd0wmbrUG0igP ZaTrPV7lnW15qHQA35EcCgsuABZK3oKzBgEIXv3qHIxEQyul42OR+MRLicSjN0DP 5qEMgPPKI9QM4oGSnqiKoZRjI4UWtSQoqUtyk0loU5Zp9fWtxAOfE4lb7pz0BpT2 7QTibMqODtHQuv8qZFFDrE0h4U42b1Cl+UTZgAgLD4KDwdCDjdZyQWkJLbbLj9Jn 4meJ3euvbhmJiDvbS+LFBU3wCXAvtYILOxkSuIrTOkBE6xg= =Ysdz -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-002.json000064400000000000000000000002751046102023000237350ustar 00000000000000{ "type" : "decrypt", "decryptKey": "gnupg-v2-1-5-002-decrypt.asc", "passphrase": "test", "verifyKey": "gnupg-v2-1-5-002-verify.asc", "filename": "", "textcontent": "hello\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-003-decrypt.asc000064400000000000000000000025521046102023000252030ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: GPGTools - https://gpgtools.org lgAAAQgEVYh/7BMFK4EEACMEIwQANhjHlYst9EvUfVlNoZ3s2JD1TtEFUlgewo+f RGNuJDAIEBpEc8PCdxPxBZr56qnQjEuaFNJzJiM5EMkPV44RYbYA4K4zEpVe9BlW 0l7nledDGpc8H0+2cTtaqYnxVsDJ1SCD+nYbjIpLqaYxGgJuz3R2iyfvOYAZgk9q M8b4jM0SE0b+BwMCjvx4XzxygpPeXE5j0D4kw3i1LmO/TxlmeqUfBl/yWMoa2lU+ /3HG7DHveiGY5CwVknshNWMF5tqC9JDfZ7BdXAtUy3c2Axa3A/zMLGgH6XWNEu0c 0Bjv2tsmiWfsQYE4GUZoU96ZJnggcvI6X4/ppla0IWdwZzIxcDUyMSA8Z3BnMjFw NTIxQGV4YW1wbGUuY29tPoi8BBMTCgAhBQJViH/sAhsDBQsJCAcDBRUKCQgLBRYC AwEAAh4BAheAAAoJEGRcqQKef3Oxc1MCB3vQGNAAqlTmIipCLIVQON+PEz4EUsrU bDIVg2HLEumeWh/vCaVvouFFpoBGAnYYGLq1gIzIurgR9TLu1MewPMEbAgkBhYqq V43UtdF2Z5UmyMbderDbbCdW+lCEH8m+lUIxl/JGcMW7m4AwFPo5uIqf+FqcG6X+ smwcWADyC8qXqQYcZ9aeAAABCwRViH/sEgUrgQQAIwQjBAHtNhqjtxk3LMMGtDs1 KvHz2rEg6aYVewON5fKtjuI6KI+lmakXKB90a2elz5yTXEI62h0/TxaJur/eJqMs vJApkAAd17+it6Yw5U2FGg+9CzVMcLtslPaW7jbbVpYxueBXh/+TtE1OpoP6ZkDC kO3zCeR/CELDViBhefdKnDhq8Q7xnQMBCgn+BwMCOeX7njM1bGneCf0WTpZg7+rZ 8qL/KqUCB0tD6pz1LeYyZNxPEM17CTyMWXmmg0taRrATUjty24msqyiM9IYZNEc8 VcOHOP1PUdGgU4cMzcLuoaUesMBL4YztppROluX5s+C2NF0dReQp1qnkKhDqlYik BBgTCgAJBQJViH/sAhsMAAoJEGRcqQKef3OxcmMCCQEfnhb7ntbTWGtE3C02CSsl GlxMA+5BNYrisOJxwe1HkImAJKLbiKD6Me7izMJZZCgo8QLP7IBWArhemfj0m5fD RwIGLHmwu5GXR3SRjckIRHY3/06SwoTny+i1iCtkulxaXGRGnQmcDXoi8tUTCp7a aVvEKtpABaq3eHHCj8n5te+H9f4= =x+3/ -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-003-verify.asc000064400000000000000000000020431046102023000250300ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Comment: GPGTools - https://gpgtools.org mJMEVYh/7BMFK4EEACMEIwQANhjHlYst9EvUfVlNoZ3s2JD1TtEFUlgewo+fRGNu JDAIEBpEc8PCdxPxBZr56qnQjEuaFNJzJiM5EMkPV44RYbYA4K4zEpVe9BlW0l7n ledDGpc8H0+2cTtaqYnxVsDJ1SCD+nYbjIpLqaYxGgJuz3R2iyfvOYAZgk9qM8b4 jM0SE0a0IWdwZzIxcDUyMSA8Z3BnMjFwNTIxQGV4YW1wbGUuY29tPoi8BBMTCgAh BQJViH/sAhsDBQsJCAcDBRUKCQgLBRYCAwEAAh4BAheAAAoJEGRcqQKef3Oxc1MC B3vQGNAAqlTmIipCLIVQON+PEz4EUsrUbDIVg2HLEumeWh/vCaVvouFFpoBGAnYY GLq1gIzIurgR9TLu1MewPMEbAgkBhYqqV43UtdF2Z5UmyMbderDbbCdW+lCEH8m+ lUIxl/JGcMW7m4AwFPo5uIqf+FqcG6X+smwcWADyC8qXqQYcZ9a4lwRViH/sEgUr gQQAIwQjBAHtNhqjtxk3LMMGtDs1KvHz2rEg6aYVewON5fKtjuI6KI+lmakXKB90 a2elz5yTXEI62h0/TxaJur/eJqMsvJApkAAd17+it6Yw5U2FGg+9CzVMcLtslPaW 7jbbVpYxueBXh/+TtE1OpoP6ZkDCkO3zCeR/CELDViBhefdKnDhq8Q7xnQMBCgmI pAQYEwoACQUCVYh/7AIbDAAKCRBkXKkCnn9zsXJjAgkBH54W+57W01hrRNwtNgkr JRpcTAPuQTWK4rDiccHtR5CJgCSi24ig+jHu4szCWWQoKPECz+yAVgK4Xpn49JuX w0cCBix5sLuRl0d0kY3JCER2N/9OksKE58votYgrZLpcWlxkRp0JnA16IvLVEwqe 2mlbxCraQAWqt3hxwo/J+bXvh/X+ =DB0Q -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-003.asc000064400000000000000000000013001046102023000235210ustar 00000000000000-----BEGIN PGP MESSAGE----- Comment: GPGTools - https://gpgtools.org hMIDnEbxpPZKkU8SBCMEAa2wbr0mCM0VcEaCvoVLNy/dNwElX2zDUwvK9H7kRNc8 ISAU9EPRJByLQ5byoiSGCyet3g0p8vPvStnxr433S1cJASj2IUgj9GjRXpHhz/Ga /eW/0c8ZPZfeJmF0zVo4w9x8B/8HlYsjUOCLEr3kdseoYAcxBBYiOMFEJ6qogzh5 fiahMOf8cyoBhx212fm9M4j3vzcMw3jTEvd0aMmLRg94IAfhc2eI0omfAHB3IRXM RoDT9dLAMwGA3lPitdCXkMFfeCwnOLLm//0/moxgn4Xd3QRoywYCEJaB2DBiwYns A85xG20Wb+IB96N41szsIb6LkD/1GhYvXeXCyGddAYiTu/qX97Rmtc8uR+4z/3+g liO2INYf516ukzu79N543AVR4OnAvRJPnsVh1b5tN2eD2o6QIlyma4ZpakAtSI4J nnKJkeJX1YbXl0nD6iH/+uO8zbM2KT/G1Xz06m9laWgBG7XMilpVKkj7TNXHQobW v1GRUbXuEn8uW5sZcgt+r+zF1gM3hUWWb+7KcQ3E/nDCF+PuZlxCzMAEp1szEtBp sVs8rWGlpJwhJQ== =pSZl -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-1-5-003.json000064400000000000000000000002751046102023000237360ustar 00000000000000{ "type" : "decrypt", "decryptKey": "gnupg-v2-1-5-003-decrypt.asc", "passphrase": "test", "verifyKey": "gnupg-v2-1-5-003-verify.asc", "filename": "", "textcontent": "hello\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-001.asc000064400000000000000000000010371046102023000234440ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQgAioSQeowOqYeUfhSa/J9KdmU8f1bqxeUS+vB931gl1YQL SiZkMVkFcok+nZFA+9Q3MntdEvWLrFRaoOU79duEmt963yxjHh02i+9kvbac3CW2 JfljlyPIpPND7ksVDLLG5n7RKy7ZMG4K4WALWNq7GyVNLERCGGQ+qpfxjbWeWotq rOdzKBgebPX/h3+Toif6R3lL1ST2V1ufKMOcxZljGQbl5+XCyw2TMazitno8Yf1b cXH7ocshnjmvu/0zGpyqoDF4JJlVBXVAm9HSJWtWlSACpEKty2AU7SoiMIsiBpKk OfYCawF49QOrkKUWcQkBLqwFQvsK+c1BAutXrwz+0tI1AY1m6E86TA2eTDQyUnEs vYugiMUrXsyPDxD7IkHBvQJSKIQQcnLD7/nFAQupqV9FN5Qlqsw= =4wN0 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-001.json000064400000000000000000000002231046102023000236430ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-002.asc000064400000000000000000000010641046102023000234450ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/RASGVTt6Tx4uRtt21Jp1lVhCAbzmdUG4DDrewGYX2eNv 7O3/HaxpUheqRbXTMC+7K8f2AyT7THamD045k5CEio6np7ljllykVTURnZOS0BPH vDFIeGtEL0CuSMQ1ufOrPtuQbIPzFOOFOHxl9h5Jz3C270cabiNNpJ2dfoGn9KSB wM1aXig2IUFl4m0taVlumnKD/zLDf3HN5Fg51mHN1p0qfDkGTzoTNS375WcGp7oY OWBF3f8Lx+tbVdjv8HkXi0Lt5T3Mw034rwMm9Dcya6bpFxxRgx6pW8GKM3jhtJGk iylrsI+QvyzcpDM7lX1ABMvnDRaR3BPwy2P8AF0fVtJDARrbueS+awRsbNjC/wPg 4T4xFx5FPUhY0HhvvJ48VyRHdg3JuGNV0XwWtdp6yWxf7gXNapLjJ6VnXP9pV5xK OuqE9A== =18b+ -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-002.json000064400000000000000000000002231046102023000236440ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-003.asc000064400000000000000000000010431046102023000234430ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQgAh4hqAX63u5p5D6PMmLAcjG4JcfRCtjyMrblDWIf42NA9 6WhlQ/md09fDcKi+Qef5tlkEsT1iaFRqmkT0pPdcNd+kSslJnkdAnx+AiJ4U0oio ZiExHV8RHb7QWLBh6ay2WueFdp7KxxiE2/B5TabAplDLvW2VoJ5igW04sxFmEoOb 5LAWh3Ta6HC6lY85AwCi2YtryJoC8vBfrO6r0J0ZfrbvpKwz4D62MCqHxPuGxQQ0 JxqqqtAkUbYEbWnGQY7h6TccsFq0F5pAnTb+3oJUahmXZ4DS/YPgtz/Ij3SK3Vng FY6wozOCH/nmNOM9OQz8mvxIMFv7oTy+CeShhhV+GdI5AVKVBVV/txHvVM97jnxN GGC/Xrpj5CPzLNqwtbwTTghXMdGZt1AZ80TMqYd5IBc/eAz7SmyYQ780 =iLqg -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-003.json000064400000000000000000000002231046102023000236450ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-004.asc000064400000000000000000000010531046102023000234450ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/exxa+hPFbs872czGJVw5RShD28CGnCQX/hcbyGHRdn5t GJLSjOGbYMzr2ZwcvVFBDr1pGfZsG4p8xHGkWzNIZ0xpuUn6kQxM9ki1aZDYJPe3 9kuRV3HTESlbFCPacJKpV9zxIZiYVJftAFVebhH8TaZeE+M/yu71KQ4kAJhu4Mwq 6DHKp367OcZNWpT36NcNxQ79Nl6Q8MOfsVRcuB4giPPjI6Cec4I/0LUc/qpzc2ue 2LhH4s+0BjfFlOosaLCvxMGAxAoLDyT2tcv1FvC7NJFXqs4oXt6aUlPrcCM0aTol Kd1PSBVCDF8l/Y0mjnwii80i1dA7xybfG1YKj+xrmdI9AboPBtw+yPhLdxNHFChh +zE79rClZUwNz8sI9J7Svu/e1T3D16sJ7+R/DNLVaaIQ7oMewyFQTxydfLCjtA== =1EaC -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-004.json000064400000000000000000000002231046102023000236460ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-005.asc000064400000000000000000000010641046102023000234500ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf+L5OwbR66JZCDa43ND/yOV/axC0xKz+83opLnkD9ZNqqx CSuCV/i5oQvGxGuXdIhJstdnW43Xdx6Zh15wB0DWGE1U8niED1I5mpW5bqeku1zn nINP00jStbatUn1y3sHd1yU7HZ9iQV6A0dCaMmFmfWqj4LU1kvH1p3Rf0N82YoRR 9KCLJUtnfLX3bTdP5gL0gy/rksibtD2UiG+uLs45ZtvFnHjOG+PyggMxDMzDQqe+ +/Gax2v8XY9gPASat3BvesBQUFh0EJSULRicV0i7v8XtNxA/GFDiTd9Tr0Ra8tkw ryYjxxqb7BjF1ZfVF5cFtFIq3K7Ym/5s23COd9zS7tJDAcAyyeKu+lKgkAVORlMA ByH1p+AAGIJfMvEaEDidYxyRctC4mUDz8HWuIyvKLqJ2itzg/OU4WZNm0qytfoZl FNkJhg== =5hVa -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-005.json000064400000000000000000000002231046102023000236470ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-006.asc000064400000000000000000000010331046102023000234450ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf+IQnDeQTlrrc64ooTWAzxphdHX0cRsZ/CkoofZe5RuFLg Nm91JECfi0ogc2Fn6nkYgh4/fEcIpzAZ0hreh2owEyWhPOpW1+eUQ9Z87nfoI12+ /6bcdsaHrDz76/itCsQWDYIr7Rz0VWsaKbKAVRgycDu0Tp0pc4wm5C4b+rjjyw3V TPu8m6nyBFK8pawZmtn2XKOV9gKE7ytOcoyPRY9NhmNb3bRu/uDvSS/Cn651D64Z p0VPSbqXoWa4+VrbqWUcFcU1zFRvPrMecLUmzGBRSF9jmfiK0y+DRzw6NDr0ehEd OLbi2tuCH7BLDoQaXuz+BHN2UF79zYZeMJOKRMlYatIxAQORnNlYkObTD+Lahrue MbUJ7DVzLG5gk2bbfO28/KrTkigGMYGGzRxUDV9e5bzQfA== =EeP3 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-006.json000064400000000000000000000002231046102023000236500ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-007.asc000064400000000000000000000010371046102023000234520ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2.1.0beta3 (GNU/Linux) hQEMAyMlJx+Vv4ahAQf/U4UWPUHhVW02FFgUHPDHhtXPbP/fe29yTTK1GQsTyvjk 4E7esdZJh/r5b45RenR95BKjx1MOAX5FscuBv5M2b0B376NTVGYI+UjRf6WGlpQs 62w8CwH5+Z64nfaaomA5ut5kEGXM6LEKin8b1s9iYslIsf2mZulza/+9ryd/3doN RsjaRE0mrzE7+6+jaTNs54yuQLYSmkzcSYhVBPlfk+5GJwVoIwmfV44YqS/MSypp +HsIY7nU2eAyAxfO2+20QrebrTpkxLXUWrBEMSKRMwtjsyHOjfhAhr4CYlBkUQRg 0aCt9TA2GZJP7aaLOKk9JFVSi2+H91Pz3md+W6H969I1AXWYpTD7ielMKCIdclVJ 8wbuLapIId+P0cwH1mL+ixkjdr7hM0H8GrHOKtYG6OkAyWIce+0= =H6oC -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/gnupg-v2-10-007.json000064400000000000000000000002231046102023000236510ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/openkeychain-001-decrypt.asc000064400000000000000000000015561046102023000257140ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lKUEVYGJkhMIKoZIzj0DAQcCAwSOLG0zDfX/HiNGHKrIGdkKNQrwvReOTioOe/Gz kWoOndSfutg2Kt2jui33Ntg+O+ryn5gLYDZRGFMZbIbIuQOe/gkDCKIW4R4Fch/L kLDSatJgkQz0+Sno53mWv/9VfjRNfp/Vn3HMyYqE4JcJnkYsg5UgsTxCCDt3PWNA ADJWkHc0yuzo/6NYvSIFupbrJFdxtdq0GUVjZHNhIDxlY2RzYUBleGFtcGxlLmNv bT6IegQTEwgAIgULCQgHCgcVCAoJCwIDBBYBAgMCGQEFglWBiZICngECmyMACgkQ OfzXHpcEWBD3DgD+PlWmfpfS59n41VmdL0S29zuD/4X7tk5MU2fcaN4OjCQBAMj2 wy11OD/r0g7brnfRXfeEMZubvJ+wA94OH8Dc98U6nKkEVYGJkhIIKoZIzj0DAQcC AwREEagIVOOFaiLeTAbMZIOwJB3UtWQrA/S6K96jRGG+eQdsmAYu+9+mo+a55LPm S9yWOUryM7Fpx7TmhcQUmWFhAwEIB/4JAwiiFuEeBXIfy5DuQG8hAHJbG1SOPJ8F xOPx++PGWtyVXGHziHQR4TU8UNIh243MMPY8ysUKwrT03v1j81f5cgN8yiCdViq9 MnFYCF2ptnspiGEEGBMIAAkFglWBiZICmwwACgkQOfzXHpcEWBBawgEAqzaG96HG GnJfiIXZ9SMwF/h6z/stB6UOqBo/pJaDlpoA/3Kp0uI+OIP3et9TuXsSt28PEEkv ZoFiOGAFQCpSe/VG =TWSc -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/openkeychain-001-verify.asc000064400000000000000000000012141046102023000255350ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mFIEVYGJkhMIKoZIzj0DAQcCAwSOLG0zDfX/HiNGHKrIGdkKNQrwvReOTioOe/Gz kWoOndSfutg2Kt2jui33Ntg+O+ryn5gLYDZRGFMZbIbIuQOetBlFY2RzYSA8ZWNk c2FAZXhhbXBsZS5jb20+iHoEExMIACIFCwkIBwoHFQgKCQsCAwQWAQIDAhkBBYJV gYmSAp4BApsjAAoJEDn81x6XBFgQ9w4A/j5Vpn6X0ufZ+NVZnS9Etvc7g/+F+7ZO TFNn3GjeDowkAQDI9sMtdTg/69IO26530V33hDGbm7yfsAPeDh/A3PfFOrhWBFWB iZISCCqGSM49AwEHAgMERBGoCFTjhWoi3kwGzGSDsCQd1LVkKwP0uiveo0RhvnkH bJgGLvvfpqPmueSz5kvcljlK8jOxace05oXEFJlhYQMBCAeIYQQYEwgACQWCVYGJ kgKbDAAKCRA5/NcelwRYEFrCAQCrNob3ocYacl+Ihdn1IzAX+HrP+y0HpQ6oGj+k loOWmgD/cqnS4j44g/d631O5exK3bw8QSS9mgWI4YAVAKlJ79UY= =ZmtP -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/openkeychain-001.asc000064400000000000000000000007601046102023000242400ustar 00000000000000-----BEGIN PGP MESSAGE----- hH4DADjdTO3mtEESAgMEbJ1bEzi00pBsA4ZD22spKfpchpsxDEw62HFvvWWuVOWB /0NrVAQ0SJ1x2FmMiM/B9NsWVoFU7uRi1FjLhr/s2DCcNSb0cDUNqeMQMzkwOBEf wR8Fkw9buMNQMokHjaXs0auW2ohn22BxuwbQwZEmHXvSvwEjwN66H0XY+a7/M6c8 DnHSFaBXb3lhD0nxdSQ2L15BsKQOioF6zQU51nUyR9PT5j9o7PSdH2g6pn7gOl8A PRgzQGSSzNHL1g080lS+7zg7QsZiab11+H/7PzFDUVUlteFhH0ZA0l70nx8wbuhV 5BhH75Pic2OoclBpvhFl+QtYGwZKh3NB8/Y8NHk6D70ENRo1gZg5YMc/Fx98v9r2 7o2apzlKGe01uevHr2FMR5s/b59xgUVRMqPQF1aflyPx =XF2D -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/openkeychain-001.json000064400000000000000000000002701046102023000244370ustar 00000000000000{ "type" : "decrypt", "decryptKey": "openkeychain-001-decrypt.asc", "passphrase": "q", "verifyKey": "openkeychain-001-verify.asc", "filename": "", "textcontent": "Hello" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/openpgp-001.asc000064400000000000000000000011021046102023000232220ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: OpenPGP.js v0.7.2 Comment: http://openpgpjs.org wcBMAyMlJx+Vv4ahAQf8CXpvMByJWLVwCvI3Ng4+OzDoQwByMebsrI6adKJp glmvgZovYVryvNwKYRTjXaPmhjfEV1HeicNDPKdEauX5p2TCjExioW4sCxtR YkAIqIxznesK+6fOvs3kFhlwkKRGkMPDBigIdX6n9yOg1fd9kZaj4ieS886c wDV7OTwTizftwjAToiuCGYLI/urTTYhR34ilhX34BZanx89O2WXgPnUcnr97 X2pINGtOpCwrdq3xLsWW7UT5ezQhtSYVwDiN9IzPfZZtnczFLsQmYPPyK7ie 4ETOzTD+6NfbjkkhnD6ALU9mkYXtz4Okdik4+eOHxHsgOsehrxrt1yWN3iq6 B9JBAf0tB+echPkUTiQARrDQW8mo4rGDwMysNuzhL0ydCHekTd0xtxAHOaJP QtApAcRrYGCNb8hkdBi66h8fxsEAEjo= =ZEjt -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/openpgp-001.json000064400000000000000000000002341046102023000234320ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "msg.txt", "textcontent": "susheep\r\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-001.asc000064400000000000000000000011071046102023000227200ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBB/0euzvEFRGiWJNXD5vvDvasRBSgqv+6Ulghgdww 52gFFim/0euBkc9/5XhLvjutxktdVWwMMVW8SU198WqHhH+aJc55f6XJfqVxZKaa 89IpUb+V2StqZ1uOpJHZMVMQT1FL2QI/H3xtdBLmQ61jYOBH3sfHhDYfwqJjj8Eg pIVoOcxVFGPkmtB32saaAaCmRzY3m3rfb81j5W8GvGKumug3tjFIREkWIPJhNZ0a K9c6VqJ+fNOoHgJZa1+3Cm3nIPza8nHb8L/N4lfkBwNLJoUlDrbrJa20FH4GBIf/ FcjoNRLLLZTLwhUwFaXHBJN32HeJE95Un7JudN8ghJLik0Gv0kIBnEzhGrUL7fvA 3Zkx1Ab/M86vjEouV83F/UIDfLHcWB/fPtIyT9yykzEb+tT3UlMh+miR4iSbOy9o pOZ9fVZh8gU= =BIOC -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-001.json000064400000000000000000000002711046102023000231240ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "timestamp": 1006632960, "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-002.asc000064400000000000000000000011131046102023000227160ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBCAC4GnRNvJix0QjchqgbCU/PYbp3NtrmwlBu8Ivr 8g2g4R6v7fZtl3oAfG8s0e4NHtmoF9FzIf6LdBDDFdDq/jEqhMVOAQRmmOIIChp+ K598t5KP0FW9tP8iVyY8QCrTK8FObG6l8dgidcd4fCGIYJnFhvvlhbnH8mw2x1Bk 7Q0baaz30rOueQeaDVsUi71b6kT34C3vjH420goigVztPdSzijcUkPevui9l66LN GHQ8dZg/q53jUeMg4cskrHX7BBeF1imNVioL/iXwlYT4vmwp9LZSUGrR2/IaZwNX izz6Cv4EMOHzN4RF0yYvfKCGTFtH03zyo2y2uLWKH4WJ42MQ0kQBBGRVn+9ocHBT RJ3msAqxkE+5+z5KObd5Lw+6qFG8PVsNmZqSCjSmZAmMYtAKXlgPJdGxVwDG8lDq LXlDUuoyqGSclw== =hr/o -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-002.json000064400000000000000000000002361046102023000231260ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-003.asc000064400000000000000000000011131046102023000227170ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBCACY8qhQaOP5NcbiUtPa7P9w9uSJQSwcp7yL7n64 Zo3yOKD4DedmT6a17L774t9UPsKlAMA5m2bkMfbq2gq0fqQVr+G0/c9/zaDRiD/3 bYAfe/MPNPmyf593U5AE7ClPhVWmzEhtEI+o/jP//FGlZY+XSa8M/3SkNzL1fc5B pYb/78xliSddqkK7wcj/E+DChF8LvLZ2aCBucjptm2j7S+ocsYIC+AXhLjoAPSJU k5mlTil4UfGmSnenpEsAlKaFnLIpUIWILgr5u3hbrTEm/mHgPvun/UKbrZ+buzQZ UysmTH4zRIhtMoUHFUgSYSOmz8VmcJgS7BrUuhBgMGw4BL8c0kQBOoRezAmzbPzX K0UI8ywc0yzslmnYrTx6yCIg9vgsUH9XzhpoWTLmxThnr7A7egJghCBMKdplYINf udXT81/3oG5BUQ== =rtaa -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-003.json000064400000000000000000000002361046102023000231270ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-004.asc000064400000000000000000000011131046102023000227200ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBCACY8qhQaOP5NcbiUtPa7P9w9uSJQSwcp7yL7n64 Zo3yOKD4DedmT6a17L774t9UPsKlAMA5m2bkMfbq2gq0fqQVr+G0/c9/zaDRiD/3 bYAfe/MPNPmyf593U5AE7ClPhVWmzEhtEI+o/jP//FGlZY+XSa8M/3SkNzL1fc5B pYb/78xliSddqkK7wcj/E+DChF8LvLZ2aCBucjptm2j7S+ocsYIC+AXhLjoAPSJU k5mlTil4UfGmSnenpEsAlKaFnLIpUIWILgr5u3hbrTEm/mHgPvun/UKbrZ+buzQZ UysmTH4zRIhtMoUHFUgSYSOmz8VmcJgS7BrUuhBgMGw4BL8c0kQBOoRezAmzbPzX K0UI8ywc0yzslmnYrTx6yCIg9vgsUH9XzhpoWTLmxThnr7A7egJghCBMKdplYINf udXT81/3oG5BUQ== =rtaa -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-004.json000064400000000000000000000002361046102023000231300ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-005.asc000064400000000000000000000011131046102023000227210ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBCACVj2uKPfT9zAOjFUsH8OuV4bBaEFBaOQfrpHOJ 1cude4SYzz1V5+tYzYvNlCSBJ1ljLW5poKixSRhqa0vQZKfmY6H2oYeXVlY+8B9E ZfTKStkhTxccAW2/0atL0USwmiq4/w8gIh9KRxZP44DkVzNMqM4PXUvsIuSTAzIO MH4IN3jrt1nZgBmCWZi6BwcXkX9Rtb13GAU+WhqXgxP1WYYRr1OHfIkn4F5x4RXF 5G0qF8i17LNVFDqxRs2bClGNrSr0xhVM6pavplLpqUnOz3EWPZ1lu7wQZWf/qXJ0 QvXhtAo6ztQMlh33fl/frbcr/Jzg81V9UGwbo7OI0CCyb9440kQB9T0Rx6omEqty Yp3qNnhwlrRs3lkYaMM+z/06rrzpn6ucZggQHD4ZCK8ZHYx/FSpYJ5li6jOOPfOc Ub0u15hwyyBnFA== =DuYZ -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-005.json000064400000000000000000000002361046102023000231310ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-006.asc000064400000000000000000000010771046102023000227330ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBCACifnnB4vb6x2bEmih4niw6G/Q2tAM/jKfun3F/ 0AuJ7lR+RB6ZSPsM9i6m5vPkbwAJlWhc51BZ87SsAZtdgWOGDbuaBYzPQ3mlzJX/ AeiemNpBJr0yNEr0Tu/mPwtNnu8LVgntA9dscxvHKlBOSoMvs63sH0naVi0zhCbg Ke0g9znjygnBXkc7IhWkvySn/82QSKVhilMNlzCgshCIF5L8HAysW13sb0YgNV+2 tbDw4+WQc6OJqobA6quloy71ncZCluf6GbIvEWGjpzWtf8U4T5vgUubt8z1g64Je g3xgn5tXJEBLsclyOtR/TjPvQVgpufvzTcSt9pwSBz6wid0f0jwB2iXt+MDa7ASJ EvDBgGcP1xahPQFPloCYhiN5+MTVF5CwAEpV9kL55ZlflanLNSfAJfDvygnle5Nw l/A= =5lk7 -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-006.json000064400000000000000000000002361046102023000231320ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-007.asc000064400000000000000000000011071046102023000227260ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: PGP Command Line v10.0.0 (Build 674) (Linux) qANQR1DBwEwDIyUnH5W/hqEBB/96YWzT39JCpC71xHnmSYCSCM32QFvikS8wuxQO 9e618KtW7gfWaZxSQsNfykFMhfkkbQcp5I5Dg6L7C9kqrnAG7XPF11S2aYYHG5t1 dcgItN/YO1y8wCq6DZ7c4wh13wHhoZfAEWbxbXOcgWiKUNmnvq9W6I2VWYHsfBSj x2qNnojH1SM8bX/EjPhUUx4WEKOhWFc7nezg7/8VOAfyGtJMUtNsIc9ekeRJNeCR a4VPVtApssd3uDMPBiBgPtS6VuuHUlEUXOaUeGVL5vZzquIaE1MSSPTPWuAg3QEO X0vO+iPdpDu5EHs5VoCZ/WMPWNa+WWY3C4db/gl9CBq6u2Wa0kIBMMqfuwSLW40a bLGSgVzkPYbWvZhAPOwuH0VNTkbBBr3DHNSM6QGPyjHN2Q3sddrhiFt7A41wM8um y/FL9GJQv3k= =vm1f -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgp-interop/testcases/messages/pgp-10-0-007.json000064400000000000000000000002361046102023000231330ustar 00000000000000{ "type" : "decrypt", "decryptKey" : "gnupg-v1-4-11-001-decrypt.asc", "passphrase": "test", "filename": "susheep.txt", "textcontent": "susheep\n" } pgp-0.15.0/tests/openpgpjs/x25519-little.pub.asc000064400000000000000000000011411046102023000172660ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- Version: OpenPGP.js v3.0.0 Comment: https://openpgpjs.org xjMEWnRgnxYJKwYBBAHaRw8BAQdAZ8gxxCdUxIv4tBwhfUMW2uoEb1KvOfP8 D+0ObBtsLnfNDkhpIDxoaUBoZWwubG8+wnYEEBYKACkFAlp0YJ8GCwkHCAMC CRDAYsFlymHCFQQVCAoCAxYCAQIZAQIbAwIeAQAAswsA/3qNZnwBn/ef4twv uvmFicYK//DDX1jIkpDiQ+/okLUEAPdAr3J/Z2WA7OD0d36trHNB06WLXJUu aCVm1TwoJHcNzjgEWnRgnxIKKwYBBAGXVQEFAQEHQPBVH+skap0NHMBw2HMe xWYUQ67I9Did3KoJuuEJ/ctQAwEIB8JhBBgWCAATBQJadGCfCRDAYsFlymHC FQIbDAAAhNQBAKmy4gPorjbwTwy5usylHttP28XnTdaGkZ1E7Rc3G9luAQCs Gbm1oe83ZB+0aSp5m34YkpHQNb80y8PGFy7nIexiAA== =xeG/ -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgpjs/x25519.asc000064400000000000000000000010151046102023000152060ustar 00000000000000-----BEGIN PGP MESSAGE----- hF4DzfwiGcVT05ISAQdAetSWotgG0+MTEfyKvagrHAeGw0Denjph+Mu2KcpAajIw kE398hrqnc6qYFdf3p761kzvgjX0auua8L2WFlhAzGh1ULodxHVLmvxwiId4JwHq 0sAzAaM+Vn5hfDM5799p2DpPK8635LN0UvtlOqGIdaNfu5DgfoherMSb3zlBa4YF WJG1Fa9glfWTOlMNKKoFl4LUh1BUF4TbqUv3a0BR6GcDy6zSp4KRl3NIq22fUD/F BZWuhPRhnsvDAoBTbvlgjyuActYhtXU5srMAEh4UeVvKyU8xImDfLgJReU4500JU VjZkMXTileVhAprvE5KCCDWi6YWzV+SSpn+VhtnShAfoF870GI+DOnvFwEnhQlol JRZdfjq5haoEjWTuqSIS+O40AgmQYPIjnO5ALehFuWTHKLDFVv4EDqx7MatXZidz drpAMWGi =erKa -----END PGP MESSAGE----- pgp-0.15.0/tests/openpgpjs/x25519.json000064400000000000000000000003611046102023000154140ustar 00000000000000{ "type" : "decrypt", "decryptKey": "x25519.sec.asc", "verifyKey": "x25519.pub.asc", "passphrase": "moon", "filename": "", "textcontent": "Oh hi, this is a private message from Light to Night!\n", "keyid": "f25e5f24bb372cfa" } pgp-0.15.0/tests/openpgpjs/x25519.pub.asc000064400000000000000000000011541046102023000157770ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mDMEWkN+5BYJKwYBBAHaRw8BAQdAIGqj23Kp273IPkgjwA7ue5MDIRAfWLYRqnFy c2AFMcC0EUxpZ2h0IDxsaWdodEBzdW4+iJAEExYIADgWIQSGS0GuVELT3Rs0woce zfAmwCRYMAUCWkN+5AIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRAezfAm wCRYMLteAQCFZcl8kBxCH86wmqpc2+KtEA8l/hsfh7jd+JWuyFuuRAD7BOix8Vo1 P/hv8qUYwSn3IRXPeGXucoWVoKGgxRd+zAO4OARaQ37kEgorBgEEAZdVAQUBAQdA L1KkHCFxtK1CgvZlInT/y6OQeCfXiYzd/i452t2ZR2ADAQgHiHgEGBYIACAWIQSG S0GuVELT3Rs0wocezfAmwCRYMAUCWkN+5AIbDAAKCRAezfAmwCRYMJ71AQDmoQTg 36pfjrl82srS6XPRJxl3r/6lpWGaNij0VptB2wEA2V10ifOhnwILCw1qBle6On7a Ba257lrFM+cOSMaEsgo= =D8HS -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/openpgpjs/x25519.sec.asc000064400000000000000000000015211046102023000157610ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- lIYEWkN/RRYJKwYBBAHaRw8BAQdAM359sYg+LtcQo9G+mzMwxiu6wgY7UTVyip+V y8CWMhz+BwMCxwCG2X+GJp7uQHSoj4fmvArR8d9hzyKBKDX84QsC1nCqMNRARz1v aSqXfCt4gLzR3sZh4yS0cDUB0UdDfFhh3XiG2j8zRJ3cKkXdV3GcSbQSTmlnaHQg PG5pZ2h0QG1vb24+iJAEExYIADgWIQR2tpyb3fzwT+cjQN/yXl8kuzcs+gUCWkN/ RQIbAwULCQgHAgYVCAkKCwIEFgIDAQIeAQIXgAAKCRDyXl8kuzcs+qgUAP4iQRLX Q1Uugidh/qsxzEpjb82f4ODhpi12+mFjyFjRvQD+OXfhgR5xkBC8Za54ZrlfawIm 9HVZkQxRaNb1x9HRMgeciwRaQ39FEgorBgEEAZdVAQUBAQdAJ64RN2MWwSiuu5gd eYBIqjtU1WCbb0Rl4DhuBtfWCxUDAQgH/gcDAoeG6mA2BitC7sbt5erYFzAndJx3 fOBDIo9MF2xo/JX1OrL5Z9Fro1UP+A3P+YyZQ3W/PMMVFArfnyiEoJAmQOkashgd CocKYaKUNrgbYl2IeAQYFggAIBYhBHa2nJvd/PBP5yNA3/JeXyS7Nyz6BQJaQ39F AhsMAAoJEPJeXyS7Nyz6I04BAKcoNxne0e+84QvJpEgyLLHoKxQqC6g4DWDkiEoI sVHYAP4+7SAxheOQvSQuC0LI3ymPVk3dCPe4VkX7m/bWKND/Cg== =NDSU -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/partial.asc000064400000000000000000000043551046102023000137720ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 hQGMAxi1CeJudmVzAQv+K/OEtrLPmVZYAicWpKeoF4jsTD5clsxGEfT2wfC8qBTo ZzJq8+jAqfLLp7V4rM2D17EqEubbyZtQZ33/LyVyfVU4lG25byXFPvONHMZ6iG7r tTZcDzrihWTBqFg99SKZNeGqFnHu+KZOLGlX3153210seE3KFKKcKyKpnT+rRMnw qvHetje6UtfQZNf+IWCQ16bmQMrsZ0+7Npz4hhe/H+0+ZCJFNt/qvO4lUXINj9Qr HoNCy0PK7nhYbFvfMdTvkWEMrEEuAcvn6RyMLPKe2itCaI63y0w8qDLz63mesMpe uUCfuLt830xUl6XpJcOYXD6a3iVziyAFw9peENYsxoD2ayiSxG8WZekAbLP95gVI j5EXVi+2Ldf5XMqkPiak3ng1dctN/F7JV9cqPhBNxH2dQwuUBwU+fYC8RnAqNKz2 ZevzzyDqrxBtrYZ/12GTsym7s0YkFIqXA+ttYViwH0kVKA9T8ZbJPwcpGO3qOYX3 DoxJea19Hv3k7AGtQ1DwhQEMA9as5tCZ3B5QAQf/Qk06sJ+WQVSupshJvmhRcxbz +D9Yj3s2aHTwlu8FetvgVsdXC0RGkZL98AEmu4DGWLam4hqXdFbrMZeTTc4HoNaG jTJPqMBRadbLBB/qGYuGzK4xeNY+AJtd3VxafUTgkmCyzTsDjcWa2zZS1z+I/4A8 aadxiK3fK2TgonVK9+7nxQxPibSwKNnuhO2AAgaxgTzb3tCWGtcgH0LJDJLUakEv uyyJngEELG/Qqc27vBUTybwutU5ceVw7n98hpRM/zanswmY3XPHvNNymGaZAJKRB tdg5ANZbt33bcUA6hoJ9YIZxGuZ+JeH7NDuZbzWS2mu1e/UGGE8xv18+qcz01NLp AWCHazW43KAPLuiJ1LyJGJUin5Pshc5UO03ofHR4gRN+fje3I8JFUvnueXTuwATy cIFKiMAFi9zM6WvbYyNO58Kz4ILYt0tQX6qR+/h1wNWFGS8zyIbmnm/172vAzdk6 AKZ92Gwceo1JM9c/tw6LTbBw9L2O958RdMP09HIUltAzZa2Y47M1INM2dwCIgK59 NiJ92UWBz/deeEGO3NKIsMd8Cz5Sin7Obqb+bRl7YsWVj8KydV6Qc3vzrV9Gadhp Zqlsz8qL0gpWCIlcePaBSHfD43YWzAKf26x343X6ptM3jFQk5o41qXWFnjIAaiHB FGPhfWUU8JB5CUpiS/bTPtIsf7H9Mm8Iz/+iY2si42c889au10l5KQY9vvrdEDNb aUM9HuzWkoaDIeCeCSEJXWCRcs5Qh/6ri46qlt0G2N1M2+1stHdnRWV+mq/hY6Pk 8gNXlP1mn0/MUKxs1pbjN2a3/nrqlaTygFVodsnW9P9JczVJNzM6A0dAxBNhoLEJ n6c7AjUgl4pk4PyAOjXdVNHG5h478x8kJK0Q2opksdL98Uqc9vBxkIM/N561oUG7 zE+G9SVsOGhtiNQllXxAR2Gt7HSig+7o5RCt6ECObVvb8GfMAthQqgANTTJ70zSC ddrjOL6D0I3ABXiPWyQ+owPTd79aeCT6j5yPc+y5E43A+4hPqzgdjVbemYYBUMgz qdZX+9l/MXIcipAir5/LUG2RyJDwLhb2og6u/H1qLC6p27I843mkkKl0LArECMsw hJiKVOII1iRrZ0opT8azs7S1eKYucIDnuO/OfIcr96qaGbGSDXTmutmaGBhhRaoC /c/6ywNywHXEZk7XiOZ6Jl5N7qDYOq8iW6qkc3w4536v3hqm9QtWWr2xXLrbJ/i2 WTIs/izbWhfovXdi7L5+fDIhSMHxxMGpADPKd01W4Jhn0dgZbqiwRv5vFVF3PBxQ Dac8A+fU6mKrzd+fcdxyPNBWd5CkuUe65iWUXEQu+xK8HhrfnNh0thvhtb0hKpX2 yR+9aqZ/Yu2SbqKGBPx6viUVhFAQDsko+JvMkILbj5P/jev+gSK9t8QAJNlximQZ 6ODD0NoIG8lQ0BrTrnqK5XhvdnvIn3zhPZzCCmFikgTZ3wXHYh4e7V5+F8sly66e 5d6pNZMgP5NaK9JjdXTTAyViZpYIWuEYSLwVR16bLFz84MDLqApPb348CZ5bgk+M /DhQPFblGBOSys76muRTEu/GEPEon38t1mMJxuP69rQ2AwDXn1DZeYTB1WrP =FY7s -----END PGP MESSAGE----- pgp-0.15.0/tests/quine.out000064400000000000000000000002661046102023000135150ustar 00000000000000 ฐ ฐ ๒ ฐ ๒‚p ๚‚p ๚๚๋‚p ๚๚๋Bˆ!ฤ๋Bˆ!ฤ๋Bˆ!ฤ๋Bˆ!ฤ๋Bˆ!ฤ ๔Bˆ!ฤ ๔3!L@3!L@pgp-0.15.0/tests/regression-01.asc000064400000000000000000000053301046102023000147260ustar 00000000000000-----BEGIN PGP MESSAGE----- Version: GnuPG v2 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 RX0Ag0r7ZHeKe1ms6O2ZUC1S5vpb6niC =tMYd -----END PGP MESSAGE-----pgp-0.15.0/tests/rfc9580/README000064400000000000000000000001451046102023000136170ustar 00000000000000All message contents were produced as `echo "hello world"` (so the literal data is "hello world\n"). pgp-0.15.0/tests/rfc9580/v4-ed25519-x25519/csf.msg000064400000000000000000000005711046102023000164250ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 hello world -----BEGIN PGP SIGNATURE----- wrsEARYKAG0FgmbbLcQJkKmdLdqMxzrTRRQAAAAAABwAIHNhbHRAbm90YXRpb25z Lm9wZW5wZ3Bqcy5vcmdQkDBaDbVH5NrDyPhfo0If6BBOKWy4W+6IYvHItQYjXxYh BAmD9h17+ghDwHJDyamdLdqMxzrTAADnIwEA3FDQy5w9B4OmAhZ+qTNy8UWAnWYP gMOJgOKeEsRSXNUA/i/25i6oVdFtNgLgOBjoCQ6vA6CopbWtlKt73iWtRiUM -----END PGP SIGNATURE----- pgp-0.15.0/tests/rfc9580/v4-ed25519-x25519/enc-seipdv1.msg000064400000000000000000000004251046102023000177660ustar 00000000000000-----BEGIN PGP MESSAGE----- wV4DsTfJeX45PwESAQdANcbZ6xhGwT8I0XKmNNdv1S95fRN2/tGOOqr6222HAhAw 7fSb8SmeMnu/bdkkUSteMd3aF0lwCC2MVFFVV5Bbs6FbdOCcTpH/eHeQRWf6bilA 0j0BldUnoW2whOENB8z8T+1ROg2YIChdSXrFK+o7T4GQmOHmCnfWUeDUU5ZQXuGE 7pV1hhXHMCg5BstWPnsg =jPYt -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v4-ed25519-x25519/enc-seipdv2.msg000064400000000000000000000004251046102023000177670ustar 00000000000000-----BEGIN PGP MESSAGE----- wV4DsTfJeX45PwESAQdAQfNNhkYiwzsL2Zmqu+aP52EZJvfnijXupLHXlLa1ezQw eIxzS8aDvwUfep/sCqGod/E/yYGYcT52SW2/6h6L/ukSB0oClbcdpYWyiVIJ1Qn5 0j0BoKdh4WltlzaJz9wmsN1r7wBPmrdHY1+skrzGwA48n/SDY0Fh5tE/65KcSH95 cwNQZxo/vZA0KFbtbxgy =c1fC -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v4-ed25519-x25519/tsk.asc000064400000000000000000000015421046102023000164320ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xVgEZtstfxYJKwYBBAHaRw8BAQdA+DnCvY5IpLWZzFuAn34gIdn0usGLqZavKrSq n56eGFAAAQDd/h/+xWRP5coGBqSc/zj81oVuMnIF+10ZcXONk+WRShFGzRB1c2Vy QGV4YW1wbGUub3JnwsAFBBMWCAB3BYJm2y1/AwsJBwmQqZ0t2ozHOtM1FAAAAAAA HAAQc2FsdEBub3RhdGlvbnMub3BlbnBncGpzLm9yZ0dIG2EeoHrtqV0TYtOn3nUC FQgDFgACAhkBApsDAh4BFiEECYP2HXv6CEPAckPJqZ0t2ozHOtMFJwkCBwIAAFct AP9FaSu/oXE24MHmhNVV1C5t5ZMkIv01qhfj2bOUwFYszwD/bQ0607Bnd+2mUTrM APkS1JQ4WpDRtHM96MtEBIhB+QPHXQRm2y1/EgorBgEEAZdVAQUBAQdATCR+e+Ky mVRhk5GaF4xnVZa6qASXU8mzNlBCodJGUTEDAQoJAAD/SN/8ctghMTinlIwPuVzl m7sJYeXVmdujw5tBQ8nVMDASN8KuBBgWCABgBYJm2y1/CZCpnS3ajMc60zUUAAAA AAAcABBzYWx0QG5vdGF0aW9ucy5vcGVucGdwanMub3Jn0p5s/rno0DRaPqlzstOG 9QKbDBYhBAmD9h17+ghDwHJDyamdLdqMxzrTAABwAQEApJKddT/Ox/QoqfmcLlum iL9m6xvj+RwdAFeIXUAHfGABAJ2bJSexnVTolnvWs0EhSfjBhMXcaKoA69l02DyI dJsL =aLfv -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v4-legacy/enc-seipdv2.msg000064400000000000000000000005101046102023000173550ustar 00000000000000-----BEGIN PGP MESSAGE----- wWwGFQS+h1+VKUtFm+Qn5ZU/aSTOGOM1SRIBB0BvRiPCZ76XFQqy3Y5Wf2VR9DYS 9P9pRo/0+gJacJyuTzCLZtlwv/YPkgMC7DZB7dP3NuRZt5p7MqKg93mEZvW8vUxn XeHQu5xrLd8aBgtAhYvSWAIHAgzXncHVTSROeQ58rmJeKIye5lLmEMIh+hFPIzwL 9Hu35tQv5zEBJzXSB6wXXCeDZTP5dt7gs6mbDt6tmX0DB8whPNTNE0AVsX7qUoCt 0xExCjFOGIY= -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v4-legacy/tsk.asc000064400000000000000000000013231046102023000160220ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xVgEZtsz4hYJKwYBBAHaRw8BAQdAqGVfFp7ZOudvQtcmVdfnJCGMIkQIFliN15BT PHXU264AAQC/ZLKkZjBE+6xW+J4QLT3Gl02O8wiYQNtgktkF5uOqMxC9zRB1c2Vy QGV4YW1wbGUub3JnwpIEEBYIADoCGQEFAmbbM+ICGwMCHgkICwkIBwoNDAsFFQoJ CAsCFgIBJxYhBLRsJ6Xqfs6zrH82ne/V+HsWqcE6AAoJEO/V+HsWqcE6TtwA/jCD hqb0JageQHQk0d4HNiNRbD96PgqE2T0hHqdei19jAP44F2ahtOWlN53/F6K48QDZ frn+ycIB7X8oOBcK0Ew+AsddBGbbM+ISCisGAQQBl1UBBQEBB0DphN2zPx5+6ZAP 3ABTZzR609TdLOiKXnENX5QPwCh+EgMBCAcAAP9b08kATMjzAwu91VY/i3CpNqFz 2/d05yZiqM/8qCTDuBKPwngEGBYIACAFAmbbM+ICGwwWIQS0bCel6n7Os6x/Np3v 1fh7FqnBOgAKCRDv1fh7FqnBOi/jAQDnCPqmhjcaIUAUTv7gHYHK0sTI+GzApKVF A+pgT1epDAD/R08Lb5qMBMizBJ/Hb3wX1eTpfBlXwSroqf9/j5slDws= =KxHq -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v4-nistp/enc-seipdv2.msg000064400000000000000000000005641046102023000172570ustar 00000000000000-----BEGIN PGP MESSAGE----- wYwGFQTyXm06EwLSZQU/9OJLGHhVR5OcshICAwRVzuzkGkl45cWjHYswtPpuPafz 07bnkNpXIHsuEGqduEeot/cGaJGR/EBkbcdhnvkbY0kcHIqp8gj+SmUHSRj7MNwC e+vsW2sGgLAJ2AlXjbiN4z9/PPO7zrp4SZ8Iu+4zldoGiD3JxgG9mKyy9LiSldJY AgcCDB73gURP7G1+0sArL5xZTDTgXVCj9Elea1ILvYht8Odb1Ys6vezrgsK/zNzF AcNd62Vc3fwwKJK99HLYxyPGJ6V8Ij0OyeR5fD7KzuOVfb2Z+TfFvw== -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v4-nistp/tsk.asc000064400000000000000000000014451046102023000157200ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xXcEZts0IxMIKoZIzj0DAQcCAwRWDf0J2INPbzMM1h3tZrlDdqE2js4Mpg9SiOq7 q3JuKOradQ777JczrPFpXhUtnp4iR00MlAt2S0bxVuTS0gt/AAD/fa7J/ecqyF/p RDJ/Itc5WJz5HJIuOilPq+e5CWkJIU8P6c0QdXNlckBleGFtcGxlLm9yZ8KSBBAT CAA6AhkBBQJm2zQjAhsDAh4JCAsJCAcKDQwLBRUKCQgLAhYCAScWIQTgIyUiV7Mc 7zTBr36RDW1YfIc2FAAKCRCRDW1YfIc2FOJsAP988LKGpGpTaAHQx9G5jpO7txZm x8boPHAaSkaVAXiYSQEAom7QgBhuUU80uvW34p3UvKnqxLaQXGEdnp3vkYVAKtjH ewRm2zQjEggqhkjOPQMBBwIDBGlPbOhGNLV9fMunt97bToKX2G7bRsTySI5qAgDm p0E7v/OyCGafiLmwzFGuedxt7OsVzp77+wG586kMfpGxZNkDAQgHAAD+Iqc9Uaur kwS2zmuEQKIqmcEammoVRo8ALcrMpO8drqoP7sJ4BBgTCAAgBQJm2zQjAhsMFiEE 4CMlIlezHO80wa9+kQ1tWHyHNhQACgkQkQ1tWHyHNhT5oAEAvzB0QHP4tstn+3CQ CxBaDxhKQQhOOkgwfSoXT1WPV0oA/3nPxshMJ/xf0b0N0ZsaT4BM8skVxpoG2bN3 z+srX4m/ =e30z -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v4-rsa/enc-seipdv2.msg000064400000000000000000000016211046102023000167020ustar 00000000000000-----BEGIN PGP MESSAGE----- wcFaBhUEEVpKQsFRp8u8H7GuAosr6yje5LYBD/444khl/rHVHL5Pm0vQqo2Vgoz2 5pbqeDvgKaWhOnpXRTJ/OSCDWQDN/Fpf4DXCzp1fYXFQ3P0BnfKBxtA8Q4ShJqAk nt0IvrJaFEkULCV+ZlBdpjhQGGbvJNd7erfJrbTgSppQJDJW/awMyWutSx3NWOOu Ur9ZafwSg7tR9tUipwRRH9EM97YqSvCFI0UQ7mOODcGVTtvEZybjNR0ilm/Ch/jl d4kKPsyncWaPUjvJJlWkEHmLQ8JiGCm41xNsrRa05cYEtCiuaXLHCjke3bHdyBpW c4Ijir6qLI22erjhGaMPxGnZHI5IyuQ6Q6mIKRaCQD1T7XTzT9JLKu8E1tBcpM1m ODJExbcnuvyexWtNIeoa51GngEOrQP8gIp19Ev6oO7dk6hf6Pi1vzW9u2t+gIGyc ZPjaWJXYviZqpZbB7GtSeWpDrNEZ5qTBG5m0SWASSZYLt06so0Eh/bZm6SlZTR6R /RYOCy/cu9dXnt5n3fYS79uoojxuyFF8/Cb+iDGhtfWS8WIqsBMtj3Ff8u/QZFTI lodv/6O8OJU1x6iVVUu1V4A16obWqbZP0Lwy2sG/vFCdsCp73IVT6yHj+k9Th8mO e6N44/whIBC7mx7pC7OrLe+g6GuRV2mIfWe2/1WaD3iGv8DzQ/Jlj4yYUXhZ/zM5 6d2DuQfGOVwfpwCODtJYAgcCDGD0ApUcIhkLVa1Kubf2lKTUe0VbHmw39uZWCx3k 8mmBpb1yQu66bkMwVZG9ImHnkEIV0SIj7VDmlz5gs2l50L/9D2RPfyGNCF3f5cfw CjjCbqMlMg== -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v4-rsa/tsk.asc000064400000000000000000000147221046102023000153520ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- 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 7k8rNtiIsw52vt/fnk4oSIvNS4s= =Vdhg -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v6-25519-annex-a-4/csf.msg000064400000000000000000000005001046102023000167210ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- hello world -----BEGIN PGP SIGNATURE----- wpgGARsKAAAAKQWCZtnC+iKhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJAAAAAIAIIPuKJbpVeuOADIgntUE26uxXnH3KU6knl8LloyFiu1GHBEJs9bQB 8fDeQTHtvKAQdeAAv7VvyB6HoqUnljHQ8ogUqwKbwStpG/XnsWhG4afBuXAko3zE HlGDdw36UY70Cw== -----END PGP SIGNATURE----- pgp-0.15.0/tests/rfc9580/v6-25519-annex-a-4/enc-seipdv1.msg000064400000000000000000000004111046102023000202650ustar 00000000000000-----BEGIN PGP MESSAGE----- wVQDEsg/HnBvYwgZW1s1eJQbzjCw8DOPffKCoK8H5clA14hPvyJZnd6tVTApCfj6 6YUBfYi4mMXPRIJprYYc5o8KXXp2ROZUS0ngGDBh7YUS4zuvE7DSPQE0gHHcipJF Pb+yj+mrbthRwF27FS0oFwRnKx6URhWlS3+HGg8BhGw9/p0sPd2q/YnuqRXIrR1n EEcRpyw= =Hsjd -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-25519-annex-a-4/enc-seipdv2.msg000064400000000000000000000005101046102023000202660ustar 00000000000000-----BEGIN PGP MESSAGE----- wW0GIQYSyD8ecG9jCP4VGkF3Q6HwM3kOk+mXhIjR2zeNqZMIhRk5Xme+wk1Fth/U mFpsFf0KnPdEEbAiMbmKTdG9tu6sHiix+1IH75zkOTYI1s2820uWe4tVyiBcbL8v LKmJe54KwSWgxwFzcT8J0lgCCQIMu7rBQSwxps80AzOrsWAMyrdIf9KKUiyDXJRl TaBS5kqaLngdatRVMYAjzGXM4YBOd6D5H+Jyw1RIBHYWy0RY6uvPrWIZ10lZ9Iu7 IlZDrwqDOVVE -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-25519-annex-a-4/tsk.asc000064400000000000000000000013461046102023000167400ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xUsGY4d/4xsAAAAg+U2nu0jWCmHlZ3BqZYfQMxmZu52JGggkLq2EVD34laMAGXKB exK+cH6NX1hs5hNhIB00TrJmosgv3mg1ditlsLfCsQYfGwoAAABCBYJjh3/jAwsJ BwUVCg4IDAIWAAKbAwIeCSIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJBScJAgcCAAAAAK0oIBA+LX0ifsDm185Ecds2v8lwgyU2kCcUmKfvBXbAf6rh RYWzuQOwEn7E/aLwIwRaLsdry0+VcallHhSu4RN6HWaEQsiPlR4zxP/TP7mhfVEe 7XWPxtnMUMtf15OyA51YBMdLBmOHf+MZAAAAIIaTJINn+eUBXbki+PSAld2nhJh/ LVmFsS+60WyvXkQ1AE1gCk95TUR3XFeibg/u/tVY6a//1q0NWC1X+yui3O24wpsG GBsKAAAALAWCY4d/4wKbDCIhBssYbE8GCaaX5NUt+mxyKwwfHifBilZwj2Ul7Ce6 2azJAAAAAAQBIKbpGG2dWTX8j+VjFM21J0hqWlEg+bdiojWnKfA5AQpWUWtnNwDE M0g12vYxoWM8Y81W+bHBw805I8kWVkXU6vFOi+HWvv/ira7ofJu16NnoUkhclkUr k0mXubZvyl4GBg== -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v6-ed25519-x448/csf.msg000064400000000000000000000005001046102023000162510ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- hello world -----BEGIN PGP SIGNATURE----- wpgGARsKAAAAKQWCZtnHUSKhBgE1Dx+jBtZm/Zk3BMflKej8xdwMR2u9GtLEkTb/ p3WPAAAAANWGIO0i+dgMlmX4q0mk4jIgkqz2K/Z5S9IsAkW8w/En/HryXG7VdRni 9Rx8/Hnn5u+MLW9mYjqpfEOvl8rCmNNO7Z1Gq7TXCUwMFeuJB+gBXbYwFzHwyxpz D/5Q1dzntb/fBg== -----END PGP SIGNATURE----- pgp-0.15.0/tests/rfc9580/v6-ed25519-x448/enc-seipdv1.msg000064400000000000000000000004511046102023000176210ustar 00000000000000-----BEGIN PGP MESSAGE----- wWwD+qqOBwJNRS0aKR+V+ypJdeFJA+KL22+n4Yl1AIqATelgom5mqiPs8w4wMW/t DtS8bW+hwvMLPfgorck+qM/HilIpCX7cqL6Q4U1sb8VrJRlFT0pFEShpKqqlESRD 53pU5b/Nw9x6GKNNxMLSPQEsLfxin+wGDuFF9SpMbxb70H2RaStuV9c5P8cioTWO TQmwsj/n7hJYo16oMZaO4cpKph7v8epS31ldA5I= =PU8I -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-ed25519-x448/enc-seipdv2.msg000064400000000000000000000005241046102023000176230ustar 00000000000000-----BEGIN PGP MESSAGE----- wXUGIQb6qo4HAk1FLaWSNuEiH33gvkdHqGNARMiEx7lPV9cVExq9cd3MwZckjQJV CeQ49KQ71Sxg4cK69UYjhq/CTU63PQ6dYFU9hAlbOePsLyyZOmNQblvcmRakxBg6 7PGkGDJA6S2JR2K5NlbaGDpBfoQWxwTSWAIHAgy2CJ3D7VGBtc5RyTDUg9zrGwPe 37fGmsnpttLMfJfFlpiIKdN253soJF2sR/Gtbw6ZSsAFnsmxsXk7jp6N6sefqMTn vFqga2LPJHOsiHCxwc4HbjQ= -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-ed25519-x448/tsk.asc000064400000000000000000000014411046102023000162640ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xUsGZtnE/xsAAAAgc1Bj70rWKNarKDXNNE3PTbcP26KXp7+pvS7c4I/jbAAArzMK 0IgHBOR95I1ZxuR3I16//S3z/hI4ffxmsUJm1mXCsAYfGwoAAABBBQJm2cT/AhsD Ah4JCAsJCAcKDQwLBRUKCQgLAhYCIiEGATUPH6MG1mb9mTcEx+Up6PzF3AxHa70a 0sSRNv+ndY8AAAAArpwgvOucaDuxEYNQ0jD+2gBf//jxU4zlW32hdyA7yBLvq/vc AP7Wma1XA1qPGxqcAyZsYg6wF7dGjSmIqk8awSQJ1jumCf+h8UbYSbm9TeogHXGQ TAmAk5R/CmlYG+6y7mILx3sGZtnE/xoAAAA4RQLWfGdb9kUPsqCJLXOVeu/5eoCU mUALwDe4RTawkgcDMRcc2GMKbl7ee7vsXjSHTdYifsTAcv0AEHP96eUD1DRh+kPe mKmKYWQvQD5jeaQTKKfJ+jfz2NmyCGbHhrWRKGyzXoDLD4QSI5TRBHwhg/nClQYY GwgAAAAsBQJm2cT/AhsMIiEGATUPH6MG1mb9mTcEx+Up6PzF3AxHa70a0sSRNv+n dY8AAAAKCRABNQ8fowbWZt1gEBm7LFP0aTLAurmUa+ZCr/V/FuIWB7R9U4uqKz5a uBTJvg59HqFEvqUnuNBmvUElArbCCsRKzAv5OupdfqPlgTfsOH72u+crBM2vJEFB 4JED =jy6X -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v6-legacy_illegal/csf.msg000064400000000000000000000005171046102023000175130ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 hello world -----BEGIN PGP SIGNATURE----- wpYGARYIAAAAKSIhBuvwcYhDocDl8LdngEoQKvRtJHjjYLDdCnUEsrzZ7g92BQJm 2dS0AAAACgkQ6/BxiEOhwOUTcxCuOCeOPmCI43bmtIro/PnnAP46Xx+RbLiOsrB9 s+dWGQImBUNdWQruRk2nKILOFyvWagD+KzqeCGUhqbZc6WI1CIUVM22UZSQxxqTM uyPmiPITtgY= =1j3b -----END PGP SIGNATURE----- pgp-0.15.0/tests/rfc9580/v6-legacy_illegal/enc-seipdv2.msg000064400000000000000000000005361046102023000210600ustar 00000000000000-----BEGIN PGP MESSAGE----- wXgGIQZOdhvUR8OQYI/X4QvCVxOuI/HFa8W1zT6ktseG8FBvDBIBB0CeHxPtrQXN +RQXmZG7g8mffkrpMb9QwENKRI/jF6U9EjCPpR/j90IH2X+JCiSoDPtDel/j/EyH m+KZkq3z7sGQyJ5FFeoc8p/MOuh1cnGqbwbSWAIJAg7x7ATWlYXYTRqbzt3afV2A q2C5Fpv0urDWGgLcEXf2pIWuOT08gL0J9CmGQugXg8l+Xheqy+Kavt9JDmuZ8sIe R9f0nfxYSEGiiU7fut4f+ebSBI4= =JLej -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-legacy_illegal/tsk.asc000064400000000000000000000014301046102023000175140ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xVoGZtnEsRYAAAAtCSsGAQQB2kcPAQEHQJ8u3Y3xhq7vDoYgyIjhniUavG9lhqqn eoQLj08i1UyCAAEAnZMljJWA74axuVNrL6uhyBLGCwypSeWCXBRqKzR4yjzCswYf FgoAAABBBQJm2cSxAhsDAh4JCAsJCAcKDQwLBRUKCQgLAhYCIiEG6/BxiEOhwOXw t2eAShAq9G0keONgsN0KdQSyvNnuD3YAAAAAFEcgEheAMaYvmoAP4UKwK0hOPtFC wnuf7v+O9tpko93/9GQA9Am6sr0XTsa8RDRc49lm5k2WYwGx5yk2JgsFLX26RJAA /j0NorcLtTCV/uejDw26ZsWg2kF69ovLed4wF26iCaAHx18GZtnEsRIAAAAyCisG AQQBl1UBBQEBB0DavdPV3M/mAO5/IkYVdHu006uVFO3eIuZ2ffJPoe5KGQMBCAcA AP9V2OXFg/QewXMGMNol6S1DUbKhGuyKEK0hrmzUz224qMKZBhgWCAAAACwFAmbZ xLECGwwiIQbr8HGIQ6HA5fC3Z4BKECr0bSR442Cw3Qp1BLK82e4PdgAAAAoJEOvw cYhDocDl37EQls/BpUt572AJX8ZBqbsycgD/QfCjSRcPHelHFHkaAHMzXscDBaUS jiCm2KiM+33wOYYA/2Hu4xmHg7wN2prRcB4+2qkUIdEzMyFs5TYcOU7Hst0N =pm0Y -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v6-nistp/csf.msg000064400000000000000000000005041046102023000157070ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- hello world -----BEGIN PGP SIGNATURE----- wpwGARMKAAAAKQWCZtnVdiKhBolAqDIEDQcN8Ekjrm34kHW8QdjWe5cOJD0sW/Ix NbGZAAAAAJ0gILCtukY4PcgGR3LDXydWWnaqvbirb7Hlj6KMMwZW1z0+APsGH+Uz nU6IqmaChh3cEujBNg3g1mpSan9UGZ55DeIOyAEAqF/fSURYvNBKB/4kirCOZOaB RsAHHrE/JMMSnH0Eses= -----END PGP SIGNATURE----- pgp-0.15.0/tests/rfc9580/v6-nistp/enc-seipdv1.msg000064400000000000000000000005011046102023000172470ustar 00000000000000-----BEGIN PGP MESSAGE----- wX4DxO7YSKuSOjUSAgME/3XSMLnPliShn+zGRN9TPYe5ieKngCvdJuwOffWnu5ze 6yijkKHvY1TLqU7rY8pRmmmwGkzDY5aEvZ8AQPEn+TDCk00orxDhdo3FGP/dQEcI k8zD0mESUei6VDVhehkhn2pj5ahrEwAxmKAG4BeYAPfSPQG7GRgQG02av4+6ITWV N48ogl5GrBZswUcMwmfxoBCuiHztzL/ZLlB9KhzHbM9x8rJlntLp2ANKJCjhTzk= =OIIZ -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-nistp/enc-seipdv2.msg000064400000000000000000000006051046102023000172550ustar 00000000000000-----BEGIN PGP MESSAGE----- wZgGIQbE7thIq5I6NVzEPlOVtcVFleRJ06Y60F1TZjvrZjRNwxICAwRh3CF+6tjx +g3qSwKyCQGsPjr7nR16QhkfIDdxb9KHuNcfRt1ZOEqcGS+EhoFI+BtGIJHxdMSH nZtTlbNBPRr7MAz5AX9fUyQjjSSPYuHO8fUoEk60X3mmVDmcT9Je6LQwUFC0qNXR Iuyz3QmAZbxDENJYAgcCDPcAsTVjngKhvPZWZB4Rly2LZEIzsvtzLrQcgT61DG00 7efSycdhFUZ6vZmD4Nv0Ul6vX/UkszHFysqI8aL4MT02RTeKzLjcfO9de312oI/L D6JGCQ== -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-nistp/tsk.asc000064400000000000000000000015561046102023000157250ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xXkGZtnFzBMAAABMCCqGSM49AwEHAgMEIbspuVoCf9aaAFQWeC6E8bw3J/n6iZX8 tiA+IhMnNSssyAgKT5oC7Ulf/FXo2EN821FzYu3LJYmsE14cOlbWMwABAL6YHYbr 8mZLNk1K0+QTk3jR8q8WJqB5uezEVJDsQwQawrQGHxMKAAAAQQUCZtnFzAIbAwIe CQgLCQgHCg0MCwUVCgkICwIWAiIhBolAqDIEDQcN8Ekjrm34kHW8QdjWe5cOJD0s W/IxNbGZAAAAAM2DII98y1PIV1WLTBsDjgPSMrKw10Cvyn1WTY+F4Dte/PO/AP4o 3L0fE7uapGUktoYqh+8wQ3Yx6UVP7n6jQismvSQ+/AD+K2atA4EN0TmfqQF2LUvC VpUSx4BeNjR3Utp1Zzx5xTXHfQZm2cXMEgAAAFAIKoZIzj0DAQcCAwSmERs4INza a8Lh6JmJVncjnRPDP90wBvqx2XjMI25ZACcLk7V1gcRKDNCjJAmNmJ5c4iDLDor9 WaQXW4OVRAg9AwEIBwABAKqxeY2dUCdnWbvpl+60PsRSN5CtNboiAHeinZeEHfGI wpkGGBMIAAAALAUCZtnFzAIbDCIhBolAqDIEDQcN8Ekjrm34kHW8QdjWe5cOJD0s W/IxNbGZAAAACgkQiUCoMgQNBw2A3BBnDmC4dOBLB9IkLXBU8ynUAP9lCFqz/HyG 14DHF64gfMEcv4EPYw3R8IXkwK4ho4k+fQD9HzE4jgyDmCnZXIotYeYfT+n9stCW JEkYM1yn5d6U578= =Y2Lz -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580/v6-rsa/csf.msg000064400000000000000000000016411046102023000153420ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- hello world -----BEGIN PGP SIGNATURE----- wsGaBgEBCgAAACkFgmbZ1bMioQYHtc47kA7CvCB/Ba0bpxA3Fwtd+iVC5ONmIdMp 8Rd6qwAAAADUESA2oCbil5b35xHGOqubd5+BGQRi3uL0CPlb/TGpgSRDOg/8DJB8 kkNcMRAAiG1hvhQtz3dZzwLFq1n5EHF4aZo57LhE4dMTrJkAXSsw3U2wFzDDDARf sbUBdtLecjh2wRF0F6a9EQqhv6z25Pi7O5eA63DLB2J5s07q6uJ4CUWkA45mVvuD cmGthRMjjv+e4HePfWxl747udTDAWhDmNBZYaQzIytwSzT59HaMMrhbvFr3EU8C7 dIzgBDx9aotpU0TSfhmUtGxNviz8BD/Q6DBg5pBWwLn7hDNrZRRXgUEikZ8WrWc7 3US9kPWyqYFWfLN4oqHFS4BpLns6aBRyExl5JoHcmATd3UE25yp2fVSk4hTUw1ZP pN/7YETMAECnML34Iy5zeUa8SUGdtomw1DIcDKGhPPCk2uA8nc63/zArDvFUPIB0 Nuuiznn5Z8dtBUQ54ckb9tLR3ArQxQFfr8/1l0LKb0cpg8+m/hC5JrK7VhZ7wZZ0 qYLkzfN3ffBAHA8n7YhtNnlIfUc53MLziUvQ6eOj/ujcFJDBxSaFPGg5vBLqsh/Y +hCEju20LKvyS0uB6FuP5YK9NEhjw04osMGfQbkRGON0OXfDB59scoU989WXZvPH bDfgYdbb9KnBbDkBGWNMK5XtGwbfD2U6Nf2ct7fRaiwo+zB+C7l915m67G7Ty+bT sLfnLePwVRw/9+PbSKaxPIE8i/SNFen2Bv4muF4= -----END PGP SIGNATURE----- pgp-0.15.0/tests/rfc9580/v6-rsa/enc-seipdv1.msg000064400000000000000000000015361046102023000167100ustar 00000000000000-----BEGIN PGP MESSAGE----- wcFMAxPycfY804kzARAAkh/4X53FhgOOb5A/5I00nyebcRnY6pnryoVaDtYGzq5L BKJRsFAarc37BM07ilVYkfTSJSH0V6hCDwR0UQHODHDTvppXj/N/+264gogKYspD w2gECdcYLRWl4LrCOOe6jnOPMx9TKfId86c+tyX599zVviLIFIj0jLBcGJVM0l6b c1pTU2OSMIbFCLvhqhpq0sHuuS020cQIk4LFUP4jnxmk4QDmCuHSwyu2eLEvuC7R VphwI5zOdDxCHdaoebTokUoZwSIFvGGUBxfZndxXUhSjHPQ7T2skKz4Dt0gBA7f3 3J01u8IbZfXCOFsDF/o6jY05bctnpEvkHDY/ZK4l9VaSrsNcglRW1Ih/7AlBaEq1 EXrtR3Gj6DYMJHKG7zGOSblaiQbXyoEcFp4KV/9UDSNIioepEQsH4XZqcCO7Spvs 8RRtgOkAalMcKeJpsWN5mXUmFOpQns1VckY6qhQ7swRGyorIX30Q3ImkFLF96alM z1Z7xb4ECU2afK6Z/9y1nqcxL72855Ks5woK/8DsmonwMlx0HLi+d052BOtlRfbA Z2uUm3c4Gy2uHYIaq3FL1JHn8Uj7egImZjUhpjeOBWyX8YnfvU04e/71/VvJB7zm BE/3ZIIWo6WVJSfI1ag1LuFfMYpJOVCxz5XatblzQ5Z71IDXWbCZdcxiCMefy6HS PQFeAdlk3+2bRkW5H+tjlPja8oySACJpdWCE+8N0lryyFPugPW6dcaduW7LAES5N ecd8lw2371Dd88AmYpE= =8Q8t -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-rsa/enc-seipdv2.msg000064400000000000000000000016411046102023000167060ustar 00000000000000-----BEGIN PGP MESSAGE----- wcFmBiEGE/Jx9jzTiTMPnuJ/2EKtiiBaOLf9+YNWhLputq1OkYsBD/43w8KuGzld fNhC69aTbLJBtMJ+2AI0vP5Zsm8kJ20BLOChy+zOq5b5X92mDxBrNGHYbQKRtkG3 pTYPOYpTyCJ+sMQH4crMba9NWRy6o0mpo28jWrCHnGPlM8f+sxOQb0i++LSgiIjS AUSgyBRFbjwUck13Ymm1PvEYxAIx1xLxsBnBtYZ0NcOzc1WfdLLw/ImDt26Nr9Au C/C52XLn/+AObHFoDFBBnb9+CafoCzLvyMgfqZzwwYIYZQ5/CoKvJN/nG/Zvwct8 3rw8HEv7UJhVoO3U0ttOTO3sGl83C3tXtiA2neR9atlmQ1h3bye1lJwOwk0IjAtG m6EAO6ei7fjGIVksYGfgqz+VsLbyOthDcJH7sHD0O8QWX575eS0PMWemiV7oulgG V06EtK6IC8ntYWqDQVfO3vBb6TW6R9s1Bhfs+A/ckcVIy7OgJsylS2DTahRy++wk 2a6FGibb3Zlm+prVRs8sVRQJ383a8X0BwQCZ706fjEeTbgqhlju6gN2suYGos+v9 E837E737sVyRFJC7LrwNBJg/NIeR7wlog5pr18SGzZczoIJdHugrS8yewEvCN0nI +75wBAzWb8VfC09wEYHxjES13alxWAhByqKhaTrFgWqyUuoaky8nQxje2+Uv2kWy G2WXfRBP45oa2DCjrVBzgVQLwTQfU3k5OtJYAgcCDDgZUPntjjQCUT8gPyBZmkoS uJZPZogmmD/rGRvXPnhTUM6+r9SvJ9A1683WE9xWn5R93Um46OtGJVMQCtmnIovs U/oE8Al8vPraKSen00KkH493xg== -----END PGP MESSAGE----- pgp-0.15.0/tests/rfc9580/v6-rsa/tsk.asc000064400000000000000000000150331046102023000153500ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- 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 S8OCXQJFkEOWE0qeMc4NbDc2YfUk4UmZRw== =V6TT -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/rfc9580.rs000064400000000000000000000173741046102023000133210ustar 00000000000000use std::fs::File; use pgp::crypto::ecc_curve::ECCCurve; use pgp::crypto::{aead::AeadAlgorithm, hash::HashAlgorithm, sym::SymmetricKeyAlgorithm}; use pgp::packet::LiteralData; use pgp::types::KeyVersion; use pgp::{ cleartext::CleartextSignedMessage, Deserializable, KeyType, Message, SecretKeyParamsBuilder, SignedPublicKey, SignedSecretKey, }; use rand::SeedableRng; use rand_chacha::ChaCha8Rng; const MSG: &str = "hello world\n"; // Test cases based on keys with new formats from RFC9580 const CASES_9580: &[&str] = &[ ("tests/rfc9580/v6-25519-annex-a-4"), // TSK from RFC 9580 Annex A.4 (Ed25519/X25519) #[cfg(feature = "unstable-curve448")] ("tests/rfc9580/v6-ed25519-x448"), // TSK using Ed25519/X448 (TODO: replace with Ed448/X448 once rPGP supports it) ("tests/rfc9580/v6-rsa"), // TSK using RSA ("tests/rfc9580/v6-nistp"), // TSK using NIST P-256 ("tests/rfc9580/v4-ed25519-x25519"), // Version 4 TSK using the RFC 9580 Ed25519/X25519 formats ]; // Test cases based on keys that don't use new formats from RFC9580. // These keys are traditional v4 keys, but they have the SEIPDv2 feature flag enabled. const CASES_PRE_9580: &[&str] = &[ ("tests/rfc9580/v4-rsa"), // Version 4 TSK using RSA ("tests/rfc9580/v4-nistp"), // Version 4 TSK using NIST P-256 ("tests/rfc9580/v4-legacy"), // Version 4 TSK using Ed25519Legacy and Curve25519Legacy ]; fn load_ssk(filename: &str) -> SignedSecretKey { let (mut iter, _) = pgp::composed::signed_key::from_reader_many(File::open(filename).unwrap()).expect("ok"); let pos = iter.next().expect("some").expect("ok"); pos.try_into().unwrap() } fn try_decrypt(keyfile: &str, msg_file: &str) { let ssk = load_ssk(keyfile); // load seipdv1 msg, decrypt let (message, _) = Message::from_armor_single(File::open(msg_file).unwrap()).expect("ok"); let (dec, _) = message.decrypt(String::default, &[&ssk]).expect("decrypt"); let decrypted = String::from_utf8(dec.get_literal().expect("literal").data().to_vec()).expect("utf8"); assert_eq!(&decrypted, MSG); } #[test] fn rfc9580_decrypt_seipdv1_msg() { for case in CASES_9580 { try_decrypt( &format!("{}/tsk.asc", case), &format!("{}/enc-seipdv1.msg", case), ); } } #[test] fn rfc9580_decrypt_seipdv2_msg() { for case in CASES_9580.iter().chain(CASES_PRE_9580.iter()) { try_decrypt( &format!("{}/tsk.asc", case), &format!("{}/enc-seipdv2.msg", case), ); } } #[test] fn rfc9580_verify_csf() { for case in CASES_9580 { let keyfile = format!("{}/tsk.asc", case); let csffile = format!("{}/csf.msg", case); let ssk = load_ssk(&keyfile); let spk = SignedPublicKey::from(ssk.clone()); // load+verify csf msg let (csf, _) = CleartextSignedMessage::from_armor(File::open(csffile).unwrap()).expect("csf loaded"); csf.verify(&spk).expect("verify ok"); } } #[test] fn rfc9580_seipdv1_roundtrip() { let mut rng = ChaCha8Rng::seed_from_u64(0); for case in CASES_9580 { let keyfile = format!("{}/tsk.asc", case); let ssk = load_ssk(&keyfile); let spk = SignedPublicKey::from(ssk.clone()); let enc_subkey = &spk.public_subkeys.first().unwrap().key; let lit = LiteralData::from_bytes("".into(), MSG.as_bytes()); let msg = Message::Literal(lit); // SEIPDv1 encrypt/decrypt roundtrip let enc = msg .encrypt_to_keys_seipdv1(&mut rng, SymmetricKeyAlgorithm::AES256, &[enc_subkey]) .expect("encrypt"); let (dec, _) = enc.decrypt(String::default, &[&ssk]).expect("decrypt"); let Message::Literal(lit) = dec else { panic!("expecting literal data"); }; assert_eq!(String::from_utf8_lossy(lit.data()), MSG); } } #[test] fn rfc9580_seipdv2_roundtrip() { let mut rng = ChaCha8Rng::seed_from_u64(0); for case in CASES_9580.iter().chain(CASES_PRE_9580.iter()) { let keyfile = format!("{}/tsk.asc", case); let ssk = load_ssk(&keyfile); let spk = SignedPublicKey::from(ssk.clone()); let enc_subkey = &spk.public_subkeys.first().unwrap().key; let lit = LiteralData::from_bytes("".into(), MSG.as_bytes()); let msg = Message::Literal(lit); // SEIPDv2 encrypt/decrypt roundtrip let enc = msg .encrypt_to_keys_seipdv2( &mut rng, SymmetricKeyAlgorithm::AES256, AeadAlgorithm::Ocb, 0x06, // 2^12 bytes &[enc_subkey], ) .expect("encrypt"); let (dec, _) = enc.decrypt(String::default, &[&ssk]).expect("decrypt"); let Message::Literal(lit) = dec else { panic!("expecting literal data"); }; assert_eq!(String::from_utf8_lossy(lit.data()), MSG); } } #[test] fn rfc9580_roundtrip_csf() { let mut rng = ChaCha8Rng::seed_from_u64(0); for case in CASES_9580 { let keyfile = format!("{}/tsk.asc", case); let ssk = load_ssk(&keyfile); let spk = SignedPublicKey::from(ssk.clone()); // roundtrip sign+verify csf let csf = CleartextSignedMessage::sign(&mut rng, MSG, &ssk, String::default).expect("sign"); csf.verify(&spk).expect("verify"); } } #[test] fn rfc9580_roundtrip_sign_verify_inline_msg() { let mut rng = ChaCha8Rng::seed_from_u64(0); for case in CASES_9580 { let keyfile = format!("{}/tsk.asc", case); let ssk = load_ssk(&keyfile); let spk = SignedPublicKey::from(ssk.clone()); let lit = LiteralData::from_bytes("".into(), MSG.as_bytes()); let msg = Message::Literal(lit); // roundtrip sign+verify inline msg let signed = msg .sign(&mut rng, &ssk, String::default, HashAlgorithm::default()) .expect("sign"); signed.verify(&spk).expect("verify"); } } #[test] fn rfc9580_legacy_25519_illegal_in_v6() { // Ensure that rPGP rejects v6 EdDSA legacy or ECDH(Curve25519) keys // "The deprecated OIDs for Ed25519Legacy and Curve25519Legacy are used only in version 4 keys // and signatures. [..] Implementations MUST NOT accept or generate version 6 key material // using the deprecated OIDs." // // See https://www.rfc-editor.org/rfc/rfc9580.html#section-9.2-6 let mut rng = ChaCha8Rng::seed_from_u64(0); // -- Try (and fail) to load a v6/legacy key -- let key_file = File::open("tests/rfc9580/v6-legacy_illegal/tsk.asc").unwrap(); let (mut iter, _) = pgp::composed::signed_key::from_reader_many(key_file).expect("ok"); let res = iter.next().expect("result"); // we expect an error about the illegal legacy parameters in a v6 key assert!(res.is_err()); // -- Create a v6 ed25519 legacy signing key, expect failure -- let mut key_params = SecretKeyParamsBuilder::default(); key_params .key_type(KeyType::EdDSALegacy) .version(KeyVersion::V6) .can_sign(true) .primary_user_id("Me ".into()); let secret_key_params = key_params .build() .expect("Must be able to create secret key params"); let res = secret_key_params.generate(&mut rng); assert!(res.is_err()); // -- Create a v6 curve 25519 legacy encryption key, expect failure -- let mut key_params = SecretKeyParamsBuilder::default(); key_params .key_type(KeyType::ECDH(ECCCurve::Curve25519)) .version(KeyVersion::V6) .can_encrypt(true) .primary_user_id("Me ".into()); let secret_key_params = key_params .build() .expect("Must be able to create secret key params"); let res = secret_key_params.generate(&mut rng); assert!(res.is_err()); } pgp-0.15.0/tests/security.rs000064400000000000000000000341521046102023000140610ustar 00000000000000use pgp::{ types::{PublicKeyTrait, SecretKeyTrait}, Deserializable, Message, }; /// RPG-022 #[test] fn rpg_022_message_from_armor_single_panic2() { // expected bug behavior: // thread '[..]' panicked at [..]/src/armor/reader.rs:489:13: // invalid state let bad_input: &[u8] = b"-----BEGIN PGP SIGNATURE-----\n00LL"; let _ = Message::from_armor_single(std::io::Cursor::new(bad_input)); } /// RPG-019 #[test] fn rpg_019_message_decrypt_with_password_panic1() { let bad_input: &[u8] = &[ 140, 159, 4, 1, 0, 0, 0, 167, 167, 167, 167, 167, 167, 167, 167, 0, 0, 0, 0, 0, 0, 0, 145, 68, 32, 70, 73, 76, 69, 208, 0, 0, 0, 0, 227, 167, 167, 76, 69, 210, 69, 208, 210, 167, 167, 167, 227, 167, 167, 76, 69, 210, 167, 167, 167, 167, 167, 167, 227, 167, 167, 76, 69, 210, 69, 208, 210, 167, 167, 167, 227, 167, 167, 76, 69, 227, 167, 167, 76, 69, 1, 0, 0, 0, 0, 0, 4, 184, 167, 167, 167, 227, 167, 167, 76, 69, 167, 167, 167, 167, 167, 167, 68, 32, 70, 73, 76, 69, 208, 210, 167, 167, 167, 227, 167, 167, 76, 69, 210, 69, 208, 210, 167, 167, 167, 227, 167, 167, 76, 69, 227, 167, 167, 69, 73, 76, 69, 208, 210, 167, 167, 167, 227, 167, 167, 76, 69, 210, 69, 208, 210, 167, 167, 167, 227, 167, 167, 76, 69, 227, 167, 167, ]; let message = Message::from_bytes(bad_input).unwrap(); // expected bug behavior // thread '' panicked at library/alloc/src/raw_vec.rs:545:5: // capacity overflow let _ = message.decrypt_with_password(|| "password does not matter".into()); } /// RPG-019 #[test] fn rpg_019_message_decrypt_with_password_panic2() { let bad_input: &[u8] = &[ 0xc3, 0x20, 0x04, 0x01, 0x01, 0x02, 0x32, 0xf6, 0xe3, 0xff, 0xff, 0xac, 0xa7, 0xa7, 0xa7, 0xff, 0xff, 0xa7, 0x26, 0xaf, 0x20, 0x4b, 0xaf, 0xa7, 0xa7, 0xa7, 0xa7, 0xd1, 0x22, 0xa7, 0xa7, 0xa7, 0x00, 0xa7, 0xa7, 0xd1, 0x22, 0xff, 0xff, 0xff, 0xa7, 0x26, 0xaf, 0x20, 0x4b, 0xaf, ]; let message = Message::from_bytes(bad_input).unwrap(); // note that for this crash, the password does matter // expected bug behavior // thread '[..]' panicked at [..]/src/crypto/sym.rs:265:52: // not implemented: CFB resync is not here let _ = message.decrypt_with_password(|| "bogus_password".into()); } /// RPG-016 /// Only present in 0.11, added as regression test #[test] fn rpg_016_message_parser_panic2() { // expected bug behavior: // thread '' panicked at 'assertion failed: length > 0', src/packet/many.rs:140:17: let bad_input: &[u8] = &[0xb7]; let _ = Message::from_bytes(bad_input); } /// RPG-015 #[test] fn rpg_015_cleartext_signed_message_from_armor_panic1() { let bad_input: &[u8] = &[ 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 80, 32, 83, 73, 71, 78, 69, 68, 32, 77, 69, 83, 83, 65, 71, 69, 45, 45, 45, 45, 45, 10, 10, 22, 10, 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 80, 32, 83, 73, 71, 78, 65, 84, 85, 82, 69, 45, 45, 45, 45, 45, 10, 72, ]; let _ = pgp::composed::cleartext::CleartextSignedMessage::from_armor(bad_input); } /// RPG-015 #[test] fn rgp_015_cleartext_signed_message_from_string_panic1() { // this triggers the same bug as the from_armor() case, but is more human readable let bad_input = "-----BEGIN PGP SIGNED MESSAGE-----\n\n-\n-----BEGIN PGP SIGNATURE-----\n-"; let _ = pgp::composed::cleartext::CleartextSignedMessage::from_string(bad_input); } /// RPG-015 #[test] fn rpg_015_cleartext_signed_message_from_string_panic2() { let data = "-----BEGIN PGP SIGNED MESSAGE-----\n\r\nqq\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n-----BEGIN PGP SIGNATURE-----\n\n\n\n\n\n\n\n\n qqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq-qqqqqqqqqqqqqqqq\0----BE\u{7}IN-D*'S-- \u{1}{\0\0\u{1}\0\0\0\0\0\0\0\0\0\0\0\0\0\0-----BEGIN PGP PRIVATE KEY BLOCK -----\n-----CEGIN PGP-----BEGIN OPENSSH PRIVATE qqqKEY----- M-----BEGIN OPENSSH PRIVATE KEY---- KEY----- M[ESSA-----BEGIN PGP SIGNED MESSAGE-----GE\t- --\0\0\0\0\0\0>ATE KEY B- M[ESSAGE\t0--\0\0\0\0\0\0>ATE KEY BLOCK----%\n-----\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\ 0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0>>>>>>>>\0\0\0\0\"DE-----END PGP PRIVATE KEY BLOCK---------BEYGIN PGP M[ESSAGE\t---\0\0>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>>>>>>>>>>>>>#>>>>>>>>>>>>>>>>>>>>>>>>>>>>qq>>>>>>>>>>>>>>>>>>>\t>>>>>>>PGP M[ESSAGE\t---\0\0>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> >>>>>>>>>[ESSAGE\tw:::::::"; let _ = pgp::composed::cleartext::CleartextSignedMessage::from_string(data); } /// RPG-015 #[test] fn rpg_015_cleartext_signed_message_from_armor_panic2() { let data = vec![ 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 80, 32, 83, 73, 71, 78, 69, 68, 32, 77, 69, 83, 83, 65, 71, 69, 45, 45, 45, 45, 45, 10, 9, 10, 10, 10, 10, 10, 10, 10, 10, 10, 45, 89, 45, 45, 45, 45, 45, 10, 10, 10, 10, 10, 10, 10, 10, 10, 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 80, 32, 83, 73, 71, 78, 65, 84, 85, 82, 69, 45, 45, 45, 45, 45, 10, 10, 10, 10, 10, 26, 45, 45, 45, 45, 45, 45, 45, 10, 10, 86, 10, 10, 10, 10, 10, 10, 10, 10, 10, 45, 45, 69, 78, 68, 32, 68, 83, 65, 32, 80, 82, 73, 86, 65, 84, 69, 32, 75, 69, 89, 45, 58, 26, 10, 10, 10, 10, 10, 10, 10, 86, 10, 10, 0, 0, 0, 0, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 45, 0, 45, 45, 45, 45, 10, 10, 10, 10, 10, 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 69, 67, 32, 80, 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 80, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 71, 80, 32, 83, 73, 71, 78, 69, 68, 32, 77, 69, 83, 83, 65, 71, 69, 45, 0, 13, 10, 247, 255, 15, 0, 45, 45, 45, 45, 45, 45, 45, 69, 78, 68, 32, 69, 67, 32, 80, 82, 71, 80, 32, 80, 82, 73, 86, 65, 84, 69, 32, 75, 189, 10, 73, 86, 65, 84, 69, 45, 45, 45, 66, 187, 175, 73, 78, 32, 80, 71, 80, 32, 77, 69, 83, 83, 65, 71, 69, 45, 45, 83, 83, 65, 71, 69, 45, 45, 45, 45, 45, 133, 133, 133, 133, 10, 10, 10, 10, 10, 133, 133, 133, 64, 10, 86, 10, 10, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 7, 121, 0, 0, 0, 0, 0, 45, 0, 0, 0, 45, 45, 0, 13, 10, 45, 45, 45, 45, 10, 13, 10, 10, 45, 45, 45, 10, 166, ]; let _ = pgp::composed::cleartext::CleartextSignedMessage::from_armor(&data[..]); } /// RPG-007 #[test] fn rpg_007_message_parser_panic1() { let bad_input: &[u8] = &[0xff, 0x1]; // expected behavior // [...] panicked at src/packet/many.rs:128:70: // range end index 1 out of range for slice of length 0 let _ = Message::from_bytes(bad_input); } /// RPG-007 #[test] fn rpg_007_message_from_armor_single_panic1() { let bad_input: &[u8] = &[ 45, 45, 45, 45, 45, 66, 69, 71, 73, 78, 32, 80, 71, 80, 32, 77, 69, 83, 83, 65, 71, 69, 45, 45, 45, 45, 45, 10, 54, 84, 54, 53, 45, 45, 45, 45, 45, 69, 78, 68, 32, 80, 71, 80, 32, 77, 69, 83, 83, 65, 71, 69, 45, 45, 45, 45, 45, ]; // expected bug behavior // thread '' panicked at [..]/src/packet/many.rs:126:70: // range end index 62 out of range for slice of length 1 let _ = Message::from_armor_single(bad_input); } /// RPG-017 #[test] fn rpg_017_signed_public_key_as_unsigned_panic1() { let bad_input: &[u8] = &[155, 4, 228, 4, 0, 4, 0]; let key = pgp::composed::SignedPublicKey::from_bytes(bad_input).unwrap(); // expected bug behavior: // thread '' panicked at src/composed/signed_key/shared.rs:116:35: // missing user ids let _ = key.as_unsigned(); } /// RPG-021 /// Actual fix is in RustCrypto/RSA #[test] fn rpg_021_signed_secret_key_encrypt_panic1() { let bad_input: &[u8] = &[ 197, 159, 4, 159, 1, 0, 20, 2, 0, 61, 0, 0, 0, 64, 0, 201, 0, 197, 0, 1, 251, 213, 0, 201, 0, 250, 196, 0, 197, 0, 197, 0, 197, 0, 201, 0, 197, 0, 197, 0, 201, 255, 255, 255, 255, 255, 255, 255, 5, 205, 205, 205, 205, 43, 129, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 1, 161, 4, 0, 242, 143, 4, 4, 135, 6, 0, 0, 0, 0, 6, 0, 0, 0, 0, 242, 143, 4, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 1, 1, 1, 161, 4, 0, 143, 4, 4, 135, 6, 0, 0, 0, 0, 4, 0, 242, 143, 4, 4, 135, 6, 0, 0, 0, 0, 0, 0, 0, 0, 242, 143, 4, 4, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 1, 1, 143, 4, 4, 135, 6, 0, 0, 0, 0, ]; // no particular meaning of this data let dummy_plaintext = vec![0u8; 128]; // note, this is non-deterministic, but does not matter for reproduction let mut rng = rand::thread_rng(); let key = pgp::composed::SignedSecretKey::from_bytes(bad_input).unwrap(); // expected bug behavior on --release: // thread '' panicked at [..]/rsa-0.9.6/src/algorithms/pkcs1v15.rs:51:39: // range end index 18446744073709551492 out of range for slice of length 5 // // expected bug behavior on --debug: // thread 'signed_secret_key_encrypt_panic1' panicked at [..]/rsa-0.9.6/src/algorithms/pkcs1v15.rs:44:20: // attempt to subtract with overflow // // crash also happens with pgp::types::EskType::V3_4 let _ciphertext = { key.encrypt( &mut rng, dummy_plaintext.as_slice(), pgp::types::EskType::V6, ) }; } /// RPG-021 #[cfg(feature = "unstable-curve448")] #[test] fn rpg_021_signed_secret_key_encrypt_panic2() { let bad_input: &[u8] = &[ 0x97, 0x04, 0x00, 0x1a, 0x1a, 0x1a, 0x1a, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x29, ]; // no particular meaning of this data let dummy_plaintext = vec![0u8; 1]; // note, this is non-deterministic, but does not matter for reproduction let mut rng = rand::thread_rng(); let key = pgp::composed::SignedSecretKey::from_bytes(bad_input).unwrap(); // expected bug behavior: // thread '[..]' panicked at [..]/src/crypto/x448.rs:149:75: // 56 // // crash also happens with pgp::types::EskType::V3_4 let _ciphertext = { key.encrypt( &mut rng, dummy_plaintext.as_slice(), pgp::types::EskType::V6, ) }; } /// RPG-020 /// Actual fix is done in RustCrypto/RSA #[test] fn rpg_020_signed_secret_key_create_signature_panic1() { let bad_input: &[u8] = &[ 151, 3, 255, 251, 255, 63, 39, 254, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, ]; let dummy_data: &[u8] = &[0]; let key = pgp::composed::SignedSecretKey::from_bytes(bad_input).unwrap(); // expected bug behavior: // thread '' panicked at [..]/num-bigint-dig-0.8.4/src/algorithms/sub.rs:75:5: // Cannot subtract b from a because b is larger than a. let _ = key.create_signature( || "pw".into(), pgp::crypto::hash::HashAlgorithm::SHA2_256, dummy_data, ); } /// RPG-020 #[test] fn rpg_020_signed_secret_key_create_signature_panic2() { let bad_input: &[u8] = &[ 0x97, 0x04, 0x00, 0x00, 0x08, 0x29, 0xc1, 0xfd, 0xff, 0x03, 0x03, 0x02, 0x08, 0x00, 0xf8, 0xff, 0x00, 0xff, 0x00, 0x00, 0x00, 0x00, 0x00, 0xff, 0x00, 0xf8, 0xf8, 0xff, 0x00, 0xff, 0x00, 0xff, 0x00, ]; let dummy_data: &[u8] = &[0]; let key = pgp::composed::SignedSecretKey::from_bytes(bad_input).unwrap(); // expected bug behavior for --debug: // thread [..] panicked at [..]/src/types/params/encrypted_secret.rs:155:48: // attempt to subtract with overflow // // expected bug behavior for --release: // thread '[..]' panicked at [..]/src/types/params/encrypted_secret.rs:155:39: // assertion failed: mid <= self.len() let _ = key.create_signature( || "pw".into(), pgp::crypto::hash::HashAlgorithm::SHA2_256, dummy_data, ); } /// RPG-020 #[test] fn rpg_020_signed_secret_key_create_signature_oom_crash1() { let bad_input: &[u8] = &[ 0x97, 0x04, 0x00, 0x00, 0x08, 0x29, 0xc1, 0xfd, 0xff, 0x9f, 0x04, 0x8f, 0xe4, 0xff, 0xff, 0xff, 0xff, 0x80, 0x8f, 0x8f, 0x8f, 0x00, 0x01, 0x00, 0x00, 0x00, 0xaf, 0xf8, 0x1b, 0x1b, ]; let dummy_data: &[u8] = &[0]; let key = pgp::composed::SignedSecretKey::from_bytes(bad_input).unwrap(); // expected bug behavior: // memory allocation of 137438871552 bytes failed let _ = key.create_signature( || "pw".into(), pgp::crypto::hash::HashAlgorithm::SHA2_256, dummy_data, ); } /// RPG-010 #[test] fn rpg_010_standalone_signature_subtract_with_overflow1() { let bad_input: &[u8] = &[209, 3, 0, 252, 45]; // expected bug behavior // thread '' panicked at src/packet/user_attribute.rs:165:41: // attempt to subtract with overflow let _ = pgp::composed::StandaloneSignature::from_bytes(bad_input); } /// RPG-009 #[test] fn rpg_009_message_from_bytes_subtract_with_overflow1() { let bad_input: &[u8] = &[187, 6, 227, 0, 255, 255, 255, 255, 255, 255, 255]; // depends on "--debug" profile // expected bug behavior // thread '' panicked at src/packet/public_key_parser.rs:250:47: // attempt to subtract with overflow let _ = Message::from_bytes(bad_input); } /// RPG-009 #[test] fn rpg_009_message_from_bytes_subtract_with_overflow2() { let bad_input: &[u8] = &[139, 4, 16, 0, 0, 0, 2, 0, 0]; // depends on "--debug" profile // expected bug behavior // thread '' panicked at src/packet/signature/de.rs:391:25: // attempt to subtract with overflow let _ = Message::from_bytes(bad_input); } /// RPG-009 #[test] fn rpg_009_message_from_bytes_subtract_with_overflow3() { let bad_input: &[u8] = &[151, 6, 7, 8, 0, 0, 0, 0, 0, 0, 0, 113, 113]; // depends on "--debug" profile // expected bug behavior // thread '' panicked at src/types/params/secret.rs:106:47: // attempt to subtract with overflow let _ = Message::from_bytes(bad_input); } pgp-0.15.0/tests/unit-tests/aead/eax.msg000064400000000000000000000004431046102023000161360ustar 00000000000000-----BEGIN PGP MESSAGE----- w0AGHgcBCwMIpa5XnR/F2Cv/aSJPkZmTs1Bvo7WaanPP+MXvxfQcV/tU4cImgV14 KPX5LEVOtl6+AKtZhsaObnxV0mkCBwEGn/kOOzIZZPOkKRPI3MZhkyUBUifvt+rq pJ8EwuZ0F11KPSJu1q/LnKmsEiwUcOEcY9TAqyQcapOK1Iv5mlqZuQu6gyXeYQR1 QCWKt5Wala0FHdqW6xVDHf719eIlXKeCYVRuM5o= -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/aead/gcm.msg000064400000000000000000000004371046102023000161320ustar 00000000000000-----BEGIN PGP MESSAGE----- wzwGGgcDCwMI6dOXhbIHAAj/tC58SD70iERXyzcmubPbn/d25fTZpAlS4kRymIUa v/91Jt8t1VRBdXmneZ/SaQIHAwb8uUSQvLmLvcnRBsYJAmaUD3LontwhtVlrFXax Ae0Pn/xvxtZbv9JNzQeQlm5tHoWjAFN4TLHYtqBpnvEhVaeyrWJYUxtXZR/Xd3kS +pXjXZtAIW9ppMJI2yj/QzHxYykHOZ5v+Q== -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/aead/ocb.msg000064400000000000000000000004431046102023000161240ustar 00000000000000-----BEGIN PGP MESSAGE----- wz8GHQcCCwMIVqKY0vXjZFP/z8xcEWZO2520JZDX3EawckG2EsOBLP/76gDyNHsl ZBEj+IeuYNT9YU4IN9gZ02zSaQIHAgYgpmH3MfyaMDK1YjMmAn46XY21dI6+/wsM WRDQns3WQf+f04VidYA1vEl1TOG/P/+n2tCjuBBPUTPPQqQQCoPu9MobSAGohGv0 K82nyM6dZeIS8wHLzZj9yt5pSod61CRzI/boVw== -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/argon2/aes128.msg000064400000000000000000000004531046102023000166630ustar 00000000000000-----BEGIN PGP MESSAGE----- Comment: Encrypted using AES with 128-bit key Comment: Session key: 01FE16BBACFD1E7B78EF3B865187374F wycEBwScUvg8J/leUNU1RA7N/zE2AQQVnlL8rSLPP5VlQsunlO+ECxHSPgGYGKY+ YJz4u6F+DDlDBOr5NRQXt/KJIf4m4mOlKyC/uqLbpnLJZMnTq3o79GxBTdIdOzhH XfA3pqV4mTzF -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/argon2/aes192.msg000064400000000000000000000005441046102023000166650ustar 00000000000000-----BEGIN PGP MESSAGE----- Comment: Encrypted using AES with 192-bit key Comment: Session key: 27006DAE68E509022CE45A14E569E91001C2955... Comment: Session key: ...AF8DFE194 wy8ECAThTKxHFTRZGKli3KNH4UP4AQQVhzLJ2va3FG8/pmpIPd/H/mdoVS5VBLLw F9I+AdJ1Sw56PRYiKZjCvHg+2bnq02s33AJJoyBexBI4QKATFRkyez2gldJldRys LVg77Mwwfgl2n/d572WciAM= -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/argon2/aes256.msg000064400000000000000000000006001046102023000166570ustar 00000000000000-----BEGIN PGP MESSAGE----- Comment: Encrypted using AES with 256-bit key Comment: Session key: BBEDA55B9AAE63DAC45D4F49D89DACF4AF37FEF... Comment: Session key: ...C13BAB2F1F8E18FB74580D8B0 wzcECQS4eJUgIG/3mcaILEJFpmJ8AQQVnZ9l7KtagdClm9UaQ/Z6M/5roklSGpGu 623YmaXezGj80j4B+Ku1sgTdJo87X1Wrup7l0wJypZls21Uwd67m9koF60eefH/K 95D1usliXOEm8ayQJQmZrjf6K6v9PWwqMQ== -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/cleartext-key-01.asc000064400000000000000000000117751046102023000174600ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: Bob's OpenPGP Transferable Secret Key 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 =miES -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/unit-tests/cleartext-msg-01-fail.asc000064400000000000000000000015731046102023000203620ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 - From the grocery store we need: - - tofu - - vegetables - - noodles -----BEGIN PGP SIGNATURE----- wsE7BAEBCgBvBYJl/DklCRD7/MgqAV5zMEcUAAAAAAAeACBzYWx0QG5vdGF0aW9u cy5zZXF1b2lhLXBncC5vcmf+jKVOJF5/diyNJvSLX1OpTtKfVXKLRMWKF/F5N+eL 2BYhBNGmbhojsYLJmA94jPv8yCoBXnMwAAAVKgv+LSHemq3PWPxgak7f6I10K3dY lHZGeHbYzBLpuhcll8rBHthTt/H+Rc/hxffRCXlHxLSnrBxoFQmBOPoSiNBQOYBl 4lAqAX1yn3mlzh0s79dYgO+yRTYEBCyquxnbpXu+DuZoL4K03lsNNofYkCX8mQFG wMpcYMo9QXP3lTxdper6e/1+b8r4RlJfh2ZnhtRzQPZq/pL8PgK8LGDS59DKZ3h3 YvP48oJMkINfPht/RVOtdYBP17UtTYeONG6gyE1qQeBXGmJORse35k7NHUlYuqOh vDk/F2pKBuB2BNRiQv2lifp46TFhqUJ6pzccuEdlxySHqbG0wkYHx4J0bgOxMWIe jRPVilCiwVFGZZAFElOVZIr8ISErA+EkcCSxiyR7mWulU+vkMnyWgVxNaYOUMo5z DHKWlKMmAk7A9es2XDBmuGzWoFzLISSmssZN7ETUlXPDwqu45HFDfiy2gzgGiofk kf/OAP9YdwUbkkI1Cfam+sE5trCMJrsRuTQl+gAU =3cQw -----END PGP SIGNATURE----- other things pgp-0.15.0/tests/unit-tests/cleartext-msg-01.asc000064400000000000000000000015561046102023000174520ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 - From the grocery store we need: - - tofu - - vegetables - - noodles -----BEGIN PGP SIGNATURE----- wsE7BAEBCgBvBYJl/DklCRD7/MgqAV5zMEcUAAAAAAAeACBzYWx0QG5vdGF0aW9u cy5zZXF1b2lhLXBncC5vcmf+jKVOJF5/diyNJvSLX1OpTtKfVXKLRMWKF/F5N+eL 2BYhBNGmbhojsYLJmA94jPv8yCoBXnMwAAAVKgv+LSHemq3PWPxgak7f6I10K3dY lHZGeHbYzBLpuhcll8rBHthTt/H+Rc/hxffRCXlHxLSnrBxoFQmBOPoSiNBQOYBl 4lAqAX1yn3mlzh0s79dYgO+yRTYEBCyquxnbpXu+DuZoL4K03lsNNofYkCX8mQFG wMpcYMo9QXP3lTxdper6e/1+b8r4RlJfh2ZnhtRzQPZq/pL8PgK8LGDS59DKZ3h3 YvP48oJMkINfPht/RVOtdYBP17UtTYeONG6gyE1qQeBXGmJORse35k7NHUlYuqOh vDk/F2pKBuB2BNRiQv2lifp46TFhqUJ6pzccuEdlxySHqbG0wkYHx4J0bgOxMWIe jRPVilCiwVFGZZAFElOVZIr8ISErA+EkcCSxiyR7mWulU+vkMnyWgVxNaYOUMo5z DHKWlKMmAk7A9es2XDBmuGzWoFzLISSmssZN7ETUlXPDwqu45HFDfiy2gzgGiofk kf/OAP9YdwUbkkI1Cfam+sE5trCMJrsRuTQl+gAU =3cQw -----END PGP SIGNATURE----- pgp-0.15.0/tests/unit-tests/cleartext-msg-02-fail.asc000064400000000000000000000016121046102023000203550ustar 00000000000000leading text is not allowed -----BEGIN PGP SIGNED MESSAGE----- Hash: SHA512 - From the grocery store we need: - - tofu - - vegetables - - noodles -----BEGIN PGP SIGNATURE----- wsE7BAEBCgBvBYJl/DklCRD7/MgqAV5zMEcUAAAAAAAeACBzYWx0QG5vdGF0aW9u cy5zZXF1b2lhLXBncC5vcmf+jKVOJF5/diyNJvSLX1OpTtKfVXKLRMWKF/F5N+eL 2BYhBNGmbhojsYLJmA94jPv8yCoBXnMwAAAVKgv+LSHemq3PWPxgak7f6I10K3dY lHZGeHbYzBLpuhcll8rBHthTt/H+Rc/hxffRCXlHxLSnrBxoFQmBOPoSiNBQOYBl 4lAqAX1yn3mlzh0s79dYgO+yRTYEBCyquxnbpXu+DuZoL4K03lsNNofYkCX8mQFG wMpcYMo9QXP3lTxdper6e/1+b8r4RlJfh2ZnhtRzQPZq/pL8PgK8LGDS59DKZ3h3 YvP48oJMkINfPht/RVOtdYBP17UtTYeONG6gyE1qQeBXGmJORse35k7NHUlYuqOh vDk/F2pKBuB2BNRiQv2lifp46TFhqUJ6pzccuEdlxySHqbG0wkYHx4J0bgOxMWIe jRPVilCiwVFGZZAFElOVZIr8ISErA+EkcCSxiyR7mWulU+vkMnyWgVxNaYOUMo5z DHKWlKMmAk7A9es2XDBmuGzWoFzLISSmssZN7ETUlXPDwqu45HFDfiy2gzgGiofk kf/OAP9YdwUbkkI1Cfam+sE5trCMJrsRuTQl+gAU =3cQw -----END PGP SIGNATURE----- pgp-0.15.0/tests/unit-tests/csf-puppet/DEB-GPG-KEY-puppet-20250406000064400000000000000000000032561046102023000216430ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- mQINBFyrv4oBEADhL8iyDPZ+GWN7L+A8dpEpggglxTtL7qYNyN5Uga2j0cusDdOD ftPHsurLjfxtc2EFGdFK/N8y4LSpq+nOeazhkHcPeDiWC2AuN7+NGjH9LtvMUqKy NWPhPYP2r/xPL547oDMdvLXDH5n+FsLFW8QgATHk4AvlIhGng0gWu80OqTCiL0HC W7TftkF8ofP8k90SnLYbI9HDVOj6VYYtqG5NeoCHGAqrb79G/jq64Z/gLktD3IrB CxYhKFfJtZ/BSDB8Aa4ht+jIyeFCNSbGyfFfWlHKvF3JngS/76Y7gxX1sbR3gHJQ hO25AQdsPYKxgtIgNeB9/oBp1+V3K1W/nta4gbDVwJWCqDRbEFlHIdV7fvV/sqiI W7rQ60aAY7J6Gjt/aUmNArvT8ty3szmhR0wEEU5/hhIVV6VjS+AQsI8pFv6VB8bJ TLfOBPDW7dw2PgyWhVTEN8KW/ckyBvGmSdzSgAhw+rAe7li50/9e2H8eiJgBbGid 8EQidZgkokh331CMDkIA6F3ygiB+u2ZZ7ywxhxIRO70JElIuIOiofhVfRnh/ODlH X7eD+cA2rlLQd2yWf4diiA7C9R8r8vPrAdp3aPZ4xLxvYYZV8E1JBdMus5GRy4rB Avetp0Wx/1r9zVDKD/J1bNIlt0SR9FTmynZj4kLWhoCqmbrLS35325sS6wARAQAB tEhQdXBwZXQsIEluYy4gUmVsZWFzZSBLZXkgKFB1cHBldCwgSW5jLiBSZWxlYXNl IEtleSkgPHJlbGVhc2VAcHVwcGV0LmNvbT6JAlQEEwEKAD4WIQTWgR7Tre64RBr1 qo9FKLbNnmHvJgUCXKu/igIbAwUJC0c1AAULCQgHAwUVCgkICwUWAgMBAAIeAQIX gAAKCRBFKLbNnmHvJg/vD/0eOl/pBb6ooGnzg2qoD+XwgOK3HkTdvGNZKGsIrhUG q6O0zoyPW8v9b/i7QEDre8QahARmMAEQ+T3nbNVzw4kpE+YIrEkKjoJsrF8/K/1L zBHJCc3S9oF9KubG5BuQ4bAmcvnI+qpEYbSTLHztYGUfXAGu+MnaDf4C60G7zM6m ec4bX8lVnt+gcsGGGCdN89XsZLBNdv21z9xMeaAPiRYJpbqwrb8cYbKQeqFSQt2M UylN5oVeN77Q8iyXSyVwpc6uKzXdQ8bVPbKUTWSXQ4SSp0HJjtAMiDH2pjty4PG6 EgZ6/njJLOzQ29ZgFrS19XLONlptHwKzLYB8nJhJvGHfzzInmNttDtNwTA6IxpsR 4aCnrPWFJRCbmMBNXvBR9B/O+e/T5ngL21ipMEwzEOiQlRSacnO2pICwZ5pARMRI dxq/5BQYry9HNlJDGR7YIfn7i0oCGk5BxwotSlAPw8jFpNU/zTOvpQAdPvZje2JP 6GS+hYxSdHsigREXI2gxTvpcLk8LOe9PsqJv631e6Kvn9P9OHiihIp8G9fRQ8T7y elHcNanV192mfbWxJhDAcQ+JEy9883lOanaCoaf/7z4kdmCQLz5/oNg2K0qjSgZH JY/gxCOwuAuUJlLcAXQG6txJshfMxyQUO46DXg0/gjwkKgT/9PbTJEN/WN/G6n1h lQ== =nKF2 -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/unit-tests/csf-puppet/InRelease000064400000000000000000001561701046102023000176500ustar 00000000000000-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA256 Origin: Puppetlabs Label: Puppetlabs Suite: bookworm Codename: bookworm NotAutomatic: no ButAutomaticUpgrades: no Components: puppet puppet7 puppet8 puppet-tools Architectures: i386 amd64 arm64 armel armhf powerpc sparc mips mipsel ppc64el all Date: Tue, 22 Oct 2024 20:38:46 UTC Valid-Until: Tue, 30 Nov 2038 00:00:00 UTC MD5Sum: 652a93c9cbd0f62bac0cbfbf7d4efb8c 220 puppet-tools/binary-sparc/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-sparc/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-sparc/Packages.gz 397e05fca7b1714bc991fcfcb75addd6 220 puppet-tools/binary-armel/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-armel/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-armel/Packages.gz fc30cba6b3ef3f2b3cb1120fc6b9f601 218 puppet-tools/binary-all/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-all/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-all/Packages.gz 0d2c7d93a046cbdf6374d59671325ff2 219 puppet-tools/binary-mips/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-mips/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-mips/Packages.gz d9afe65189e898b232ee58ce03faacd0 219 puppet-tools/binary-i386/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-i386/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-i386/Packages.gz 80ffc7fb9b9f1ce4c8fa215e6d61d2b5 222 puppet-tools/binary-powerpc/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-powerpc/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-powerpc/Packages.gz aa436a0ae8ec59ad1cc3cb29489be9e1 220 puppet-tools/binary-armhf/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-armhf/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-armhf/Packages.gz ace1c2a295e40b2dea967c7003174368 220 puppet-tools/binary-arm64/Release 08f932927da7ec4896bfcf91a6517c4d 15443 puppet-tools/binary-arm64/Packages 9989f596b312bdacbc0526f25ede5c6e 7682 puppet-tools/binary-arm64/Packages.gz d025a6158e7796a91a2b65445ab890b9 222 puppet-tools/binary-ppc64el/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-ppc64el/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-ppc64el/Packages.gz c0e0d854dd9443ff176ebb0500c37ed7 221 puppet-tools/binary-mipsel/Release 6897e777eea34c3f92375e02e8f4b4ee 4235 puppet-tools/binary-mipsel/Packages ea2bb2f3f9a206c035a53a1e0d795d37 1263 puppet-tools/binary-mipsel/Packages.gz c6c5d7980cc2fc7a1794202a408a792b 220 puppet-tools/binary-amd64/Release 78234e0534eddfad42a3eb983d690063 37941 puppet-tools/binary-amd64/Packages 21e0441416620dc78bf899d0758dd166 18922 puppet-tools/binary-amd64/Packages.gz 91cbf040248ff3f0e7f58e1ca26922c5 215 puppet7/binary-sparc/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-sparc/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-sparc/Packages.gz 4bd42203cc2869f8ea8f665208736a8a 215 puppet7/binary-armel/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-armel/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-armel/Packages.gz 513ae92a083333fbefef8f0c4aa0986d 213 puppet7/binary-all/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-all/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-all/Packages.gz f635514aa2144df6e7f91ecefc70cc9c 214 puppet7/binary-mips/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-mips/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-mips/Packages.gz 824764162aed08f981c33cbb07ebd9fa 214 puppet7/binary-i386/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-i386/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-i386/Packages.gz b826df6c803d0ed604b2c135f22bc934 217 puppet7/binary-powerpc/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-powerpc/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-powerpc/Packages.gz 0f8ea4af54785d7a9e3faa8ccd7fd21f 215 puppet7/binary-armhf/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-armhf/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-armhf/Packages.gz 48b4d797f38f58559cae89fc48294a08 215 puppet7/binary-arm64/Release 49076659cc27161a805df788376daab0 94282 puppet7/binary-arm64/Packages bc61aa5e6fc718239457ef48adfebda9 30866 puppet7/binary-arm64/Packages.gz 8722037dd8f72d109a839a29b6a854b0 217 puppet7/binary-ppc64el/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-ppc64el/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-ppc64el/Packages.gz 1c81538a6bd180b02b3a9d2b8ab4f160 216 puppet7/binary-mipsel/Release c7bd64f005408b48b616a40ccd377e5d 8818 puppet7/binary-mipsel/Packages 59d3bb10069768a51d6c02193debfe12 2665 puppet7/binary-mipsel/Packages.gz b586cce1dcc7085bb81b7476ba280b7e 215 puppet7/binary-amd64/Release 1ef82217fcd3ab804062bb91d89faea5 117088 puppet7/binary-amd64/Packages 27ff76d64e041205dbe3ae63fa43671c 42047 puppet7/binary-amd64/Packages.gz 507b3ad60a64a056f16f705bc30f25ba 215 puppet8/binary-sparc/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-sparc/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-sparc/Packages.gz d20b849b8df97d124a238a591ff77e64 215 puppet8/binary-armel/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-armel/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-armel/Packages.gz a86504e973dc79bfd2ad6c1c6135780a 213 puppet8/binary-all/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-all/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-all/Packages.gz cfe3edab92798749ebc53d128a2a467c 214 puppet8/binary-mips/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-mips/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-mips/Packages.gz 01af3abe0bb99b1533a55dc40759e855 214 puppet8/binary-i386/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-i386/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-i386/Packages.gz 5d5ff004bb5d8b601250ab603007b5c6 217 puppet8/binary-powerpc/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-powerpc/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-powerpc/Packages.gz 6f160dbcab48878a1c4be5d8c4d4f7bc 215 puppet8/binary-armhf/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-armhf/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-armhf/Packages.gz cce46654054285cc8bf2ccba8410cf71 215 puppet8/binary-arm64/Release b5f990ec6d9ec770c7d70f21fc4e8458 77324 puppet8/binary-arm64/Packages eabe9869049699a04085ed1833ca887d 30014 puppet8/binary-arm64/Packages.gz 1e9307c8a0ea796c0b6116d7127c06a3 217 puppet8/binary-ppc64el/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-ppc64el/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-ppc64el/Packages.gz 65497a0c20e295c082b539c4ce6581fd 216 puppet8/binary-mipsel/Release acb474dc929b8b1515c9452b848540d9 7316 puppet8/binary-mipsel/Packages de786f3493c3f1cb363b488976f4cfa7 2268 puppet8/binary-mipsel/Packages.gz c84fe170d95158bd737fad3c7019612d 215 puppet8/binary-amd64/Release 752622b7d3dfe05b9562c29d2786f115 99802 puppet8/binary-amd64/Packages a514bd78c68415eb5bca7d422d4c6eb0 41015 puppet8/binary-amd64/Packages.gz 5fd42b815b3e24d709e77d4ecb798a78 214 puppet/binary-sparc/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-sparc/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-sparc/Packages.gz ce2667f717789504e1da927118b5f754 214 puppet/binary-armel/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-armel/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-armel/Packages.gz f7cc02a010ef62796189be2c6f9de86f 212 puppet/binary-all/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-all/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-all/Packages.gz 974782100d96359cb40dc0b894945b71 213 puppet/binary-mips/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-mips/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-mips/Packages.gz eec1e5e0a4dbd20444dbfef76cec46a3 213 puppet/binary-i386/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-i386/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-i386/Packages.gz 3a387eabe15874b98e420568d9269e3c 216 puppet/binary-powerpc/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-powerpc/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-powerpc/Packages.gz 2c0bb29e16dc2d63a1876d81e51e1991 214 puppet/binary-armhf/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-armhf/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-armhf/Packages.gz 60120241d877b63d1b12114bd20de116 214 puppet/binary-arm64/Release 3f0cd27293f4cfe5fd868498a35c5f85 94254 puppet/binary-arm64/Packages fe569d344ec14aa02113df5e55e63eeb 30866 puppet/binary-arm64/Packages.gz 41e1061887bbcea07e209e31f99c3632 216 puppet/binary-ppc64el/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-ppc64el/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-ppc64el/Packages.gz f799be91df621fd8271aa0ae8c0d707c 215 puppet/binary-mipsel/Release 2b392e742ef273a4ca8cb032acfa6e3e 8808 puppet/binary-mipsel/Packages a61c1c511598a270cf2b83ca07afd7ea 2665 puppet/binary-mipsel/Packages.gz e150a7f958e476e476262cce46a346ba 214 puppet/binary-amd64/Release 5620e93deff79cf5717d7ef2144b98e7 117056 puppet/binary-amd64/Packages 3910136f494bf0505cfc206c16ecc2a5 42046 puppet/binary-amd64/Packages.gz SHA1: 6490ea31d07203970162cc7f6e69b39f65522e0b 220 puppet-tools/binary-sparc/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-sparc/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-sparc/Packages.gz f8902b6234952e6d9acb476a81ba09293c78dc8b 220 puppet-tools/binary-armel/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-armel/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-armel/Packages.gz 82f634dca3009c2238e2c8f4ea87a66d8fca1185 218 puppet-tools/binary-all/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-all/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-all/Packages.gz fa53c3cac90d5c1b053eded3ada40a37204f05b7 219 puppet-tools/binary-mips/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-mips/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-mips/Packages.gz 93ad0fbb62df01b2f237ea7aaacbbb6c7ddd214a 219 puppet-tools/binary-i386/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-i386/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-i386/Packages.gz c7c71fe55f2e1314efe0eed1d7b7de9e45262d0d 222 puppet-tools/binary-powerpc/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-powerpc/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-powerpc/Packages.gz ca0d1cd1bd427434447acd1ce9bb3852ce7560eb 220 puppet-tools/binary-armhf/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-armhf/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-armhf/Packages.gz 548ca810c9ff6126e996ebe58e0917244d271ace 220 puppet-tools/binary-arm64/Release 170981b3ceb3ff21e0a9fe53da1c6bd39c0cfd0a 15443 puppet-tools/binary-arm64/Packages bb101488807b3a10141d9ac0a082773e5f1ac3f7 7682 puppet-tools/binary-arm64/Packages.gz 49767bb0499841dc67a6002288da43b834131f6a 222 puppet-tools/binary-ppc64el/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-ppc64el/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-ppc64el/Packages.gz 3b5a2e4b414d0ce63ed013c2a5d05b4d58b901ee 221 puppet-tools/binary-mipsel/Release 049e3ef965f163403912852c9b92c6fc0aa0b63d 4235 puppet-tools/binary-mipsel/Packages 1f543be5ed546c45488576806cf37173fca744ec 1263 puppet-tools/binary-mipsel/Packages.gz eef7e7a52227c55748b4a975ac22b9a8f74d701f 220 puppet-tools/binary-amd64/Release ca2133cfbda33681f4119a54ffcfc2c30b76d713 37941 puppet-tools/binary-amd64/Packages dd495a56f08c729e602253e9e330bf34419c5268 18922 puppet-tools/binary-amd64/Packages.gz 31be8cf8ae985cfba4ab1204e9f46b050816a7a1 215 puppet7/binary-sparc/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-sparc/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-sparc/Packages.gz 5c40494bbf49392e4692378ed4431d44232a22b9 215 puppet7/binary-armel/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-armel/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-armel/Packages.gz 2de02c2d2aba4f6e45bee213b8c08649ed365cef 213 puppet7/binary-all/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-all/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-all/Packages.gz e2e8e5ed8e34416343824d9cc33b41703440f414 214 puppet7/binary-mips/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-mips/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-mips/Packages.gz 76e8d15ee9ad81327041f845cb424b90376c0a02 214 puppet7/binary-i386/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-i386/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-i386/Packages.gz e31a9b56c88b6f9033b3f5c5b6d920d6110dcba1 217 puppet7/binary-powerpc/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-powerpc/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-powerpc/Packages.gz 119944ceb2356c5fd65d11724e9a50e233cad83a 215 puppet7/binary-armhf/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-armhf/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-armhf/Packages.gz d4925107c22bfa8bec34c9817e0a3ad323e39ed4 215 puppet7/binary-arm64/Release 64366543e3086603255efee2ce149d996276403a 94282 puppet7/binary-arm64/Packages 87f76a8985d0f1c4b62f2b11dfffe6a922664d9c 30866 puppet7/binary-arm64/Packages.gz 31021e5389b0967eef03844bdd5dc325a91b118a 217 puppet7/binary-ppc64el/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-ppc64el/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-ppc64el/Packages.gz 6ea8131daaf6d7597a3058015360acec715f36f0 216 puppet7/binary-mipsel/Release bc1a1c5c94b57b8e3de553fe9f3d73c168d972bd 8818 puppet7/binary-mipsel/Packages 582bff5b8ebc168d266edb6d820b1a3cb931863c 2665 puppet7/binary-mipsel/Packages.gz 2685b3f7848eac2e5cbf9daa7bb36bb341baff56 215 puppet7/binary-amd64/Release 46a19f1bd45cd1a2cb5ba7267f592ad31792e955 117088 puppet7/binary-amd64/Packages 7b911faabcfb38bb2890122f15b835de69b1e0c7 42047 puppet7/binary-amd64/Packages.gz 1fa047489729d1aaa05721331a4440599fa6e094 215 puppet8/binary-sparc/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-sparc/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-sparc/Packages.gz e5981dc31d1eccf5e6d65b03b996510bd1702d27 215 puppet8/binary-armel/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-armel/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-armel/Packages.gz d1040b6eb767c0a94d6dbfb390a33184d8a4a3f3 213 puppet8/binary-all/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-all/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-all/Packages.gz ee3b346a60bac2157865afcbff777cd72750576c 214 puppet8/binary-mips/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-mips/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-mips/Packages.gz 2f922ec25d65b4ab4b32255c421bf42108225319 214 puppet8/binary-i386/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-i386/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-i386/Packages.gz 1efee4c1d991df1f71c57da3c6e397b08c3ca23f 217 puppet8/binary-powerpc/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-powerpc/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-powerpc/Packages.gz 58e70399de75b1d579f2afe160e89ca028aef038 215 puppet8/binary-armhf/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-armhf/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-armhf/Packages.gz bd13989cf6096edd132ec6932269e5d2c6b26ef4 215 puppet8/binary-arm64/Release a4c824c8d7f12f7632e90a6821769e9325bb0f31 77324 puppet8/binary-arm64/Packages 26d916d4198158c9c1c5c3917132362f616868c0 30014 puppet8/binary-arm64/Packages.gz 1de4a3f638dc589f0618cdb3ff1aea27b8f8bef0 217 puppet8/binary-ppc64el/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-ppc64el/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-ppc64el/Packages.gz edb06f9dd472dfe5fb2dd99a7dd44e6633d6d7cd 216 puppet8/binary-mipsel/Release 7ee19c32535807cc2e0d8f1b0663b111c4d9ca4e 7316 puppet8/binary-mipsel/Packages 2f38e396f28e8160679b3d93c3cb3518611743e1 2268 puppet8/binary-mipsel/Packages.gz 134535f7a28f78349a4c7186a9e97eabd0976966 215 puppet8/binary-amd64/Release 11796781c78c9d04a981e5e2365274c18b74a837 99802 puppet8/binary-amd64/Packages 8edb7c57ab2fc8259cbb8ffc156ba1f1ff70c9ee 41015 puppet8/binary-amd64/Packages.gz 27787a1732089365f2fdfb14ec1de3aef91847d5 214 puppet/binary-sparc/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-sparc/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-sparc/Packages.gz bb44cc9d8a008d0ca85e18fdcd856aeab2661750 214 puppet/binary-armel/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-armel/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-armel/Packages.gz 8650fa46357447eb6f51e4dfb04003e494193ef7 212 puppet/binary-all/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-all/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-all/Packages.gz fcdd7b449af5f5f7f7c93d9f1380538def96f3fe 213 puppet/binary-mips/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-mips/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-mips/Packages.gz b26c0ae8a8b8a6b57369f253e03272f3af6ede5b 213 puppet/binary-i386/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-i386/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-i386/Packages.gz e469ad5399bad7f97c29e9209d8f256932039a56 216 puppet/binary-powerpc/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-powerpc/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-powerpc/Packages.gz 46d8377cd912c9d035ea442d7c15380c73c31ae0 214 puppet/binary-armhf/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-armhf/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-armhf/Packages.gz c492a9672bece65ec3579c2f96280e749889afdf 214 puppet/binary-arm64/Release 5ad13008ff533325fab35dae70d51aee9bc84a48 94254 puppet/binary-arm64/Packages 7d9dd7dc41e49a2484316c6779402b13ae33e32f 30866 puppet/binary-arm64/Packages.gz 404e2e58e5a4644c042860d485d8d5d0b21082ec 216 puppet/binary-ppc64el/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-ppc64el/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-ppc64el/Packages.gz 61fe62f1dbf0f882bed9bca0ca7c619b4ee52054 215 puppet/binary-mipsel/Release f934a2dc4b7b18911b11d5a77e517d8a3e36de68 8808 puppet/binary-mipsel/Packages d6af172705d71fa924e1aedb7f4847bbdc0b5ded 2665 puppet/binary-mipsel/Packages.gz 5a1c10cc51de6d0ccde583c3bc334f66a299ae71 214 puppet/binary-amd64/Release 9a9026f922e34de3d2f1340d4683e1b7ecf3fb07 117056 puppet/binary-amd64/Packages f69fe188377a1e0d9ed073c4a63762de369c0a50 42046 puppet/binary-amd64/Packages.gz SHA256: c4f7eed1da5cfe01910d3a32e400b81801fbd55b631deeb7850ec5b3853319f3 220 puppet-tools/binary-sparc/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-sparc/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-sparc/Packages.gz cb00820eda9297d0cd9e3d62cda34b17872c96462b594cb92292e08f2da99aab 220 puppet-tools/binary-armel/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-armel/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-armel/Packages.gz 0f3818b43192588f6478067fb4a00a5ede18229e0d4d336d20104603f052c219 218 puppet-tools/binary-all/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-all/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-all/Packages.gz 3c4a65e5a93d67428cc73391c4ec143feb399210d2cb661af76b3634331e0890 219 puppet-tools/binary-mips/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-mips/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-mips/Packages.gz 3205086bb5079308ad9cc398948a38ae14b91504090323a6f6610f81a9796c63 219 puppet-tools/binary-i386/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-i386/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-i386/Packages.gz d793f885ec7696e4370d019f7daf3b63808f9bc192a0369d23eae1005adba7ce 222 puppet-tools/binary-powerpc/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-powerpc/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-powerpc/Packages.gz 6f39fb98ac5973e380621cf6186a82b123699d93ae0af352b2febdeda5de3b8a 220 puppet-tools/binary-armhf/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-armhf/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-armhf/Packages.gz 1e7ea705d668f4e42ba0549ab0b285468a798142a1e063ea5ff4afdcaa195c26 220 puppet-tools/binary-arm64/Release 53d02d030fb756a47a76351747bd1a5698cfaa6ceb2518bd625297039ba0d9cc 15443 puppet-tools/binary-arm64/Packages f9f355df56e5d809e2f53e9b9c4532ca9d341645888bd6e76d191eb2de4aec4f 7682 puppet-tools/binary-arm64/Packages.gz 3064132d0fe0b73f3cf1e046a6b5fbf36e54769f8267c8c3786effd6811509ba 222 puppet-tools/binary-ppc64el/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-ppc64el/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-ppc64el/Packages.gz e4d5cfc5d7b9b92722e4296a2ed734c70bbef5f26bb70e8ede5e771b13ca883b 221 puppet-tools/binary-mipsel/Release 8dcff9881cbac29d43f5269b7588c478cf8145b875b812a1e93be5919d7daf83 4235 puppet-tools/binary-mipsel/Packages 36e991a2b45361d0907fbf4008a6f14cf1f27dfc574c034b72dec8a676a46564 1263 puppet-tools/binary-mipsel/Packages.gz dccfae95a659e1bd6cf83652664a77ddf25eecd7d4f8a2f6d93a6ebc195123b5 220 puppet-tools/binary-amd64/Release 86ffd3603c1de053752755102a333643b30e4b3bff7972fef662fa0ff4636d47 37941 puppet-tools/binary-amd64/Packages 4132de3119e9f1661f96d403a76c0cf737b602d4655b3386275eca9401779bb8 18922 puppet-tools/binary-amd64/Packages.gz 99375c60c9f6c7f8e245e7bd71f219bb0ddf0d55c1dc9d336b661c97bb7b9254 215 puppet7/binary-sparc/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-sparc/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-sparc/Packages.gz 5965fb7788ea8f3b18563a94a5eb4dcc5d0d162c9a337ef8b00fb265942053a2 215 puppet7/binary-armel/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-armel/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-armel/Packages.gz f1d542ea4cdfc9e0c14e25956b222c5288e6f0790e676390038e72f19a8ed8c9 213 puppet7/binary-all/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-all/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-all/Packages.gz 21b1d673686ba5fc4fad4dbe2682c120c440a2781c31cdbd1e2b4e0bfbe37eb0 214 puppet7/binary-mips/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-mips/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-mips/Packages.gz 4d9941da99dffeae0e459ce5782963b682bef30cb705d06bb8126ce14c81bba5 214 puppet7/binary-i386/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-i386/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-i386/Packages.gz 25cf7721e33cbdecd711fb19df10cd0255000a55d937e4a8ac9ebf20f24e6532 217 puppet7/binary-powerpc/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-powerpc/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-powerpc/Packages.gz e3e67aa614d93fb8a111a53682968428a1e94ed917017ab27712abd4df9e1167 215 puppet7/binary-armhf/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-armhf/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-armhf/Packages.gz 19dc88b0ece2ff274bd4410d400746369667a8f00d694aa35157e068c85b8027 215 puppet7/binary-arm64/Release f525a5981dfb74ba5da2e08fe7ac1a05eade6d57ddd16be1b3c2bce35b1cc321 94282 puppet7/binary-arm64/Packages 8b84519182f50d89dd66d5777ba4be7eb0537154f2d979726591b0830445cb14 30866 puppet7/binary-arm64/Packages.gz 9124bce4502106c169384cc0fb37ab215139849ff7ba7b594e59d8bcc9379c77 217 puppet7/binary-ppc64el/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-ppc64el/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-ppc64el/Packages.gz e39e3997d742e78e14d038c6a8a15f8638dd35d8d213f6978112594946259aa9 216 puppet7/binary-mipsel/Release fa0e5ab79e4e474c0d406f0f50d8ffa050a96b542c474807b9c3ba2532c703f0 8818 puppet7/binary-mipsel/Packages af99b6e8c6028d33cda68cf315f014dcb86bffeeea5f75b5f0a107a68ed4e8fb 2665 puppet7/binary-mipsel/Packages.gz 54d9422e112be863075c9a732020ff538e2548376160efa2de59c0542129ded8 215 puppet7/binary-amd64/Release 614199a9f4283fb495371492f034c6c055e68c214541f95494ddba8e35e77a6a 117088 puppet7/binary-amd64/Packages f8c528e25670837a40a9b83a55f8ce6df70b368fc977e4c2630dbb3873827b34 42047 puppet7/binary-amd64/Packages.gz 1be9a7098ba86816ce893aaf0f6a8b642d960599908a66e89e6cc3c8ffb37021 215 puppet8/binary-sparc/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-sparc/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-sparc/Packages.gz 0c835ee1f5be82f894f0edfb905a253850e5254b84d09172bac6efec2593e5c6 215 puppet8/binary-armel/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-armel/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-armel/Packages.gz 436b7e4bbcb8948e1a1d8b2e6b10372cf8665955b8898b6d5223620365a946ce 213 puppet8/binary-all/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-all/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-all/Packages.gz 6b77614317feddd36b96219efb40b067afeea4a6eaa50e773df0d3d35cff1f12 214 puppet8/binary-mips/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-mips/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-mips/Packages.gz 0a46d59794253b88b5539b565db3e39400e201783e18191f23d803e75c53ee29 214 puppet8/binary-i386/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-i386/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-i386/Packages.gz 20df18061af0101b034a7d4a32c4a86686a380f6d29e814400a3e4a3ff0e8c68 217 puppet8/binary-powerpc/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-powerpc/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-powerpc/Packages.gz 9c447333a0dbb38117955713a6f225681727018e90634213f7fb980575d3a6e9 215 puppet8/binary-armhf/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-armhf/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-armhf/Packages.gz e9bcc0dfd52020b253bf58a4f26ad38eb04c691c454c3f850955bcb1acc7bcf2 215 puppet8/binary-arm64/Release a9e4c3d34fae90702e4c457b8e4a35ad89c5d53da83e9d799a6564ab507a3813 77324 puppet8/binary-arm64/Packages f0909679670652a60a787d74493f10d3b50c297e417dde5ec14248e0155f8c85 30014 puppet8/binary-arm64/Packages.gz d80953ece2a23062633d64ebb13f9c435bde9ee36f27edfb66631e2771012834 217 puppet8/binary-ppc64el/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-ppc64el/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-ppc64el/Packages.gz 9d3d23b031acbd8d015098a0b78d1dc1103e9ad9c0efbeed6d78bab77b5b90fa 216 puppet8/binary-mipsel/Release 58ac1ad37847a87838a2cc1e8205e677ece59accac7bb61a172f284005ae2a34 7316 puppet8/binary-mipsel/Packages 3c0e32c73efa96e5e75e416034d5bc59fccedd6f0a7cfc342544f1438cc9739b 2268 puppet8/binary-mipsel/Packages.gz fef13cbe63b414900128ab598e73cba285ec96d265003eff340e229f158e4a76 215 puppet8/binary-amd64/Release e8f4b63ff2ea509d693f3a7597f7b960db76bdc8728e1216d06c55727f3645d0 99802 puppet8/binary-amd64/Packages 09c020aec06ad517f339dca9b1279e6af282866d21e7d12e08c2775582d2d4d4 41015 puppet8/binary-amd64/Packages.gz 10d31abf848c791d4c5838a7becda5046045b3e4ce0bb05cdb1f40881afd7a82 214 puppet/binary-sparc/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-sparc/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-sparc/Packages.gz 944bff973d75c62b92cfe47a850732451e405971ddbaa30873e96ef1b516002c 214 puppet/binary-armel/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-armel/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-armel/Packages.gz d1d2a00bb53c47cb98283505c3ff6938eac39db2098721d0ffe22eaa9de089b5 212 puppet/binary-all/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-all/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-all/Packages.gz ae99e90c2a47ea02b813443e9686ded4aceca69654adb4afdf61a9620eca5050 213 puppet/binary-mips/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-mips/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-mips/Packages.gz 8fabf4f9b24a052cf1b1c8b4193e96c9f11290e28ff227b716e16ce7d0cbc958 213 puppet/binary-i386/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-i386/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-i386/Packages.gz a44c3d02507990e64f442796758db6707872bb61882e56207dcdacd10df5497c 216 puppet/binary-powerpc/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-powerpc/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-powerpc/Packages.gz 97493bef1a78eb4ceee80da3d62087b70c7760f781c95f73135f10d4f876f236 214 puppet/binary-armhf/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-armhf/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-armhf/Packages.gz 8ebd41c01c795053aa032243c4e9946f2a5797c9d08bfce4cb1d1a7932bf2642 214 puppet/binary-arm64/Release a3263ffa555ded07e5a488a78043b4ccdcf6d209fa1bddc74ffd74d5c693815a 94254 puppet/binary-arm64/Packages ef641481acc42ade08aa4d59c1e8393e426dfe646a7df95bb7b6e83244c89b88 30866 puppet/binary-arm64/Packages.gz 7411c18197329fa7eb6a58d813c1b52ab5549bbec95b2a9edc48f0bb34394fc5 216 puppet/binary-ppc64el/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-ppc64el/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-ppc64el/Packages.gz 110358bb8b6bd69a2b21d36429e769adb6df6cd9a6185d4ebee608951f2f5a16 215 puppet/binary-mipsel/Release 4474f06fc364272203a17c7de5097e31edd87c9253845dad75fc037c07ff0645 8808 puppet/binary-mipsel/Packages ed43f37465567624363caba0ea74d51930cb4f292e2a55d96683185e3a00a7e4 2665 puppet/binary-mipsel/Packages.gz fdc0ea76b210cb8383b1a6130e347dbfa6445afcee5bf91d419269e674d3dd01 214 puppet/binary-amd64/Release 25e39b74d93a2a603bdc6817c6589908ceb33d9c8b8512a88ffab8486c367291 117056 puppet/binary-amd64/Packages bae68782da4001d2c4dbd3e7ff5626b56f385c0130233882bcad2d77e98993d4 42046 puppet/binary-amd64/Packages.gz SHA512: 080bf1ea40b7ba0a882d2b68caaa28dc718e4da0ef6c6d04cdfbe9cb1f7bc80c2a51bf57304e83afd533744f0177a7cd9f2311f3f2b4ad58609bd22aa348dbb2 220 puppet-tools/binary-sparc/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-sparc/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-sparc/Packages.gz 918f7b5914116c4eac4cbceb80e98b00317732062e91a78046d6b2837cd2c41487e3b04efb673aac586944a7315407383757bb6735e40b63107121c6d77beda2 220 puppet-tools/binary-armel/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-armel/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-armel/Packages.gz 6d63ba75bf16c6691002f4160fe6fbfc32bfb8c248560fff8105611ab43b9b27e9a07e18b38e70dba9f81ee7ceef5eb1a3e2311d01eb3f4b1d19af4def1e3c71 218 puppet-tools/binary-all/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-all/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-all/Packages.gz 4edc418fe67da6d738796b01d69e0f07dfee7eb3181ff63cc87cf97d45ba207a603aa913257fcc30ec9eeb6fc463981e88272540f5f2d3440e3fb4cd32935243 219 puppet-tools/binary-mips/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-mips/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-mips/Packages.gz 1568e0acb7d60ee86f794cda61876e9df07af4354ca7c2b6e417fb764d0a91303767bc312741ed6b182dab3e3f36dd4ed8fdda3731d3d0ad09e6640d08552ec2 219 puppet-tools/binary-i386/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-i386/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-i386/Packages.gz cd4d7e0bee03616f38436569ff04a3f423562b9ee52ce21a5a4230b63aca7b882e907ea0e131303c18ffc40d72a7c008e04ff333f8c545e7f08c1a8e02660d20 222 puppet-tools/binary-powerpc/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-powerpc/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-powerpc/Packages.gz 4880e83b57bd01248e76065c4ff342fa1b2c9cac8b7a9370c69bdf32f5d18e2565c37d938542f56beb5a906f61eb0dc77ebc93ecdf0aa1e2cb9a64f05ecb84b4 220 puppet-tools/binary-armhf/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-armhf/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-armhf/Packages.gz d0a17b15d489087feda896a56bdbb0950bef32565302105076cff5ad4258f1ffd7b4ada2975f680a1a79f1f1f1c7f48e8a0fb6f0d148844b230b2edb3e35ce2e 220 puppet-tools/binary-arm64/Release 56a55fa3919ba59f6f55edf260ce889fe4b6f85b9a2d43c1ab84a3391cbd01e16e02b76de85b095644bf506c3cb2d1d1e27433c89a7b877da75a594347dc8657 15443 puppet-tools/binary-arm64/Packages 5a2d102890bf803dbe825e0c53e8cda0101ed3d57e68c16961c674995a2cb12228a225be0a7e7df672d0d5a77353d76dd1e6c0e0e7c6c5d0c1384767b577369b 7682 puppet-tools/binary-arm64/Packages.gz c8e76c4541924b6f1a75bb170b5fe02765aa1a10f38875d81ac78315ee6de97e17e10a32f9e4e1b9653fed3f00c890a055e4e9094f3cf61d3ac84fb0356a60cc 222 puppet-tools/binary-ppc64el/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-ppc64el/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-ppc64el/Packages.gz 65f8931bc49392693426db0e272aad3dbed418a358769438bb05e266d1755a8e391a1ae68a471adf2115188e13d55414cedf9db6397ac0db4550594c1cab13e1 221 puppet-tools/binary-mipsel/Release 7dd24a53e7b21102f8ee75ba09b8383ad4e79dcd938dd0a94c6a49092c30e09f5803f70c580a13fd5500e9e1ef4417e68eda57178004da4e7ebf77cea18d2ee0 4235 puppet-tools/binary-mipsel/Packages 6ff16f70660c5fce9797e3a0a3f18c535ba60b2a870230f7ad2ae259dac5499873255d3a18d763df0d2eeb1f5568825ff5be03c0e4998698b7605f2217ca4e50 1263 puppet-tools/binary-mipsel/Packages.gz 5c4c076c542799ce0c02d66e55f824f86ad468d906d68ad4b4a89600a5e334041a3eeb3cb2d6cb3ae689be87e4536a7b866e7df2d04d9e6a06178ee5c76abb58 220 puppet-tools/binary-amd64/Release e8c37f2958d80ec620e94bdfadf3d56c1211f043d1b264bb551dc1e1dfe5f61da8b146d8014533e54c0d637c8bdd976cf98d10a1135c86ad5ff8407ddec19a1c 37941 puppet-tools/binary-amd64/Packages af472c19168784e534a3cfd7069c0e31a861072feafd9a188389d9a882aea6194ad54f9e6ac0c15cfbd18c97157abcbac4b67286a80031b074c65115a252cf92 18922 puppet-tools/binary-amd64/Packages.gz 25305c0987a7a847e72651b65c73bb6cb5f28ab0aa671f404baf9972556587ddd5f1afd0f81eabc207b25b1a88a196b43bbc286b086826f4ff1bb3c2daa65ca6 215 puppet7/binary-sparc/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-sparc/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-sparc/Packages.gz 13a8e13b14cff8a2adbfadc78a3203e2778581e793d6d7323de5111a84d176dde82992dfbf0aa1696265f77e0705e2c9c25f9849fe1d1cb3f379c67ec6ab0e1d 215 puppet7/binary-armel/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-armel/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-armel/Packages.gz 4b67dc2420ef44b7b65306f97d88d135281b262ac13a9b799a3b6973eaa676b890dd88ef4fdcd2947a35621d7294c815c87dc8c0493edd910f5d5ab107c42cf1 213 puppet7/binary-all/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-all/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-all/Packages.gz 1a0e35984c79b38c3e06657c9b27332deabf7e16806bef919bcc4c00bba5c93a80c31a1f06ada20de480951533177f65da6115e7e513bfe79e12c96788267f23 214 puppet7/binary-mips/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-mips/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-mips/Packages.gz 68f6f036fa4ee7cb173878f05075d694bd88f2e956dc7c4c53285d384c24ca1ec7708af02a29dca02c54c747a33328251f79a587ca05ac58ce03ba8113311e8f 214 puppet7/binary-i386/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-i386/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-i386/Packages.gz 839718bbb0d376e2065d5d46f1a50eb93ba1f6a75cef38c315343b8e82f1b412879c6a1c47cccee637ef855f9ad1ac90ae7a9a16677a3ebeb7e763e185a7d30c 217 puppet7/binary-powerpc/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-powerpc/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-powerpc/Packages.gz 57491a4bb7bb8ab4972dcdc832337d4a31d3559880777c36f69a9f0afdcb536d6bc22d2facf1b4409c1084d02a368bdbc9daf6ad724d7aca8e5065f514a8587e 215 puppet7/binary-armhf/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-armhf/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-armhf/Packages.gz 1cf15ef7f4de3794df2f88c025c83579d5a154d6c741c1be6d6329bf045d980d2a7309b6546315e346ac8076293e8defda5cd70f8fe3d9fdd82b0c8ab2d79138 215 puppet7/binary-arm64/Release 252da02d514500ac30871a696e9f8b27640b605ec470a454f3ec7202593867d8491694f6bcc0bbeaf578a735a5507b664d230aac0004c109684aa1284403f2bd 94282 puppet7/binary-arm64/Packages d4cd4884f4ebd65e409ca96c9875d3dc2339d1cd530cff5463e01040ee69472388ec05b806787e64d81a6b69da7295e80a498fb804eaf21caeaaeb68c7b7614a 30866 puppet7/binary-arm64/Packages.gz 3aa34e1aadaeed316d45e8e96d00d9cd8bcbf1b51e40c477f53ab1d8786150a12afbe0f9fc601af8730570c68ff20748003414a0dfdeadeeb63d372edf92a362 217 puppet7/binary-ppc64el/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-ppc64el/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-ppc64el/Packages.gz e0539c0e2bb18e8e5976c4f09521279653202de52e6f0b9e1d2fc2c5b595809b585651cb7fa056562daf8eaa39e9aea0265e7adddfc4f470e8e82984c9044cc8 216 puppet7/binary-mipsel/Release 1d93626109db7042d62e71cec46e0d740b03977c6fddb147a9eb307ea58e6e30e8c4adddd698fde76caa2222df71816c45847cdcc03a442f00cd119535d9ffd3 8818 puppet7/binary-mipsel/Packages d2669a35f89b0e8f07d5521a9a1062cd28aac20806279a51c35d3cf3736b2add78322506311b77d5a0dab13cc7d018720cd5cc0eb5367fb905c8b0241e70f395 2665 puppet7/binary-mipsel/Packages.gz 16565c423e341bb4c993cd8e87c2f29b3d0659bd9c0298c347aa7b7a197f92104716ffa14aacafc4ce4f531a20b0dfc0e38466a2b41822a965d03a6b274224cc 215 puppet7/binary-amd64/Release 0a9a3b0104b8dc94392c7bffeb6f1757b9eea281348d3a39b5afc7baea2c6c81cdae8cdfcbb3418985b6f71854eb09761970baf86f3e1e223a76425a518efaa7 117088 puppet7/binary-amd64/Packages 09fb772a0db44ac011492c929e2dec6b4e1e4ec548968dcf91cc998af65d3a55f73e05cea06591a0a2d325eac4ef9bb2d984c3d80ffa43660a3a074c46fdd8fc 42047 puppet7/binary-amd64/Packages.gz 70601dae78a793f9a76de8fc9798a79253ffb7a2f2332b67facd3b2f0ba5fab13b53e9660bb13f2fbac483fe8c2b080eb43ecf742fc0dfe67e8f065bb6937a60 215 puppet8/binary-sparc/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-sparc/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-sparc/Packages.gz dd7e3157f1989e78323830882698319a2651b19dfafc9e560000bab77fb39407217a8870535acd2fd6c1089cff303788392a1bebf5ba35ff495950ed4bacf2af 215 puppet8/binary-armel/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-armel/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-armel/Packages.gz 1a5cfe30cb8200ba93a78e348e11629102c7047ef752cdf9cf08177fb21c17fe53cb4e025714c43d743ee0eeca84082e8c137c63904bd79c74c6eb4bc0c0a2b6 213 puppet8/binary-all/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-all/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-all/Packages.gz 7626090ab72708aaa8f280920b1a5a311608ea2dbcf6e9962483bb813c8cb111ecacfba050dedd8f6b6d3784ef8f62f7a61e9fc4312bd88f8b967e6dc5e49256 214 puppet8/binary-mips/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-mips/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-mips/Packages.gz ccd8a80131973bc2da3547984231595ee629d8013a1f5c4334aa5405f768d0b4ed6a414e697a469be19bcc99437244a08f75cab1462a646527e95c4de21fbf31 214 puppet8/binary-i386/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-i386/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-i386/Packages.gz 84e2d701ead56f5efcbbe4cbe7da710215494a01c579e762a279693f7f5100adb8cea141821b8365c1b9f1588e5e6a46c9ca3edc6be607dd8fec3f26d4c0af31 217 puppet8/binary-powerpc/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-powerpc/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-powerpc/Packages.gz b38a45a84d618ba5dcf5576efaa096e8b42ee22bc7b4039b68cb50e62fa9e875e55886c2dcc0ad2203d4a6e41f0942faef9afa2aaa773645807ef49572a344c3 215 puppet8/binary-armhf/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-armhf/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-armhf/Packages.gz 9489dd0feeeb7fe25421f1da9d09b255cb200b7ef21f724b782c2792fa86aefe6643f1505f92b9002bac697c4ae241032736149c723a2274ba95d2dc86eba443 215 puppet8/binary-arm64/Release c015ae4a16cd9dc9638f68c6ef7a6df7d53e52a903cc1a684a54ee0516a1608e2e4ef8caa0e09c51ef07b1bf2019aa05eb589c62448ad4427f905185e0969371 77324 puppet8/binary-arm64/Packages c62a825a7e80afc4933627ea87952c7d8fd510bc4ed50d32cc1f8e3b5dfd05f384894ddd0119a1d461f16b0cdd8ed90581ae6ceb50065acceb9ff7994ddb9999 30014 puppet8/binary-arm64/Packages.gz 75b76db9b4248aebeec129fc073250983fb85ee96040a587b354c968f608827454748091ab3740149266f7117409ab6dc2ebaad8c857be772d4db4c331c79f05 217 puppet8/binary-ppc64el/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-ppc64el/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-ppc64el/Packages.gz 58510c3fd2de0003f85b1523464615223c6fd354c6f5ddd29c8c20fcd448f113b8613c365e3db3231edb18c25d50bbd32b8e6f7e2feb639feeb3c4d9f7858c16 216 puppet8/binary-mipsel/Release 4ac1065bef1bc5f03a6a06b4d012c6ae9c287c9b3f3ebb57fbb43755bcc3707d6ea832fca9b1da8b014545f03485d1ac7b0fa646f5eebf325294f63bdd00e598 7316 puppet8/binary-mipsel/Packages 51ab78fb50e98bf6081746b3b9faca05c7805f14f6150a2a42125700a5f1201c2ebf1909a4dffde3967cac054fb7ec0a845630e2ca965cbded4b7498b6016180 2268 puppet8/binary-mipsel/Packages.gz de03b3b655d8b16b15ca7552578a123131efab55b3565fbb269761c031bb3d3d13c8a247345069e1024c2f883ec9168499f2848c55746a8727e50d367d9cc44a 215 puppet8/binary-amd64/Release 91ac550271631dabdcba8a67bc3dfa68fb41e3aaaccaaac8cc2436db8d356a52467ce27fdd2628b48eefaa58b7d6eb0eabf3d5c9bd67635046b81b8d664eb69b 99802 puppet8/binary-amd64/Packages 748f466d5dd321d13682f6fb7cc7c2ca5dfd8914c2754b552e1c6221031489616e0b0d5b6a0e607d6edaa5695cb9a5086772f8b68fbc9ab7f1d0352c5f1ec390 41015 puppet8/binary-amd64/Packages.gz a60c9e9c56f78307a9734803ac4b9c1b834b7f0956c2c95ce12118a3f8352790cebf4a3e669ee9b102a18ac536356a9bce7e346b28399cfcc48d26cfa8fb2ba4 214 puppet/binary-sparc/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-sparc/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-sparc/Packages.gz a746f785a3f1f08aab316a1f797fabc634351628d557f7716c856cd60e52528dc311308b9c9a2d20091352f83be9c41c5e3fbeef6fb687fa7e6b2c49c80d2695 214 puppet/binary-armel/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-armel/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-armel/Packages.gz f8c1cbed54df484a2661a6b340f83172cb9a9f515e5427ae8ef0ca8bb5d7b665d978c267f6d636e8ae369fa4fdc71932964a454d4507febdddbd0f6f739f0e78 212 puppet/binary-all/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-all/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-all/Packages.gz ede13d76b4e4797196f09329b6b7878c6b098db0fc1fdc108dac1098f67a13f8792bb6ca8f1f26c31b56a7f9d01e60b2311e773b2fa5d7ad5808bbffacd09f5d 213 puppet/binary-mips/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-mips/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-mips/Packages.gz fabac3c7a17f25cb3a8e4112311ee2d322883417bd8b8dcdf4fefd62d030526788deaa9c62e4e0aee062d63db733837caf8e16873b8ce00139b27f12bdfd5ea5 213 puppet/binary-i386/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-i386/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-i386/Packages.gz 0d859425a557c154fc5c85edaae26508d84472ed49929d6642f517079ae5d6451b7a0ce71643cd9f63b7f01497f99f1591a721a193afec0b395eaf0b64ad0065 216 puppet/binary-powerpc/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-powerpc/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-powerpc/Packages.gz c8b763d7820d07654ab32e7185a3dfe2b8bcd83113d65f02107cf95002441918ff78ba1d3803e0d672ff3ae52968dd83796165fec5cb3fe52b7437f0e4f9c2c1 214 puppet/binary-armhf/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-armhf/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-armhf/Packages.gz 6396da948142b216507e53f64ee092561af770af910679008da22fb12cf3dcd4f69e3db4f0aaae0baf7703d829920281fbd2191f8ef80ef82a8fc6c1a7956cb5 214 puppet/binary-arm64/Release 9ead34e88a23197478fcd5d01fd0ad5216b549a9c40d44b9721c8e56049ab6526bcb02e7e17e6a0902b2ec8f1b7e185202a1dc7312d3c7c5febfb41dc2f5c906 94254 puppet/binary-arm64/Packages 1b3274c1d04e1e247bf1512557546545565da0ce8bdb3630a61219cf83ac75462fdb3f9f0df18a52a323726debb17f25d867a9d2e650929501398c86efda114b 30866 puppet/binary-arm64/Packages.gz 14d44ab310e9696265ad25eb1e14adb37cbc008c0bd22b1cbf318d770fbc2c7db738bae23525de8bc63c3791a7408f7dc25064db1ad1a39d0b965c7c4bdf684d 216 puppet/binary-ppc64el/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-ppc64el/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-ppc64el/Packages.gz 125602d829e7e9b6ed189532d54d0cd1d24115eacd589de640c089e01e2d893a04655dc900625c8c6ecc68e6913b2567cd1ed4b705c48bf090a6f6f2df8b43c6 215 puppet/binary-mipsel/Release c2fcfb223541214c7154242a50b66eb2a787920a45d05820155ed8c6d0b7bd4defb5418c6b821f92452974192b652f7626b65669999f7be2225f1251491f0345 8808 puppet/binary-mipsel/Packages 6a0e00c2f477290746f7ab03576c1ca3f2a00df5cdc50bc653ceb0d9f504ab8dafbf4cb3d532c009608167bd5c8070d0e06907e6ea653237d46f9c41dd952e4b 2665 puppet/binary-mipsel/Packages.gz 6335a422f751fe1db8406dcf2b479504d18f35e77703de62367a0a4fd3b02855e2c3ac34239cd0ed94eb50fc8f20fd4f5ac87a51844551414bbae0cc1c298754 214 puppet/binary-amd64/Release f4615b79943459ab2ecf8e605d7d8037e96b712d867ab641473aa5e6585237cacdf473631522c96fd89e84399feff0a72786752838f655cdc2750b94a214d868 117056 puppet/binary-amd64/Packages 7c147af7d2cb88e357296260052214c9e57f0427fe58d1fa8e9de0385d66f53f2191648a5333cd01faffbc98ed49df1d53327f92b42c8a16c3d006a4ef04d4f7 42046 puppet/binary-amd64/Packages.gz -----BEGIN PGP SIGNATURE----- iQIzBAEBCAAdFiEE1oEe063uuEQa9aqPRSi2zZ5h7yYFAmcYDXIACgkQRSi2zZ5h 7yZAjQ/+OkeFjH8vt9MYKPnFsSI1tZd2KFy1hpLTExXKRhxxSIjoxGxBjYOklMEI UD9RJ8y1cF5HcUzoV1Pi3rdJyyKBZ4vEL2GXI0bLkXjyeD3dvjFPNgwa1K95Ooh8 sapbHls1QRkAIUVqXesIGnFtcWwqkfDAIp8qIa2W8mX6t/iBvgjVLxzPwMoL6lX2 KbmTQUVuLUDdKELsySmx8osW2sGhi+RvOVCIdoYQ7ZIEnZsRwHS+aS/zEuFXCJG0 Ksv1yJHapATfdBu1EM9KSzj2VZ+d/F0TO8SsmKZrW+1jRgtn8iKMGLRLOkPnQELP MtqJS3nuOej3prCdCYHYe2pf/ObKiIOLU0plWf4+T3thE0J0wY2fs2p88a28s70T a+FSbQqrtsNZnvAMfGtVSmdv8yhNu/vZ3Rxa2aZvPd9Gj15n3GPta3x5nYUzJcLc 0IeDulmhLMP9ihJGToTBWz4it5IZtaf2aYQZtp7V2+1O0n3eBUBSQLmErNHxpmf3 npaGhXzC8GIVJ8dXtDQgGse0D06/rFDhgKGd9NkaCTBIdA94HDhG5k97OJhYkSIx 4LWNgfEr2jlhbC0ZTl91czDgo8pGPtM/YdszImcrrvHlAt9zdeY/nMVlT59ohsVm nbZebpCe9hZHhDpIBV/GVbL3XgPORyJQOSccKJQ7i02cy5HJVy8= =SCqJ -----END PGP SIGNATURE----- pgp-0.15.0/tests/unit-tests/hsm/alice-rsa4096.priv000064400000000000000000000147161046102023000176430ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- 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 Zp/96vX5AvS6wsJ0WZP67A== =NJEc -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/unit-tests/hsm/bob-curve25519.priv000064400000000000000000000013131046102023000177370ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xVgEZf8yHBYJKwYBBAHaRw8BAQdArQKX6zvBqUI15scLi9lsneR7WdIxJy1FAzyy wnPVFAMAAQC47xYvwzi5P4PpvpRe6nQ/iJ63/+FCDI+7gcJKFLEVrRECzQ9ib2JA ZXhhbXBsZS5vcmfCjQQQFggANQIZAQUCZf8yHAIbAwgLCQgHCg0MCwUVCgkICwIW AhYhBACAWjqUp7DhO2dH2J8cU1Hp+PQxAAoJEJ8cU1Hp+PQx4PQA/RiPJAmPMe2n m249bbnA3gMClIgNr5h5vtTqwhz+DNqZAP4sL/Pg0aWerxHiHvcsCBG+m+eS2akM znwxiSAuHyJeD8ddBGX/MhwSCisGAQQBl1UBBQEBB0D2FKf31g9Bcje5TnkT7jzs rHpuigcjkpLshtVFn05ldQMBCAcAAP9bnxfn2ZKVLHCOALxz0otuK7illsDDWEHC B/zGyU792BLMwngEGBYIACAFAmX/MhwCGwwWIQQAgFo6lKew4TtnR9ifHFNR6fj0 MQAKCRCfHFNR6fj0Mbc4AQDQQDtKKXCbATaZM0E/YH2kgw6Qugk6fDf2kUVrJyns xAEAjlJYDWtB9E+O9VBWd7QHDxJIF8yFNKgPmxGiDGY4RwU= =S4+M -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/unit-tests/hsm/msg-to-alice4096.enc000064400000000000000000000015261046102023000200440ustar 00000000000000-----BEGIN PGP MESSAGE----- wcFMA9/cc8mpNN02AQ//YDdyIefiJ5dNbmYPyglaGanSZ8tmFQD97+AKqUs4AT2B yvziTdFO0Dfv/62Mq7mkJzMjC0n9esaFJL4xM+YGBMG7uyRqBXW9A+7ERRLZvcxG NkNBm2vGmAsLPECkTPPIewWsXgySTJq408OBKmA77f0D3CvG/uDkl5ySxwyBHIap 4hk39GprplyrMcRUIpZztK8JBa7HGPfdaY3oH8P72YGdfwMo9embScR1m6Q0b4Ys Oly36TGJgdtZmOCUX1kkgDTWiI88fCIU9wyluvV5ZkYmlB/Vx0bVaL4H8WsRq8Dr 02c+AcdbN81qtv56IPzi6F7LZSZIRl9VujH1LbbS9KXVv9RY9smBdYAQuNIw+cgc ak2lLnN93ifFj9WUPngSfOKKoQrW2x8KvNyLY/4qhDc8CkqezqsxIJ5zinB45+Ym rND5RNk/GUCGrq4MijXwjpI12ZlwaZtBF5xJttLapJXWrFAJBPEgXSkbkfA+jD0L 0s3ow9o5DH4RfgJ9EP4l4vyeimMvPxu3kp2YlGfbNTv7OnUd5abZn3/MIBA1UAue d1bpnES4YRepISS4nPHyu/LgiiZtwku4Ea2tr4y0VS1oyrPdP/zbTeP7KnRg3eTE 3U0/6Lc3PtnjUou7dA3gU6vfp2NRZQQWT8OW9l3SKZmir7mvzCpwCQcVUVnm3KPS OAH/9kzLJxT7T8QxCORLqXD48qZvXDnyikSHOt/qe5X54GEn+lT7pRQWQaHR9lRT M5aU+yS+gROi =XHzp -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/hsm/msg-to-bob25519.enc000064400000000000000000000004211046102023000176050ustar 00000000000000-----BEGIN PGP MESSAGE----- wV4DZp3JpsWZG2ASAQdArAuqLTIiV5BRJygZK0u8Vi9bfc/b3wPoj5ZcLTeE5l4w uO+UQLFnPdWniIb91xcjJS1ic3DiwRDlKuI0V+hl2uMZgP7zyA0eogZH0jCq3q87 0jgBEXRGLUurqq5P0i1buAZmLe2qNX9AXDJIZ5HKSPNxpyl8iGuR3GPD2YNGif3+ 0ydB1jhvsVlHrw== =IcFT -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/long-key-2.asc000064400000000000000000000200351046102023000163320ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- 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 d8gZItOhbcMdkfY= =A/8P -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/unit-tests/long-key-2.asc.line000064400000000000000000000177151046102023000172730ustar 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 d8gZItOhbcMdkfY=pgp-0.15.0/tests/unit-tests/long-key.asc000064400000000000000000015266031046102023000162100ustar 00000000000000-----BEGIN PGP PUBLIC KEY BLOCK----- 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 lI0k13bL3lEbzrfM/XPIYfN9vJq9HV6GjJ6RItFN0sIZ9sL11HDc5fy5LJXXmWxH l1SWxlx44TRodnirafMtmb9/kHLEXK9jnWlky7s+aTz3bVtPsmFbYipKma7z+Vag S1AiebYUTh72tM5V1LTELcl1Y4CZAUFhdA696PBSn6kCl013Q5Ghn27E/kpYQI3f 8enjCA8e468j0B9whdwg5XrOOo70VA8MnelDq9R1rML9RwgwDb5gjC51y1Rq3fbA N44fcJiOmeEtGTxuZJUTH3W7BUYAnbNHlitLlNTIBiZZjrZC7/p/wztSHw8ivjDy Q07Oh4XMK0K1tEFBbGFpbiBaYXJpbmVsbGkgKFJFU1RSSUNURUQgQ09ORklERU5U SUFMKSA8YW16YXJpbmVsbGlAZ21haWwuY29tPokCPQQTAQoAJwUCUV2QNQIbLwUJ DpGjgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRDGoyrou3VhRQ+SEACcTMi2 rhghXvQPgJrw+nxdRL55QmvQPc0ZdDZjnq3kEjeLU6or95yL9zLEijTNiptYYpPM 6dx16eCjij3ZXdMVcEZ7ybsFrSFoIRFzSsDk1AniWG4EQ0BnRBTGhIY/jDR+QD98 xb40882LwaWybcE7wZg44dx/Mq7F2HGivIq0ZoLWVbDa8w96jRmjtiaoyMLbUjcK YfNZuM25qYlHfmDyjsael/q2qnPTk7Xbnvfpmo22moPUc0UJy6zcIUS5gJBzPXPH kmr89RBnEPrzg1pZVkl/GIbmZWm5wYmyvkeLDQkEvf4QFGCSkj3XLw0QVXxd6GF+ uqVRLdVlL6pwPnX6z4aeyWXuKTRcb6ZOdJOQK5Df9Dja/FYRNQngFgOsyo0mZI3T ggK8ee0KF9wcxzxX4rDLSjJxeU1JAZDxJYsyIpmdxJN4ooqUibo/50qg8kd1hnv6 SYen4GsJ6yMhpG1xwTVpzKNITGyDmk7phGbdYvCRFLVk5OWdiHlUXQdyuMDwer27 v6iYnmdhxsiTSi+lnZrctAfzvVBq3hCW5wMdNG8WrVhAIDNi7YUta57vn81R50nG oQX0aqq5mIrXxsETfszU8oSJd+F0j/7Bi6FnIvF5KS7DGgfra9QbEINvxkEjbPhh 4HMn/Mew+dDOF7JuljE6WKrniZ54/MLtwQLZi4kCQAQTAQoAKgIbLwUJDpGjgAUL CQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCUV2RFwIZAQAKCRDGoyrou3VhRZ57EACi j3Gz4twUBqRwIuAGSV2Jl/u/fgyxlpnI6eoIFCGyd1tG1+9ymgHFsexDGnoAuwQF V65LCmQ9dqcEwToiqu+IuSeo9Sy5wzZ0Sdi0pZkPqohZz89EAJ3+c4Rj4GH5q4eq U2DE6/i1C+Kwtyq1NessuzoQxu0gxSPbRAfE3RibDifqdiH+qQ+HPhQFJ+j8VGGD 6jUekuDWcU7gNGwMLhm2MHCo8aOWTPmoC1F+eBI6nXXdCND461Lm89tZmSoV4tPd Z/MhNidgDQLZBSieMSM+mqLKsBvF4B1sxFbGhVL/3uId8WBXL7Vj3DMp8xlHnAuN P9p3KJlZmk1iYriTguSVD7FiH8kpytcLTLbrASLrTJHLT6gIcsNCkeV1P6+CQ4g/ mQczzNUEn+6/4f+YKHSWj79ckkKn7fbo+5bxNj4bu7wMtU+aa1sXhTAbD7gzy5zw KSMcqksZAbFXveJMc1Pkgg6bOyEuYvHq4KBGLyene2QQnumz0hAbBrQTb9fYp17g zbEIKAPXfscTOKQcNM9zzvet0loCCqp2J9nBKB8N1Th20r33WHAo+iVzr4wj0qAp 529XiPW9gjemUOStwiGI/4Mp6QYGtlxhnWf+F4IfwWwlrASxFFz1HCrNW7BZgUJ9 ODBsDhPI6OLMES815WJVNXGJtr16/Vlpwz1+vQVg/9H/AATN/f8ABM34ARAAAQEA AAAAAAAAAAAAAAD/2P/hGndFeGlmAABJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEF AAEAAABSAAAAKAEDAAEAAAACAAAAOwECACEAAABaAAAAmIICACUAAAB8AAAAogAA APAAAAABAAAA8AAAAAEAAABBbGFpbiBaYXJpbmVsbGkgLSBMdXhsdWR1cyBNZWRp YQAAwqkgMjAxMiBBbGFpbiBaYXJpbmVsbGlcbHV4bHVkdXMuY29tAAAGAAMBAwAB AAAABgAAABoBBQABAAAA8AAAABsBBQABAAAA+AAAACgBAwABAAAAAgAAAAECBAAB AAAAAAEAAAICBAABAAAAbxkAAAAAAABIAAAAAQAAAEgAAAABAAAA/9j/7gAOQWRv YmUAZAAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwM DBAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQcHBw0MDRgQEBgUDg4OFBQO Dg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/ wAARCADPAQADAREAAhEBAxEB/90ABAAg/8QBogAAAAcBAQEBAQAAAAAAAAAABAUD AgYBAAcICQoLAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAIBAwMCBAIG BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVD NFOSorJjc8I1RCeTo7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRl dYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJ WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+hEAAgIBAgMFBQQFBgQIAwNtAQACEQME IRIxQQVRE2EiBnGBkTKhsfAUwdHhI0IVUmJy8TMkNEOCFpJTJaJjssIHc9I14kSD F1STCAkKGBkmNkUaJ2R0VTfyo7PDKCnT4/OElKS0xNTk9GV1hZWltcXV5fVGVmZ2 hpamtsbW5vZHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6 SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwDypirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Q8qYq7FXY q7FXYq7FXYq7FXYq7FXYq7FW8VaxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV//0fKmKuxV2KuxV2KuxV2KuxV2KuxVsDFV6Qu3QYqmNhpv1hxGVJJ6 ZElkAq6n5W1Gzi+sLG0kHUkDdfniJKY0kuSYuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV//9LypirsVdirsVdirsVdirsVdiq4DpiqKgtg7gGpHYYE0yHS NJikk9OZGV+wNeh3GRJZxizKz0qCIwtDGvqftHrX2yBLaIss0nRJZ4H5xBo2PEq3 QV7bjBbOnmH5k/l/Jocg1OyjP6MmbjIg39GQ9v8AVb9nLIytoyQpgeTam8VaxV2K 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 9sVXAt4HFVRGFfiBxVewU96YoUKUPjilUdm9MChp44qojFXYquXpQ9MVWnFWz9nf FWsVaxV2Kt4q7fFXYq2CcVb3xV//2f/tGsZQaG90b3Nob3AgMy4wADhCSU0D7QAA AAAAEADwAAAAAQABAPAAAAABAAE4QklNBAQAAAAAAIwcAVoAAxslRxwCAAACAAQc AgUADFRoaW5raW5nIE1hbhwCUAAgQWxhaW4gWmFyaW5lbGxpIC0gTHV4bHVkdXMg TWVkaWEcAlUAGVBob3RvZ3JhcGhlci9WaWRlb2dyYXBoZXIcAnQAJMKpIDIwMTIg QWxhaW4gWmFyaW5lbGxpXGx1eGx1ZHVzLmNvbThCSU0ECgAAAAAAAQEAOEJJTQQL AAAAAAA0aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMt c2EvMy4wL3VzLzhCSU0EDAAAAAAZiwAAAAEAAAEAAAAAzwAAAwAAAm0AAAAZbwAY AAH/2P/uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwK CgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBwcHDQwN GBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAM8BAAMBEQACEQEDEQH/3QAEACD/xAGiAAAABwEBAQEB AAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkK CxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR 4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbT VSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4 iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUG BAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMl omOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWF 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 dCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAAS c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+E AAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAA FklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5 NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5n IENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAA AEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAAC c2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3 ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCu ALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHh AekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUc BSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAad Bq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyO DKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8J DyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJ EegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgb GEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2Mbihuy G9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+U H78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPC I/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/ KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIq MmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9 Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnw SjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19h X7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9 Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94 b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gR eG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opk isqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQg lIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5A nq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjE qTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/ v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3 yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj 4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY 8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 /kv+3P9t////4Qf6aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNr ZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8 eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9i ZSBYTVAgQ29yZSA1LjUtYzAwMiAxLjE0ODAyMiwgMjAxMi8wNy8xNS0xODowNjo0 NSAgICAgICAgIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5v cmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlv biByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMv ZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOnhtcFJpZ2h0cz0iaHR0cDovL25zLmFk b2JlLmNvbS94YXAvMS4wL3JpZ2h0cy8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnhtcD0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0 cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOklwdGM0 eG1wQ29yZT0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcENvcmUvMS4wL3ht bG5zLyIKICAgeG1wUmlnaHRzOldlYlN0YXRlbWVudD0iaHR0cDovL2NyZWF0aXZl Y29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMtc2EvMy4wL3VzLyIKICAgeG1wUmln aHRzOk1hcmtlZD0iVHJ1ZSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSI5 Mjg3NjM3Nzc0NzlENzZENEIzMThGMEIxQjJFQjA0OSIKICAgeG1wTU06RG9jdW1l bnRJRD0ieG1wLmRpZDozZjI2ZGE2ZC0yMzMwLTQxZDYtYTFlNS04NWU1ODc3YTcw OTAiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M2YyNmRhNmQtMjMzMC00 MWQ2LWExZTUtODVlNTg3N2E3MDkwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDEz LTAxLTEzVDEwOjAzOjQ3LTA2OjAwIgogICBwaG90b3Nob3A6QXV0aG9yc1Bvc2l0 aW9uPSJQaG90b2dyYXBoZXIvVmlkZW9ncmFwaGVyIj4KICAgPGRjOnJpZ2h0cz4K ICAgIDxyZGY6QWx0PgogICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+ wqkgMjAxMiBBbGFpbiBaYXJpbmVsbGlcbHV4bHVkdXMuY29tPC9yZGY6bGk+CiAg ICA8L3JkZjpBbHQ+CiAgIDwvZGM6cmlnaHRzPgogICA8ZGM6Y3JlYXRvcj4KICAg IDxyZGY6U2VxPgogICAgIDxyZGY6bGk+QWxhaW4gWmFyaW5lbGxpIC0gTHV4bHVk dXMgTWVkaWE8L3JkZjpsaT4KICAgIDwvcmRmOlNlcT4KICAgPC9kYzpjcmVhdG9y PgogICA8ZGM6dGl0bGU+CiAgICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDps YW5nPSJ4LWRlZmF1bHQiPlRoaW5raW5nIE1hbjwvcmRmOmxpPgogICAgPC9yZGY6 QWx0PgogICA8L2RjOnRpdGxlPgogICA8eG1wUmlnaHRzOlVzYWdlVGVybXM+CiAg ICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPkNy ZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1TaGFyZUFs aWtlPC9yZGY6bGk+CiAgICA8L3JkZjpBbHQ+CiAgIDwveG1wUmlnaHRzOlVzYWdl VGVybXM+CiAgIDxJcHRjNHhtcENvcmU6Q3JlYXRvckNvbnRhY3RJbmZvCiAgICBJ cHRjNHhtcENvcmU6Q2lFbWFpbFdvcms9ImFsYWluQGx1eGx1ZHVzLmNvbSIKICAg IElwdGM0eG1wQ29yZTpDaUFkckV4dGFkcj0iMTkxOCAxOTR0aCBTdHJlZXQiCiAg ICBJcHRjNHhtcENvcmU6Q2lBZHJDaXR5PSJNb25kYW1pbiIKICAgIElwdGM0eG1w Q29yZTpDaUFkclJlZ2lvbj0iSW93YSIKICAgIElwdGM0eG1wQ29yZTpDaUFkclBj b2RlPSI1MTU1NyIKICAgIElwdGM0eG1wQ29yZTpDaUFkckN0cnk9IlVTQSIKICAg IElwdGM0eG1wQ29yZTpDaVRlbFdvcms9IjQwOS0zNDktOTY3MiIKICAgIElwdGM0 eG1wQ29yZTpDaVVybFdvcms9Imh0dHA6Ly93d3cubHV4bHVkdXNtZWRpYS5jb20i Lz4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+ CiAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+/+4ADkFkb2JlAGRA AAAAAf/bAIQABAMDBAMEBwQEBwkHBQcJCwkJCQkLDgwMDAwMDhEMDAwMDAwRDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEEBgYMCAwWDAwWFA4ODhQUDg4ODhQR DAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgG ewgAAwERAAIRAQMRAf/dAAQBAP/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAH CAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIG AnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKy Y3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1 xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEF URNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJ ChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG 1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqK mqq6ytrq+v/aAAwDAQACEQMRAD8A+f8AirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVf/9D5/wCKuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//0fn/AIq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//S+f8AirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9P5/wCKuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//1Pn/ AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F X//V+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVf/9b5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV//1/n/AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FX//Q+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVf/9H5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//0vn/AIq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//T+f8AirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9T5/wCKuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kt9sVaxV2KuxVs7dDirsVaxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//9X5 /wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kt4q1ireKtYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FX/1vn/AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX 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 irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVf/S+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVbGxrirWKuxV1MVdirdKdcVdirq4q7FXD wxVsE9sVdv1xVuu2KXMzP13xQqIXGwJAwJXVFKnrXbFVSOMEgnocCUTAErSu36sV VvSDj4a0GBKM9OIryFFoAKDuR1OKUxWNfQLL3U9q1OBkhzaOIw0ihRUfTiimrqwa 9bkoAKqASBSoG1fn44rSSz2cidiMkxQQjp1woUpeVd8LFZTFWsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVf//T+f8AirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir 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 irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//W+f8AirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVXAACp+jFWia7nFWsVdirs VdirsVbpXpirth7nFXAV2xV3XFW1WoqemKtuvCgPXwxVeD6g+M/ZFAO2KqQ8cVXk qRXv2GKqyqqU4nlIRU+C4Eqh5wt6qGlajlTxGKqMaqxoSadvniqY28ADFiwqOoGx P34EukaKtJKlsVWpCs44x1DffXFLUlg1rIFmNGHVR1GKoh3aUcYlIQfecCqYs5WT nxIWtKnx8MUtxWxUUOw8AMbVFRRPCfUh5I4B+7AlVWIOQ4XfuO30YpRETBEYcfjH QAgCvia/wxVMkLoyIUNWHI0Yjau7bUyLJO5HkhtW4iru/AcjU0b9r3p1wM0wFrLb kMr8tgKlT4UpQdMDKk4EDS8WcUIHQfjgZ0jobaUrSbcdtv14rS+G0aYHrz2G/wCA wKrG1CEkLQ1pt2pt0xVqSzT1JFXkVBpyPWn9MVQT+XFumZZgrIVJNTxoP8k+PgP2 sbYkMI8w+Vvq9JIEMisxAZQKUrxo6Do1fvywFolFgusaBLZ2qX6GtuztEa/aV16q 69Vr1jr9pQ38rZaGlIia7nChbirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd 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 sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdir/AP/U+f8AirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVb6Yq1iq8Nx6Yq2AXBJIAHbFVvKgoO+KtYq754qr+uTH6S Dip606n54EuijV9i1PAAVOKplcfUbeFI4Hb1WBMtR0NdlH8f7MCUuaTl8MYIB+kn CqvZ8raVZti61opFe1N8CokxzPBwU8LZT8Q6cm/icUqAjVjRSRH1p1xVHQzxQ/ZU JQUrSrf7eBKogjkLfCxpuSf1Yqpu7S/sUUbbYpVRpt6qJcmJkhIJV3FFIB7e2KuW 5pJuwAO5+Ef0xVkFr5iuYTzjKqvSgjQj8RgZJzY+bbqynRuYmiG5idAYySNxxFP+ FociyCa3NxZ3o+s2duYDT4oyxZSw6sD9ofI1/wBbAzROmlpFEsgUutdvbAyXetLM x5UB/Z3/AIYGVI2ECnKQcjSn+3gTSfWl3Fbh1kQMGWm34Ed6DAhdPfCOJogKcuni KduWKUqe5muEoxPIVG3U9D/tYpW2ltGG9QbEbkEHf5YEpkYo7gFT1YjkDtucKoNL aAFkIIcHbfAqPfTaspj2dl3A6VpgSqQqF/dvWgG3jXvTFKMs1QNufskYqj7aEXMh DIOKk7n8MFsmQ2enmKMSulEG24rU0/4XrimkOY0qUUGlKe9DgVF2ul3axtPLIihR URk/Ew6fD/q9SOvhiyR6QkqqlORI4hq1p3+7FUH+gZIhJJCKNXbfp49RihoSXFpH yKGNy1AWGzDatD/MP44oTOa0hFuQWdVrsq/stXv4eP8AnssULJaszpWQsAR6b+4F eLeK8sU0knmryyNfsGhfisjdKdOQYAoGSvMbg75MFplG3yp5u8q3el3TrKtHA5L/ AJS+x7lfvzJiXCkGHZNrdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V+f8AirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirdT0xVrFXYq7FWwCTQdcVXmiCg+1 irjSgVBv3OBLuNAGZuv0nCrlXntWnhXAqqqSH4eg9sUuEar1wJpFQNDEecgNR0A7 /T2GKUXdz2zKpoUqAeFB18fZfAYFQhlAQiRWqaFOwp32wqtTlM1K8QOgHQYEpzZe WL26tWuUIJGyqu7NuB9nrQVwJVbKFLTklzE8km4KsxUA+4FD9GK0rfVneT+7VD1A A2/jjaaV4/0rHFMYJpI4XXhJRiFZRvxbfiRtsuNrSSGKMbyVr4e/vihkX1eOO0jF vdJMpHJo6OpQ1+y3JQP+BZsDIIzTbaaImblEEG1TR/8Ahd8BZhNYIagM0nJDWoXY +3XIs000+KMKzLUlzsK7jtv7YEo5oWr8Q+EU6b/P6cWTScIpiQaKO/8An3wJTu3t WdVIPxCtfl44FTa6tIUs+SH1HK1oB037k0/DFUpaECAlBV+uw3oPbAroYmZSRVWr TifDxH/NOKVOR3LlI9lFB7VHh74pRPoCcLIxHJdjXx7dMCU1tI55hxjALAUNDuPv xVSu9Oncfuy9d6EYFdp1nLax/v25mtOJ8e1cUpzah4pFCjiCeJoaivhX5YEsv0+y a14pMjr6nEh6VND0I8QcCUeY0uecYUn0yxX4ab9Ptdvk2NpXx262MHNgX2AZjvw3 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 tryxkMdshjNTyZ6ihCgKtT8Lo9W5r/NT7IywFxpxfIuv6Bc6DcGKdWCGvEsKHbqr Dsy9x9PTMkG3DIpKckhrFXYq7FW6kYq7FWsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//S+f8AirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdireKupirYqu/fFKrH1IPfAkK0YdWEi9j1wJTO MLCQ7AkN9GBKj6AmkdoVJABNBvQYqljvwPwmh3ByTFaK7e+KVeJz1ORZBPYZzHF6 dFKdalRX7+uBkqW7MrcWGwNSCMCUSsxKgN03r8sUq7R+nxAoedCPHFKnCPVorgMA akdDQ++BVZLMSKzAUBO3+3ilFRW3Bwh8fmMiyZVEzTpQdgK7eG2LNE20ZWQcmNG6 ntT5ddsCpjYWMfNhXkoJ79vHfwwMk4gt+JjmXdztutfwxQgNWWWArFK9V3+DqB16 UwJU/qct7GsMC7otQTt0FT12xVBQrcyRu5JVaVJHWoO1MVW8XURGtQxJBQ1NO/04 pTiO3SIcmYSJUIQNn3APXAqrDpEl/NEsSGg6UNdtzRh2+WKpnMJeLP8ACImJBWMf CDTYcfenXtikIjTLS212a2tHISZyAUJHwk9DUkKK+JpgZMm1qO00lIba0UM7BjIh NVDVoBtUBtq/a6YqFDR7dLlllkPGUEEBFJNACKVA6no22LJFpbTiYwxx/uyOS8iC wbwanv2wFLI7fTG9NJi1TJVAgPSRev8AntvgW1TUPqU84+sI5MEYjljAHz+0vXfb +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 oQV/mpTrVfoOKEbZ30k8TRXUZd0IYONqDqeWNsSK5JfJp0q3C3YIMQUrJxYcl3qj Eb9cDO+iW3wMkbxsvDkPhao+L+dfb4fi8MUJJe2cUQMj82SUJyLLvzHXiR/N9+KC +af+cgvIsR0+XWNNhlMMXAytVWADbRuCDyNWDK+3w1jXrTLIuPIPk07HMlxWsVbx VrFXYq7FXYq7FW8VaxV2KuxV2KuxVvFWsVdirsVdirsVdirsVdirsVbxVrFXYq7F XYq7FXYq7FW8VaxVvFWsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVf/Q+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVbxVrFXYq7FW8VaxV2Kt4q1ireK uxV2Ktg1OBKqQoHvgZIq1mKKVWtD1+WBIRcnGSjM/wC8O/SmBKwKTGASAy1/rilG rNLPFHHsQjFum+9O+BknukRxSgerSnbxwJV7h2kuDFXildid6D3OBkymOzSG0CTh wZKKzAcuAr9rjtXbp8WBKV3draaZckOS9P7srsW9260+WFUpnsrqKNZmQoknxK29 GFabHvuKYqiVtUhWJiSrOhatPhPXbbAlEQRIiczuiCo3qAcWSd6NcSWylweQkIqa bAdt/CuQLMPRPLl9LZyowKmYKfi5H7P/ABrT2yLJm0Vv6y/WQXjs2Tk6h6luA36U 28T/ALWFDGPMgWKWS0WFXjnjThvyZORr8B2pyAH+xwqwWw/0m4jslPx1+Aca0NaU Pv4eORZPT7bTJ4baCzAjjtZY5fVm/aHL4RyLfY+wxWg50wraH0Ly5ca1qMEIZIon 4M1FatDX4nA+Lcp1/wArFiSiNA8tSPfy2Y+O8KepayNShUgsGatd2T4U8GpvXGkE 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 7f59Muid3GmHy8y06dMvcdb0xQ1irsVdirsVdirsVdireKtYq3irWKt4q1irsVdi rsVdirsVdirsVdirsVdirsVdireKtYq3irWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2Kt4q1irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVf//U+f8AirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdireKuxVrFW8 VdirsVdirsVdirsVdil2KHYpdih2KXYquAqaHArdAGp1xSiJI+YDV38MizpFWNvL cyAJXp+GRLIMvs7eNZIYOJBPQg775Eswy1BEkfomhCDkV7n+wYpSy3NqnJrgilKp tsCciyTmz1eMSySQgtGyUUHahA2r40O+BKP0bVblZE9aOrcvhr4E96YGTJfNmsXV 5Ot1biO3RI44eEYPE8U4Ft9+bfaP34SxASC7s4DGUt5DJK3BjICx40FSu9N177fL AlJrqIs4tY1bcV5A7nbpv2xVN9I0+O0hMuohvReNjGa0NRsvvSu1cKULDpltJBJd PIVgU8dlqA2/Hr40yKVG+ttQ1OOG8LRCSZGFAQhVYujPWi79F/1ckqF0xGu7coUD uVZ2JO6ACvj/ALLFKM0yOTVXjWcrHbcOLEDfig+37t4+OBKc6ZZtcLbojxxo9VDz MEUMKk15f5IHxe+KUJq8dvqkjzWyiCEIOm4ov8vckndv5e/TFKefl7qcei2txqKr zu0VxQkgV24Mviwb6Ps9cCph5Uu104F7kBYz8Cq1KiTY7jqPnkWT3OLTRIPVIkd9 TPJYiPiao2Y8dgOXGlPHrkmCU2ks0FgZLxKSxymFELMVNdue/wAIG/H/AGORbKTi ARwrJPZLzuOCyEyig4yAhY/i2qqn1Eb3GFipxJNKYri5ukjkMvL4m5Mp4Baqsey1 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 5liDFwSWjdSakc+PTlUbYOTKrZbY2SaSsWqX4mlZpzNJxUMzykjh8JHTj8XE7jJc mBN7BD+YNYsktUutP9JLxeJYSoORQ/Dyp3477jt8NO2AlMQeqt5av72SygbV5vrA iLNa9nl4lRRVbfiTty4j4DviPNZDuVfLvlweYri5EEQtVmfjKjsWPClF4t+0erHo p+HqFxiLRKXCrah5kks71tP0q0t3niYIZySqKq9KkkLU0+19quEnuURsWUXFHqd4 WkgvAWWRjLxAKx8ifhNS3I1HTHdTQVoY5H05ru51GVLChQtyZaMOnFTRa+A/mx6I PPlu15TsrnUbL1gbmYBvgHQlSaJzqev7SHpgG6ZkBk8b3lqv1cWsf1Qyc2PEAliK MJBQ123+H55Jhseq+1jl9SscfoLGSw6gstOhPf8A2XTEIKPdYViCI/pByOSS1Gx3 FGFckwV4ZY+QEvEugFJABQj/ACmXv4E98VTRfSRQpB9QChZdm36Nt9rJMEOZWBLu UeUH4hTizKBt9IPfAlr6lFKpeB+cXIEITQoSKb+FOnyxpFuefiea/DT4STQmg/z/ AI4GVK8HqShZqgo1SK9On4q34YWBQUMUiXDMq7zABlO3b4TXpgZWg7ik1rwILJU1 DCnEjt8v4YGQ5vm//nJ/yU+v+UWltlVrm0csAdxxI+IdOzbjIg0UzHEH59zQmByh INO4O2Zbr1PChrFXYq3irWKuxV2KuxV2KuxVvFWsVbxVrFXYq7FXYq3irWKuxV2K t4q1ireKtYq7FXYq7FW8VaxV2KuxV2KuxV2Kt4q1irsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVf//V+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVbxV2KuxVrFW8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdil2KHYpdirsVd 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 w2LpsBruIwow6bIaokuvxnIMSUsvtIBqIV4OWw== =EF1N -----END PGP PUBLIC KEY BLOCK----- pgp-0.15.0/tests/unit-tests/long-key.asc.expected000064400000000000000000015264731046102023000200150ustar 00000000000000 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 lI0k13bL3lEbzrfM/XPIYfN9vJq9HV6GjJ6RItFN0sIZ9sL11HDc5fy5LJXXmWxH l1SWxlx44TRodnirafMtmb9/kHLEXK9jnWlky7s+aTz3bVtPsmFbYipKma7z+Vag S1AiebYUTh72tM5V1LTELcl1Y4CZAUFhdA696PBSn6kCl013Q5Ghn27E/kpYQI3f 8enjCA8e468j0B9whdwg5XrOOo70VA8MnelDq9R1rML9RwgwDb5gjC51y1Rq3fbA N44fcJiOmeEtGTxuZJUTH3W7BUYAnbNHlitLlNTIBiZZjrZC7/p/wztSHw8ivjDy Q07Oh4XMK0K1tEFBbGFpbiBaYXJpbmVsbGkgKFJFU1RSSUNURUQgQ09ORklERU5U SUFMKSA8YW16YXJpbmVsbGlAZ21haWwuY29tPokCPQQTAQoAJwUCUV2QNQIbLwUJ DpGjgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRDGoyrou3VhRQ+SEACcTMi2 rhghXvQPgJrw+nxdRL55QmvQPc0ZdDZjnq3kEjeLU6or95yL9zLEijTNiptYYpPM 6dx16eCjij3ZXdMVcEZ7ybsFrSFoIRFzSsDk1AniWG4EQ0BnRBTGhIY/jDR+QD98 xb40882LwaWybcE7wZg44dx/Mq7F2HGivIq0ZoLWVbDa8w96jRmjtiaoyMLbUjcK YfNZuM25qYlHfmDyjsael/q2qnPTk7Xbnvfpmo22moPUc0UJy6zcIUS5gJBzPXPH kmr89RBnEPrzg1pZVkl/GIbmZWm5wYmyvkeLDQkEvf4QFGCSkj3XLw0QVXxd6GF+ uqVRLdVlL6pwPnX6z4aeyWXuKTRcb6ZOdJOQK5Df9Dja/FYRNQngFgOsyo0mZI3T ggK8ee0KF9wcxzxX4rDLSjJxeU1JAZDxJYsyIpmdxJN4ooqUibo/50qg8kd1hnv6 SYen4GsJ6yMhpG1xwTVpzKNITGyDmk7phGbdYvCRFLVk5OWdiHlUXQdyuMDwer27 v6iYnmdhxsiTSi+lnZrctAfzvVBq3hCW5wMdNG8WrVhAIDNi7YUta57vn81R50nG oQX0aqq5mIrXxsETfszU8oSJd+F0j/7Bi6FnIvF5KS7DGgfra9QbEINvxkEjbPhh 4HMn/Mew+dDOF7JuljE6WKrniZ54/MLtwQLZi4kCQAQTAQoAKgIbLwUJDpGjgAUL CQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCUV2RFwIZAQAKCRDGoyrou3VhRZ57EACi j3Gz4twUBqRwIuAGSV2Jl/u/fgyxlpnI6eoIFCGyd1tG1+9ymgHFsexDGnoAuwQF V65LCmQ9dqcEwToiqu+IuSeo9Sy5wzZ0Sdi0pZkPqohZz89EAJ3+c4Rj4GH5q4eq U2DE6/i1C+Kwtyq1NessuzoQxu0gxSPbRAfE3RibDifqdiH+qQ+HPhQFJ+j8VGGD 6jUekuDWcU7gNGwMLhm2MHCo8aOWTPmoC1F+eBI6nXXdCND461Lm89tZmSoV4tPd Z/MhNidgDQLZBSieMSM+mqLKsBvF4B1sxFbGhVL/3uId8WBXL7Vj3DMp8xlHnAuN P9p3KJlZmk1iYriTguSVD7FiH8kpytcLTLbrASLrTJHLT6gIcsNCkeV1P6+CQ4g/ mQczzNUEn+6/4f+YKHSWj79ckkKn7fbo+5bxNj4bu7wMtU+aa1sXhTAbD7gzy5zw KSMcqksZAbFXveJMc1Pkgg6bOyEuYvHq4KBGLyene2QQnumz0hAbBrQTb9fYp17g zbEIKAPXfscTOKQcNM9zzvet0loCCqp2J9nBKB8N1Th20r33WHAo+iVzr4wj0qAp 529XiPW9gjemUOStwiGI/4Mp6QYGtlxhnWf+F4IfwWwlrASxFFz1HCrNW7BZgUJ9 ODBsDhPI6OLMES815WJVNXGJtr16/Vlpwz1+vQVg/9H/AATN/f8ABM34ARAAAQEA AAAAAAAAAAAAAAD/2P/hGndFeGlmAABJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEF AAEAAABSAAAAKAEDAAEAAAACAAAAOwECACEAAABaAAAAmIICACUAAAB8AAAAogAA APAAAAABAAAA8AAAAAEAAABBbGFpbiBaYXJpbmVsbGkgLSBMdXhsdWR1cyBNZWRp YQAAwqkgMjAxMiBBbGFpbiBaYXJpbmVsbGlcbHV4bHVkdXMuY29tAAAGAAMBAwAB AAAABgAAABoBBQABAAAA8AAAABsBBQABAAAA+AAAACgBAwABAAAAAgAAAAECBAAB AAAAAAEAAAICBAABAAAAbxkAAAAAAABIAAAAAQAAAEgAAAABAAAA/9j/7gAOQWRv YmUAZAAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwM DBAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQcHBw0MDRgQEBgUDg4OFBQO Dg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/ wAARCADPAQADAREAAhEBAxEB/90ABAAg/8QBogAAAAcBAQEBAQAAAAAAAAAABAUD AgYBAAcICQoLAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAIBAwMCBAIG BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVD NFOSorJjc8I1RCeTo7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRl dYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJ WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+hEAAgIBAgMFBQQFBgQIAwNtAQACEQME IRIxQQVRE2EiBnGBkTKhsfAUwdHhI0IVUmJy8TMkNEOCFpJTJaJjssIHc9I14kSD F1STCAkKGBkmNkUaJ2R0VTfyo7PDKCnT4/OElKS0xNTk9GV1hZWltcXV5fVGVmZ2 hpamtsbW5vZHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6 SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwDypirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Q8qYq7FXY q7FXYq7FXYq7FXYq7FXYq7FW8VaxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV//0fKmKuxV2KuxV2KuxV2KuxV2KuxVsDFV6Qu3QYqmNhpv1hxGVJJ6 ZElkAq6n5W1Gzi+sLG0kHUkDdfniJKY0kuSYuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV//9LypirsVdirsVdirsVdirsVdiq4DpiqKgtg7gGpHYYE0yHS NJikk9OZGV+wNeh3GRJZxizKz0qCIwtDGvqftHrX2yBLaIss0nRJZ4H5xBo2PEq3 QV7bjBbOnmH5k/l/Jocg1OyjP6MmbjIg39GQ9v8AVb9nLIytoyQpgeTam8VaxV2K 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 9sVXAt4HFVRGFfiBxVewU96YoUKUPjilUdm9MChp44qojFXYquXpQ9MVWnFWz9nf FWsVaxV2Kt4q7fFXYq2CcVb3xV//2f/tGsZQaG90b3Nob3AgMy4wADhCSU0D7QAA AAAAEADwAAAAAQABAPAAAAABAAE4QklNBAQAAAAAAIwcAVoAAxslRxwCAAACAAQc AgUADFRoaW5raW5nIE1hbhwCUAAgQWxhaW4gWmFyaW5lbGxpIC0gTHV4bHVkdXMg TWVkaWEcAlUAGVBob3RvZ3JhcGhlci9WaWRlb2dyYXBoZXIcAnQAJMKpIDIwMTIg QWxhaW4gWmFyaW5lbGxpXGx1eGx1ZHVzLmNvbThCSU0ECgAAAAAAAQEAOEJJTQQL AAAAAAA0aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMt c2EvMy4wL3VzLzhCSU0EDAAAAAAZiwAAAAEAAAEAAAAAzwAAAwAAAm0AAAAZbwAY AAH/2P/uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwK CgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBwcHDQwN GBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAM8BAAMBEQACEQEDEQH/3QAEACD/xAGiAAAABwEBAQEB AAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkK CxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR 4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbT VSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4 iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUG BAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMl omOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWF 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 dCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAAS c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+E AAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAA FklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5 NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5n IENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAA AEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAAC c2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3 ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCu ALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHh AekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUc BSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAad Bq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyO DKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8J DyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJ EegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgb GEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2Mbihuy G9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+U H78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPC I/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/ KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIq MmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9 Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnw SjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19h X7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9 Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94 b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gR eG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opk isqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQg lIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5A nq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjE qTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/ v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3 yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj 4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY 8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 /kv+3P9t////4Qf6aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNr ZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8 eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9i ZSBYTVAgQ29yZSA1LjUtYzAwMiAxLjE0ODAyMiwgMjAxMi8wNy8xNS0xODowNjo0 NSAgICAgICAgIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5v cmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlv biByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMv ZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOnhtcFJpZ2h0cz0iaHR0cDovL25zLmFk b2JlLmNvbS94YXAvMS4wL3JpZ2h0cy8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnhtcD0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0 cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOklwdGM0 eG1wQ29yZT0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcENvcmUvMS4wL3ht bG5zLyIKICAgeG1wUmlnaHRzOldlYlN0YXRlbWVudD0iaHR0cDovL2NyZWF0aXZl Y29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMtc2EvMy4wL3VzLyIKICAgeG1wUmln aHRzOk1hcmtlZD0iVHJ1ZSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSI5 Mjg3NjM3Nzc0NzlENzZENEIzMThGMEIxQjJFQjA0OSIKICAgeG1wTU06RG9jdW1l bnRJRD0ieG1wLmRpZDozZjI2ZGE2ZC0yMzMwLTQxZDYtYTFlNS04NWU1ODc3YTcw OTAiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M2YyNmRhNmQtMjMzMC00 MWQ2LWExZTUtODVlNTg3N2E3MDkwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDEz LTAxLTEzVDEwOjAzOjQ3LTA2OjAwIgogICBwaG90b3Nob3A6QXV0aG9yc1Bvc2l0 aW9uPSJQaG90b2dyYXBoZXIvVmlkZW9ncmFwaGVyIj4KICAgPGRjOnJpZ2h0cz4K ICAgIDxyZGY6QWx0PgogICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+ wqkgMjAxMiBBbGFpbiBaYXJpbmVsbGlcbHV4bHVkdXMuY29tPC9yZGY6bGk+CiAg ICA8L3JkZjpBbHQ+CiAgIDwvZGM6cmlnaHRzPgogICA8ZGM6Y3JlYXRvcj4KICAg IDxyZGY6U2VxPgogICAgIDxyZGY6bGk+QWxhaW4gWmFyaW5lbGxpIC0gTHV4bHVk dXMgTWVkaWE8L3JkZjpsaT4KICAgIDwvcmRmOlNlcT4KICAgPC9kYzpjcmVhdG9y PgogICA8ZGM6dGl0bGU+CiAgICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDps YW5nPSJ4LWRlZmF1bHQiPlRoaW5raW5nIE1hbjwvcmRmOmxpPgogICAgPC9yZGY6 QWx0PgogICA8L2RjOnRpdGxlPgogICA8eG1wUmlnaHRzOlVzYWdlVGVybXM+CiAg ICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPkNy ZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1TaGFyZUFs aWtlPC9yZGY6bGk+CiAgICA8L3JkZjpBbHQ+CiAgIDwveG1wUmlnaHRzOlVzYWdl VGVybXM+CiAgIDxJcHRjNHhtcENvcmU6Q3JlYXRvckNvbnRhY3RJbmZvCiAgICBJ cHRjNHhtcENvcmU6Q2lFbWFpbFdvcms9ImFsYWluQGx1eGx1ZHVzLmNvbSIKICAg IElwdGM0eG1wQ29yZTpDaUFkckV4dGFkcj0iMTkxOCAxOTR0aCBTdHJlZXQiCiAg ICBJcHRjNHhtcENvcmU6Q2lBZHJDaXR5PSJNb25kYW1pbiIKICAgIElwdGM0eG1w Q29yZTpDaUFkclJlZ2lvbj0iSW93YSIKICAgIElwdGM0eG1wQ29yZTpDaUFkclBj b2RlPSI1MTU1NyIKICAgIElwdGM0eG1wQ29yZTpDaUFkckN0cnk9IlVTQSIKICAg IElwdGM0eG1wQ29yZTpDaVRlbFdvcms9IjQwOS0zNDktOTY3MiIKICAgIElwdGM0 eG1wQ29yZTpDaVVybFdvcms9Imh0dHA6Ly93d3cubHV4bHVkdXNtZWRpYS5jb20i Lz4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+ CiAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+/+4ADkFkb2JlAGRA AAAAAf/bAIQABAMDBAMEBwQEBwkHBQcJCwkJCQkLDgwMDAwMDhEMDAwMDAwRDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEEBgYMCAwWDAwWFA4ODhQUDg4ODhQR DAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgG ewgAAwERAAIRAQMRAf/dAAQBAP/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAH CAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIG AnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKy Y3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1 xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEF URNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJ ChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG 1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqK mqq6ytrq+v/aAAwDAQACEQMRAD8A+f8AirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVf/9D5/wCKuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//0fn/AIq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//S+f8AirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9P5/wCKuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//1Pn/ AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F X//V+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVf/9b5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV//1/n/AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FX//Q+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVf/9H5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//0vn/AIq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//T+f8AirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9T5/wCKuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kt9sVaxV2KuxVs7dDirsVaxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//9X5 /wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kt4q1ireKtYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FX/1vn/AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX 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 irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVf/S+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVbGxrirWKuxV1MVdirdKdcVdirq4q7FXD wxVsE9sVdv1xVuu2KXMzP13xQqIXGwJAwJXVFKnrXbFVSOMEgnocCUTAErSu36sV VvSDj4a0GBKM9OIryFFoAKDuR1OKUxWNfQLL3U9q1OBkhzaOIw0ihRUfTiimrqwa 9bkoAKqASBSoG1fn44rSSz2cidiMkxQQjp1woUpeVd8LFZTFWsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVf//T+f8AirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir 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 irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//W+f8AirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVXAACp+jFWia7nFWsVdirs VdirsVbpXpirth7nFXAV2xV3XFW1WoqemKtuvCgPXwxVeD6g+M/ZFAO2KqQ8cVXk qRXv2GKqyqqU4nlIRU+C4Eqh5wt6qGlajlTxGKqMaqxoSadvniqY28ADFiwqOoGx P34EukaKtJKlsVWpCs44x1DffXFLUlg1rIFmNGHVR1GKoh3aUcYlIQfecCqYs5WT nxIWtKnx8MUtxWxUUOw8AMbVFRRPCfUh5I4B+7AlVWIOQ4XfuO30YpRETBEYcfjH QAgCvia/wxVMkLoyIUNWHI0Yjau7bUyLJO5HkhtW4iru/AcjU0b9r3p1wM0wFrLb kMr8tgKlT4UpQdMDKk4EDS8WcUIHQfjgZ0jobaUrSbcdtv14rS+G0aYHrz2G/wCA wKrG1CEkLQ1pt2pt0xVqSzT1JFXkVBpyPWn9MVQT+XFumZZgrIVJNTxoP8k+PgP2 sbYkMI8w+Vvq9JIEMisxAZQKUrxo6Do1fvywFolFgusaBLZ2qX6GtuztEa/aV16q 69Vr1jr9pQ38rZaGlIia7nChbirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd 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 sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdir/AP/U+f8AirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVb6Yq1iq8Nx6Yq2AXBJIAHbFVvKgoO+KtYq754qr+uTH6S Dip606n54EuijV9i1PAAVOKplcfUbeFI4Hb1WBMtR0NdlH8f7MCUuaTl8MYIB+kn CqvZ8raVZti61opFe1N8CokxzPBwU8LZT8Q6cm/icUqAjVjRSRH1p1xVHQzxQ/ZU JQUrSrf7eBKogjkLfCxpuSf1Yqpu7S/sUUbbYpVRpt6qJcmJkhIJV3FFIB7e2KuW 5pJuwAO5+Ef0xVkFr5iuYTzjKqvSgjQj8RgZJzY+bbqynRuYmiG5idAYySNxxFP+ FociyCa3NxZ3o+s2duYDT4oyxZSw6sD9ofI1/wBbAzROmlpFEsgUutdvbAyXetLM x5UB/Z3/AIYGVI2ECnKQcjSn+3gTSfWl3Fbh1kQMGWm34Ed6DAhdPfCOJogKcuni KduWKUqe5muEoxPIVG3U9D/tYpW2ltGG9QbEbkEHf5YEpkYo7gFT1YjkDtucKoNL aAFkIIcHbfAqPfTaspj2dl3A6VpgSqQqF/dvWgG3jXvTFKMs1QNufskYqj7aEXMh DIOKk7n8MFsmQ2enmKMSulEG24rU0/4XrimkOY0qUUGlKe9DgVF2ul3axtPLIihR URk/Ew6fD/q9SOvhiyR6QkqqlORI4hq1p3+7FUH+gZIhJJCKNXbfp49RihoSXFpH yKGNy1AWGzDatD/MP44oTOa0hFuQWdVrsq/stXv4eP8AnssULJaszpWQsAR6b+4F eLeK8sU0knmryyNfsGhfisjdKdOQYAoGSvMbg75MFplG3yp5u8q3el3TrKtHA5L/ AJS+x7lfvzJiXCkGHZNrdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V+f8AirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirdT0xVrFXYq7FWwCTQdcVXmiCg+1 irjSgVBv3OBLuNAGZuv0nCrlXntWnhXAqqqSH4eg9sUuEar1wJpFQNDEecgNR0A7 /T2GKUXdz2zKpoUqAeFB18fZfAYFQhlAQiRWqaFOwp32wqtTlM1K8QOgHQYEpzZe WL26tWuUIJGyqu7NuB9nrQVwJVbKFLTklzE8km4KsxUA+4FD9GK0rfVneT+7VD1A A2/jjaaV4/0rHFMYJpI4XXhJRiFZRvxbfiRtsuNrSSGKMbyVr4e/vihkX1eOO0jF vdJMpHJo6OpQ1+y3JQP+BZsDIIzTbaaImblEEG1TR/8Ahd8BZhNYIagM0nJDWoXY +3XIs000+KMKzLUlzsK7jtv7YEo5oWr8Q+EU6b/P6cWTScIpiQaKO/8An3wJTu3t WdVIPxCtfl44FTa6tIUs+SH1HK1oB037k0/DFUpaECAlBV+uw3oPbAroYmZSRVWr TifDxH/NOKVOR3LlI9lFB7VHh74pRPoCcLIxHJdjXx7dMCU1tI55hxjALAUNDuPv xVSu9Oncfuy9d6EYFdp1nLax/v25mtOJ8e1cUpzah4pFCjiCeJoaivhX5YEsv0+y a14pMjr6nEh6VND0I8QcCUeY0uecYUn0yxX4ab9Ptdvk2NpXx262MHNgX2AZjvw3 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 tryxkMdshjNTyZ6ihCgKtT8Lo9W5r/NT7IywFxpxfIuv6Bc6DcGKdWCGvEsKHbqr Dsy9x9PTMkG3DIpKckhrFXYq7FW6kYq7FWsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//S+f8AirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdireKupirYqu/fFKrH1IPfAkK0YdWEi9j1wJTO MLCQ7AkN9GBKj6AmkdoVJABNBvQYqljvwPwmh3ByTFaK7e+KVeJz1ORZBPYZzHF6 dFKdalRX7+uBkqW7MrcWGwNSCMCUSsxKgN03r8sUq7R+nxAoedCPHFKnCPVorgMA akdDQ++BVZLMSKzAUBO3+3ilFRW3Bwh8fmMiyZVEzTpQdgK7eG2LNE20ZWQcmNG6 ntT5ddsCpjYWMfNhXkoJ79vHfwwMk4gt+JjmXdztutfwxQgNWWWArFK9V3+DqB16 UwJU/qct7GsMC7otQTt0FT12xVBQrcyRu5JVaVJHWoO1MVW8XURGtQxJBQ1NO/04 pTiO3SIcmYSJUIQNn3APXAqrDpEl/NEsSGg6UNdtzRh2+WKpnMJeLP8ACImJBWMf CDTYcfenXtikIjTLS212a2tHISZyAUJHwk9DUkKK+JpgZMm1qO00lIba0UM7BjIh NVDVoBtUBtq/a6YqFDR7dLlllkPGUEEBFJNACKVA6no22LJFpbTiYwxx/uyOS8iC wbwanv2wFLI7fTG9NJi1TJVAgPSRev8AntvgW1TUPqU84+sI5MEYjljAHz+0vXfb +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 oQV/mpTrVfoOKEbZ30k8TRXUZd0IYONqDqeWNsSK5JfJp0q3C3YIMQUrJxYcl3qj Eb9cDO+iW3wMkbxsvDkPhao+L+dfb4fi8MUJJe2cUQMj82SUJyLLvzHXiR/N9+KC +af+cgvIsR0+XWNNhlMMXAytVWADbRuCDyNWDK+3w1jXrTLIuPIPk07HMlxWsVbx VrFXYq7FXYq7FW8VaxV2KuxV2KuxVvFWsVdirsVdirsVdirsVdirsVbxVrFXYq7F XYq7FXYq7FW8VaxVvFWsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVf/Q+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVbxVrFXYq7FW8VaxV2Kt4q1ireK uxV2Ktg1OBKqQoHvgZIq1mKKVWtD1+WBIRcnGSjM/wC8O/SmBKwKTGASAy1/rilG rNLPFHHsQjFum+9O+BknukRxSgerSnbxwJV7h2kuDFXildid6D3OBkymOzSG0CTh wZKKzAcuAr9rjtXbp8WBKV3draaZckOS9P7srsW9260+WFUpnsrqKNZmQoknxK29 GFabHvuKYqiVtUhWJiSrOhatPhPXbbAlEQRIiczuiCo3qAcWSd6NcSWylweQkIqa bAdt/CuQLMPRPLl9LZyowKmYKfi5H7P/ABrT2yLJm0Vv6y/WQXjs2Tk6h6luA36U 28T/ALWFDGPMgWKWS0WFXjnjThvyZORr8B2pyAH+xwqwWw/0m4jslPx1+Aca0NaU Pv4eORZPT7bTJ4baCzAjjtZY5fVm/aHL4RyLfY+wxWg50wraH0Ly5ca1qMEIZIon 4M1FatDX4nA+Lcp1/wArFiSiNA8tSPfy2Y+O8KepayNShUgsGatd2T4U8GpvXGkE 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 7f59Muid3GmHy8y06dMvcdb0xQ1irsVdirsVdirsVdireKtYq3irWKt4q1irsVdi rsVdirsVdirsVdirsVdirsVdireKtYq3irWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2Kt4q1irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVf//U+f8AirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdireKuxVrFW8 VdirsVdirsVdirsVdil2KHYpdih2KXYquAqaHArdAGp1xSiJI+YDV38MizpFWNvL cyAJXp+GRLIMvs7eNZIYOJBPQg775Eswy1BEkfomhCDkV7n+wYpSy3NqnJrgilKp tsCciyTmz1eMSySQgtGyUUHahA2r40O+BKP0bVblZE9aOrcvhr4E96YGTJfNmsXV 5Ot1biO3RI44eEYPE8U4Ft9+bfaP34SxASC7s4DGUt5DJK3BjICx40FSu9N177fL AlJrqIs4tY1bcV5A7nbpv2xVN9I0+O0hMuohvReNjGa0NRsvvSu1cKULDpltJBJd PIVgU8dlqA2/Hr40yKVG+ttQ1OOG8LRCSZGFAQhVYujPWi79F/1ckqF0xGu7coUD uVZ2JO6ACvj/ALLFKM0yOTVXjWcrHbcOLEDfig+37t4+OBKc6ZZtcLbojxxo9VDz MEUMKk15f5IHxe+KUJq8dvqkjzWyiCEIOm4ov8vckndv5e/TFKefl7qcei2txqKr zu0VxQkgV24Mviwb6Ps9cCph5Uu104F7kBYz8Cq1KiTY7jqPnkWT3OLTRIPVIkd9 TPJYiPiao2Y8dgOXGlPHrkmCU2ks0FgZLxKSxymFELMVNdue/wAIG/H/AGORbKTi ARwrJPZLzuOCyEyig4yAhY/i2qqn1Eb3GFipxJNKYri5ukjkMvL4m5Mp4Baqsey1 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 5liDFwSWjdSakc+PTlUbYOTKrZbY2SaSsWqX4mlZpzNJxUMzykjh8JHTj8XE7jJc mBN7BD+YNYsktUutP9JLxeJYSoORQ/Dyp3477jt8NO2AlMQeqt5av72SygbV5vrA iLNa9nl4lRRVbfiTty4j4DviPNZDuVfLvlweYri5EEQtVmfjKjsWPClF4t+0erHo p+HqFxiLRKXCrah5kks71tP0q0t3niYIZySqKq9KkkLU0+19quEnuURsWUXFHqd4 WkgvAWWRjLxAKx8ifhNS3I1HTHdTQVoY5H05ru51GVLChQtyZaMOnFTRa+A/mx6I PPlu15TsrnUbL1gbmYBvgHQlSaJzqev7SHpgG6ZkBk8b3lqv1cWsf1Qyc2PEAliK MJBQ123+H55Jhseq+1jl9SscfoLGSw6gstOhPf8A2XTEIKPdYViCI/pByOSS1Gx3 FGFckwV4ZY+QEvEugFJABQj/ACmXv4E98VTRfSRQpB9QChZdm36Nt9rJMEOZWBLu UeUH4hTizKBt9IPfAlr6lFKpeB+cXIEITQoSKb+FOnyxpFuefiea/DT4STQmg/z/ AI4GVK8HqShZqgo1SK9On4q34YWBQUMUiXDMq7zABlO3b4TXpgZWg7ik1rwILJU1 DCnEjt8v4YGQ5vm//nJ/yU+v+UWltlVrm0csAdxxI+IdOzbjIg0UzHEH59zQmByh INO4O2Zbr1PChrFXYq3irWKuxV2KuxV2KuxVvFWsVbxVrFXYq7FXYq3irWKuxV2K t4q1ireKtYq7FXYq7FW8VaxV2KuxV2KuxV2Kt4q1irsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVf//V+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVbxV2KuxVrFW8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdil2KHYpdirsVd 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 w2LpsBruIwow6bIaokuvxnIMSUsvtIBqIV4OWw== =EF1N pgp-0.15.0/tests/unit-tests/long-key.asc.line000064400000000000000000015264631046102023000171420ustar 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 lI0k13bL3lEbzrfM/XPIYfN9vJq9HV6GjJ6RItFN0sIZ9sL11HDc5fy5LJXXmWxH l1SWxlx44TRodnirafMtmb9/kHLEXK9jnWlky7s+aTz3bVtPsmFbYipKma7z+Vag S1AiebYUTh72tM5V1LTELcl1Y4CZAUFhdA696PBSn6kCl013Q5Ghn27E/kpYQI3f 8enjCA8e468j0B9whdwg5XrOOo70VA8MnelDq9R1rML9RwgwDb5gjC51y1Rq3fbA N44fcJiOmeEtGTxuZJUTH3W7BUYAnbNHlitLlNTIBiZZjrZC7/p/wztSHw8ivjDy Q07Oh4XMK0K1tEFBbGFpbiBaYXJpbmVsbGkgKFJFU1RSSUNURUQgQ09ORklERU5U SUFMKSA8YW16YXJpbmVsbGlAZ21haWwuY29tPokCPQQTAQoAJwUCUV2QNQIbLwUJ DpGjgAULCQgHAwUVCgkICwUWAgMBAAIeAQIXgAAKCRDGoyrou3VhRQ+SEACcTMi2 rhghXvQPgJrw+nxdRL55QmvQPc0ZdDZjnq3kEjeLU6or95yL9zLEijTNiptYYpPM 6dx16eCjij3ZXdMVcEZ7ybsFrSFoIRFzSsDk1AniWG4EQ0BnRBTGhIY/jDR+QD98 xb40882LwaWybcE7wZg44dx/Mq7F2HGivIq0ZoLWVbDa8w96jRmjtiaoyMLbUjcK YfNZuM25qYlHfmDyjsael/q2qnPTk7Xbnvfpmo22moPUc0UJy6zcIUS5gJBzPXPH kmr89RBnEPrzg1pZVkl/GIbmZWm5wYmyvkeLDQkEvf4QFGCSkj3XLw0QVXxd6GF+ uqVRLdVlL6pwPnX6z4aeyWXuKTRcb6ZOdJOQK5Df9Dja/FYRNQngFgOsyo0mZI3T ggK8ee0KF9wcxzxX4rDLSjJxeU1JAZDxJYsyIpmdxJN4ooqUibo/50qg8kd1hnv6 SYen4GsJ6yMhpG1xwTVpzKNITGyDmk7phGbdYvCRFLVk5OWdiHlUXQdyuMDwer27 v6iYnmdhxsiTSi+lnZrctAfzvVBq3hCW5wMdNG8WrVhAIDNi7YUta57vn81R50nG oQX0aqq5mIrXxsETfszU8oSJd+F0j/7Bi6FnIvF5KS7DGgfra9QbEINvxkEjbPhh 4HMn/Mew+dDOF7JuljE6WKrniZ54/MLtwQLZi4kCQAQTAQoAKgIbLwUJDpGjgAUL CQgHAwUVCgkICwUWAgMBAAIeAQIXgAUCUV2RFwIZAQAKCRDGoyrou3VhRZ57EACi j3Gz4twUBqRwIuAGSV2Jl/u/fgyxlpnI6eoIFCGyd1tG1+9ymgHFsexDGnoAuwQF V65LCmQ9dqcEwToiqu+IuSeo9Sy5wzZ0Sdi0pZkPqohZz89EAJ3+c4Rj4GH5q4eq U2DE6/i1C+Kwtyq1NessuzoQxu0gxSPbRAfE3RibDifqdiH+qQ+HPhQFJ+j8VGGD 6jUekuDWcU7gNGwMLhm2MHCo8aOWTPmoC1F+eBI6nXXdCND461Lm89tZmSoV4tPd Z/MhNidgDQLZBSieMSM+mqLKsBvF4B1sxFbGhVL/3uId8WBXL7Vj3DMp8xlHnAuN P9p3KJlZmk1iYriTguSVD7FiH8kpytcLTLbrASLrTJHLT6gIcsNCkeV1P6+CQ4g/ mQczzNUEn+6/4f+YKHSWj79ckkKn7fbo+5bxNj4bu7wMtU+aa1sXhTAbD7gzy5zw KSMcqksZAbFXveJMc1Pkgg6bOyEuYvHq4KBGLyene2QQnumz0hAbBrQTb9fYp17g zbEIKAPXfscTOKQcNM9zzvet0loCCqp2J9nBKB8N1Th20r33WHAo+iVzr4wj0qAp 529XiPW9gjemUOStwiGI/4Mp6QYGtlxhnWf+F4IfwWwlrASxFFz1HCrNW7BZgUJ9 ODBsDhPI6OLMES815WJVNXGJtr16/Vlpwz1+vQVg/9H/AATN/f8ABM34ARAAAQEA AAAAAAAAAAAAAAD/2P/hGndFeGlmAABJSSoACAAAAAUAGgEFAAEAAABKAAAAGwEF AAEAAABSAAAAKAEDAAEAAAACAAAAOwECACEAAABaAAAAmIICACUAAAB8AAAAogAA APAAAAABAAAA8AAAAAEAAABBbGFpbiBaYXJpbmVsbGkgLSBMdXhsdWR1cyBNZWRp YQAAwqkgMjAxMiBBbGFpbiBaYXJpbmVsbGlcbHV4bHVkdXMuY29tAAAGAAMBAwAB AAAABgAAABoBBQABAAAA8AAAABsBBQABAAAA+AAAACgBAwABAAAAAgAAAAECBAAB AAAAAAEAAAICBAABAAAAbxkAAAAAAABIAAAAAQAAAEgAAAABAAAA/9j/7gAOQWRv YmUAZAAAAAAB/9sAhAAGBAQEBQQGBQUGCQYFBgkLCAYGCAsMCgoLCgoMEAwMDAwM DBAMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMAQcHBw0MDRgQEBgUDg4OFBQO Dg4OFBEMDAwMDBERDAwMDAwMEQwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAz/ wAARCADPAQADAREAAhEBAxEB/90ABAAg/8QBogAAAAcBAQEBAQAAAAAAAAAABAUD AgYBAAcICQoLAQACAgMBAQEBAQAAAAAAAAABAAIDBAUGBwgJCgsQAAIBAwMCBAIG BwMEAgYCcwECAxEEAAUhEjFBUQYTYSJxgRQykaEHFbFCI8FS0eEzFmLwJHKC8SVD NFOSorJjc8I1RCeTo7M2F1RkdMPS4ggmgwkKGBmElEVGpLRW01UoGvLj88TU5PRl dYWVpbXF1eX1ZnaGlqa2xtbm9jdHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4KTlJ WWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+hEAAgIBAgMFBQQFBgQIAwNtAQACEQME IRIxQQVRE2EiBnGBkTKhsfAUwdHhI0IVUmJy8TMkNEOCFpJTJaJjssIHc9I14kSD F1STCAkKGBkmNkUaJ2R0VTfyo7PDKCnT4/OElKS0xNTk9GV1hZWltcXV5fVGVmZ2 hpamtsbW5vZHV2d3h5ent8fX5/c4SFhoeIiYqLjI2Oj4OUlZaXmJmam5ydnp+So6 SlpqeoqaqrrK2ur6/9oADAMBAAIRAxEAPwDypirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//Q8qYq7FXY q7FXYq7FXYq7FXYq7FXYq7FW8VaxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV//0fKmKuxV2KuxV2KuxV2KuxV2KuxVsDFV6Qu3QYqmNhpv1hxGVJJ6 ZElkAq6n5W1Gzi+sLG0kHUkDdfniJKY0kuSYuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV//9LypirsVdirsVdirsVdirsVdiq4DpiqKgtg7gGpHYYE0yHS NJikk9OZGV+wNeh3GRJZxizKz0qCIwtDGvqftHrX2yBLaIss0nRJZ4H5xBo2PEq3 QV7bjBbOnmH5k/l/Jocg1OyjP6MmbjIg39GQ9v8AVb9nLIytoyQpgeTam8VaxV2K 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 9sVXAt4HFVRGFfiBxVewU96YoUKUPjilUdm9MChp44qojFXYquXpQ9MVWnFWz9nf FWsVaxV2Kt4q7fFXYq2CcVb3xV//2f/tGsZQaG90b3Nob3AgMy4wADhCSU0D7QAA AAAAEADwAAAAAQABAPAAAAABAAE4QklNBAQAAAAAAIwcAVoAAxslRxwCAAACAAQc AgUADFRoaW5raW5nIE1hbhwCUAAgQWxhaW4gWmFyaW5lbGxpIC0gTHV4bHVkdXMg TWVkaWEcAlUAGVBob3RvZ3JhcGhlci9WaWRlb2dyYXBoZXIcAnQAJMKpIDIwMTIg QWxhaW4gWmFyaW5lbGxpXGx1eGx1ZHVzLmNvbThCSU0ECgAAAAAAAQEAOEJJTQQL AAAAAAA0aHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMt c2EvMy4wL3VzLzhCSU0EDAAAAAAZiwAAAAEAAAEAAAAAzwAAAwAAAm0AAAAZbwAY AAH/2P/uAA5BZG9iZQBkAAAAAAH/2wCEAAYEBAQFBAYFBQYJBgUGCQsIBgYICwwK CgsKCgwQDAwMDAwMEAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwBBwcHDQwN GBAQGBQODg4UFA4ODg4UEQwMDAwMEREMDAwMDAwRDAwMDAwMDAwMDAwMDAwMDAwM DAwMDAwMDAwMDP/AABEIAM8BAAMBEQACEQEDEQH/3QAEACD/xAGiAAAABwEBAQEB AAAAAAAAAAAEBQMCBgEABwgJCgsBAAICAwEBAQEBAAAAAAAAAAEAAgMEBQYHCAkK CxAAAgEDAwIEAgYHAwQCBgJzAQIDEQQABSESMUFRBhNhInGBFDKRoQcVsUIjwVLR 4TMWYvAkcoLxJUM0U5KismNzwjVEJ5OjszYXVGR0w9LiCCaDCQoYGYSURUaktFbT VSga8uPzxNTk9GV1hZWltcXV5fVmdoaWprbG1ub2N0dXZ3eHl6e3x9fn9zhIWGh4 iJiouMjY6PgpOUlZaXmJmam5ydnp+So6SlpqeoqaqrrK2ur6EQACAgECAwUFBAUG BAgDA20BAAIRAwQhEjFBBVETYSIGcYGRMqGx8BTB0eEjQhVSYnLxMyQ0Q4IWklMl omOywgdz0jXiRIMXVJMICQoYGSY2RRonZHRVN/Kjs8MoKdPj84SUpLTE1OT0ZXWF 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 dCAoYykgMTk5OCBIZXdsZXR0LVBhY2thcmQgQ29tcGFueQAAZGVzYwAAAAAAAAAS c1JHQiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAABJzUkdCIElFQzYxOTY2LTIuMQAA AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA WFlaIAAAAAAAAPNRAAEAAAABFsxYWVogAAAAAAAAAAAAAAAAAAAAAFhZWiAAAAAA AABvogAAOPUAAAOQWFlaIAAAAAAAAGKZAAC3hQAAGNpYWVogAAAAAAAAJKAAAA+E AAC2z2Rlc2MAAAAAAAAAFklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAA FklFQyBodHRwOi8vd3d3LmllYy5jaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAAAAAAAAAAAAAAAAAAAAAABkZXNjAAAAAAAAAC5JRUMgNjE5NjYtMi4xIERl ZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAAAC5JRUMgNjE5 NjYtMi4xIERlZmF1bHQgUkdCIGNvbG91ciBzcGFjZSAtIHNSR0IAAAAAAAAAAAAA AAAAAAAAAAAAAAAAZGVzYwAAAAAAAAAsUmVmZXJlbmNlIFZpZXdpbmcgQ29uZGl0 aW9uIGluIElFQzYxOTY2LTIuMQAAAAAAAAAAAAAALFJlZmVyZW5jZSBWaWV3aW5n IENvbmRpdGlvbiBpbiBJRUM2MTk2Ni0yLjEAAAAAAAAAAAAAAAAAAAAAAAAAAAAA AAAAAHZpZXcAAAAAABOk/gAUXy4AEM8UAAPtzAAEEwsAA1yeAAAAAVhZWiAAAAAA AEwJVgBQAAAAVx/nbWVhcwAAAAAAAAABAAAAAAAAAAAAAAAAAAAAAAAAAo8AAAAC c2lnIAAAAABDUlQgY3VydgAAAAAAAAQAAAAABQAKAA8AFAAZAB4AIwAoAC0AMgA3 ADsAQABFAEoATwBUAFkAXgBjAGgAbQByAHcAfACBAIYAiwCQAJUAmgCfAKQAqQCu ALIAtwC8AMEAxgDLANAA1QDbAOAA5QDrAPAA9gD7AQEBBwENARMBGQEfASUBKwEy ATgBPgFFAUwBUgFZAWABZwFuAXUBfAGDAYsBkgGaAaEBqQGxAbkBwQHJAdEB2QHh AekB8gH6AgMCDAIUAh0CJgIvAjgCQQJLAlQCXQJnAnECegKEAo4CmAKiAqwCtgLB AssC1QLgAusC9QMAAwsDFgMhAy0DOANDA08DWgNmA3IDfgOKA5YDogOuA7oDxwPT A+AD7AP5BAYEEwQgBC0EOwRIBFUEYwRxBH4EjASaBKgEtgTEBNME4QTwBP4FDQUc BSsFOgVJBVgFZwV3BYYFlgWmBbUFxQXVBeUF9gYGBhYGJwY3BkgGWQZqBnsGjAad Bq8GwAbRBuMG9QcHBxkHKwc9B08HYQd0B4YHmQesB78H0gflB/gICwgfCDIIRgha CG4IggiWCKoIvgjSCOcI+wkQCSUJOglPCWQJeQmPCaQJugnPCeUJ+woRCicKPQpU CmoKgQqYCq4KxQrcCvMLCwsiCzkLUQtpC4ALmAuwC8gL4Qv5DBIMKgxDDFwMdQyO DKcMwAzZDPMNDQ0mDUANWg10DY4NqQ3DDd4N+A4TDi4OSQ5kDn8Omw62DtIO7g8J DyUPQQ9eD3oPlg+zD88P7BAJECYQQxBhEH4QmxC5ENcQ9RETETERTxFtEYwRqhHJ EegSBxImEkUSZBKEEqMSwxLjEwMTIxNDE2MTgxOkE8UT5RQGFCcUSRRqFIsUrRTO FPAVEhU0FVYVeBWbFb0V4BYDFiYWSRZsFo8WshbWFvoXHRdBF2UXiReuF9IX9xgb GEAYZRiKGK8Y1Rj6GSAZRRlrGZEZtxndGgQaKhpRGncanhrFGuwbFBs7G2Mbihuy G9ocAhwqHFIcexyjHMwc9R0eHUcdcB2ZHcMd7B4WHkAeah6UHr4e6R8THz4faR+U H78f6iAVIEEgbCCYIMQg8CEcIUghdSGhIc4h+yInIlUigiKvIt0jCiM4I2YjlCPC I/AkHyRNJHwkqyTaJQklOCVoJZclxyX3JicmVyaHJrcm6CcYJ0kneierJ9woDSg/ KHEooijUKQYpOClrKZ0p0CoCKjUqaCqbKs8rAis2K2krnSvRLAUsOSxuLKIs1y0M LUEtdi2rLeEuFi5MLoIuty7uLyQvWi+RL8cv/jA1MGwwpDDbMRIxSjGCMbox8jIq MmMymzLUMw0zRjN/M7gz8TQrNGU0njTYNRM1TTWHNcI1/TY3NnI2rjbpNyQ3YDec N9c4FDhQOIw4yDkFOUI5fzm8Ofk6Njp0OrI67zstO2s7qjvoPCc8ZTykPOM9Ij1h PaE94D4gPmA+oD7gPyE/YT+iP+JAI0BkQKZA50EpQWpBrEHuQjBCckK1QvdDOkN9 Q8BEA0RHRIpEzkUSRVVFmkXeRiJGZ0arRvBHNUd7R8BIBUhLSJFI10kdSWNJqUnw SjdKfUrESwxLU0uaS+JMKkxyTLpNAk1KTZNN3E4lTm5Ot08AT0lPk0/dUCdQcVC7 UQZRUFGbUeZSMVJ8UsdTE1NfU6pT9lRCVI9U21UoVXVVwlYPVlxWqVb3V0RXklfg WC9YfVjLWRpZaVm4WgdaVlqmWvVbRVuVW+VcNVyGXNZdJ114XcleGl5sXr1fD19h X7NgBWBXYKpg/GFPYaJh9WJJYpxi8GNDY5dj62RAZJRk6WU9ZZJl52Y9ZpJm6Gc9 Z5Nn6Wg/aJZo7GlDaZpp8WpIap9q92tPa6dr/2xXbK9tCG1gbbluEm5rbsRvHm94 b9FwK3CGcOBxOnGVcfByS3KmcwFzXXO4dBR0cHTMdSh1hXXhdj52m3b4d1Z3s3gR eG54zHkqeYl553pGeqV7BHtje8J8IXyBfOF9QX2hfgF+Yn7CfyN/hH/lgEeAqIEK gWuBzYIwgpKC9INXg7qEHYSAhOOFR4Wrhg6GcobXhzuHn4gEiGmIzokziZmJ/opk isqLMIuWi/yMY4zKjTGNmI3/jmaOzo82j56QBpBukNaRP5GokhGSepLjk02TtpQg lIqU9JVflcmWNJaflwqXdZfgmEyYuJkkmZCZ/JpomtWbQpuvnByciZz3nWSd0p5A nq6fHZ+Ln/qgaaDYoUehtqImopajBqN2o+akVqTHpTilqaYapoum/adup+CoUqjE qTepqaocqo+rAqt1q+msXKzQrUStuK4trqGvFq+LsACwdbDqsWCx1rJLssKzOLOu tCW0nLUTtYq2AbZ5tvC3aLfguFm40blKucK6O7q1uy67p7whvJu9Fb2Pvgq+hL7/ v3q/9cBwwOzBZ8Hjwl/C28NYw9TEUcTOxUvFyMZGxsPHQce/yD3IvMk6ybnKOMq3 yzbLtsw1zLXNNc21zjbOts83z7jQOdC60TzRvtI/0sHTRNPG1EnUy9VO1dHWVdbY 11zX4Nhk2OjZbNnx2nba+9uA3AXcit0Q3ZbeHN6i3ynfr+A24L3hROHM4lPi2+Nj 4+vkc+T85YTmDeaW5x/nqegy6LzpRunQ6lvq5etw6/vshu0R7ZzuKO6070DvzPBY 8OXxcvH/8ozzGfOn9DT0wvVQ9d72bfb794r4Gfio+Tj5x/pX+uf7d/wH/Jj9Kf26 /kv+3P9t////4Qf6aHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wLwA8P3hwYWNr ZXQgYmVnaW49Iu+7vyIgaWQ9Ilc1TTBNcENlaGlIenJlU3pOVGN6a2M5ZCI/Pgo8 eDp4bXBtZXRhIHhtbG5zOng9ImFkb2JlOm5zOm1ldGEvIiB4OnhtcHRrPSJBZG9i ZSBYTVAgQ29yZSA1LjUtYzAwMiAxLjE0ODAyMiwgMjAxMi8wNy8xNS0xODowNjo0 NSAgICAgICAgIj4KIDxyZGY6UkRGIHhtbG5zOnJkZj0iaHR0cDovL3d3dy53My5v cmcvMTk5OS8wMi8yMi1yZGYtc3ludGF4LW5zIyI+CiAgPHJkZjpEZXNjcmlwdGlv biByZGY6YWJvdXQ9IiIKICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMv ZWxlbWVudHMvMS4xLyIKICAgIHhtbG5zOnhtcFJpZ2h0cz0iaHR0cDovL25zLmFk b2JlLmNvbS94YXAvMS4wL3JpZ2h0cy8iCiAgICB4bWxuczp4bXBNTT0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgIHhtbG5zOnhtcD0iaHR0cDov L25zLmFkb2JlLmNvbS94YXAvMS4wLyIKICAgIHhtbG5zOnBob3Rvc2hvcD0iaHR0 cDovL25zLmFkb2JlLmNvbS9waG90b3Nob3AvMS4wLyIKICAgIHhtbG5zOklwdGM0 eG1wQ29yZT0iaHR0cDovL2lwdGMub3JnL3N0ZC9JcHRjNHhtcENvcmUvMS4wL3ht bG5zLyIKICAgeG1wUmlnaHRzOldlYlN0YXRlbWVudD0iaHR0cDovL2NyZWF0aXZl Y29tbW9ucy5vcmcvbGljZW5zZXMvYnktbmMtc2EvMy4wL3VzLyIKICAgeG1wUmln aHRzOk1hcmtlZD0iVHJ1ZSIKICAgeG1wTU06T3JpZ2luYWxEb2N1bWVudElEPSI5 Mjg3NjM3Nzc0NzlENzZENEIzMThGMEIxQjJFQjA0OSIKICAgeG1wTU06RG9jdW1l bnRJRD0ieG1wLmRpZDozZjI2ZGE2ZC0yMzMwLTQxZDYtYTFlNS04NWU1ODc3YTcw OTAiCiAgIHhtcE1NOkluc3RhbmNlSUQ9InhtcC5paWQ6M2YyNmRhNmQtMjMzMC00 MWQ2LWExZTUtODVlNTg3N2E3MDkwIgogICB4bXA6TWV0YWRhdGFEYXRlPSIyMDEz LTAxLTEzVDEwOjAzOjQ3LTA2OjAwIgogICBwaG90b3Nob3A6QXV0aG9yc1Bvc2l0 aW9uPSJQaG90b2dyYXBoZXIvVmlkZW9ncmFwaGVyIj4KICAgPGRjOnJpZ2h0cz4K ICAgIDxyZGY6QWx0PgogICAgIDxyZGY6bGkgeG1sOmxhbmc9IngtZGVmYXVsdCI+ wqkgMjAxMiBBbGFpbiBaYXJpbmVsbGlcbHV4bHVkdXMuY29tPC9yZGY6bGk+CiAg ICA8L3JkZjpBbHQ+CiAgIDwvZGM6cmlnaHRzPgogICA8ZGM6Y3JlYXRvcj4KICAg IDxyZGY6U2VxPgogICAgIDxyZGY6bGk+QWxhaW4gWmFyaW5lbGxpIC0gTHV4bHVk dXMgTWVkaWE8L3JkZjpsaT4KICAgIDwvcmRmOlNlcT4KICAgPC9kYzpjcmVhdG9y PgogICA8ZGM6dGl0bGU+CiAgICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDps YW5nPSJ4LWRlZmF1bHQiPlRoaW5raW5nIE1hbjwvcmRmOmxpPgogICAgPC9yZGY6 QWx0PgogICA8L2RjOnRpdGxlPgogICA8eG1wUmlnaHRzOlVzYWdlVGVybXM+CiAg ICA8cmRmOkFsdD4KICAgICA8cmRmOmxpIHhtbDpsYW5nPSJ4LWRlZmF1bHQiPkNy ZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tTm9uQ29tbWVyY2lhbC1TaGFyZUFs aWtlPC9yZGY6bGk+CiAgICA8L3JkZjpBbHQ+CiAgIDwveG1wUmlnaHRzOlVzYWdl VGVybXM+CiAgIDxJcHRjNHhtcENvcmU6Q3JlYXRvckNvbnRhY3RJbmZvCiAgICBJ cHRjNHhtcENvcmU6Q2lFbWFpbFdvcms9ImFsYWluQGx1eGx1ZHVzLmNvbSIKICAg IElwdGM0eG1wQ29yZTpDaUFkckV4dGFkcj0iMTkxOCAxOTR0aCBTdHJlZXQiCiAg ICBJcHRjNHhtcENvcmU6Q2lBZHJDaXR5PSJNb25kYW1pbiIKICAgIElwdGM0eG1w Q29yZTpDaUFkclJlZ2lvbj0iSW93YSIKICAgIElwdGM0eG1wQ29yZTpDaUFkclBj b2RlPSI1MTU1NyIKICAgIElwdGM0eG1wQ29yZTpDaUFkckN0cnk9IlVTQSIKICAg IElwdGM0eG1wQ29yZTpDaVRlbFdvcms9IjQwOS0zNDktOTY3MiIKICAgIElwdGM0 eG1wQ29yZTpDaVVybFdvcms9Imh0dHA6Ly93d3cubHV4bHVkdXNtZWRpYS5jb20i Lz4KICA8L3JkZjpEZXNjcmlwdGlvbj4KIDwvcmRmOlJERj4KPC94OnhtcG1ldGE+ CiAgICAgICAgICAgICAgIAo8P3hwYWNrZXQgZW5kPSJ3Ij8+/+4ADkFkb2JlAGRA AAAAAf/bAIQABAMDBAMEBwQEBwkHBQcJCwkJCQkLDgwMDAwMDhEMDAwMDAwRDAwM DAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAEEBgYMCAwWDAwWFA4ODhQUDg4ODhQR DAwMDAwREQwMDAwMDBEMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwM/8AAEQgG ewgAAwERAAIRAQMRAf/dAAQBAP/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAH CAkKCwEAAgIDAQEBAQEAAAAAAAAAAQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIG AnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPBUtHhMxZi8CRygvElQzRTkqKy Y3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE1OT0ZXWFlaW1 xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEF URNhIgZxgZEyobHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJ ChgZJjZFGidkdFU38qOzwygp0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG 1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+DlJWWl5iZmpucnZ6fkqOkpaanqK mqq6ytrq+v/aAAwDAQACEQMRAD8A+f8AirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVf/9D5/wCKuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//0fn/AIq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//S+f8AirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9P5/wCKuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//1Pn/ AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F X//V+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVf/9b5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV//1/n/AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FX//Q+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVf/9H5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//0vn/AIq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//T+f8AirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/9T5/wCKuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kt9sVaxV2KuxVs7dDirsVaxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV//9X5 /wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2K uxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2 KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kt4q1ireKtYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FX/1vn/AIq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX 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 irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVf/S+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVbGxrirWKuxV1MVdirdKdcVdirq4q7FXD wxVsE9sVdv1xVuu2KXMzP13xQqIXGwJAwJXVFKnrXbFVSOMEgnocCUTAErSu36sV VvSDj4a0GBKM9OIryFFoAKDuR1OKUxWNfQLL3U9q1OBkhzaOIw0ihRUfTiimrqwa 9bkoAKqASBSoG1fn44rSSz2cidiMkxQQjp1woUpeVd8LFZTFWsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVf//T+f8AirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir 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 irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir//W+f8AirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVXAACp+jFWia7nFWsVdirs VdirsVbpXpirth7nFXAV2xV3XFW1WoqemKtuvCgPXwxVeD6g+M/ZFAO2KqQ8cVXk qRXv2GKqyqqU4nlIRU+C4Eqh5wt6qGlajlTxGKqMaqxoSadvniqY28ADFiwqOoGx P34EukaKtJKlsVWpCs44x1DffXFLUlg1rIFmNGHVR1GKoh3aUcYlIQfecCqYs5WT nxIWtKnx8MUtxWxUUOw8AMbVFRRPCfUh5I4B+7AlVWIOQ4XfuO30YpRETBEYcfjH QAgCvia/wxVMkLoyIUNWHI0Yjau7bUyLJO5HkhtW4iru/AcjU0b9r3p1wM0wFrLb kMr8tgKlT4UpQdMDKk4EDS8WcUIHQfjgZ0jobaUrSbcdtv14rS+G0aYHrz2G/wCA wKrG1CEkLQ1pt2pt0xVqSzT1JFXkVBpyPWn9MVQT+XFumZZgrIVJNTxoP8k+PgP2 sbYkMI8w+Vvq9JIEMisxAZQKUrxo6Do1fvywFolFgusaBLZ2qX6GtuztEa/aV16q 69Vr1jr9pQ38rZaGlIia7nChbirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd 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 sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdir/AP/U+f8AirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVb6Yq1iq8Nx6Yq2AXBJIAHbFVvKgoO+KtYq754qr+uTH6S Dip606n54EuijV9i1PAAVOKplcfUbeFI4Hb1WBMtR0NdlH8f7MCUuaTl8MYIB+kn CqvZ8raVZti61opFe1N8CokxzPBwU8LZT8Q6cm/icUqAjVjRSRH1p1xVHQzxQ/ZU JQUrSrf7eBKogjkLfCxpuSf1Yqpu7S/sUUbbYpVRpt6qJcmJkhIJV3FFIB7e2KuW 5pJuwAO5+Ef0xVkFr5iuYTzjKqvSgjQj8RgZJzY+bbqynRuYmiG5idAYySNxxFP+ FociyCa3NxZ3o+s2duYDT4oyxZSw6sD9ofI1/wBbAzROmlpFEsgUutdvbAyXetLM x5UB/Z3/AIYGVI2ECnKQcjSn+3gTSfWl3Fbh1kQMGWm34Ed6DAhdPfCOJogKcuni KduWKUqe5muEoxPIVG3U9D/tYpW2ltGG9QbEbkEHf5YEpkYo7gFT1YjkDtucKoNL aAFkIIcHbfAqPfTaspj2dl3A6VpgSqQqF/dvWgG3jXvTFKMs1QNufskYqj7aEXMh DIOKk7n8MFsmQ2enmKMSulEG24rU0/4XrimkOY0qUUGlKe9DgVF2ul3axtPLIihR URk/Ew6fD/q9SOvhiyR6QkqqlORI4hq1p3+7FUH+gZIhJJCKNXbfp49RihoSXFpH yKGNy1AWGzDatD/MP44oTOa0hFuQWdVrsq/stXv4eP8AnssULJaszpWQsAR6b+4F eLeK8sU0knmryyNfsGhfisjdKdOQYAoGSvMbg75MFplG3yp5u8q3el3TrKtHA5L/ AJS+x7lfvzJiXCkGHZNrdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVf/V+f8AirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirdT0xVrFXYq7FWwCTQdcVXmiCg+1 irjSgVBv3OBLuNAGZuv0nCrlXntWnhXAqqqSH4eg9sUuEar1wJpFQNDEecgNR0A7 /T2GKUXdz2zKpoUqAeFB18fZfAYFQhlAQiRWqaFOwp32wqtTlM1K8QOgHQYEpzZe WL26tWuUIJGyqu7NuB9nrQVwJVbKFLTklzE8km4KsxUA+4FD9GK0rfVneT+7VD1A A2/jjaaV4/0rHFMYJpI4XXhJRiFZRvxbfiRtsuNrSSGKMbyVr4e/vihkX1eOO0jF vdJMpHJo6OpQ1+y3JQP+BZsDIIzTbaaImblEEG1TR/8Ahd8BZhNYIagM0nJDWoXY +3XIs000+KMKzLUlzsK7jtv7YEo5oWr8Q+EU6b/P6cWTScIpiQaKO/8An3wJTu3t WdVIPxCtfl44FTa6tIUs+SH1HK1oB037k0/DFUpaECAlBV+uw3oPbAroYmZSRVWr TifDxH/NOKVOR3LlI9lFB7VHh74pRPoCcLIxHJdjXx7dMCU1tI55hxjALAUNDuPv xVSu9Oncfuy9d6EYFdp1nLax/v25mtOJ8e1cUpzah4pFCjiCeJoaivhX5YEsv0+y a14pMjr6nEh6VND0I8QcCUeY0uecYUn0yxX4ab9Ptdvk2NpXx262MHNgX2AZjvw3 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 tryxkMdshjNTyZ6ihCgKtT8Lo9W5r/NT7IywFxpxfIuv6Bc6DcGKdWCGvEsKHbqr Dsy9x9PTMkG3DIpKckhrFXYq7FW6kYq7FWsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVf//S+f8AirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdireKupirYqu/fFKrH1IPfAkK0YdWEi9j1wJTO MLCQ7AkN9GBKj6AmkdoVJABNBvQYqljvwPwmh3ByTFaK7e+KVeJz1ORZBPYZzHF6 dFKdalRX7+uBkqW7MrcWGwNSCMCUSsxKgN03r8sUq7R+nxAoedCPHFKnCPVorgMA akdDQ++BVZLMSKzAUBO3+3ilFRW3Bwh8fmMiyZVEzTpQdgK7eG2LNE20ZWQcmNG6 ntT5ddsCpjYWMfNhXkoJ79vHfwwMk4gt+JjmXdztutfwxQgNWWWArFK9V3+DqB16 UwJU/qct7GsMC7otQTt0FT12xVBQrcyRu5JVaVJHWoO1MVW8XURGtQxJBQ1NO/04 pTiO3SIcmYSJUIQNn3APXAqrDpEl/NEsSGg6UNdtzRh2+WKpnMJeLP8ACImJBWMf CDTYcfenXtikIjTLS212a2tHISZyAUJHwk9DUkKK+JpgZMm1qO00lIba0UM7BjIh NVDVoBtUBtq/a6YqFDR7dLlllkPGUEEBFJNACKVA6no22LJFpbTiYwxx/uyOS8iC wbwanv2wFLI7fTG9NJi1TJVAgPSRev8AntvgW1TUPqU84+sI5MEYjljAHz+0vXfb +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 oQV/mpTrVfoOKEbZ30k8TRXUZd0IYONqDqeWNsSK5JfJp0q3C3YIMQUrJxYcl3qj Eb9cDO+iW3wMkbxsvDkPhao+L+dfb4fi8MUJJe2cUQMj82SUJyLLvzHXiR/N9+KC +af+cgvIsR0+XWNNhlMMXAytVWADbRuCDyNWDK+3w1jXrTLIuPIPk07HMlxWsVbx VrFXYq7FXYq7FW8VaxV2KuxV2KuxVvFWsVdirsVdirsVdirsVdirsVbxVrFXYq7F XYq7FXYq7FW8VaxVvFWsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVf/Q+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVbxVrFXYq7FW8VaxV2Kt4q1ireK uxV2Ktg1OBKqQoHvgZIq1mKKVWtD1+WBIRcnGSjM/wC8O/SmBKwKTGASAy1/rilG rNLPFHHsQjFum+9O+BknukRxSgerSnbxwJV7h2kuDFXildid6D3OBkymOzSG0CTh wZKKzAcuAr9rjtXbp8WBKV3draaZckOS9P7srsW9260+WFUpnsrqKNZmQoknxK29 GFabHvuKYqiVtUhWJiSrOhatPhPXbbAlEQRIiczuiCo3qAcWSd6NcSWylweQkIqa bAdt/CuQLMPRPLl9LZyowKmYKfi5H7P/ABrT2yLJm0Vv6y/WQXjs2Tk6h6luA36U 28T/ALWFDGPMgWKWS0WFXjnjThvyZORr8B2pyAH+xwqwWw/0m4jslPx1+Aca0NaU Pv4eORZPT7bTJ4baCzAjjtZY5fVm/aHL4RyLfY+wxWg50wraH0Ly5ca1qMEIZIon 4M1FatDX4nA+Lcp1/wArFiSiNA8tSPfy2Y+O8KepayNShUgsGatd2T4U8GpvXGkE q15qvlrQrAzG4WV7leDigaSORDyDBQOPpuAqE1r8VcaXdBa9+ZFpeyyXWl2kaQfC kYVaFRt6hI3HxMPhavIdO+JKQF0v5j6zqK2zcIo7aDZIooyo33Zq17/tb7+GDiSI qXmM3mr2sQuJJpIA3KJAWoB3KruBxX/hcBKaSaLyzAJzc2KevzjYxV3bmv2g32eg PT8cVULCIWhjuooyJJAweJTXZvhHxU+EtvgSzDT7e+RBb2EZSKeT4w/xsxUcSF6r 8Ck1NMUsjgs01DVJBZIQCyKXdqqkSjfl4sFHZhx6YUckVHqGnCyup7IPK0iyKsbJ VliBABarfBuq06han4cK0gtAs7u/FjdP60MMXwykA8D6ZozMelT+03T78jTNlC33 6YcpOp9KORaycqsVk3EdPi5EnkRRclzRVI3XNHsb0PcxWywrAgUzTAq6qv22ZQR6 gX4eAZuWEhgDTFtKsjZywC+n9CFhExChghUAmrKBV2Un4t6pyyNM2a26Lqc8E0QE MLKsb8QQCXZgzfs8hsdj8O+FjyZJbQ2+lxzTRQuv7xaOqELxfduJJ7AU6fDh5MOa Ovo7a5spTZuPQQAVCVbmG5Fq9SBt86ZIoHPdDXmnWNqYYORDneoHEVVNmO1eZ2+z /HInZkCSnEDLapA80LAhXjd3UknoQSKckX7/AGyTGrRMMfMELAGjkPEMRTceLeHh 8O2KEaglkX05E4OBQkgfDT9nfrTqpwoVvqd3yKmVWtZaKQtKADuKdd8d0WFO5E0B WCVfUUj01PIdR8J3+0MSoQjaayuIztbFlYdCAelO23jkaZcSgA0DsisqkSkmu/Hr 0I7f5J/ysVQSSyW1zK3Hgy1BpUo1BuPx+7BbKtkztrCChlICTrQA0qKH7Kn/ACfw wgMCUsmiSST035Mx+F1JrXiKCnf4duPUj3xSxPWLScypbn0xCyqwI2PxH4gRUsGV 9+nyyBZMW86aBFr2k3GmlSriIqUQikgIpxVtuQL8ZP2viRRT4ckC1yD89/Oeg3Xl 7VZLW6ryqaHxoafhmTE24chTHsmwdirsVdirsVdirsVdirsVdirsVdireKtYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX//0fn/AIq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq 7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FW8VaxV2 Kt4q7FXYq7FXYq7FWsVbxVrFW8VdirsVdirsUrsCqyOVIA6dxgZpg0wlfmaBRSnt TtkWSIDo7FFoWJrXFKNhhkoUeiKKfTXAlOorUrGBF8C1rTsKD7xkWS/Ti0M5llA9 IHYHete+BkGRQ3JmflErCL7K1bc/2YEtalp4JjZGDl+QYdSB1+7wOFVJpI4ZIYWT kkTV4GvxEmvTanh+OKqbCeZ0hljBRarWp2qSfuBOBKstoQxKVEasFZl7kYEptdJw cQ28Zjrswr1FarVf2T9OAswnfl6ZVSRJIyt07cPi/lrsQafOu+RZPRNFureLUF2j KUKssvxLxUD4l/mZt/gGFUP9Qu54fTaFpZJHoGkqnH4fgVTXfYg0xQk7aQ+jRWl1 b0WWSZlZw1WBHxdCO3iNsVtPbvX9AttHktru/D6oLhf3iHdkNfU2oSzD9mvH265J CS6p+asaO0eh2xRVdYo5ZyQ/pR047KQVYtyZ+2/w4EUxS1lvbq3nuLmcl5TQKtSx Fa8Qf2VB6b5BmyCDy5DaSJa8iTxjNWFSeQqaD9kitOJ64FRE9vZW7T20Ct6bKGBX 4Rs37XfoK7fThSh7RYlv3gAfgV+E08RVaV/z+jAyeteVdOuFtohDbrLJwmKlmHAB 04/GlGp+13/l6DJhhJi8GmA6Q0t8QbgOTbKXCJGzCsrenTdnjVQv7I+7IhJRB0iw kEzh2Eaw+sgNd2Y8X+JfsqjEsP8AiONJZYdVsbO5EWkcrh3VQszcxJ8CAMydAhbf /YquS5Ma71DSLZLUl0VrxWjEZCvuvJwC1d6Urw+zuflgCSx19du7+aazZYoZWkSN 7dQytIS3OOpWtWX4hvx64GYDIYdOe1u2N/I13MzXCtFGWUB0IJaQ0oyBuv8AscKL 7k7k1AR3dtBbyqZIY4hC8pDsqBisnwpRQ0Y5da1SjYrTteuLjzhEzG4lBhDIQRSE yjalVr/eLSgPiuEm1A4UBFZaDp8E8VxLLIWKRxkuSyqVq7ivXlIvGh+HBSd2YaNJ HewSOYPUaEu6EOWJjNCtTTivpg0+Hl8QNcLA7MwE07XCkLGLVh6xVaF2LLVaKdgf tGo+7JtaJjS3mhhaykaFWFeSk1AIoRX2PWvjTH3I96EGgSaRI8ENy0nJg3Qk8QgV jvyAJNOtPh47ZGqZ8VsgNlfX8UUczcoiQX5AHkRQdupB6rk+bXYDUGhW2nycYpHU hyVhPKhHv8v5sFUkytWYjUGaKGMoAaMaF6FRUE99/ljzRybsLcSxyQCMxqKsaV8R 9PXEKT1VbBoqSq0ZB5VZ2G7VFD9OIYyXXMxVPSBEi8ee43p0I2xKhBXEHpVRhsyV 61pvQN/wXXAm0HdwJblZFG4O4BqG8RX+Yfsr4YGQKks7GOORSGJqEcGodD416MvX xxTTr+H1uFxJRiwABXYqeqkfP/m3EoDHtViF3IUCCOaNQ6k9GIHU07+2AsgkkUK3 NqT8XqglgWG/LqSKDbk3w/RgS+UP+cnfJsojTXEjEaGhdQB9obE1/a5LuT/MMtgd 3FyRfL5FBTvmQ4y3FXYq7FXYq3irWKt4q1ireKtYq3irWKt4q1ireKtYq7FXYq7F XYq3irWKuxV2Kt4q1ireKtYq3irWKuxV2KuxV2KuxV2Kt4q1irsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVd irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdir/9L5/wCKuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Kux V2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2Ku xV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxV2KuxVvFWsVdireKux V2KuxV2KuxV2KuxV2KuxS7FXDbFV1fDArdD1HXFKJidQlG3rkWYRFoZC/IA8R1I7 DAyDIbdwGURgekxBJbqT7eGRLMMuMKXVDFxBIoVHSg74GSGjt4rdWQEO3UxMDUfq wKjUgW4m4QI0EC8eKsSx5U/Z2H2m+z+PjgSiYraKK69MM/qLUEOArKQd+ld/btil OdP0+WUyX8oLGJOZAABVRty323JwKgr23a/kEcbA8BSvSte9cWSKl0+bSlaxuIzH KRG/FhSoI5Bj7b4FTY6QtrIhuHcJLwR6dK7b8uhHH4hiqKkmt/L94JC6mNmdUNak qpoGO/h9rGmS0+cbSG19IuGZZiFcAEAU2ZT9pq718Nv5sCo/W/zOuL/S4bMwBWiY yeuBx5Ain2Bt0PXChikWseYNYaBllZFjr6BU041PKvzr3xSEt0/TI47tJ7lQY6nm WPRh4f074pTJbOFkdparId0AFa0O/LwwJZ3oNtFeQwxem31lZaKgpw4nbdSB8RPe tOOBKbwXb206yJGkn1hnRTIQStPhqKV/Zav0fDgVIr2zudKjI4/uCW5lRU/AwFWB 3H2u2LIJ7o9lcXtmt+I3RbdgOLELVq1py6mnLbl+ycUs50DTry/jjS5uDaxuJkkK gDgi/FxoOoJwjdgUf5W0y3lieW9j4vE5DSsnNl33pH/OduP44Qgpfpenrc3MEVtb n6ukzgQzfCZEm+DkX+IhPg5f5PP4cASVby3oq3Fq13IjMsc7qkQb01BaKsJZq13B 4++2ICyKSR6w8mstYKhttOuRGHYEgoyf3ktRxX+8Xkw3GNppV8x/6G2oQ2lrGeKw ICKliCSyz8uiO+3Lv2XEpjupWMOo3c4tIkaW4P7x4YQBSGSIFx6n+UnGvvXIsiQy UXOm6japdxiOMmKIJGhICEmiPM/hw+E/ZrkkbhE+XdNuLm7o/FLb1omcR0p6vEiM 77Ucr8YUHp1xCyKY63DbSyHVIYwiyy0WCMChcrvyNeW68uVPh5YSxBrZkGjGGx+s WE6xmK1hiYEGgfgTVFeu/X4sIYHfdltosn1ua7nSOG3WJdpDsOKcRxp0JU1yQazy pAn6uohsqqI/RMqmHeoJ2BdvtcutB0yDPzVLEa5cxCSxlLEHi6SDYBBydDUVLHbf liL6KaHNS0258y6pc+lKogBkI+J6cTxqKBSaff4YgksiIgJnbeYNXslkknhM07Jw IYgMd+oH+r1w8RYmIKtD5jnkqFtJFcRhuVT8QFQeQG+x/Vh4kcHmiLrzRKkfKKHZ gA0p33P7S8QQd/hxMkCCMTXraYOsMiq3IEchuQKeOwrh4mPAutbu2mmMrhSkh2p0 ovUE9Kt1piCxIKmdU0zk4/aQlQi1qADX5f2Y2E0UMJNPvpCI3URyEseQFag7D/Px wbJ3DQ0iJY5ESnEfEBXeoPenenEbY0niaJKQMkiniAagdu/QffihL761j1GOnF/V RjJG6gjbwNO2230rjzSDTD5T6M63ENIvU+GVR8QJ7t7f6uVtjF/zA8pxeZ9IfT5l 9WG4iKqKAULEjkR/Mrdae3LCGMhb84fMGiXXl7UZtOvFKyxMRU/tDs30jMsG3AIp KskxdirsVdirsVdirsVdireKtYq7FXYq7FXYq3irWKuxV2KuxV2KuxV2Kt4q1ire KtYq7FXYq7FW8VaxV2KuxV2Kt4q1irsVdirsVdireKtYq7FXYq7FXYq7FXYq7FXY q7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FX Yq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7F XYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7FXYq7 FXYq7FXYq//T+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdireKtYq3irWKt4q7FXYq7FXYq7FXYq7FXYq7 FXYpdirsVdiq9CVPhTAriwrXrilfWgouwpgZI+FjboDGT8Yo61I298i2BPdNtw6x ySNRa0ANT75EsgzVbb02juEZaMCSF249OuBkg6xvc0lpIzn4CPGvfAUslaGeRfqi 0WRWEnLfkDvsO1O527YEpp5L8tnV74JcK31iRuKD4RyPXq5Xckd8ikp49n6sztG7 ANIHUqvxf5K7fCvw/wDDYqjNZtbXTpvV9JEV44mozBmXmgbkWU0qzVoOy/DjSgse 17zJbzxTxx85rgJEquacQqjpU/FtQKtP2cKGIDUtR1SH45TRdwnvsNqe34YCyROv ul7BByLMeNF5NyoK12/2Va4qhNOt4XDRTCsqsKADqpr9HhilNnlt47SKMni1SAe9 SRQU8B/NgSibW5S0jnil+zGHqR8QP8tOtKnvhShLR59QRBwPIFuFRtsNlJHU7Yqs sbsC8SLUWY25FCUpUA/Pb7WBkHoWi6mrTAiUyNMCzqwFNl6cutdqdsCU40YT6nEq wNG5NCo5BCC5K8Qx7hiu38MVT3W/LiWV9MXb15rZCk3A1+PZnBU7lVBpy/mXbEhQ bTLypp866h9bnhMltGgkVJN6tUUelOLdvgwBMk61CzezuJTtIJf3qKpHwgqeMfTq zcuVev2cLEK6fWpk+rxI/wBUlkkViXb1HY0KfCSqgqVVuNPs+1MKU6sZr+LSNSkD +neXCIiSkfGJDT91/Knw/Hx+0MILWRux+bShpjXKPLK8MgW4RevIIp+IqPhBWT4F /lX7WBnatJaXlz5tt7dKXE7R+vIzqeMMz/HKjbGq7fyrj1Yg7JSNOv8AWNZuLO0W ONbiX1nL1IAVzVSrfaUbpQeGDm2XQQPlPU7qFrvRxOsYtAFRwAPURpPjq2x9NRxr 9plTpgBZEJ9cR2y8tFsTGVkaOUBQQJQmwUMwFVarbdPuxR5lki6hcXl0llbxM0rW 7mJ1YoCSxr6W1HaP7Kk7PyyVsUfpvlCVk+uTyIXEZE7OxJRA3FWA25S+mf3vID/J xEWBmyG3EUYhuLRRKXEcgKoKyKSWqv2h8KinHJMGQW0draRyTX1062DIpdXFCsrs zbj+VlcUPTbJMN+nNLNLPlyyZ2unEn1QLSJVb94RurxhftD9nb4TTIABtPEeXVZ/ jLQdZuJYo0mimRWjdVYrUhqK3gte37R6HEyCfDIT7y/rVlNbm0exkjmjB5DkKs/8 y+JP+fTJRIa5RPO1llMEvJPSikaB3HKpqA467b8dtvh8MQkjZNIbmS2ug1wqR8kJ pTlWh2Wu29MNsKsNSWPNSyp8EhoEJ6DuSPD2/ZwUtpXLpjxyH6wI2JrxpuWVR0+Y wUz4u5amiiOBYUPJ3BIKGvTf238K4OFeJVnEFn/pcXxOoAlSm4B78iDXxGHkjnsr iyt7oj1KLVA0dBQ08PAsMatjdNSRTCIGBnVONOS0J28R0K/59cKgtQ6gqSKl2Age PaQbCo/m8DXbBaa7kNeqkNtysnJdjt3U7k/T/XFfexZbCS7kVyRIkxLKKUYk7nof 5v7ci2WpW5S7jeCMclJ2B3I7HkATXv8AfgCl8df85Wfl+NDul1BY+QYluYI2BO4p 7f59Muid3GmHy8y06dMvcdb0xQ1irsVdirsVdirsVdireKtYq3irWKt4q1irsVdi rsVdirsVdirsVdirsVdirsVdireKtYq3irWKuxV2KuxV2KuxV2KuxV2KuxV2KuxV 2Kt4q1irsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVdirsVdirsVdirsVdirsVf//U+f8AirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdireKuxVrFW8 VdirsVdirsVdirsVdil2KHYpdih2KXYquAqaHArdAGp1xSiJI+YDV38MizpFWNvL cyAJXp+GRLIMvs7eNZIYOJBPQg775Eswy1BEkfomhCDkV7n+wYpSy3NqnJrgilKp tsCciyTmz1eMSySQgtGyUUHahA2r40O+BKP0bVblZE9aOrcvhr4E96YGTJfNmsXV 5Ot1biO3RI44eEYPE8U4Ft9+bfaP34SxASC7s4DGUt5DJK3BjICx40FSu9N177fL AlJrqIs4tY1bcV5A7nbpv2xVN9I0+O0hMuohvReNjGa0NRsvvSu1cKULDpltJBJd PIVgU8dlqA2/Hr40yKVG+ttQ1OOG8LRCSZGFAQhVYujPWi79F/1ckqF0xGu7coUD uVZ2JO6ACvj/ALLFKM0yOTVXjWcrHbcOLEDfig+37t4+OBKc6ZZtcLbojxxo9VDz MEUMKk15f5IHxe+KUJq8dvqkjzWyiCEIOm4ov8vckndv5e/TFKefl7qcei2txqKr zu0VxQkgV24Mviwb6Ps9cCph5Uu104F7kBYz8Cq1KiTY7jqPnkWT3OLTRIPVIkd9 TPJYiPiao2Y8dgOXGlPHrkmCU2ks0FgZLxKSxymFELMVNdue/wAIG/H/AGORbKTi ARwrJPZLzuOCyEyig4yAhY/i2qqn1Eb3GFipxJNKYri5ukjkMvL4m5Mp4Baqsey1 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 5liDFwSWjdSakc+PTlUbYOTKrZbY2SaSsWqX4mlZpzNJxUMzykjh8JHTj8XE7jJc mBN7BD+YNYsktUutP9JLxeJYSoORQ/Dyp3477jt8NO2AlMQeqt5av72SygbV5vrA iLNa9nl4lRRVbfiTty4j4DviPNZDuVfLvlweYri5EEQtVmfjKjsWPClF4t+0erHo p+HqFxiLRKXCrah5kks71tP0q0t3niYIZySqKq9KkkLU0+19quEnuURsWUXFHqd4 WkgvAWWRjLxAKx8ifhNS3I1HTHdTQVoY5H05ru51GVLChQtyZaMOnFTRa+A/mx6I PPlu15TsrnUbL1gbmYBvgHQlSaJzqev7SHpgG6ZkBk8b3lqv1cWsf1Qyc2PEAliK MJBQ123+H55Jhseq+1jl9SscfoLGSw6gstOhPf8A2XTEIKPdYViCI/pByOSS1Gx3 FGFckwV4ZY+QEvEugFJABQj/ACmXv4E98VTRfSRQpB9QChZdm36Nt9rJMEOZWBLu UeUH4hTizKBt9IPfAlr6lFKpeB+cXIEITQoSKb+FOnyxpFuefiea/DT4STQmg/z/ AI4GVK8HqShZqgo1SK9On4q34YWBQUMUiXDMq7zABlO3b4TXpgZWg7ik1rwILJU1 DCnEjt8v4YGQ5vm//nJ/yU+v+UWltlVrm0csAdxxI+IdOzbjIg0UzHEH59zQmByh INO4O2Zbr1PChrFXYq3irWKuxV2KuxV2KuxVvFWsVbxVrFXYq7FXYq3irWKuxV2K t4q1ireKtYq7FXYq7FW8VaxV2KuxV2KuxV2Kt4q1irsVdirsVdirsVdirsVdirsV dirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdi rsVdirsVf//V+f8AirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirs VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdirsVdir sVbxV2KuxVrFW8VdirsVdirsVdirsVdirsVdirsVdirsVdirsVdil2KHYpdirsVd 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 w2LpsBruIwow6bIaokuvxnIMSUsvtIBqIV4OWw==pgp-0.15.0/tests/unit-tests/padding/alice.key000064400000000000000000000013031046102023000171500ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- xVgEZdN4DxYJKwYBBAHaRw8BAQdApxytqlcnL0/3rtWZap3iSOFG2dSx9AI/D5o5 zy6mVb0AAP9sFhaYqJjML/bq5Ci1bdHKHVoZDC2r4tXmtfblWUXpohLdzRFhbGlj ZUBleGFtcGxlLm9yZ8KGBBAWCAAuAhkBBQJl03gPAhsDAQsFFQoJCAsCFgIWIQRe 8mnlk1K6ANFfrX/1wGnp37GcNwAKCRD1wGnp37GcN1IoAPsEEqnAPkJ3LOP6Sb/g Fz1d5HkU/8JqZOUDN/oDgAm2AwD/VsD77Qbh5GMc1UyFOuMgQQwnI1gABKDuqDMv DOY72gLHXQRl03gPEgorBgEEAZdVAQUBAQdAj3WQTzt6QWvD5I/YUwibBBEMjkkE AV8YgumCix2Lgk0DAQgHAAD/WteJICkesMFLj3m5KmWloLy976/bDCjI9B11oDGw gkARKMJ4BBgWCAAgBQJl03gPAhsMFiEEXvJp5ZNSugDRX61/9cBp6d+xnDcACgkQ 9cBp6d+xnDelQQD8CWlTwl+jvPOgab+HHgd1KWmAeIlEGAfsA0cWWw4XRSMA/3IY Gw3w1/MlB88Yejltc7TcNTLd4oJxyRTwICaeyQII =ylXe -----END PGP PRIVATE KEY BLOCK----- pgp-0.15.0/tests/unit-tests/padding/msg-long-padding.pgp000064400000000000000000000004071046102023000212240ustar 00000000000000-----BEGIN PGP MESSAGE----- wV4D4uDroNMMT4QSAQdAmSe4f8D9XjcTmDaOWCxLcMwLwP7V731g5C/1HvDd0Dcw /GFmwNotDTEG3W3H0kiywvW3tBlm+lrUeKirEVshTbwL2ELBnmfNmPOybeAzKyhD 0jcBHp/B2DLt5MArrLJiO7uCgirW6rgL3bH+s16cMq1kO9F/25zUUgvTch57gnUE sOU+/wI0cacy -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/padding/msg-short-padding.pgp000064400000000000000000000004151046102023000214230ustar 00000000000000-----BEGIN PGP MESSAGE----- wV4D4uDroNMMT4QSAQdAxYnDMbJRKbO9/XbXVr7hxq1TbIZjkMD4no/tF/uLJEsw /7/4n/oGWofvF7YbqEc7fwIdAt5KY7GRWTLvT4/KOt9280OjITmDvLm4lxsiPj7e 0jcBBFNzsp79iSX+rmLS4sT/Fd1JOPnqBY5FhxPfcZy/xFNuDC7LMYTZVQJRbkCn UheUc5ALR3Fw =9v3V -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/partial-body-length/literal.packet-partial.256.asc000064400000000000000000000024221046102023000251630ustar 00000000000000-----BEGIN PGP ARMORED FILE----- y+hiAGXUsyJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIg YWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVu dCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBt aW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBs YWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4g RHVpcyBhdXRlIGlydXJlIGRv/wAAAoJsb3IgaW4gcmVwcmVoZW5kZXJpdCBpbiB2 b2x1cHRhdGUgdmVsaXQgZXNzZSBjaWxsdW0gZG9sb3JlIGV1IGZ1Z2lhdCBudWxs YSBwYXJpYXR1ci4gRXhjZXB0ZXVyIHNpbnQgb2NjYWVjYXQgY3VwaWRhdGF0IG5v biBwcm9pZGVudCwgc3VudCBpbiBjdWxwYSBxdWkgb2ZmaWNpYSBkZXNlcnVudCBt b2xsaXQgYW5pbSBpZCBlc3QgbGFib3J1bS4gTG9yZW0gaXBzdW0gZG9sb3Igc2l0 IGFtZXQsIGNvbnNlY3RldHVyIGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNt b2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBh bGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhl cmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEg Y29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXBy ZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUg ZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZp Y2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLgo= =PvJu -----END PGP ARMORED FILE----- pgp-0.15.0/tests/unit-tests/partial-body-length/literal.packet-partial.512.asc000064400000000000000000000024221046102023000251560ustar 00000000000000-----BEGIN PGP ARMORED FILE----- y+liAGXUsyJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCwgY29uc2VjdGV0dXIg YWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0ZW1wb3IgaW5jaWRpZHVu dCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1YS4gVXQgZW5pbSBhZCBt aW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0YXRpb24gdWxsYW1jbyBs YWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21tb2RvIGNvbnNlcXVhdC4g RHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVuZGVyaXQgaW4gdm9sdXB0 YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBmdWdpYXQgbnVsbGEgcGFy aWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1cGlkYXRhdCBub24gcHJv aWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEgZGVzZXJ1bnQgbW9sbGl0 IGFuaW0gaWQgZXN0IGxhYm9ydW0uIExvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0 LCBjb25zZWN0ZXR1ciBhZGlwaXNjaW5nIGVsaXQsIHNlZP8AAAGCIGRvIGVpdXNt b2QgdGVtcG9yIGluY2lkaWR1bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBh bGlxdWEuIFV0IGVuaW0gYWQgbWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhl cmNpdGF0aW9uIHVsbGFtY28gbGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEg Y29tbW9kbyBjb25zZXF1YXQuIER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXBy ZWhlbmRlcml0IGluIHZvbHVwdGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUg ZXUgZnVnaWF0IG51bGxhIHBhcmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNh dCBjdXBpZGF0YXQgbm9uIHByb2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZp Y2lhIGRlc2VydW50IG1vbGxpdCBhbmltIGlkIGVzdCBsYWJvcnVtLgo= =piDy -----END PGP ARMORED FILE----- pgp-0.15.0/tests/unit-tests/partial-body-length/literal.packet-two-octet-length.asc000064400000000000000000000024161046102023000264230ustar 00000000000000-----BEGIN PGP ARMORED FILE----- y8LCYgBl1LMiTG9yZW0gaXBzdW0gZG9sb3Igc2l0IGFtZXQsIGNvbnNlY3RldHVy IGFkaXBpc2NpbmcgZWxpdCwgc2VkIGRvIGVpdXNtb2QgdGVtcG9yIGluY2lkaWR1 bnQgdXQgbGFib3JlIGV0IGRvbG9yZSBtYWduYSBhbGlxdWEuIFV0IGVuaW0gYWQg bWluaW0gdmVuaWFtLCBxdWlzIG5vc3RydWQgZXhlcmNpdGF0aW9uIHVsbGFtY28g bGFib3JpcyBuaXNpIHV0IGFsaXF1aXAgZXggZWEgY29tbW9kbyBjb25zZXF1YXQu IER1aXMgYXV0ZSBpcnVyZSBkb2xvciBpbiByZXByZWhlbmRlcml0IGluIHZvbHVw dGF0ZSB2ZWxpdCBlc3NlIGNpbGx1bSBkb2xvcmUgZXUgZnVnaWF0IG51bGxhIHBh cmlhdHVyLiBFeGNlcHRldXIgc2ludCBvY2NhZWNhdCBjdXBpZGF0YXQgbm9uIHBy b2lkZW50LCBzdW50IGluIGN1bHBhIHF1aSBvZmZpY2lhIGRlc2VydW50IG1vbGxp dCBhbmltIGlkIGVzdCBsYWJvcnVtLiBMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1l dCwgY29uc2VjdGV0dXIgYWRpcGlzY2luZyBlbGl0LCBzZWQgZG8gZWl1c21vZCB0 ZW1wb3IgaW5jaWRpZHVudCB1dCBsYWJvcmUgZXQgZG9sb3JlIG1hZ25hIGFsaXF1 YS4gVXQgZW5pbSBhZCBtaW5pbSB2ZW5pYW0sIHF1aXMgbm9zdHJ1ZCBleGVyY2l0 YXRpb24gdWxsYW1jbyBsYWJvcmlzIG5pc2kgdXQgYWxpcXVpcCBleCBlYSBjb21t b2RvIGNvbnNlcXVhdC4gRHVpcyBhdXRlIGlydXJlIGRvbG9yIGluIHJlcHJlaGVu ZGVyaXQgaW4gdm9sdXB0YXRlIHZlbGl0IGVzc2UgY2lsbHVtIGRvbG9yZSBldSBm dWdpYXQgbnVsbGEgcGFyaWF0dXIuIEV4Y2VwdGV1ciBzaW50IG9jY2FlY2F0IGN1 cGlkYXRhdCBub24gcHJvaWRlbnQsIHN1bnQgaW4gY3VscGEgcXVpIG9mZmljaWEg ZGVzZXJ1bnQgbW9sbGl0IGFuaW0gaWQgZXN0IGxhYm9ydW0uCg== =b3Vn -----END PGP ARMORED FILE----- pgp-0.15.0/tests/unit-tests/text_signature_normalization.msg000064400000000000000000000005621046102023000225040ustar 00000000000000-----BEGIN PGP MESSAGE----- xA0DAQoWZDV+trtV3hIByxJiAAAAAABmb28KYmFyDQpiYXrCvQQBFgoAbwWCZbAa kAkQZDV+trtV3hJHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2VxdW9pYS1wZ3Au b3JnkqQJ/B+pAjaQbrLl9TZoAaS9VzbmZwtyMrEjzju5lFEWIQSX3BWbcSRhIfIg fiJkNX62u1XeEgAAH2oA/1MaBJ/6xjZhJnCCMyrJeUITug7hKvkCRXXGsXcOqdHi AP4gZkk6zrgXlrJPdMfR6GoYGAU9HRAPSup+8HSkrb+dDA== =TGcS -----END PGP MESSAGE----- pgp-0.15.0/tests/unit-tests/text_signature_normalization_alice.key000064400000000000000000000036011046102023000236400ustar 00000000000000-----BEGIN PGP PRIVATE KEY BLOCK----- Comment: EA98 F4AC 913E DCCB 25FC A6A5 F1AC 9B15 FAFB 5860 Comment: xVgEZbAWRxYJKwYBBAHaRw8BAQdAPsgZS76rXexdprvANez2RHP7HAjwefzz1hMX X3jYpgQAAQDTeEHAKO968pxn5XCe+j9ivP3OFNkJhgvR+P70ShevWRKTwsALBB8W CgB9BYJlsBZHAwsJBwkQ8aybFfr7WGBHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMu c2VxdW9pYS1wZ3Aub3Jnv9wFb8w1+n3wHzBJvvq8tm3xRKPWrXqc6bCXJ/JLm9sD FQoIApsBAh4BFiEE6pj0rJE+3Msl/Kal8aybFfr7WGAAACncAQDWWoQbnkHdIOg8 1j169+2N9Aj33WmOKx8gBUER2csbZwEA0wFFzmsa4v/Blj7Zpok2dYxEhqKtOQQA 6j4VMK7VDAHNEzxhbGljZUBleGFtcGxlLm9yZz7CwA4EExYKAIAFgmWwFkcDCwkH CRDxrJsV+vtYYEcUAAAAAAAeACBzYWx0QG5vdGF0aW9ucy5zZXF1b2lhLXBncC5v cmcmTjZy9Kq3dK8rXUmLIMTvRGKXR0QwsRDbFMz37NCB5wMVCggCmQECmwECHgEW IQTqmPSskT7cyyX8pqXxrJsV+vtYYAAAGHABAJ2dUDba4yF1jmlL3PQ1DvhLSe8o 2u8x4/zu1PRnw3BIAP9CpXfHw/UaHYu8jFvekzXvufQFbYpiJhtlvqrJfSiFCMdY BGWwFkcWCSsGAQQB2kcPAQEHQN1uVzuK6TQrJoGDA5K7sr+k82A5JBpLl9SxiWnP twM/AAEAwHh1msdI+FdAEiL4gMqsgpvI619v37fiTSGnhlW7VKkRxsLAvwQYFgoB MQWCZbAWRwkQ8aybFfr7WGBHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2VxdW9p YS1wZ3Aub3JnPa7JLW0khO6JFCJArCPtvb16cqp0BL9ZkghY/qADcJMCmwK+oAQZ FgoAbwWCZbAWRwkQZDV+trtV3hJHFAAAAAAAHgAgc2FsdEBub3RhdGlvbnMuc2Vx dW9pYS1wZ3Aub3JnnwHR1nm6AWEP4RZb/XcDZpX7Kr0xZroJ0K6wMaK1eoQWIQSX 3BWbcSRhIfIgfiJkNX62u1XeEgAA1d0BAOTrShbEHvhqItrZvOuqIyS3mNENH4w4 XpxHAiZt6ri4AQCNrQ4ZGBHs16RdvG1ajGSXzuVMSNUJkc7+fEYGMaUYChYhBOqY 9KyRPtzLJfympfGsmxX6+1hgAADBqAD/WtTpDIFbzJOyvwZ1Ua2sPLDJNBViFTzY 61e5mPW1kcUBANyuLqv+8cM5VRjT1MEmVuG4wHI8PqqPomM36VjyJmAAx10EZbAW RxIKKwYBBAGXVQEFAQEHQP+PKhMpVBEB1j8nWVNwBRkjCu/FPwjd2VEUMGPnNqg7 AwEIBwAA/3QBCDTset/bXkjBsbkr7XyydAs/IuUshNiQqpulks8YESfCwAAEGBYK AHIFgmWwFkcJEPGsmxX6+1hgRxQAAAAAAB4AIHNhbHRAbm90YXRpb25zLnNlcXVv aWEtcGdwLm9yZ4w6LyeJe0907w9PGfIuUAjQnfgESXdzMaEIBBwQxItqApsMFiEE 6pj0rJE+3Msl/Kal8aybFfr7WGAAAE5SAP9FMGw0riJu0/oGxGM/VfD6J7ZKU1p+ 2uWtScgBOf9O9QEA3qTlfc53Ab6TcrDiniQCcewI9qBR3kebxPqUoZBTCQY= =XG8r -----END PGP PRIVATE KEY BLOCK-----