From 25a19c7d505523fe5a11078f4ca13bb98fb6116e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Micha=C5=82=20Gutowski?= Date: Thu, 14 Jul 2022 13:03:04 +0200 Subject: [PATCH] =?UTF-8?q?Initial=20project=20import=20=F0=9F=8C=B1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/ci.yml | 40 ++ .gitignore | 22 ++ CODE_OF_CONDUCT.md | 132 +++++++ LICENSE | 211 +++++++++++ Makefile | 18 + Package.resolved | 59 +++ Package.swift | 67 ++++ README.md | 353 ++++++++++++++++++ Resources/machoview-cstring-literals.png | Bin 0 -> 436495 bytes Scripts/Commons/common.sh | 40 ++ .../artifactbundle-info.json.template | 15 + Scripts/generate_release_artifacts.sh | 224 +++++++++++ Scripts/run_tests.sh | 96 +++++ Scripts/upgrade_bash.sh | 44 +++ .../ConfidentialCore/Coding/DataEncoder.swift | 7 + .../Constants/Constants.swift | 27 ++ .../CompressionAlgorithm+CaseIterable.swift | 13 + ...ionAlgorithm+CustomStringConvertible.swift | 19 + .../CompressionAlgorithm+Name.swift | 19 + ...tricEncryptionAlgorithm+CaseIterable.swift | 13 + ...ionAlgorithm+CustomStringConvertible.swift | 17 + .../SymmetricEncryptionAlgorithm+Name.swift | 6 + .../Foundation/Data/Data+HexString.swift | 20 + .../Encodable/Encodable+TypeErasure.swift | 19 + .../FixedWidthInteger+SecureRandom.swift | 26 ++ .../TokenSyntax/TokenSyntax+Tokens.swift | 79 ++++ ...uration.Secret.Value+UnderlyingValue.swift | 11 + .../Models/Configuration/Configuration.swift | 65 ++++ .../SourceSpecification.swift | 108 ++++++ .../Obfuscation/DataObfuscationStep.swift | 5 + ...ceObfuscator+ObfuscationStepResolver.swift | 33 ++ .../Obfuscation/SourceObfuscator.swift | 47 +++ .../DataCompressor+DataObfuscationStep.swift | 10 + .../DataCrypter+DataObfuscationStep.swift | 32 ++ .../DataShuffler+DataObfuscationStep.swift | 62 +++ .../Parsing/Builders/Variadics.swift | 38 ++ .../Parsing/ConvenienceTypealiases.swift | 3 + .../DeobfuscateDataFunctionDeclParser.swift | 130 +++++++ .../CodeGeneration/NamespaceDeclParser.swift | 60 +++ .../NamespaceMembersParser.swift | 34 ++ .../Parsers+CodeGeneration.swift | 4 + .../CodeGeneration/SecretDeclParser.swift | 47 +++ .../CodeGeneration/SourceFileParser.swift | 66 ++++ .../ModelTransform/AlgorithmParser.swift | 34 ++ .../CompressionTechniqueParser.swift | 29 ++ .../EncryptionTechniqueParser.swift | 29 ++ .../ObfuscationStepParser.swift | 21 ++ .../Parsers+ModelTransform.swift | 4 + .../RandomizationTechniqueParser.swift | 23 ++ .../SecretNamespaceParser.swift | 50 +++ .../ModelTransform/SecretsParser.swift | 79 ++++ .../SourceSpecificationParser.swift | 33 ++ .../Parsing/Parsers/ParsingError.swift | 13 + .../ParsersConvenienceInitializers.swift | 46 +++ .../DeobfuscateDataFunctionDecl.swift | 59 +++ .../Declarations/SecretDecl.swift | 67 ++++ .../DataCompressorInitializerCallExpr.swift | 43 +++ .../DataCrypterInitializerCallExpr.swift | 43 +++ .../DataShufflerInitializerCallExpr.swift | 38 ++ .../DeobfuscateFunctionAccessExpr.swift | 34 ++ .../Expressions/InitializerCallExpr.swift | 31 ++ .../InlineAlwaysAttribute.swift | 29 ++ .../SyntaxText/SourceFileText.swift | 28 ++ Sources/ConfidentialCore/Utils/TypeInfo.swift | 40 ++ .../ConfidentialKit/Coding/DataDecoder.swift | 8 + .../SymmetricKeySize+ByteCount.swift | 13 + .../BinaryInteger/BinaryInteger+Bytes.swift | 23 ++ .../FixedWidthInteger+ByteWidth.swift | 8 + .../Obfuscation/DataDeobfuscationStep.swift | 13 + .../Obfuscation/Obfuscation+Secret.swift | 17 + .../Obfuscation+SupportedDataTypes.swift | 11 + .../Obfuscation/Obfuscation.swift | 19 + .../PropertyWrappers/Obfuscated.swift | 65 ++++ .../Compression/CompressionAlgorithm.swift | 7 + .../Compression/DataCompressor.swift | 33 ++ .../Compression/Obfuscation+Compression.swift | 5 + .../Techniques/Encryption/DataCrypter.swift | 47 +++ .../Encryption/Obfuscation+Encryption.swift | 5 + .../SymmetricEncryptionAlgorithm.swift | 39 ++ .../Randomization/DataShuffler.swift | 110 ++++++ .../Obfuscation+Randomization.swift | 5 + Sources/confidential/Confidential.swift | 14 + .../confidential/Errors/RuntimeError.swift | 3 + .../confidential/Subcommands/Obfuscate.swift | 58 +++ .../Foundation/Data/Data+HexStringTests.swift | 74 ++++ .../Encodable+TypeErasureTests.swift | 21 ++ .../FixedWidthInteger+SecureRandomTests.swift | 50 +++ .../TokenSyntax/TokenSyntax+TokensTests.swift | 198 ++++++++++ .../Configuration/ConfigurationTests.swift | 74 ++++ .../SourceSpecificationTests.swift | 157 ++++++++ ...uscator+ObfuscationStepResolverTests.swift | 29 ++ .../Obfuscation/SourceObfuscatorTests.swift | 94 +++++ ...aCompressor+DataObfuscationStepTests.swift | 50 +++ ...DataCrypter+DataObfuscationStepTests.swift | 50 +++ ...ataShuffler+DataObfuscationStepTests.swift | 60 +++ ...obfuscateDataFunctionDeclParserTests.swift | 79 ++++ .../NamespaceDeclParserTests.swift | 134 +++++++ .../NamespaceMembersParserTests.swift | 91 +++++ .../SecretDeclParserTests.swift | 41 ++ .../SourceFileParserTests.swift | 88 +++++ .../ModelTransform/AlgorithmParserTests.swift | 81 ++++ .../CompressionTechniqueParserTests.swift | 73 ++++ .../EncryptionTechniqueParserTests.swift | 73 ++++ .../ObfuscationStepParserTests.swift | 75 ++++ .../RandomizationTechniqueParserTests.swift | 70 ++++ .../SecretNamespaceParserTests.swift | 81 ++++ .../ModelTransform/SecretsParserTests.swift | 103 +++++ .../SourceSpecificationParserTests.swift | 76 ++++ .../SyntaxText/SourceFileTextTests.swift | 68 ++++ .../TestDoubles/Dummies/ErrorDummy.swift | 1 + .../TestDoubles/Spies/DataEncoderSpy.swift | 18 + .../TestDoubles/Spies/EncodableSpy.swift | 13 + .../Spies/ObfuscationStepResolverSpy.swift | 17 + .../Spies/ObfuscationStepSpy.swift | 14 + .../Spies/ParameterlessClosureSpy.swift | 22 ++ .../TestDoubles/Spies/ParserSpy.swift | 19 + .../Stubs/ConfigurationStubFactory.swift | 18 + ...ourceSpecification.SecretStubFactory.swift | 24 ++ .../SourceSpecificationStubFactory.swift | 14 + .../Utils/TypeInfoTests.swift | 93 +++++ .../SymmetricKeySize+ByteCountTests.swift | 29 ++ .../BinaryInteger+BytesTests.swift | 58 +++ .../FixedWidthInteger+ByteWidthTests.swift | 25 ++ .../Obfuscation/Obfuscation+SecretTests.swift | 28 ++ .../PropertyWrappers/ObfuscatedTests.swift | 65 ++++ .../Compression/DataCompressorTests.swift | 33 ++ .../Encryption/DataCrypterTests.swift | 50 +++ .../SymmetricEncryptionAlgorithmTests.swift | 14 + .../Randomization/DataShufflerTests.swift | 77 ++++ .../TestDoubles/Spies/DataDecoderSpy.swift | 18 + .../Spies/DeobfuscateDataFuncSpy.swift | 11 + .../TestDoubles/Stubs/SecretStubFactory.swift | 12 + .../Stubs/SingleValueStubFactory.swift | 18 + codecov.yml | 9 + 134 files changed, 6307 insertions(+) create mode 100644 .github/workflows/ci.yml create mode 100644 .gitignore create mode 100644 CODE_OF_CONDUCT.md create mode 100644 LICENSE create mode 100644 Makefile create mode 100644 Package.resolved create mode 100644 Package.swift create mode 100644 README.md create mode 100644 Resources/machoview-cstring-literals.png create mode 100644 Scripts/Commons/common.sh create mode 100644 Scripts/Templates/artifactbundle-info.json.template create mode 100755 Scripts/generate_release_artifacts.sh create mode 100755 Scripts/run_tests.sh create mode 100755 Scripts/upgrade_bash.sh create mode 100644 Sources/ConfidentialCore/Coding/DataEncoder.swift create mode 100644 Sources/ConfidentialCore/Constants/Constants.swift create mode 100644 Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CaseIterable.swift create mode 100644 Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CustomStringConvertible.swift create mode 100644 Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+Name.swift create mode 100644 Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CaseIterable.swift create mode 100644 Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CustomStringConvertible.swift create mode 100644 Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+Name.swift create mode 100644 Sources/ConfidentialCore/Extensions/Foundation/Data/Data+HexString.swift create mode 100644 Sources/ConfidentialCore/Extensions/Swift/Encodable/Encodable+TypeErasure.swift create mode 100644 Sources/ConfidentialCore/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandom.swift create mode 100644 Sources/ConfidentialCore/Extensions/SwiftSyntax/TokenSyntax/TokenSyntax+Tokens.swift create mode 100644 Sources/ConfidentialCore/Models/Configuration/Configuration.Secret.Value+UnderlyingValue.swift create mode 100644 Sources/ConfidentialCore/Models/Configuration/Configuration.swift create mode 100644 Sources/ConfidentialCore/Models/SourceSpecification/SourceSpecification.swift create mode 100644 Sources/ConfidentialCore/Obfuscation/DataObfuscationStep.swift create mode 100644 Sources/ConfidentialCore/Obfuscation/SourceObfuscator+ObfuscationStepResolver.swift create mode 100644 Sources/ConfidentialCore/Obfuscation/SourceObfuscator.swift create mode 100644 Sources/ConfidentialCore/Obfuscation/Techniques/Compression/DataCompressor+DataObfuscationStep.swift create mode 100644 Sources/ConfidentialCore/Obfuscation/Techniques/Encryption/DataCrypter+DataObfuscationStep.swift create mode 100644 Sources/ConfidentialCore/Obfuscation/Techniques/Randomization/DataShuffler+DataObfuscationStep.swift create mode 100644 Sources/ConfidentialCore/Parsing/Builders/Variadics.swift create mode 100644 Sources/ConfidentialCore/Parsing/ConvenienceTypealiases.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/DeobfuscateDataFunctionDeclParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceDeclParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceMembersParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/Parsers+CodeGeneration.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SecretDeclParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SourceFileParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/AlgorithmParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/CompressionTechniqueParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/EncryptionTechniqueParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/ObfuscationStepParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/Parsers+ModelTransform.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/RandomizationTechniqueParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretNamespaceParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretsParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SourceSpecificationParser.swift create mode 100644 Sources/ConfidentialCore/Parsing/Parsers/ParsingError.swift create mode 100644 Sources/ConfidentialCore/Parsing/ParsersConvenienceInitializers.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Declarations/DeobfuscateDataFunctionDecl.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Declarations/SecretDecl.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCompressorInitializerCallExpr.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCrypterInitializerCallExpr.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataShufflerInitializerCallExpr.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Expressions/DeobfuscateFunctionAccessExpr.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/Expressions/InitializerCallExpr.swift create mode 100644 Sources/ConfidentialCore/SyntaxBuilders/InlineAlwaysAttribute.swift create mode 100644 Sources/ConfidentialCore/SyntaxText/SourceFileText.swift create mode 100644 Sources/ConfidentialCore/Utils/TypeInfo.swift create mode 100644 Sources/ConfidentialKit/Coding/DataDecoder.swift create mode 100644 Sources/ConfidentialKit/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCount.swift create mode 100644 Sources/ConfidentialKit/Extensions/Swift/BinaryInteger/BinaryInteger+Bytes.swift create mode 100644 Sources/ConfidentialKit/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+ByteWidth.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/DataDeobfuscationStep.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Obfuscation+Secret.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Obfuscation+SupportedDataTypes.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Obfuscation.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/PropertyWrappers/Obfuscated.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Compression/CompressionAlgorithm.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Compression/DataCompressor.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Compression/Obfuscation+Compression.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/DataCrypter.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/Obfuscation+Encryption.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithm.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/DataShuffler.swift create mode 100644 Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/Obfuscation+Randomization.swift create mode 100644 Sources/confidential/Confidential.swift create mode 100644 Sources/confidential/Errors/RuntimeError.swift create mode 100644 Sources/confidential/Subcommands/Obfuscate.swift create mode 100644 Tests/ConfidentialCoreTests/Extensions/Foundation/Data/Data+HexStringTests.swift create mode 100644 Tests/ConfidentialCoreTests/Extensions/Swift/Encodable/Encodable+TypeErasureTests.swift create mode 100644 Tests/ConfidentialCoreTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandomTests.swift create mode 100644 Tests/ConfidentialCoreTests/Extensions/SwiftSyntax/TokenSyntax/TokenSyntax+TokensTests.swift create mode 100644 Tests/ConfidentialCoreTests/Models/Configuration/ConfigurationTests.swift create mode 100644 Tests/ConfidentialCoreTests/Models/SourceSpecification/SourceSpecificationTests.swift create mode 100644 Tests/ConfidentialCoreTests/Obfuscation/SourceObfuscator+ObfuscationStepResolverTests.swift create mode 100644 Tests/ConfidentialCoreTests/Obfuscation/SourceObfuscatorTests.swift create mode 100644 Tests/ConfidentialCoreTests/Obfuscation/Techniques/Compression/DataCompressor+DataObfuscationStepTests.swift create mode 100644 Tests/ConfidentialCoreTests/Obfuscation/Techniques/Encryption/DataCrypter+DataObfuscationStepTests.swift create mode 100644 Tests/ConfidentialCoreTests/Obfuscation/Techniques/Randomization/DataShuffler+DataObfuscationStepTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/DeobfuscateDataFunctionDeclParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceDeclParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceMembersParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SecretDeclParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SourceFileParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/AlgorithmParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/CompressionTechniqueParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/EncryptionTechniqueParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/ObfuscationStepParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/RandomizationTechniqueParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretNamespaceParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretsParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SourceSpecificationParserTests.swift create mode 100644 Tests/ConfidentialCoreTests/SyntaxText/SourceFileTextTests.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Dummies/ErrorDummy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Spies/DataEncoderSpy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Spies/EncodableSpy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepResolverSpy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepSpy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Spies/ParameterlessClosureSpy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Spies/ParserSpy.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Stubs/ConfigurationStubFactory.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecification.SecretStubFactory.swift create mode 100644 Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecificationStubFactory.swift create mode 100644 Tests/ConfidentialCoreTests/Utils/TypeInfoTests.swift create mode 100644 Tests/ConfidentialKitTests/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCountTests.swift create mode 100644 Tests/ConfidentialKitTests/Extensions/Swift/BinaryInteger/BinaryInteger+BytesTests.swift create mode 100644 Tests/ConfidentialKitTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+ByteWidthTests.swift create mode 100644 Tests/ConfidentialKitTests/Obfuscation/Obfuscation+SecretTests.swift create mode 100644 Tests/ConfidentialKitTests/Obfuscation/PropertyWrappers/ObfuscatedTests.swift create mode 100644 Tests/ConfidentialKitTests/Obfuscation/Techniques/Compression/DataCompressorTests.swift create mode 100644 Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/DataCrypterTests.swift create mode 100644 Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithmTests.swift create mode 100644 Tests/ConfidentialKitTests/Obfuscation/Techniques/Randomization/DataShufflerTests.swift create mode 100644 Tests/ConfidentialKitTests/TestDoubles/Spies/DataDecoderSpy.swift create mode 100644 Tests/ConfidentialKitTests/TestDoubles/Spies/DeobfuscateDataFuncSpy.swift create mode 100644 Tests/ConfidentialKitTests/TestDoubles/Stubs/SecretStubFactory.swift create mode 100644 Tests/ConfidentialKitTests/TestDoubles/Stubs/SingleValueStubFactory.swift create mode 100644 codecov.yml diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..7b68f13 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,40 @@ +name: CI + +on: + push: + branches: + - master + pull_request: + branches-ignore: + - 'bugfix/**' + - 'feature/**' + - 'topic/**' + workflow_dispatch: + +jobs: + tests: + name: Tests + runs-on: macos-12 + env: + DEVELOPER_DIR: "/Applications/Xcode_13.4.1.app/Contents/Developer" + + steps: + - name: Runner Overview + run: system_profiler SPHardwareDataType SPSoftwareDataType SPDeveloperToolsDataType + + - name: Checkout + uses: actions/checkout@v3 + + - name: Upgrade Bash + run: make bash + + - name: Run Tests + run: make tests + + - name: Upload Code Coverage Report + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + directory: ./.coverage/ + fail_ci_if_error: true + verbose: true \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..172d128 --- /dev/null +++ b/.gitignore @@ -0,0 +1,22 @@ +### macOS ### + +.DS_Store + +### SwiftPM ### + +/.build +/Packages +/.swiftpm + +### Xcode ### + +/*.xcodeproj +xcuserdata/ + +### Other ### + +# Code coverage reports +/.coverage + +# Release artifacts +/.release diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..dfd2098 --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,132 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +We as members, contributors, and leaders pledge to make participation in our +community a harassment-free experience for everyone, regardless of age, body +size, visible or invisible disability, ethnicity, sex characteristics, gender +identity and expression, level of experience, education, socio-economic status, +nationality, personal appearance, race, caste, color, religion, or sexual +identity and orientation. + +We pledge to act and interact in ways that contribute to an open, welcoming, +diverse, inclusive, and healthy community. + +## Our Standards + +Examples of behavior that contributes to a positive environment for our +community include: + +* Demonstrating empathy and kindness toward other people +* Being respectful of differing opinions, viewpoints, and experiences +* Giving and gracefully accepting constructive feedback +* Accepting responsibility and apologizing to those affected by our mistakes, + and learning from the experience +* Focusing on what is best not just for us as individuals, but for the overall + community + +Examples of unacceptable behavior include: + +* The use of sexualized language or imagery, and sexual attention or advances of + any kind +* Trolling, insulting or derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or email address, + without their explicit permission +* Other conduct which could reasonably be considered inappropriate in a + professional setting + +## Enforcement Responsibilities + +Community leaders are responsible for clarifying and enforcing our standards of +acceptable behavior and will take appropriate and fair corrective action in +response to any behavior that they deem inappropriate, threatening, offensive, +or harmful. + +Community leaders have the right and responsibility to remove, edit, or reject +comments, commits, code, wiki edits, issues, and other contributions that are +not aligned to this Code of Conduct, and will communicate reasons for moderation +decisions when appropriate. + +## Scope + +This Code of Conduct applies within all community spaces, and also applies when +an individual is officially representing the community in public spaces. +Examples of representing our community include using an official e-mail address, +posting via an official social media account, or acting as an appointed +representative at an online or offline event. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be +reported to the community leaders responsible for enforcement at +conduct@securevale.com. +All complaints will be reviewed and investigated promptly and fairly. + +All community leaders are obligated to respect the privacy and security of the +reporter of any incident. + +## Enforcement Guidelines + +Community leaders will follow these Community Impact Guidelines in determining +the consequences for any action they deem in violation of this Code of Conduct: + +### 1. Correction + +**Community Impact**: Use of inappropriate language or other behavior deemed +unprofessional or unwelcome in the community. + +**Consequence**: A private, written warning from community leaders, providing +clarity around the nature of the violation and an explanation of why the +behavior was inappropriate. A public apology may be requested. + +### 2. Warning + +**Community Impact**: A violation through a single incident or series of +actions. + +**Consequence**: A warning with consequences for continued behavior. No +interaction with the people involved, including unsolicited interaction with +those enforcing the Code of Conduct, for a specified period of time. This +includes avoiding interactions in community spaces as well as external channels +like social media. Violating these terms may lead to a temporary or permanent +ban. + +### 3. Temporary Ban + +**Community Impact**: A serious violation of community standards, including +sustained inappropriate behavior. + +**Consequence**: A temporary ban from any sort of interaction or public +communication with the community for a specified period of time. No public or +private interaction with the people involved, including unsolicited interaction +with those enforcing the Code of Conduct, is allowed during this period. +Violating these terms may lead to a permanent ban. + +### 4. Permanent Ban + +**Community Impact**: Demonstrating a pattern of violation of community +standards, including sustained inappropriate behavior, harassment of an +individual, or aggression toward or disparagement of classes of individuals. + +**Consequence**: A permanent ban from any sort of public interaction within the +community. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], +version 2.1, available at +[https://www.contributor-covenant.org/version/2/1/code_of_conduct.html][v2.1]. + +Community Impact Guidelines were inspired by +[Mozilla's code of conduct enforcement ladder][Mozilla CoC]. + +For answers to common questions about this code of conduct, see the FAQ at +[https://www.contributor-covenant.org/faq][FAQ]. Translations are available at +[https://www.contributor-covenant.org/translations][translations]. + +[homepage]: https://www.contributor-covenant.org +[v2.1]: https://www.contributor-covenant.org/version/2/1/code_of_conduct.html +[Mozilla CoC]: https://github.com/mozilla/diversity +[FAQ]: https://www.contributor-covenant.org/faq +[translations]: https://www.contributor-covenant.org/translations \ No newline at end of file diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..ec77fde --- /dev/null +++ b/LICENSE @@ -0,0 +1,211 @@ + 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. + + + +## Runtime Library Exception to the Apache 2.0 License: ## + + + As an exception, if you use this Software to compile your source code and + portions of this Software are embedded into the binary product as a result, + you may redistribute such product without providing attribution as would + otherwise be required by Sections 4(a), 4(b) and 4(d) of the License. \ No newline at end of file diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..a7f3027 --- /dev/null +++ b/Makefile @@ -0,0 +1,18 @@ +.DEFAULT_GOAL := help + +.PHONY: help bash release tests + +help: + @grep -E '^[a-zA-Z_-]+:.*?## .*$$' $(MAKEFILE_LIST) | awk 'BEGIN {FS = ":.*?## "}; {printf "\033[36m%-30s\033[0m %s\n", $$1, $$2}' + +bash: ## Upgrade Bash to the latest version + @./Scripts/upgrade_bash.sh + +release: ## Generate release artifacts and tag the release with given version + @test -z "$$(git status --porcelain)" || { echo "Aborting due to uncommitted changes" >&2; exit 1; } + @./Scripts/generate_release_artifacts.sh $(version) + @git tag $(version) + @git push origin $(version) + +tests: ## Run package tests + @./Scripts/run_tests.sh diff --git a/Package.resolved b/Package.resolved new file mode 100644 index 0000000..5dd9caf --- /dev/null +++ b/Package.resolved @@ -0,0 +1,59 @@ +{ + "pins" : [ + { + "identity" : "swift-argument-parser", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-argument-parser.git", + "state" : { + "revision" : "df9ee6676cd5b3bf5b330ec7568a5644f547201b", + "version" : "1.1.3" + } + }, + { + "identity" : "swift-case-paths", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-case-paths", + "state" : { + "revision" : "b4a872984463070c71e2e97e5c02c73a07d0fe36", + "version" : "0.9.0" + } + }, + { + "identity" : "swift-parsing", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/swift-parsing.git", + "state" : { + "revision" : "bc92e84968990b41640214b636667f35b6e5d44c", + "version" : "0.10.0" + } + }, + { + "identity" : "swift-syntax", + "kind" : "remoteSourceControl", + "location" : "https://github.com/apple/swift-syntax.git", + "state" : { + "revision" : "0b6c22b97f8e9320bca62e82cdbee601cf37ad3f", + "version" : "0.50600.1" + } + }, + { + "identity" : "xctest-dynamic-overlay", + "kind" : "remoteSourceControl", + "location" : "https://github.com/pointfreeco/xctest-dynamic-overlay", + "state" : { + "revision" : "8816142e27f1127d87c61cee4a0a5db93e9df7c4", + "version" : "0.3.1" + } + }, + { + "identity" : "yams", + "kind" : "remoteSourceControl", + "location" : "https://github.com/jpsim/Yams.git", + "state" : { + "revision" : "01835dc202670b5bb90d07f3eae41867e9ed29f6", + "version" : "5.0.1" + } + } + ], + "version" : 2 +} diff --git a/Package.swift b/Package.swift new file mode 100644 index 0000000..fe1e044 --- /dev/null +++ b/Package.swift @@ -0,0 +1,67 @@ +// swift-tools-version: 5.6 + +import PackageDescription + +var package = Package( + name: "swift-confidential", + platforms: [ + .iOS(.v13), + .macOS(.v10_15), + .macCatalyst(.v15), + .watchOS(.v8), + .tvOS(.v15) + ], + products: [ + .library( + name: "ConfidentialKit", + targets: ["ConfidentialKit"] + ) + ], + targets: [ + // Client Library + .target(name: "ConfidentialKit"), + + // Tests + .testTarget( + name: "ConfidentialKitTests", + dependencies: ["ConfidentialKit"] + ) + ], + swiftLanguageVersions: [.v5] +) + +#if os(macOS) +package.dependencies.append(contentsOf: [ + .package(url: "https://github.com/apple/swift-argument-parser.git", from: "1.0.0"), + .package(url: "https://github.com/apple/swift-syntax.git", exact: "0.50600.1"), + .package(url: "https://github.com/pointfreeco/swift-parsing.git", from: "0.9.0"), + .package(url: "https://github.com/jpsim/Yams.git", from: "5.0.0") +]) +package.targets.append(contentsOf: [ + // Core Module + .target( + name: "ConfidentialCore", + dependencies: [ + "ConfidentialKit", + .product(name: "SwiftSyntaxBuilder", package: "swift-syntax"), + .product(name: "Parsing", package: "swift-parsing") + ] + ), + + // CLI Tool + .executableTarget( + name: "confidential", + dependencies: [ + "ConfidentialCore", + "Yams", + .product(name: "ArgumentParser", package: "swift-argument-parser") + ] + ), + + // Tests + .testTarget( + name: "ConfidentialCoreTests", + dependencies: ["ConfidentialCore"] + ) +]) +#endif diff --git a/README.md b/README.md new file mode 100644 index 0000000..bfdbe7d --- /dev/null +++ b/README.md @@ -0,0 +1,353 @@ +# Swift Confidential + +[![Swift](https://img.shields.io/badge/Swift-5.6-red)](https://www.swift.org/download) +[![Platforms](https://img.shields.io/badge/Platforms-iOS%20%7C%20macOS%20%7C%20watchOS%20%7C%20tvOS-red)]() +[![SwiftPM](https://img.shields.io/badge/SwiftPM-compatible-brightgreen)](https://github.com/apple/swift-package-manager) + +A highly configurable and performant tool for obfuscating Swift literals embedded in the application code that you should protect from static code analysis, making the app more resistant to reverse engineering. + +Simply integrate the tool with your Swift package, configure your own obfuscation algorithm along with the list of secret literals, and build the project 🚀 + +> **NOTE:** Swift Confidential is still in development and even though a lot of thought was put into API design, apart from new features, some breaking changes might still be introduced. See [Versioning](#versioning) section for more information. + +## Motivation + +Pretty much every single app has at least few literals embedded in code, those include: URLs, various client identifiers (e.g. API keys or API tokens), pinning data (e.g. PEM certificates or SPKI digests), Keychain item identifiers, RASP-related literals (e.g. list of suspicious dylibs or list of suspicious file paths for jailbreak detection), and many other context-specific literals. While the listed examples of code literals might seem innocent, not obfuscating them can be considered as giving a handshake to the potential threat actor. This is especially true in security-critical apps, such as mobile banking apps or 2FA authentication apps. As a responsible software engineer, you should be aware that extracting source code literals from the app package is generally easy enough that even less expirienced malicious users can accomplish this with little effort. + +

+ Mach-O C String Literals + A sneak peek at the __TEXT.__cstring section in a sample Mach-O file reveals a lot of interesting information about the app. +

+ +This tool aims to provide an elegant and maintainable solution to the above problem by introducing the composable obfuscation techniques that can be freely combined to form an algorithm for obfuscating selected Swift literals. + +> **NOTE:** While Swift Confidential certainly makes the static analysis of the code more challenging, **it is by no means the only code hardening technique that you should employ to protect your app against reverse engineering and tampering**. To achieve a decent level of security, we highly encourage you to supplement this tool's security measures with **runtime application self-protection (RASP) checks**, as well as **Swift code obfuscation**. With that said, no security measure can ever guarantee absolute security. Any motivated and skilled enough attacker will eventually bypass all security protections. For this reason, **always keep your threat models up to date**. + +## Getting started + +Begin by creating a `confidential.yml` YAML configuration file in the root directory of your target's sources. At minimum, the configuration must contain obfuscation algorithm and one or more secret definitions. + +For example, a configuration file for the hypothetical `RASP` module could look like this: + +```yaml +algorithm: + - encrypt using aes-192-gcm + - shuffle +defaultNamespace: extend RASP.Literals +secrets: + - name: suspiciousDynamicLibraries + value: + - Substrate + - Substitute + - frida + # ... other suspicious dylibs + - name: suspiciousFilePaths + value: + - /.installed_unc0ver + - /usr/sbin/frida-server + - /private/var/lib/cydia + # ... other suspicious file paths +``` + +> **WARNING:** The algorithm from the above configuration serves as example only, **do not use this particular algorithm in your production code**. Instead, compose your own algorithm from the [obfuscation techniques](#obfuscation-techniques) described below and **don't share your algorithm with anyone**. Moreover, following the [secure SDLC](https://owasp.org/www-project-integration-standards/writeups/owasp_in_sdlc/) best practices, consider not to commit the production algorithm in your repository, but instead configure your CI/CD pipeline to run a custom script (ideally just before the build step), which will modify the configuration file by replacing the algorithm value with the one retrieved from the secrets vault. + +Having created the configuration file, you can use [Confidential Swift Package plugin](https://github.com/securevale/swift-confidential-plugin) (see [this section](#integrating-with-your-swiftpm-project) for details) to generate Swift code with obfuscated secret literals. + +Under the hood, the Confidential plugin invokes the `confidential` CLI tool by issuing the following command: + +```sh +confidential obfuscate --configuration "path/to/confidential.yml" --output "path/to/Confidential.generated.swift" +``` + +Upon successful command execution, the generated `Confidential.generated.swift` file will contain code similar to the following: + +```swift +import ConfidentialKit +import Foundation + +extension RASP.Literals { + + @ConfidentialKit.Obfuscated>(deobfuscateData) + static var suspiciousDynamicLibraries: ConfidentialKit.Obfuscation.Secret = .init(data: [0x4a, 0x84, 0x89, 0x73, 0x7c, 0x81, 0x18, 0x86, 0x16, 0x5e, 0x1c, 0x41, 0xdc, 0x2e, 0xe1, 0xe4, 0x92, 0x98, 0xdc, 0xde, 0x98, 0xa5, 0xa7, 0x31, 0x6a, 0x5f, 0x4c, 0x7e, 0x5d, 0x61, 0xfd, 0x9d, 0xc1, 0xd2, 0xd4, 0xb8, 0xaf, 0xba, 0xa3, 0x46, 0xda, 0x61, 0xcb, 0xf1, 0xb7, 0xbd, 0xf9, 0xc7, 0x3a, 0x6d, 0xe8, 0x62, 0x09, 0x29, 0x6e, 0x13, 0x5b, 0x50, 0xfa, 0xde, 0x80, 0x82, 0x80, 0x7e, 0xe2, 0x3c, 0xf0, 0xf1, 0x03, 0x12, 0xf8, 0x50, 0x95, 0x03, 0xc8, 0x4e, 0xc1, 0xb3, 0xa9, 0x2c, 0xed, 0x0b, 0x1b, 0x71, 0xe8, 0xfd, 0xa2, 0x69, 0xca, 0xac, 0x4f, 0x35, 0xc6, 0x4f, 0x01, 0x36, 0x5a, 0x5d, 0x58, 0x3b, 0x37, 0x0b, 0x0c, 0x4e, 0x24, 0x1f, 0x38, 0x25, 0x33, 0x3d, 0x4c, 0x27, 0x1c, 0x20, 0x15, 0x01, 0x07, 0x26, 0x0a, 0x51, 0x1a, 0x3c, 0x11, 0x18, 0x21, 0x12, 0x1e, 0x29, 0x3f, 0x5f, 0x0e, 0x19, 0x09, 0x57, 0x31, 0x04, 0x32, 0x4f, 0x2f, 0x02, 0x35, 0x06, 0x23, 0x03, 0x08, 0x1d, 0x2c, 0x39, 0x2d, 0x10, 0x5e, 0x48, 0x05, 0x28, 0x0d, 0x52, 0x5c, 0x4d, 0x30, 0x17, 0x2e, 0x5b, 0x34, 0x1b, 0x56, 0x49, 0x22, 0x00, 0x53, 0x55, 0x16, 0x2a, 0x50, 0x13, 0x54, 0x2b, 0x59, 0x3a, 0x3e, 0x0f, 0x14]) + + @ConfidentialKit.Obfuscated>(deobfuscateData) + static var suspiciousFilePaths: ConfidentialKit.Obfuscation.Secret = .init(data: [0x99, 0x84, 0x89, 0x73, 0x7c, 0x81, 0x18, 0x86, 0xe0, 0x5b, 0x88, 0x65, 0xa5, 0x1f, 0x53, 0x5e, 0x3c, 0xa5, 0x58, 0x0b, 0x80, 0x06, 0xad, 0x6d, 0x5e, 0xae, 0x2d, 0x52, 0xea, 0xf1, 0xde, 0xac, 0x9d, 0x36, 0x12, 0x56, 0xf9, 0xce, 0xe4, 0x95, 0x84, 0x7e, 0x47, 0x44, 0xde, 0xd3, 0x76, 0x68, 0x67, 0x90, 0xfb, 0x30, 0x3c, 0xaf, 0x33, 0xce, 0x8e, 0x79, 0xa5, 0xdb, 0x7a, 0x97, 0x9d, 0x60, 0x58, 0x0f, 0x59, 0x5f, 0x2c, 0xe0, 0x3a, 0x4d, 0xf6, 0x38, 0x75, 0x1c, 0x2e, 0x5c, 0x94, 0x3f, 0x7c, 0x7a, 0x61, 0xca, 0xbe, 0xbf, 0x52, 0x05, 0x0d, 0xc7, 0xe3, 0xe2, 0x8e, 0x34, 0x02, 0x5f, 0x6b, 0x56, 0xb0, 0x67, 0xac, 0xf3, 0xf8, 0x3d, 0xf5, 0x26, 0xa0, 0x3b, 0x91, 0xf4, 0x88, 0x38, 0xc4, 0x5b, 0xaa, 0x7a, 0x0c, 0x2e, 0x98, 0xeb, 0xd2, 0xbd, 0x7e, 0x63, 0x53, 0xf7, 0x37, 0xb4, 0xc0, 0xb8, 0x8f, 0xb6, 0xe1, 0xd4, 0x3c, 0x89, 0x7c, 0x0f, 0xa8, 0x2a, 0xea, 0x01, 0x0c, 0x74, 0x7b, 0x65, 0x4c, 0x78, 0x14, 0x0f, 0x09, 0x60, 0x02, 0x2f, 0x1f, 0x4a, 0x2c, 0x1a, 0x52, 0x1e, 0x37, 0x98, 0x71, 0x17, 0x30, 0x34, 0x0a, 0x3c, 0x5f, 0x6a, 0x58, 0x42, 0x13, 0x39, 0x44, 0x4d, 0x79, 0x41, 0x59, 0x4b, 0x7d, 0x64, 0x20, 0x33, 0x21, 0x50, 0x5d, 0x22, 0x45, 0x28, 0x54, 0x4f, 0x66, 0x6d, 0x77, 0x03, 0x11, 0x25, 0x26, 0x08, 0x6c, 0x9d, 0x2b, 0x12, 0x6e, 0x68, 0x5e, 0x69, 0x04, 0x9e, 0x06, 0x0d, 0x3a, 0x3e, 0x63, 0x62, 0x2a, 0x19, 0x55, 0x73, 0x01, 0x24, 0x7a, 0x1c, 0x61, 0x32, 0x23, 0x2e, 0x7c, 0x35, 0x46, 0x1b, 0x5b, 0x76, 0x36, 0x4e, 0x7f, 0x16, 0x3f, 0x51, 0x7e, 0x0b, 0x27, 0x9c, 0x10, 0x57, 0x31, 0x18, 0x3b, 0x2d, 0x1d, 0x47, 0x67, 0x0e, 0x6b, 0x72, 0x6f, 0x56, 0x53, 0x40, 0x9f, 0x5c, 0x05, 0x3d, 0x49, 0x00, 0x5a, 0x15, 0x43, 0x38, 0x29, 0x75, 0x70, 0x48, 0x07]) + + @inline(__always) + private static func deobfuscateData(_ data: Foundation.Data) throws -> Foundation.Data { + try ConfidentialKit.Obfuscation.Encryption.DataCrypter(algorithm: .aes192GCM) + .deobfuscate( + try ConfidentialKit.Obfuscation.Randomization.DataShuffler(nonce: 9662615372037719068) + .deobfuscate(data) + ) + } +} +``` + +You can then, for example, iterate over a deobfuscated array of suspicious dynamic libraries in your own code using the projected value of the generated `suspiciousDynamicLibraries` property: + +```swift +let suspiciousLibraries = RASP.Literals.$suspiciousDynamicLibraries + .map { $0.lowercased() } +let checkPassed = loadedLibraries + .allSatisfy { !suspiciousLibraries.contains(where: $0.lowercased().contains) } +``` + +### Integrating with your SwiftPM project + +To use Swift Confidential with your SwiftPM package, add the `ConfidentialKit` library along with `Confidential` plugin to the package's dependencies and then to your target's dependencies and plugins respectively: + +```swift +// swift-tools-version: 5.6 + +import PackageDescription + +let package = Package( + name: "MyLibrary", + products: [ + .library(name: "MyLibrary", targets: ["MyLibrary"]) + ], + dependencies: [ + // other dependencies + .package(url: "https://github.com/securevale/swift-confidential.git", from: "0.1.0"), + .package(url: "https://github.com/securevale/swift-confidential-plugin.git", from: "0.1.0") + ], + targets: [ + .target( + name: "MyLibrary", + dependencies: [ + // other dependencies + .product(name: "ConfidentialKit", package: "swift-confidential") + ], + exclude: ["confidential.yml"], + plugins: [ + // other plugins + .plugin(name: "Confidential", package: "swift-confidential-plugin") + ] + ) + ] +) +``` + +Please make sure to add a path to the `confidential.yml` configuration file to target's `exclude` list to explicitly exclude this file from the target's resources. + +Now simply build the `MyLibrary` target and the plugin will automatically generate a Swift source file with obfuscated secret literals. In addition, the plugin will regenerate the obfuscated secret literals every time it detects a change to `confidential.yml` configuration file or when you clean build your project. + +> **NOTE:** Swift 5.6 is required in order to run the plugin. +> Also, please make sure to use the same version requirements for both `swift-confidential` and `swift-confidential-plugin` packages. + +## Configuration + +Swift Confidential supports a number of configuration options, all of which are stored in a single YAML configuration file. + +### YAML configuration keys + +The table below lists the keys to include in the configuration file along with the type of information to include in each. Any other keys in the configuration file are ignored by the CLI tool. + +| Key | Value type | Description | +|------------------|--------------------------|-----------------------------------------------------------------------------------| +| algorithm | List of strings | The list of obfuscation techniques representing individual steps that are composed together to form the obfuscation algorithm. See [Obfuscation techniques](#obfuscation-techniques) section for usage details.
**Required.** | +| defaultNamespace | String | The default namespace in which to enclose all the generated secret literals without explicitly assigned namespace. The default value is `extend Obfuscation.Secret from ConfidentialKit`. See [Namespaces](#namespaces) section for usage details. | +| secrets | List of objects | The list of objects defining the secret literals to be obfuscated. See [Secrets](#secrets) section for usage details.
**Required.** | + +
+Example configuration + +```yaml +algorithm: + - encrypt using aes-192-gcm + - shuffle +defaultNamespace: create Secrets +secrets: + - name: apiToken + value: 214C1E2E-A87E-4460-8205-4562FDF54D1C + - name: trustedSPKIDigests + value: + - 7a6820614ee600bbaed493522c221c0d9095f3b4d7839415ffab16cbf61767ad + - cf84a70a41072a42d0f25580b5cb54d6a9de45db824bbb7ba85d541b099fd49f + - c1a5d45809269301993d028313a5c4a5d8b2f56de9725d4d1af9da1ccf186f30 + namespace: extend Pinning from Crypto +``` + +> **WARNING:** The algorithm from the above configuration serves as example only, **do not use this particular algorithm in your production code**. +
+ +### Obfuscation techniques + +The obfuscation techniques are the composable building blocks from which you can create your own obfuscation algorithm. You can compose them in any order you want, so that no one exept you knows how the secret literals are obfuscated. + +#### Compression + +This technique involves data compression using the algorithm of your choice. The compression technique is **non-polymorphic**, meaning that given the same input data, the same output data is produced with each run. + +**Syntax** + +```yaml +compress using +``` + +The supported algorithms are shown in the following table: +| Algorithm | Description | +|------------------|-----------------------------------------------------------| +| lzfse | The LZFSE compression algorithm. | +| lz4 | The LZ4 compression algorithm. | +| lzma | The LZMA compression algorithm. | +| zlib | The zlib compression algorithm. | + +#### Encryption + +This technique involves data encryption using the algorithm of your choice. The encryption technique is **polymorphic**, meaning that given the same input data, different output data is produced with each run. + +**Syntax** + +```yaml +encrypt using +``` + +The supported algorithms are shown in the following table: +| Algorithm | Description | +|------------------|-------------------------------------------------------------------------------------------------| +| aes-128-gcm | The Advanced Encryption Standard (AES) algorithm in Galois/Counter Mode (GCM) with 128-bit key. | +| aes-192-gcm | The Advanced Encryption Standard (AES) algorithm in Galois/Counter Mode (GCM) with 192-bit key. | +| aes-256-gcm | The Advanced Encryption Standard (AES) algorithm in Galois/Counter Mode (GCM) with 256-bit key. | +| chacha20-poly | The ChaCha20-Poly1305 algorithm. | + +#### Randomization + +This technique involves data randomization. The randomization technique is **polymorphic**, meaning that given the same input data, different output data is produced with each run. + +> **NOTE:** Randomization technique is best suited for secrets of which size does not exceed 256 bytes. +> For larger secrets, the size of the obfuscated data will grow from 2N to 3N, where N is the input data size in bytes, +> or even 5N (32-bit platform) or 9N (64-bit platform) if the size of input data is larger than 65 536 bytes. +> For this reason, the internal implementation of this technique is a subject to change in next releases. + +**Syntax** + +```yaml +shuffle +``` + +### Secrets + +The configuration file utilizes YAML objects to describe the secret literals, which are to be obfuscated. The table below lists the keys to define secret literal along with the type of information to include in each. + +| Key | Value type | Description | +|------------------|---------------------------|----------------------------------------------------------------------------------| +| name | String | The name of the generated Swift property containing obfuscated secret literal's data. This value is used as-is, without validity checking. Thus, make sure to use a valid property name.
**Required.** | +| namespace | String | The namespace in which to enclose the generated secret literal declaration. See [Namespaces](#namespaces) section for usage details. | +| value | String or List of strings | The plain value of the secret literal, which is to be obfuscated. The YAML data types are mapped to `String` and `Array` in Swift, respectively.
**Required.** | + +
+Example secret definition + +Supposing that you would like to obfuscate the tag used to reference the private key stored in Keychain or Secure Enclave: + +```yaml +name: secretVaultKeyTag +value: com.example.app.keys.secret_vault_private_key +namespace: extend KeychainAccess.Key from Crypto +``` + +The above YAML secret definition will result in the following Swift code being generated: + +```swift +import Crypto +// ... other imports + +extension Crypto.KeychainAccess.Key { + + @ConfidentialKit.Obfuscated(deobfuscateData) + static var secretVaultKeyTag: ConfidentialKit.Obfuscation.Secret = .init(data: [/* obfuscated data */]) +} +``` + +You may also need to obfuscate a list of related values, such as a list of trusted SPKI digests to pin against: + +```yaml +name: trustedSPKIDigests +value: + - 7a6820614ee600bbaed493522c221c0d9095f3b4d7839415ffab16cbf61767ad + - cf84a70a41072a42d0f25580b5cb54d6a9de45db824bbb7ba85d541b099fd49f + - c1a5d45809269301993d028313a5c4a5d8b2f56de9725d4d1af9da1ccf186f30 +namespace: extend Pinning from Crypto +``` + +With the above YAML secret definition, the following Swift code will be generated: + +```swift +import Crypto +// ... other imports + +extension Crypto.Pinning { + + @ConfidentialKit.Obfuscated>(deobfuscateData) + static var trustedSPKIDigests: ConfidentialKit.Obfuscation.Secret = .init(data: [/* obfuscated data */]) +} +``` +
+ +### Namespaces + +In accordance with Swift programming best practices, Swift Confidential encapsulates generated secret literal declarations in namespaces (typically enums). The namespaces syntax allows you to either create a new namespace or extend an existing one. + +**Syntax** + +```yaml +create # creates new namespace + +extend [from ] # extends existing namespace, optionally specifying + # the module to which this namespace belongs +``` + +
+Example usage + +Assuming that you would like to keep the generated secret literal declaration(s) in a new namespace named `Secrets`, use the following YAML code: + +```yaml +create Secrets +``` + +The above namespace definition will result in the following Swift code being generated: + +```swift +enum Secrets { + + // Encapsulated declarations ... +} + +``` + +> **NOTE:** The creation of the nested namespaces is currently not supported. + +If, however, you would rather like to keep the generated secret literal declaration(s) in an existing namespace named `Pinning` and imported from `Crypto` module, use the following YAML code instead: + +```yaml +extend Pinning from Crypto +``` + +With the above namespace definition, the following Swift code will be generated: + +```swift +import Crypto +// ... other imports + +extension Crypto.Pinning { + + // Encapsulated declarations ... +} +``` +
+ +### Additional considerations for Confidential Swift Package plugin + +The [Confidential Swift Package plugin](https://github.com/securevale/swift-confidential-plugin) expects the configuration file to be named `confidential.yml` or `confidential.yaml`, and it assumes a single configuration file per target. If you define multiple configuration files in different subdirectories, then the plugin will use the first one it finds, and which one is undefined. + +## Versioning + +This project follows [semantic versioning](https://semver.org/). While still in major version `0`, source-stability is only guaranteed within minor versions (e.g. between `0.1.0` and `0.1.1`). If you want to guard against potentially source-breaking package updates, you can specify your package dependency using version range (e.g. `"0.1.0"<.."0.2.0"`) as the requirement. + +## License + +This tool and code is released under Apache License v2.0 with Runtime Library Exception. +Please see [LICENSE](LICENSE) for more information. \ No newline at end of file diff --git a/Resources/machoview-cstring-literals.png b/Resources/machoview-cstring-literals.png new file mode 100644 index 0000000000000000000000000000000000000000..d48fef63b9ecb6d7325ebb2ec715f0a5e6d416fe GIT binary patch literal 436495 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°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

&Dv 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 z zf8whThudTxe4hjN!-EQ=3wwOrDcnJ!>~c@kM2`MHl)YzIli&6&Dk`E>5s)SXM5Xs4 zJt`m_q=Pi+z4sacrAY6+cMy;wT|)0gK$>(y=rz%ub%YI-{ZN;T+sFLLQ<{DLkt)lB zzz@j}!amI&t$Le%W?d=X9Lx3l{-N^OS|)8l65U9;;p*SMPj@;!)xD06zYSG=ULPUd zqIk;Z2>%QR)Tw$YA!bJrKXMuf=btKOiKa$-*Bhkr9Ci7iVO|oEN)847X&jb_GC9F7 zAOYW$B{eJ$Bw0?Fpy-q&8GWVV%5$%Z{B!?)#-7QtRF&W1^|WfV-|fDt%@}u41JHoBZ+~I1 z{^dyuYm7p=up(eQ_jWEb?)g-iMl3KtVJNpcOcf0+25~?qTxop@K>GetFC>?fv%StP zc@;#j;O)|pN+OCw5~u;9RRj@8&i@0;3O8bK>3BI;)BmnN*YWGCVCXT3DkbO-8a{tW zRNLUtvhQw}uBPgqpY1hcL~#n)=|Gd)UFAuIe^BuJJg!-x#~jb7NZ8E!nRW_oH{YgT zq?}!Z{`sl#;RQxvvH>H?m;wvqx0!C=3JDYV4n|8&GGd{;uBh-I5MrX2@N=E`pMlmc zpaqATi`*}TTL+3TCq|v8Lh}PX?llU0H?J)CG%=vIY&zEDDp%S2+5k=NE&)OCee4>d@OKWCDR9XeBop=UZovY4wl+gX_yLsi}|BQ{UAPL z0uIX(tL*{vlhvrjF!UH^`yy9KzCzO^eoIiOaeo9))wcG4faS`Y zUo$+bN^mF>GW@jZ9gZB6+DhF0QgOYGNH^l~VQ@^|)8 zm*n=@0ORHE%j}hA&+#=nE@x5=Gy)#&#-s6umkm<;G=wO~R*C2G7s`2X!#f-lqM3sJ zzTD`Y?C@m$v^Vlh4!OLk@0YjL#{#jx&5L%qsq(+z z{tKF+1J2I=_2dQ-xU$Do#Bx9TCuSO>jWM}#prcGfZ8qb$6AMv5dgCw^7`IkZ2b9T8 z)d1+NjR}HW+Xy-YDoaz%%J1JzU}vwi&BeWAot3qH$(P_@!#yvk7^(Wp=dAZL-`kxj z5hX42ZJh8+R8E!cYJ_j=;U(W%g+99#b17ovhpbdWglaHKrRI%U0r1f8r$&I8!M-vPone@CxV==J|(gW!ZznJ$A+NfE# zRl`E{luXF1w!ZzmPa&-P**TC+uknL0`1;xC>U`n0-QT*mS$jtXdkff7FZG5r*%QUd z6wro%(wN!SQ7#w0u`cJj9d|;}VzWm)WAY2@6N z(Ulh*YI%jzf_jfxL1eEwT!MzrIiZMUGt4EpRK4k2{i0#}XT&gXrs?sTR2hS*A!;b0 zbfQR++G`(*k!sn$3dRn9I;iilM1SjD9YHCgd2Mfq_R_Y(RN>HmR(Y%&z~BkvP5Uup zbQ0Y+e4`9FqVo@*(}=*KRc+sRH>WQ-Orvjzt{-0zNv8O7T!Wtk&j#QPC5&SbVi=19 zj7$*65lp`TqegUwd$PRGSMXf00og{Pt(YmSQE$8S0#JD1RE7;34@yUglgyL&U6zMS zWqS>ML=U#tk6UTOahA~~TFsUyeUA~o+6gfHj~aikxvkh0Fv8HkH|KJ?U}~?DhTBCo zWcbsX-^y>_EluDWnQZ8*64zjVkLDt}zkH!^@c{$3&R~lvN zDkzV=1^TMMhMB;N=fmVhRi$RXi(6r{!3)JN#|;UJKF38}OQ-3qb4CIa)imgJ@L&r^ zS4=6BiCWR!^X_IMQ#deVfw{VWjk zBxnU@^CG_{W&r#O6H8L3?-ti8*FD#dc?GG>t-ehVeIKzTp&TM0BwpqZS@q{1pmUCr z1#Diya_XqDVKbym7is#=)h}MY95~RQ-Fb*E983rd+}U0U8ZY`<5vk|AUHD-mB0hFG zGOiTLWxy+DVM-38-<}A)AYF@%aNqK!{0#wyR|)}J-x|Alf$gJ9Xdwx{WJEFV0C6sM zgzaXQU)09bYt7-$L%V{M{MH35ztiXsMZq6VzWoNis#l1S=H6S}^*3>OcN4+G@8#s0 z7rZCg8@u8)MImpn^x7eMl(TXK9!KW)QI1ov6mFA0D*}Ly3=hD-7TQS3hjV5~lvrHQ z>5&YlwQc2v^NZ#)bH5NX8ze<~AI-?gpL|Yb80Dq8Oo*NNQK5EhEEVM3g@a59PlOEU zHdy=1KuJbBVRV5=Gv*v?SVeQXeVY!g_fc++FNZ=(8z+Ph%|?ywlwG9ODtMI!_U5KX zeK}^-Z!^DX(ZTp)`FFb1%C{52o`G(7;N(pOb1wx+cw|*YL96(=#a^Q(G4;jSTIlei zXgy0WK1iC!NE)w(YL4ls$q|@)ksJ=(reK}lmt%g`->}<%=cf5VLTs<&Lz}&TM(=tD z4(2QG#nZu+j(hOkxA(qUOdiY*xL7saxCioyl{1&CBXxb~>X5f{6F8W&oHigReJLn7 zNTT6dYI?J++Mp!XbaF288{BOV;cUJ%2JCtp9M2C}kgb?aE(O0zKf>!!-cdmkR>EbI zUHr09sjZU-r}{yM0O0TwIs?Q}ARW2ylw#04zxG&`tM|c6#?8}R7{va8s(303i`Le0r1Z^z_#dvLurAMD?4TiKQQ`lJAj=Lh5i?>WU zqBFa=Suy$mZ(!xR;q3c1nrUEB@XSSF?yOoAR&jJD~J&DXkY~xmnUDKlyIIj46%79k5pr&S%x9LU2U(rQxov zf#WAYOE9C=Y)IL&!HWuA!*Zk4^Q@ia)p`$<^wl)_-lgC^XqR>A!s3$TH4MCrzC%zG ze%;n}qb#rw^@B{KwXcVW7;P{PHy~k)UC4KgRCK3*VC#>nKG44}_UJS4G=}yWGXJw$ z)*GCzsH`CWBjdLe!|0PiR%f@NBvsO0#%6u(N77(>2P9Skb6@s{Ww(bNF+uYJub#3o zVZ4xJR&#&*G(;{dJ$ylMW(RFd-(x^*c80L!nj9>v=_j&R8uEu5KhY6Nh{~Bg2XyZ`x!Gs3!BnN`dj8mcFoFGEkA@f$M^otZU{YE*sB#ov+S6F_O6nVFd_&IT zUpqVH1ze-Q=OZinG%K}BS?}WA4XSVW8QZYzhof^xF-}TU84zc@QoUnwaZD2#RFJJM zD67;V#Nu~-ni!lS1(I}f;;$0Kd3>t>sHC@BY;96yt_W*83_+ShH>7nLF14HtrouSh zNKZ;z<7RL|C?Ffbr#hGd(Bo-&Rn@m%a5$!UJh6RcP$^iMi0$jXp!AGI-E*t)mc{R+SX!ZdrhC6>+C_wRx+US zoGl6L;D?{c#IA+`wkg?-heqAuib$)H($aI023Q8ymrvJY74N{8IU%Gh>iu8eiY{ZW z&%vc1;!Zm`?(Y9xdU8A3bY)Kf0jn^2=Y7wNaT zB(1LKs)G(!pfocy+Ebxf!V{R?rq+J>z(EE!{S9=q#YxR?rQXl4yB_R=w06MrNS#F4 zCnR`s^b}W0cCKY8oN~%tWAeKbn@z0>WDS&r@G(0Kb@@%pWgcF&cWvHAso`>)&Jm+5 zx+l+&qUO`G^7XcRESyFCcdHjNpU&j|4Mf(Kf2qX*)O4NYp3lfz)!mZ( zX!S!}vZ0}=S@ujMzdXZgpQ z^}AR6Kbm#Ub5Qt|Dl5t+v_osVpoY{fUVXR?Rk>3aA8b|m3cG`sCB4D=rBwJ+Y`^}& zmdv-m%n29|v))ir8v#Jg_66Wgcq4DpIYp-BTz)o;&~iWh>HiMV&@0K<9sSklMw1fvjz9 zA$CBwHX$y82`29JcGO5GICz8pcTYZu z2(!0!IE2_t@V5r=h#q_t0h5d0pGcAL*gIww7%nuB`bt!wuER0T-=O2m;AQA4sO6^N zkaNqxxDJDpf3rA$2qDufaH8IR&h>trLN!d+F`usbGF#WF>dJ<{{!EWS>KnZ;5_gN* z=uOA^Gq(WGYEEF#;Pj^!7Qy}!kr7I$G|Wpu^f@GjMt4A z5WjPQD55`~OOh<63QGIkO*Tb6D(_Pw9@0YjQf=d7Bv}AnHQa`U>Z@}fEo&l+rmD#l z`a4E3yRTY3l*>%Ay{Ra(l-Lj)MN z^k2n{G)deq**0uFPp+}x{f@g{Hs43!{v-Kw!w+oFz z<3k+9DV@Onm|jdZoah=|aZ`KVcMBC(V5-sNzl;*lUWSoi1vD2D_9+SyiE$o-JQ^67 z|NYGI{&$V!@uw?fZeZd*I$vOl?RoT<%&6nDK+gb9jy+d?nl@Ym-V~1yfIIDp>&0jv z^_g#@j9z|~pf?jQ7cVLjbM*5w_ue&L8=>C!8+x!{TWDQw?EA!#rk~Jh%#lwu8l2DB zxh3%^jg-uJ3y0HRlhWzD5(9rx2th5IX=^k}G+ebpZ~P8g&UE_eO1gPzPhLTO zHvJ^1H_W8Bo3Bqi*LL$1oWblmv~mER^lDG4c^o^VNfwnJV^v~o_Ll)~MV2an8=_vS zr_uK82)iE2dEemG>$!{UV|LKx;cYPHMW6Vk`ay6$qJR8*UB2JszL2rlC;BL`7J=?-{<_&k49Hu58{A?0X0)Yq$NWenuxy5Xwf>NPsVbLGtk z=|j%67Ji2L}%!U=lp+3)j-3r71n7q_YeQTR4_J<<=BT#&Q|>|0!&$ z&tI$UTHX+egnEv8Gy-XhEi!*m-(#>Ko6$;otQJ2Urq_B#Ezp$MUs41SJNmrvw_fo> zY}*nl{|s}yp1sX$zJfoXdnbYVPqNsW%v`fs_})fphb40qyP<*j{&lK7JIG#80sUoQ zY~6txGJ84Hn=ODQay8oX*#3^uc-s?TbcHhsEjjqgld_Fbz);%L_=Rt$e;d{UP4s5t z_@Jy#JHoSQItm2Pwa3etiObhU^3Kl9=|rSl&~L3B3J-lBSJHc&1TTnD+eP4Wg+J`; zhk?2ttgiO(>TX#k=lOQ4r+&MJ*Fw5j)nte^7>-j^op_AZ(aJvAQYj%6MAq zGq&!kNwWMS-egrTx3R03B=~aF?eoJ+8C`tDVZx6RNW(ccf0JQa75e<;IZx`8dp~s1=N&r3KKHi)C zrK5Lw5dX?91>JGVSp>mtz%`mmUrI-hoI0Q+6)+F+6)=`p(sfBOrHYuX0;UVa6f`q* zEBnchY(@>q4SXz#_QzcJ|7Ra`py%z23d59lgFn-MdPwm<`gkKQ)sF9vtXpH7|1X}p zL(CPFeH`#V{+7@5G10&yhT@f?L(TuiQ=cAyVgKC`%?V2?r*mnPmr#@4nB5?j^8~Lv-5Aclu9zi(4b*2gai#6cAq$K*EZT-Jr5+p@H zw{M2W|7%;`a6G;QtVY)XRsVQ^uP+bSdZmV^Jmmv3aCx6v0>bK{>Q$Qhw3jpYkWEZU z9{;r1p+Rq=2>iFVx8q`B9y6u_YE!PF8!xK(V9CZ~;#O8xHD*Iknf04bv+m*0rzrO_ z16WfOZ2jW1S4Dbj@6e&A4*FmJx*+M}Plg%=GQ_fSa)T=FvyAqC>tqKL0AziRURv_p zCC( z7*<+9fIA6_LF-Zp*fMQqxQxDKb+(X3r{<~vf3_jklNGZ|FWkY6;Au0xN^U$!!0laimowmnK_GYVj9(rX)HKq$VJe?4| zIi2LMQdfQ70%+4J7Ad6WRh6P-+QH4Lh4R~b7A)^L0IwEXvc&YaA;?TZ-wisbi2Ff8 z=U3bTzyW~~fHZ#T0nOkv^V6}Mw?PHU%i=XhW7xNlmCz0VBXvJu90aVr$+eui5pKKF z?0LQ>Y3iq>pNR$7Z6kVaZ1kIDdcKk6575?GZ1`~vijtvzQ2M&w-6@iL7kBSpQ{quKwzGE2ZTjA)Tl5T2YG(N) zj#ywVWQ~pUp84!mPc%B2G_3^U)$l*9R)!m{c7BBeZy_P$ujNC4%fRe+b(%D&QARsm zzGUE!G?SH8jQ#u5y8M`f_D485XHuKrHSQO>#3&}lV=zHmNPY)rL#uSqGT>1O52m&c zWo_u`a(7rRZ^cXfR>K&%W3aRs9|6c)(O3l@9`$8I;*t%#Wgp;E#8gDIG$89P|LJTy zt`N(79`9G2kIGY&Y6s?3*h{TS%hq%A`sTWy{L!AI=`CLC37779f&`|4*9RE06I_RB zm5T`oj{hV)C?t;bSZwi#ri_*gueX~Y{H{}L)Gs&b+LRX~SJWLCCd_bCGsH3UE}FCL z%KEeD*&nsIw6vl@yv*Z>i-P5?KkvD%06`cr9`8Sv1o=o4jz?1O0v`IYsEA*#+!I3d zGt~apuQ3f<0Cw_SVM;i;UW!G5gb4%LyYYk75KxklL`d0_$m0}gW$34XyA#N!O=A{n z@Xe{(_McLcI2Yn4F;g;nBOVX@?B~>hcBbV74m{PjyP5u#fl@g8_R5kn|PA6fFR z5FSE&m+y}optRn0iNJGZW1_(5b?rCPiDvs92u<9(Y4Tvzs#J&dm1&goS-N5l=OLBP z!Z))3n`q=-?O1_k#YZ07*&m)A=R?;(w}AEmv`w|i`DO0$p`$AleO0bE+04Jg_4d|( zwCVh>4eaSj6%-u@xD~71%t4@tL5L}=cf@&!{k41uAmJh$81oJg`;TQ< zvT@%othtW>5%|*(U%U|-oK=3?t0a}V#Yh>45mbpJ=`tSJ5Qk*Mc#Mf%l(b)twjAzs z3mjT#{ZlCG$2{!TTYXKyT5VaEA6NCvd}A5Ye$RQhy01ScAjp&{LPHIbnunYHddZW4 zBD2rg1?{;#|VT~T}@uAc*l<)WQ)yf8Nxcv^J$&jddN69HXJ zz*Tf(`)r1HvLNdID_Q207$(4Er{q;?TwIv8U?Y^o)C8suv{U<$H$HuCkg7rp8{BbSS8mrK*GK9AM7&B>E zs40L1qpGU0fA(a|gu@Ep_b0cK&WB75BqOpQkWDf$zF z?i*79-adh~SJgFyy03pBr*)ktWEri((zE8&1x0{n7#bjRy)SiQYrWbByyj+Hj2ger zq&u`xhIvfuSPY<$983KU(4i*|NCX@K>jq7IcI%KL9}MSgqnI-<(XKW|{FWe+wU#U6 z@~eD`C(<_A`hI*}i1%c3BpFaEWCkpWGCyp4-mia1AY!ksQSu?K&T8@%it0gopX(4y zrS?jFHmm0M{yM2w$H%>GfFX&xJ@n>W;TX`WsT4Hz4gghYzTT^K z)0kWzu$Q+@+P}>-fU%WT4jR_w!$0C8dgk_6-hk88HqvPIV*J8e$??y#q%E%N-PHL= z#G#|x0#7DM{T9HhrxJ_ier=|K>{8?%RIKwQnN}`Sr5%1->Bivc%YZW>L`hxamC))l ztrO$1Ii@w2K{AwQR^~{H_lYqq9qko=>u-kW`tnF;ecn;K<@Gz2qOR+?kUxiy)5ET=@|gYPdVP|V}A$4vR#Gu z0+qcmaiayqZq)o?D8)5J*5=~4$|DKy+dSnApR(eT5Ym{tE3$ zjsk6f(CV=eqbnfGsrCg-Oc4BovJ%Gh88};+YG3X$?7>sjz9vNba8<776E8=7K&1;< zQE{JhbFMQ`8Ha(jG=h=zz}9gMTJrrn_gZ-D3FsC6#8^b5MC(%ssjq!?gxDHZPYruI-{1<%CF8Qj9|&2 z04(A+O}`z2Ec@k_(jr`fqbJ+U=W5J&uzDi^ut}Ccmw<}zx3AM(m02gA-%&IoKjL3+ z`(5w4dL#+If-S(ijM}U-b5N|Jxl#;%59iu1CJWyaHgtVJ;xrWICMBUQXTs zdQq-9nroGJ{R_>f<}1?X`+uTv^Ww!&PE2dsB;m`302NspD6dg!(vy8Izfg< zNsA8n;8U}kV4`>h$OApLR8?ySXUDB#3E`XwQEpi3{DC&wp9+rBc3jqY)m-0CqAW@o@-f-|Xy*8iL*RN2UZdBL zOXSEL;NmmxZs^?SpL(0#Um<4Yo4*!f-y4zo?jG@pv$;$_A)mDa zv6=mmYcG@;U-QFZW1Z?8vw)RjJyj+Y_MmI-6_8IWZT$&6@d(nU7Wm$GZNYOT?Al|I zpC{@qW4>o1-QE3u>syICjg=QkCeZj9*ijBidaWF(M` zxouBKC3TieHlOh$mRb%6JXfSx__88sc|SIY>;qoW!xc{~M$!r`FsigiH=qVl%w>M` z9~r@CB>q4mRBwpyAJ3@#o&)PegnL0OV~E10BpPVxHj5&T@@s67JTE1h`l!d2`XpKG zcMsr#*+hde-(8v~Vz8Sg??yWB#Mou+4%z($-_?|z^?Sa@qPn^iy(F8 zH{!#RcIVpDN%$8MrK2iW#A;0f)e&jx#=ZeGKL3Wtw#c@Mq)@zY#3jmQ?q1>+fI$9hfBol(JWilqDI=3Lb? z9M5ll7b1CjqUdrLlMqeqS+vlGcBy_#5{oj6 zMp?lsil}SycqcMuY0R*c^yC|NQmyyd&XPQg8~TUa$wxJ$VF;?6?j+>W=D6A!>xr}5 z%gm>u$&~2%D%S&qzLenZZyG{Q;g*+no4rAKy>YKt?hT+G33jQL=SFB%Q4c1ds?-NY@dK&d8lSrh!0mT)ey_eh0nv=Ebk_zuW z{&39oz20xAv6Ux^9GYYVOY}LMofcy;& znI*WF_1OE+uNy`Oi7aY4HS(J|zx;K(vYjtrq*l${o!iSRbN9T8}e;#Qr zDNGK5(I^YVoAEp;jaRw^bKz$)$UV6XlV|RL?IWQk{H(9swbY=ZSub#ZoOy>&$kk8nepFwMFzukHe z18B_XT+#{CZ0PWY+}A;Sjt;y(9b=;wO0}+>wo-j!b^={LbW1hc+v2n0f>%EI9#6S~ z=kkx$-6h@Q`ITb15La7v4LNza!gfHNtb%o|@ne<4a+~#Ko=Tqx6$a(&4b>-Uu=L)n zXwV27uQrj6Y_Nv2P+an?ako(&IG&we9`Fx$7ai|6!gdCr=rc}ztX_VjCAw~|*3DE; z^((bXDf^i0_>e^6tkBsThW=hJXvu8V_4a4mBtqrc`u1B> z7&l-J6la}LrweI~_q|pEAlN!?W}lFyp6m9yG(U`20Z&&#X)&gYbsSUalkT}I*R1H0 z7qCIxX##@wUCTy-jA;kj%dx(O@_&PNZW@L;p7Njpl{);Zn&5CH4H)#_u^VN#dBE}}imFfz!X_v}jbtEttiVXrcBBqh}A zt}mdV@K$d?^Jr=%KhtL2ZkoCf+k3D4u;ox(e-SS63z$trbl`xtaNlge6V#NB4OlR? zi#3UB_tt|pc_=q3&N4gzny(L~*e9p(Lxf!uW_GI#u3De_5S>y1oz&GI~b9#Jnt8H5x zkGqUObbLl-rpCQ< z_TX!!m3H1;ow|Hlu$su8DFSAkcdTDVu6lm3`2uqi5FJ~}%^RZLH#h#dQ2c?^=_lZR z4W-M#u5``8LyBkz$f#PIs`u!=HxLnfZ6-REUas<1p+ayj zLM#l?f!HL~EOfPZgIQ6J?{`e9m&z1Q|GKD8CO7m{v2QxlWDcE*o^No7XB2S_{r=#E zm~iEX93%U^6z)__>51sxAF&KjlimdX#*EVoc(LlxI1wTW$6UXwaftr7+_%7Ms6-1v zJf`1z6qsZGndaCKae;GsbbqXcqCb}6t|8n9@mq6xx z;E8W5P-e&x@QcnI4sk+x{@3rqJAQ?pZcrPtij45dWhf9TC@!s-~ObU+AqJR&Wfs^*DNuPx5 zvoZFzU)9maO!o{v+iA*X_s;*I7IH4I{o5+*0)*a{(1k%RKE4ytH)MxL&x**E7@V{5 zP)%#Gt)s0{Cs>gYr;K7s*55Xb2eOYlReQ~mv9{~@l8kEmp95~*F{YcuWeuv+&xsm% zcLy7J9R6kJt4rtor>dswUH}^_%JQ>(P+Z=fdgJv$?yOYA%>}rG`yf>*v+mCVNBBpa z(Y1{^X1?LVJtY-578xtY5|4a?}gg6CfbA55s>d{hXT=Q-fVHV9?~0E%WxRt;FPUjh%H3FnVV=y4Sz!Q#I8QWg1R~-f;`;!@}Pz}+w4g>$f zERMh-?Hs4NZ5Rto5_O-QD1bYa`8{voTlaEv-D@$wLAOw08a2*=(!P}EU29#U|L^4< zJd&HNUkuxS$~1J-_^h7nXP#J`O8~nmJ!SX)gf8&}rJ|W4TA^S$lsN@*F*%-&w%ERRyKIter4GItYqH$i(k-$U7nCXT)D!%@D z$hWXyFRFiIm9O(+!70#d-9ut-CgY!4I?reynvQRkc47e~2SJI97Z6i(8D*10K>mU} zur!O`9}Yh}(B+>^{V3?M&G!usqoa`a;+%myV%{rT>w$iBty z0o3omY{m{_Oxo1Tv>)keiRW1Pc&i7|ICT?WMS;;-a^ZzTNrQN^Ps4>66LufrTQm*Ed4bHt$W0;PrQ?NL7iwiCk$t{ZTPGHql;T@dBV3}XQJ6$mEMY2&Q*6G3jf!FA&If5zRx<= zVxk4UuNR2w6+(bQdj|wlPUVq$A4&CfO0SE%nnCgXS{np|_8zrcIF&IJiEgB?@%-Vi zY8Xj1ReK3P=*fCi%W2M(HAlT~dAYjIpk#dfKp+^oTcr_~7FUK)Zj}`}5K~=pd73w{ zv6WggL}h!{j}{ywL`b{O!H{m)j|1l+{`@Pf_j}!83mlyypF+q#YGJSRJ<a>6FpT)Cr-%W{VGd3ScI9iMI(nJhRm~ox1k`zyA-BX)e~)XhBjB;{o0>=lhFvCx-5`P)-ub zyc~QKxdZkKc&ufEiS(z_08r%H>WuW$z{aMZ?!9tsy(0XVt9quDWkcmI&T6RHbOB+V z$np!3Pr5F`Ypc7A!sd}w{5%HC_H1Bx^EW6IwW?A5NOw>}+bSDJ&Rws3oD)Qwd~do29lzL*So~*u|505#Gk3Q$tbpq(&h) zoX}$IpR(^5=;MClBQ*(v!8bqqfG&zgSZ8Xtfsw?^zHel#d~ZC9ytOH-U5`~YW*yT9 z9YrevMdVm%GYZ^CA>GGE>wGS=5Bj zSNiA3i2vPXpRyAn6z`xErT3GE!O(X^<7~x59v%ilPqMaE)I+xYy@5pgK86WCS0gqioA^Tz2)8{+#QW>jQbM^Cthbp8JqE@kNQIM|#gj6NT+QA8w%sGn(_9rv z>F8kS43;xhyI!}QFa~YXj6F8Bkme2!PScJOdG?!o80`pD(k`4Hho?~=GFUG@x6h=|anDV5i!Xma)N*(<>OxOvb{>z*H@6?}hrbJd8 zZ85YJw`Q-(u-bZlS;;#uTM0aneX5)g?_U){*U>56I!G^X>E?lGi`a?&xi1oECJz8; z)f1%dk56ykyXPIK_Y&#^F&_q-orFdZ`0h*%v6)D}EYvMMn5_;{_&z@)eLY|MkMY#- zHlCIo*(@}M?bw#oHSd&_^CsH&|IRJj%3Ge&vbc0IdlUakk&i8r4p6N$EAj+PJASf| zZ+T2@K8Q7%S5&qI{KaAsQm?bW z#apP$QL8Ov7S_nVNa{^@*@widEp9P1 zvzWuG1AVhXy5rXGOY4#^lD2^=Jd8Dn&-zb)BDJeH>Zt3(quQmSf&x?T)Bq@Ns~MvE zo{Y`kZtz}OhSP&3*!r9MTR@F8D-Y+j&yM=2mO8vI9K$TLzB+3Xt%AaIHU+MpkTYQA z*=Lw`B~yB=(p92Ou91$*fW6V0wy zGm4E$of3ExHEg%gvr z5B?7|{V!_(DB0JygG^qgL>;?CEJHUP<`u)<$`(ss9EtUK)2w#z}VT(KaZB!7*y7p9#he}OLB5%2#msu>CQp_H*EC(rK7Dw?msahTg9Lc zF{XS8?#sq4^eh*nVi$VM2?;M++z+Q$%!U$TH?trd@_%kUb$HB&DJZ$ubdlJ{qauf* zvI+{M(3eHML3f#w@)0q()uv1#B?>#gbMI|+I6fWTD9VEYpxM|HjT2n#34qIE3Xp}; zX1cpy%>BZ9FUX_{v@#0iinl_QD1-LXKNQ(iH6>lq-R~nJ^LqP9+@@rYwJAyZ@9}xDW`UbaWR7_(7e0|j6Pa94PuoNBz zx&lBhyyEq8f^p9`v#?@0`VAtblhl{pxfg*bKxx?$`4q(k$WRFp`6i^O%QV<9pw0TF zGes;0JPnYX^6$<&|J`e*(|UM>Uw5$BGW2WzFcFNoRI`*s;zD|Uu*2Oc)+UTT<%sNl zujMHmTCx&;HM-#A;KLu7z@($ee zJq>Pp*e{ySO_*s9KwP@}H5z4%`2P%dxM$B5QY&$CUd-rw zWDdFlNIol%OKtORQM!E~)+KL7L#rx4T&R5i3W0kfpBfzRu|?~-f|V*@m*%)T0jT0z z(mW9{?oG_WAA=5Yw6LiWZz(STA}*b8Zis_L-b#v45m{*$ zxb(7`0F{InImx7Y(YLs2d9|W%3?|ogf-3vP+5W2D>o^nq7XL(|3?aJ9t#vsrGgD}z z)$}yD(pW0IOx1)D--OS6s zr##j|s^qFxc)N+d?2pP6HI)2f0gMDpzPEf_;LQ9t)?91-jB5R-Aimi!jDzZW1!!ck z1Cz#4sWX8Ad2)#~0c}Bp&>#35+&1uSU3df|@OEqzo-^8%tddjDziMuh(!J zTf0TFXEqs9t2 z6k*`Qe}G8kND7EO#Cyurk5{P!S8d~rSwVHp9{J5O6JhtL%yB4v6pu=dyd^L6xAc$^ zL2oQ+24|g2SwPt{2ETl4ZjxCv#SK~Zp2p<=YqL(vpES^r^U66bW7FSU9J zcYF;dZ8$UE%W$Svs&wCU590g5C3-DH#X4+8*S^ng)s1-Y`*+lXlM>WHlG?uflrU+4&W}qk7Ou!oXF;m!W zqC(f9arFT``X5{U?T-aBh<}LH6K?+fS@Zv_OFMl)dkuVOy)O*B;@u| zD>|+MCYR0kh9nf7%+>*aSkulgkG`lz2_j_XTD@wwknWx;ZF*ik0z|U9r2o{K;JS|> zyIbGMX{eEGHvLcQ@t^$s|NiKYcoQ%jeQx?sarXb-vj3CCA|C~GuiMS@K_5NZj?2o* znWrz5misKy)|DjVn;b>W_Q-WL$k1=1v6(fo4K89|z7Em1^&>{o7rM%Zf8o9r@W}Rq z*uK`o>nghIaXU=a}75zw}xa%z@A*PjGNKB02S>#*ZOo7W* zI4j)s;k%EESTi<)-aK`9DR-KL^cf0PUmxXb#SmgYN^YYzNBr#Vi;UyC!V96^vpUDr*0|=zOE1tRz#mWlZ=Qaq@i9L z!-)Eo1kkwaJD=HGL+xOO)R4JLUQ2GFrxq>SU_ybsgQebV$EP_p{eId0X44?=824bSj}cuY@o@Uv zgazZhBJziwJb6@?Te2HUF?VAgGSr4_js37{Jnm!&^0qkr_vC(^*zKf|;S5PE&3B9w zlQzZ%5i(#%$0&>yDFee~#VlFiHwqR*^dcYC# ziBCJn6h(dB-9S2D9&|rkBjRjeA`d~lQ$AD2OdVdl>CL#Ei!J&dRxbv$xKjA_>x|`Z} zJAqP9aA`6hh_}IHBi{k42?fUAzWrwwMc^IvgL=xpekrKc0`{3q7M8zh!Z`})38n7; zMb%qJMfJX6zaUZ~B~lUtB8{{X3PU3eq5@LV-3`KkG)hP#EoIVOLw8E&(A_z`&wPLH zd(K+t|Cw2Po_#;D?|ogLYfI<0ElErhdsl;sA_ZKB{|u2b5(@tBE)X%z!@K*;!x(Hf zb(kPU@)IgJ)5>#f{dq$?R14@Bn>+&ZJ!U?*5%P=5cO0=V-E{u&@@}6bMUeMd**lrl z^Z2OOpw&bEvdI3wp9=@~6N%=+QcA~0SKkKc=%B;Y9CNQbCXdFJ)k=C<7MEH)wB=HJi`7k+GD$E6OHPvct@Opwan>615*$MHWb ztu`tDn+H>U`OX|yJ(|1pEb#N>1ddytt=F0I(Y<64 zcvY8B8{T7gCS8iSJ3@1tVh>+HR0?={#6zO&DcFRQlcj7T=v zvyg+Fv`d{TT2@l@5meqw11yV*rRXdoBEdAy!8v9A?`8gP{g?$B^QMuom|8g>BAa_D z;7?&WgXYv(Uvn%j$_8Q10s~~s{grBs}`@Vr+WmS?g`k{Gk9N@@Hkg$uBkC?)?;PY7+D{p?;qf#9ui(SGwm~ zj1=ztzh&f>rHS$`C@vThddH-*Z|uKeek;w!f0uvx4={P!jWkaI&%dqAed95_B{UaV z9jq(&{~vYJIk}a{ebAkAYTUBD_iBo~DNT7fQy;d7s|i>sL>Lpk5302h|L>O67Kvkw z+2pptIKSAewd?+V&QwZe^ks$r_K@st+^6cx^&Bo9{WAsfq>mcl-Jh}RA|$`f#>SyN zX${_mJnHY*#gP=u%Kc~DiAkJa0Q9XTEWZwn^EcygLpZ9Cu5C8D?B2ikFtkG1C@C}RjSEA8#%o=}K0dVT5Pf2O_e{|X3qPyRE%;fD5} zY7#jQ521EH^E&SPXOA2IsD-#tWmq4C3E&tJJ#n$WM&AId5KoSvbIWgyX0 zMUay_8F(4-RhLSZfufPp5QZ3d#o>MUuY>IWmPkKQXG?+6dQlx1ud^Y$G0OFSJhA@< z_;EGkl12*j4U5wSH&S<{Q}mxz1d@9B8~V7N_P$EWiHGQo{1JSqrzo5jT_6#{V}r zxm#Xc+{x5X44fp!`Bs-6GYxOxX>h*t1$8ewd;v1r4h2k)Gp>wBAp}E5UjFjg8 zeUW~fo7;iNuknZyrPIlscQi3r*Y$)rBcVL*_usX9{$wD~#{~a;T{clveBv0P7Jb+L zP=~I+7CHE1enB+pnF@}gOY+{N*!q8kjwwDuS#dmQ)D5!yZ?9kM_g|g(eGTT5HpcCn z#MZwnTl-Yg8hE@2FAOSH+lq0_f#jSVf$M`AFMNivEuj>s<)FF4{>Ai^&R`5ROg+tU zW^1n~;c-Jm4sLhAD)?C7AaP)+J%}@ICR2`cmD8-#s3j2PiBYRvGYud{B_n^ z6IZ$c5y^{}9C8Ye5)qo+e>L(8#S;5C$9M zy{cuNBIdkrrnn6wz)aVQtF1QUbf$d0nO`qXb&wOC9XyA-#KQfnEDT7gpTOQlS?QfJ z7kuqMf!n!%t}A5Oaf#|>#tm#{4r_=^S(g8o1#lR*d+=I+B7%X_U9clzizPV@()*eA z)_HT|C=B?Ae}wDvl_(9qeqG7Nmp6D?h?TMN)5`d3oKo^?{c&<;>W_*$_3;{D7PR6w zPK~tGJB0Tfb8;?V^~Xz3$e#wETlRi(ZoB}IV0BijmG9B>e(~fYtPNPWy;|sVUVXSm zL(+;9`;FU4xj+o##LqhEw!W;-1SMu9MxAoNtnsqu5SugRS1 zp|)Xtk-mrjFu?X%p7(DfKUF8XW$_q<&0^S)K-EZ1Hfd(?!nKuo=!@a1$P)Gjf6 zsq1s@sQ}?WD5jqe+nEQo^SyMjSJU1LwKgfKf^Vhw%I=KZ z-~?YJSbg8vF33=-x%JHvti(I3`X7#QhZzE@_EJEeLqO9u_%>G(P5;z{4cCQC7QgB} zZM)4Am)iW234@_=&VW!MsP~rxnvS~jeXT8=0B3*}KFzkuZp*y+@` zbvN?*KmUZb%bpLIakn0xc<9~ zHa~3?R1N!2#JBq-= z7u)>S{Rzh;X>8;jMRvJ9t`Q-ykYJmssCdtzpXA$Lxb`Y^3#B@tI?&awD;<}4T~w3d zRnhRcU9&yHZxb0W8gTJs%S-B_NpU}a8V|A6kUCgcERS(psv?)0AwPJGLZ2G24+;@Fab? zMT?5$+Cu%Y%j-rSWLK~Zw&YGUi)GI-BhWSjbzZKO=hFK2n7>wNxtzJclhZ%mqz`>{ zxMJ|!d69>F@-{D4gllz!vRZ|82ui)Li41tHlwjk*l;i(Bham7AF63kI%Xz7ZT$*d| zpGoY*X_va$pL zIFjY5w7{{|%v9d}qF*DZ8~6kG!(ipPFSfcVC!;sI?PvdFP5*g2tfv%0VT*z`99LNW z0ylN%`_r7Wyzm`T1zDKH?~Mw&aN#;OzOZ|TyuSd8HkYs*Gxh$5_o;l(_ls!B`RENk zY0>hLzCJ^)qs~RW=XJAWgQJ`yJ?mFJd~h^5os^~1MlHr~Pp+)=dxa0jgGV;|Awr5# z6lqy84V;YU2h(X$@!BabT%lTV-#ZD|BWy}D6^JlTjU^N_k#eQlxlv)=FL{mY|Kxn? z`!v+R6`yUtUWZa%{YWi?InA0Y?4Fp=&Uh-UFx~sdhmXq@8s24P5y8!po|thrU^8Aq zZZ{*eoz8IhH4#w>&d#Zh^T`h3@LY*UP3Wo`3q{&e9ci3JG6iOf<-%cD({g`Qb}8Re zYisUT)8Lu@W*!pB&pPx-3ru@wWyP;yO5L{IwH-m%wDz4$Y`vnG;35y(cn%(@EL5z` z$z~U3F-Y|3@?6CaTk_*7r=aC{>iZ5^b(UBT7+!U68}NMf+Ze3GF}v;GRg^&qqrRQU z1P)Z-K#BogyMx;I)$h^X(f(2N?ys@N<<2N=zCF@evc>N-!5{jV^-Nh&?}sjR&u_9w z8>c3dO`C~)nIHH17aW*X8EBz6{1cz0!A&ie~T>(R7{34D)1r?5dVno+#wG= zP(VxAjX9r5w+pQ)Y#-Ne737o*tLHY?>5VOIU-gx>ytLH^KGO*$ueJpaA3Xb=)|2bE z%FC@7FxYIxxH$vh9Jw|)Lgm1%vr);mW)g?UCNLtFJrsNkE2{yzugCAo077Psx`DSR z9KQ`JX0LDwVuC!HI&XkIl$W18=lhCFLH^zpcOl~D~@9j zAs}5npjvX&<~W#>5oXs}{OL8WL)CQl{c|edeU{+9ep*5Ap9t%7OP z>b32B7(uuF;>`~;7GtV~Ld7U`0E_9oBrBX=Dusjmx=1~>4xNhk7j%`P&u-DTgWNLL zEl7;t+3Nd?7el1IO1*Jwx0ju#4Rw0m@9+}uElnQdLKa&(qs@miC#^&bbyDKe_;6lS zouq)&=!ZpAz*nxNA)^}G!EYp^PbU5pY`50AF!7Ra69sV70WQks|BCvFMO_x(WPuZ} z1MVWDQ?`fb4AgP&+o{H{!FgEc5N>Bm-Fz~-r(J%@UvfBKF<$Z4InB+699>Oy61%r! zyD=aHtnPeeTjFeexyeg7X^}Hhtj;u}e;Znb)~=PwjJ)}frVx+{XrHuDx)2x)QWe0j z2u?HME&h1?6oBfc4j=AEaPUQp#U9X~!1()kRUnFVy-+mhLP+qtp@Nz)Pg~8-dx*3f#5s-^MB7)+~_|)|-sfmM3hTi z{}pt`iXhzF&Ou<-i>3r>5y6>r=e7?=JtCHR4>>O3b8|ohh-WI82Ocq6M7oy57?leuTUD#YhK~l!^27J ziq<3ZBGMv7$wTiFog`scrArvyKz6EMnND`X`QFR7YyOBIB3m4uPOVtTQKN@+X(m}# z2qG>m)0;>5My}K?u(Z}qCkty|8@)(lzhb{s%3G?zw>1+D3e=T6p^Phn5u(00RX|mI z2nEaqkThKAAEF%GvsGBBurwMY;|ABCagO9uU{#{KR3dGjhkcinDCosj)7#W=z(&I}qV@+zc(z z$PoMm7$WBQc(C`>|4RF8;pG46s8Aa{hA+XWL;TAtDcikS@{1ie`#G`rv_ySPK{xH( zPwDS3ajjP)m3U@O*vHHGM`KuQP;NUIXN)hw83zBIoV1+DJez3k>%uY6GawK+miP*j zuYprKZZ{uVoRP(YWiTGnt1OReAo(2pdJ>w$@qV3RNp6X<2Mif657M^DaCQx~uQ>hc ztG;-qQ}1tNeHux~|zB;Awlqa6z@BjwPbX{O8di!OL;g=q`jy9&RN zD~$3Sv2 zH8kLm3sDe6IYT;!bm_`{$(6#GbIq9B-CzQM(dzc049N0caGn^0!gWc3yBwVyQ&$t_M& zF!lpDxBB^lfr4f5&;304mRBqCDAeMxND=}+E!|@n?mD$flo7KnsfZ+U-8$PJz!?W+U;*Goh=)to5 zgfrN(l-D-Fm5sLq>|;&pD}k>rh|OR~I~Eo|?|Cu~X0N;3goh;GF~BS*ZqQT!cC0rM z(6an*QNG9QwN6RTVxVO@h{JDA70OHIcm1D`__&RG-*s!j3$!skxI=-#Q&P_meCpPY zq5El9I8I6@)2v7@y0Wj35URaty{)&WP_ShAV5^BFc=_lrw)Ym;dUg=-IM_mWEd8nR zPy7TWH7F&@?1~JxTE*|xjLX?B&kbMn9|D$jU>dH_yo={shQ*`4spXt~Qn-_J`o{h_ ztTrJ0YHwDtF9F04`TPE_wBjS>d0;hQm&ND`8csx!9!Ahv^v%&0oko&fk2iobFgk*% zu~^LQuJ?EQxq@NSrsUwl0llOw91A7t2JvfnzzXrKYT`D(&?>?t_S{ik;QkN1+`UM8 zvoECYCiJIBB3=?N^l9B3=N}%TG}3;(-9j>z&ov5c;uvBLHI$KG2nI?5B~E_lQ#?*@|2kX^s#>ntCgRQa$tf{m)A)a4Ei7W$O=_;qJqPpN75wh zW`2Lx_b^p4Jb9z5#U2@Zmz}&x3l9&;%S%Nn>W_=TuGi=88QQZhQ}mDy?yJ}%DI3I@ zzMl5Rd6nE%j{ww(dWala?Y{26xwdM4Q!pM%7(n!>tYI}!HO?ZE5T9E{2SO$Q$H6H7 z_B|+7Z9rB)x0c+Ze#@b7f}x?_Q9+`@4t;{AE^_RnfZ%!>+j{m2CDw!}C=QhH!xN6v zmw(;JJl|nqx*-%!ok%K93*#9fW%(>bN)tgq_=pb{446u7knq@2_mh7!ZN#mML%~#z z8G=R|p}j)EKdAEXIqw_zPA2uFDh>~A$MIq9j(?eUAHjY zJIWKqk>vLy`^r2^_#Ta=>18P&u48Ut87FXp1M2=hdzSkF=9H|DacKqk7PBtl%Ge^j z72J8~6~@Ud31(WL_DA;4XqY*`F$_CbE+@?(B{F=02H$7 zU-S~EiV`^l{Jhmcot3ggT@r+vbLQLwGX|zwzIw}+GvMLbV~i_2$b7%)pZvP>z|%B(S#xjFK0)&YPoUI)(s<_9SVo{_H}>a+|(qDQjV#WGEG~_ z8m~nDVMQ*SbfY#)q%mCX`PDDpB9eSAXr(h`=P4>)+f2t6{aRPM#i`}wiD%}NOF^Rf zacDvFdK20G1^uY*SI7lB%yvvsLJY2#G$&|kPN1ebeF+nM${lc8RFG3(R3iF{C~N9$ z|Dp#65|`kix%{-@#8hXyB5gzvmQv%LA9BFkbTIV$nUH*6DA=B_{uSBXV2l@4I|J;n zUk0r5g2FlIx@#+1{nbJp7#EF9u{~oz(4MUGA<2|%Q*u}vS?4r+?<7mrolxkH0To;P zTub{{sNj7VL4N8=i?v95Riecc%itS@;CCv)j=j-~P_1mE{9`uV(V6;B4nQ4Ji1D2K zfaYFehM7XJ<=Xni#-9G(N!fLn9hO_Hb6@k-$aJ1)P7&{Lm*^~{5kuAh zE!OFc7>@%QJ}8AyB|yh&B>| z6Czq4?M+f+Im%PznQ{iCd(9sL$6CN{f6Q{7Jd|Eoy8nZTg*ffzKR?O5r%|ycXuMjC z-<5gL@!NqQW_|0AOXBVxX$IqRrKpFZD_>Pv!|WL?^8C>-zKkk>Lq*e*<-Yu8e_{rR zEkow|$yW96iYT2OYz9#zzOLC7@^1B8VcrCc+vvBXnoJTxUZ2+H+ChLx!X-KAgFtSi z+fl#I;}qq!DAo4CqW*NKW{jivG6*7ei?fN6Sq$e3E33^T{n5 zi$vn3HX^KT2dDB$Wr*WVmqir!t8>RYvvsDG0FqpAmTH1G7L z=hHoVOL|>i{D+lcEY3VAOo-jd(W^jA@QZ%RY3eohv;LRdZ0sWx*ohW)o3j* z7NQoYa9>@waAfVP(_*y*H&9$af%GP7X9ze6I!S0|!}ijdGndWBe@4v5u0K0%mGr=7 zZwk?KuFBaqVIv#wG^cv18Jy|&muEM9q}ra00d^Ka_(sIEkdMWvq-4@ z7{iI1-`)3jl=J9B)D{^pBwQ%`d02CqRf^7d$Z3={yJa%OISf0>5GmC@NPQqjH|9Um z&A5q)$DYg6jkwyDP5;vnqofReif@Dd2q7NXJ9O|mKp|-zRGVhaf}Yw_LB@z}v~bq= z%Nf0ZH5Ryw+plZ4y~>8TRe{B`IR0UfF|EIkC@ZD{T3Hz#e7}FYH^cDpKOTl$Jnwq) z9i|Cx$ssUYo<6{Ci($CvD^~fDT1Loz0%h#lhAdm!>BoNx2x!+F#PMR(WO?0pne2*Md432>tZ_Y9^+sW(KG@k2g80;q zl~^3A`f0-_+d+3xSbxDiISB*ul;@wSQ$L%ALi(|mrth$@;Lqi`UV@kMz6sQU@ukh zSH!Di2~1tB6V4(|F2K!*ANILjH+zqu*2x)d#N0FI12P1PcFr4~ z**3?=*{~8)7D&MS|4JT?)cEVF60}=;hf=Jv2JEeGoMRKC4LXhNa*a$r4swP`WJbun zh_5kxGR@QY1VMorwGa>dOh=hb*?q(>@DRsw%j(4`pzm;(bpGgph~^2o)lgY%o+PyY zoj*W`(B$E?xL*cGc6$dk3mhG#`y<#szm0-DEUWG6esJ_yGBwOa=5OL{Vq|5(^@fIG zQhH5hFUN|@`v%^Spb?SIe#)atWCWE~IQ42~)n**Ezgk{LsI&{1Gm#OV*`@szb0+QK z&X)SLex6T3+Tn+<-ntQ;bvqw1`VIv`X_d-hZH^(Al^qfj=rQnFycAZcIFX4G%Zy$X7}?y^>)_N|Rxi=lMUfXvQoD-0^ypsczRs5j;<5C$N+B< z+y}*JCi1mgTlOpzex#a@Dn!5-!=b$f3WJb*I83Fbw<`@ z%N(>^{z#eORZZ>8x@Uhu>OA@|EZV>Ojh?df0IXiM)GpAGoj zE-5qkuR?(CjXyQxg6~e6)vGq{G4QZyQ>zuVAd;PF^22C?8?-5yo~P>il0%LJ-P?wv!>0%jH^2Tx zn%#+BeX^dSqrM%x`0&MXtA5q!Y$~_Q@%9yEz6hRdR^<4%Z;SIy+$n05#=QkWHKWau zb`uY3v+I>{DmK|$W}+OS&r7atGGCq>uW4nWzyaSxw+}6G$hW7mHOHTTrw#Mf^F7aF zlnv+~#t8oU6y7?P0_0hx zLq_9Jbz2emSKP)lx;~Cx@E=BgUV--(ij^ZC}@yp}Fw{&RNPHK#7< zHouI#{RF=_OuBWMR;>bJt;X+o7a!Q%Tt??)`! z3-K9tKCOL}7ylU+xLp!5_vuV%nsept6#y=T08g=YrND(aH?quDWrbAUonGlO{IvAg zoP>AC>*l~*1FeIxRj)b?X)D5{%|7*buq27>_dHTVppET76(th}X>a=~q~i(eIucxf24FuRLq5KXu=Fi(%Q396%Ib3> z*!$~`7>`cZmSb(k5>J~SN?GUBHmlOUN9ETveIUIf(jn$F0K`Cfp!;*x{!3DFL1eZG zfHlSbz8)93&JywaHirHXEAD5RcQ(;Yxvski^~a=%!{VD##O1Q!EK@6E4 zy=5d$2bbLiqUMR`kA*WyZ~J=@ySc{buO6?;0UfI!?(O_`&yMgskE-wMS>bHvdT8t? zvh$Y!8(mWKzx?u^Mgd1Yc%P1c#onm4IBNclPz`=)XA0*|h7CiqzU{w9$yP6eM2R{Y zHgB~h>0K3H6;O)2G51B}#|bf<=JlYPFHLhlZ)X@6e*LegU~x_rzJFfRzc^T_gF3QK z(b(*U^xXbP_zj1mMe7gdEadJ_Z7^PO-73G_hd}(9!$L{ zzx{k67GEkqoe;*&(Y|faeS8PPoRkJ@dB3LZ^v}w;b3+JWbZfSU9JaLarrF5~edrp# zunq21_KhIa^zQn7XKS-Uq`kLekbk$OZJIGBdu&Tmfa?kM zaU8w{usUY~X(?)ID$);BkZ@Xr7HySGzo=TQbs)aK_9|3eclCF6dbigI!I!Sh zd08`rg{WvuyA=97!TaaRFE?ei;p~BjJ(o4KFTS(#6G4Tata4(FOz4z5Tp556#f97b zQ4<2=NW=l^swCIxt`u=YC9L@iKbW!j(APhw zUJv7C$rH}@!=DVY)$2lyi28c<63iEPwm=tDf+CpEI;_sXG%9=3UB(c!7F)4 zFP%z#sMVW#$$QGnoX4NipUYOc+Y%iQhc@h>6Fctb#AO}kPPa>(u?#q3+h zmd(GNVaTHw+v8HZN0oYncorm1beFIs#*RZ&{z4D%={mQz$#mFW6u2nD^4hr;LVc7{ zNLP0J+CSRuo$Z`CkVe>v%kC3Sv3PCuN^K;k<^ zJ-Ojb;+M`J#yF?C$(n&`czs9y>lPk>{)2ja3!J&zo?FjD^$WAna{s5`YOUlo?lbeJ zfWh9Bo7Gh8Whz5rwNDO3N8bxrrFQ6m;_ z*V(1bwCdV&DxDRdr0DK`@KWa1MTdu}(<(ezs6|3^Ck|NxX%tsbh*2AF(<@SqGU(Tj zKvZ{{H+DbXpd@qt|-u7jn~+Hv!u%K zoIBWc@_7Cy%}@o&q2+^O`mlloX=LVi9T=ujh>Tfz5x3Xi#cRIONT&*1_R2m74}VX? zS;LGcB1_!P2A-*$m!6$+9_7rzZbjH0Kw5lVemsN-3>PN|b28C$tb2{@i5%qx-dhNX z>a14mQbXP^;>Gd^!!j;@q(kA~HZsmeAaAj1?D~l4uBC3}V*!Sq6@!nRO~icrZjd1F zDx5YE-vGX`;@aX8wqMbQ+&!UYay7@?WWwlh7;k*rwC^8{L?sw+W4Ne)?Kq8<#v1mA|?2nNDh|t6*lRE0O1=x;u>VbNi*-0KcCfgWHE2V z*8*qerl&8`$z-9uo4uy~kALA3WXdgWmy$J}8YMz#6!;!di09VL>tf^7#x<>Eg4D{8 z4P${3BQj@lbg~_YE&cmZs@211ZQs3IwA#?*3y5qOGb>yl|CiI>uJAc+TcLWJAla!D z0%Xl-i=A-FFr*89ejX&-_4))C)hY17TQDRVUx@XSxpeCm_%H!_z2o`0o!8N+rDrXe z7d`@KQMy{F(8=ki)5Tkp(`MN0a-)M=ROWpYL9n z`?dLGz5+d5|1f>)w|2YY*H2fMsx}La1!;az7-UPo*kAn{bo5$J_M$XnCbpLQM9w$a z<8e4$MFc3vzc=v4G7Y$%RivblZInF8w36!H8?>Ar&|42P&|hNADa|pv@7+*5qTmO^ zpdR#n$fxSYA+(t+D4w5A7G-|AtzVzYVQ8>Cquu{$5FUM>-Fw*N`nZB>&QxN*)1%+Z z^})x40t-<8m`*P1#6xT*uA86C2{u6aR?(UWdA+FS6q#l!wJpo_wIpUSUIl$jdhXr3 z2Cf5dFf;FRC$WFvW%6KkpOEh*jVShy>+PWy&~9Twnh^}W0j|?Mb$OQ#*CK=2Y&>v@ z<;A@-e}ru?MM2K0fe1n-W=kFPf$DZ~n>HAa4c zh|wjJXJ-t9xA59akwUpykp01narh>qTn(1+qu6{UoB;1FB3lQmkMK$nE%scqqlKO? zvuu4c(?Q|b4b_<$HFVoLl1w#cO{kL~ORC^l^ViZc3RjKB3K$p=idhKrenVoyz~!N^ zM7*2G?GUu-hz}{=Rs10@x9o0y0E46et^&HQaUrq)pupP;;%f*YU=R_upV*z=0f}r_ zHu3W4lOt*JKr}>vhx)EkJ@5+e15C)d2UsZ<$jDFZ@cZ=sqcrHZ3YCl4>MiUp>@P%Y z6IP|?3SrT|-md`CQg7h*X=rz1|4Tk*gibfre<38^;3pk>{LE8Yd0;_7sZaeVE_Wo&J8!WpXsQ(T2 zK^Nu$smN1*U5vLt{cc`R6~oOXNezvu!q0F(4FU7ZzkID&)4*}B8}vFxk&0o%W143t zW}2Y?MSk#wLsgO$kKj3YGc$qd@Er_uTLGhPJMtXf9H};{3K(b2*+==D-?7pv8ZNf2 z^6}`7mr!cI8F@-R*)U)kL0sx6X=aw!Dk6wFk2VxHsS?FbAHwzsN=^M(`kRQW!?8o6 z2jrU-1(6xsaG_zyM$dWgXCX;QIe)Xysa}rHn9)Q2Sha(uRqkBx$45X%W)woq3f3sM zLH)47(S+SW%Ozt&=*!!5_Y;LX!1Jo{Rj5$qpQ)$gz^YyAQ^9`E>!>$)BY!Yoef=zK zP~CxtMMWJ+szT65b>Ov(OS$O?z#i~lFhOx>TGYkOBrh-lF(q-Z<~Me|ools%-p|t@ zeHGm$+Fhd6+%3D5V6;T6ZS{Miljb_i^OdrBj{Du|{g7Kx`bkEu0QAisOr0ZJOGaB0jG)<3adGvJ7q6_5O0hh<@h2U!e9Y&&zGF1?9m$4uQD8N{dUX+ zKN;YkXY@nyVfSr-vJ@n)nRMT5T+g^|`RDAfJV1$RBGf`WOh?Uau_!^Rd2gxAjRTE) zD{DFs(uV|ni(Yrj+MwDgyG9DV{bz6?P+59Wv60bcI}CkX`A+ZyjzZBP&tQxHgG8w( zVfU6xc&jEUQj3O*3&Tp?SL^Kwm4DGUGbzh61VV*5R6-Gc2n*RcF+IHSsCkau%rFe0~(DMC(xtbSITR~eVNA#mB@R9b& z@5J8ye^dvHp{q8x73)6P7j8iIL9*^)-1W=v3hSdpK)nQgQPGfG%f9eq*?H`%&urD$ z7N(}tFyeJN|wKv&@4^~!ak(7D*5lwq-b*Ubw+rxtvwgU0*z zH2V5`xgFz}A@ES43(9X%NN$yP&L0Fk7J_-Cp`l<8h56X0H7E0NDG9$cj!JhM1?bnO zCsB&3`?tegxX56kx9I&Jj~nqJ($8P1v)HK%foxFp_jNzjI}Ej!oR_(`zITKi1r@nY z=KSfGeC}YUh)U_thgn4jZvny9TwF#z5V-eWSL z!2g|(%_^5dEa}8RW!Ot+Ci$?q2$=dt&Lt(M+E}yrWBRhYh$tZzIO^t@rasU9bC2Ey zO8;s+o&ujKkU8;WwA`4ii{*FJ@o{YY`Jr1o#Zp-UW5SXrV*CfhePlQZ>SOi^QOMjX znzcFrEer$nkKMXRlPdwDX502O%e_MzdA!1UM6R_1=pK4*UmDZ1I-Yz9$#~px_Ew@~?Cq(Bq@_W|XR*5vt*eIw< zV=#?i)AVaSEVO6vG}>V*Q~zZQd8$bJwk_h@V323fVYU6sLGr>p9-R-V`i;-u(^VVr zKivDf-fjP~|0^L4@zNM*o4G3ZOtbnmWb~w#JMZITsz2jw-f3^u$IW%gy9s(Sd(FUT zxK&PF8MoB|b6LM&-2llL!3~(rG4f47Q~2obXG7=nMUXO@m-Y5Ax(l`6cGIEUc}b_1 zGVbL=uH1Gf|3Ccm}l0nj2lPpMpMeTd%mhPJ>@@1HBW3KRG za-7%ffn{{6q=C8BGopszJCK_vZz?zZnB3Pc=xh5KVukV-c-vo`v~|F;Bk^Tqt?bw= z^qyOVb)|D}bBbhGm=Rs|dp*!SEN=*@l3w*Lt(22-a$e4?N~SXo0<^P^hVO74zaO0X z0w-uBan7-dNqc1DK?rD_mF-gWhW48CJZLyK-EkO#?j}Xj3+>Mqh!eW81Mmcv6v|oThwf?#+{nApLSK_j;+xlRhBJ+mJE&oe zUEAK~gmcOWewv;Z(7$65R%RL`SA0RA=TMD4UY4$jks!)-@8qH~xY9u;u)X;ezyFcp zJRgExV2h8?JN>o^Gnl;|H(YB7li81;k;yo}8`!2m3)j;N%gK zFc+Hl$9xmtA%@B(`7ob2!%qGUf*!JQ`O_Y7j&^i(OkVEXUJ%|mRLNdvj4P!1s2)X- zh(iX^VH`l9?d5Mc$rq7OrY~3GORqY=!i7{l>H`ElknSH1MvP2-)eY8>)R*QSfX@4G z8ZwC2ex1jTe9{elU=j-*g17=(Vw;KC>ZlspY9EWKYR}1LFPHd^jej)Ix1^Oqm~a9y z?t2IMm~fXWIDnlm>J_=6Of4HcUfWbw2E;=Adq(D}`Zp_)mqoEF% z6fWN6w4JSr5i!6+|0{$R@R>8Gf7>?=-OR!7wvgzp(2r&B5(V-YpMGD955z5DqcC@F6L}2C6FVpj=WvNyehrYG5=}Tpjhuum+gou~Ew<%?tnN%elP9=FJ_Pm?$>a zx+>Z~@SXEMUEuKDlCc1XIKYxsVR4BP)N#E%h5sIaykvcTq#GRv~?+42I?#u&!E4wbfSjncU0f(#m9}6Uomt~mn7U#GGTG3SW%;| z*e4E(y}BaK874A%t3LdGcv7l{AQq+m4!E_RKRSjpgxz({JxK2fJvcll!S3@sU?1*m zA+kHZDKQHcQs)8~_@jk9N`IUuV~^XN@F$ zFB%C9V|IRSWTa)SQ$AM5W*k>g;%|2`@%l+50_v3hlZ_ZPRO%@u3{26a~yN! zbkBk2VV}BVI8S2gvGGN+pB0IdmFYN@OiQpry@IskcOjpuK1`jLZGX6%NRt6%42x8r zrRwj1L(*)1q|y} zZI?0LNA)72DHd;ooL4zMkV;MrGY^>_xEijYNda9XYosLE+!PfdknGV68F!1#+2_h?4w>!EG) zH0Z0IO++p$0UI{&?2%nD=VTYRLxv=sf7?%kRkad8qwBa%vI(}Egas2A zKnIgBhYb5W6Xx*FY8~@m2$9OuS3Z;Ndif+u>hE_7F2vV}L+Tt`j0-ArY4YZnB&n}u zX9&D0FTew#vgsMV=2s#d=<)k7?ihmVljt|r$u!7*6`q9(^Udw&6oo*+fKOU1#c|@JX+Y3vLbqfH!OrsY-oYHH2I5Wfsean++*^B6B*Dtv4ufiCs*`OXlu`2V5lEFYTu`!*~pB@NOg-Q5zCZV>z_Af2N_8i7em zcS%eHK?Uiq(cK^oqek~=7SHY%&mXY8SX|%uoab?fcVfn#cSY(p(^?Fh(uC_3ph8;L zmKC&I`1s(EFH=ay5n8_ivX4oG%Iz7e+wwbNo58 z#()^7Nc~SdseYCg343=s>rwP>0@S8EnQMY5uMsdlY>8V@R{a=sP<^%(V9|nTXaL2X z7*V+`WLaIPj)5)y41D_R>-tzAjTbcS*IuOlT-v;NjLwI>#RM7oARnD;KfWeUV_WG;fjD*$KRTrS*-Y zy$A(^-nVt$EWj=Mp=QW*bhqnr0OiV1PK~YSbK@k&%%hmuypxItAt4JBl(xW9O+DpV znDVO|C)a+9EYQ>tFbjRWaa-|uQd-h`vM_J9D$}jlu^atv#Ztv00mzn==eKUJfE1DC z+v`!=Ty<96WqsXWc0q?<)Zz4K3TU(%+rN;Y-}wGh?E3?sD_Ses9zqlErbOGKP`}?3 z|4L#<5t)*xr|laq<<^1BeP?wff10x>Q)stL1JDNQr4Fe%h|o-os{$_E+NafmOGmNu z>+se0CM1OLYq3t(K0})Q4fIvTpwT-7c3%)=`UBpRvRr%`4$8tO2b5uzd_^|4+{wy@VEl`n7+>(|_l2-(89b+0k^o#c@B z-j7M_YqogXJp<1BH;zu4wQIQT0^1}zSTe(y7)LIeH#FS=HO}XbX8*;35-7WcqF=o| z=^Q*wyi1Nr1*stf-48g}j@s(%Wh}kpAUx<1-k6Q}?h3q(AHPvjgAf+KIe<`Nw+ZUf z15d?QQ3#gEGs-Ttfy%o~E=cX7UOeyWhOPx)hWI3v5TAV&O~;j$GP@*6 z;?_}U=edSB-OF}M<}y*!yVhH;YU^mjEMe%3*)Assbi3Av5eq4K7en;7Esu{V9zChW zFbNNzKBDV0=6a!6G`=8Z%*Js!gHo_%4^ty75Hg-jo{gHw?6?`Z|&@SeOqPPm103A37~nu8Wj8 zSkw*buc%M=Rq`CX0{*tVys=HdIYhy!W7qRG{d`2(Y#h_}GjEZE3+Hi#nxKdeFT3#l zvFy8U~2kor>R#IJwE z{Il!(6#*59N1w{yAquLQL%}JNT?i*l*7`u}GEK!EecFDwM}9aB=XOfn(qe=t16WV0CtaOzpzFqn+@Bv|qJfAPSG zM9Hs;eiJ_R|9!f)Y%rFoT^{Gyx3GacB$&r8#;=o=o+%5wkBO| z_}G6INV_JvRAGVE`3Qr;l9`5l zmwfV^?ow(9%Jm*W=PhqJx7NZcQN^59!!je(x^FWOR4(3g7ASzJ&sg|7#^Q?>G#^|mGexUaQZL)x(hI*rfyz^YW_IqJ_&y`<@yy_Fflz{4kho7N4@ z2*GQg{q&{B*oDzsHn-Q$7^L+w;u6q?6Dj7OH2rj*=Zofg7~n7l_z=UF6a9u~Mjt#- ze-NgwXpOy`X?WdDx0vZOhh2dCQxSH_2*7OR>90JsbkB?G($WtvfFvLa)Se1jG_-#o z9G-8BLX!-D{$+xa97#>k$^gPJhS4a=DREPheY)=+Ogo=B}6*T~-+Q=bYiy zQR3Ib3vUm{Beta1KZJQzF{|D?JvW+&kD;l!92t#Q#eqn%(!G0G|4Bi87rBx2COH z!6I()C9o?#{9RW0kMantMp=MaEn=g-?mnOe&7H9+wkKnyC43~EpQ%V+Kn@Sf$zuZ% z6r!4P4$CY8=h_KqRBU>fKGpYe9RuGC`|=)DzTWJ39TWfXD zr*3RkXMpzouckmyli=eH+_$F=qQ`71fM%i@S>2=&jrJ_)l>^J$r%`;mw8!JM=PBr1 z(PjM0e|Nt+CwO@{^%`s2XaFr7-E`#9+}XT!$ro2Cz409NoFB$ogd;qNQ$w$&hINC7 zV>s#8dK@_%2;5MU`y5~k0B&Xyjf0tn>vglTjIO)??zvV=?OJ*vCg_)gPu%r-^hD& zU9?G48gX+AVUmj{)MT7TO!=Xo?vKR1 zJkLbh<&DmFweEDm-_q)E)AHDsx&etXvgQf)1-$P$sE)H2|O%m|YYl`;7uTuD;pt zS5vYBCswC=np!Bhxq>P#J${V&Q56KzUra`nUS^}60En)89Zbh?t>_rZRn0mf4fn$U zHmntQ9P^pe;Ppy(Tqlt8J)lDKYkI0n39BxOgbUn3S^Fz&zb6HTL?LowNPn|^+Fw0p z1&w1~A!Z1@g|YkOsfiMaz%hgIK9ax|a&^*4#MNcf-{N{RJ?VGhXdu=~m&f z?((!gDvDw1!uquC8Pr*43CVcn6U*L$-u%5VHUjZAUCts0tuzYOztJ`|ShxFt_9{^Mm9^VB|^+IG~g?|X1euaEQ2X?hYCwQ9} zF9D$;`=;3hs0jJ6JFWuE!922MHmP0=Iy3PVx)5xaN_%~91uZaeom3+Q-vgiS$?U0F z8kg>9-$RnT!;|9PORu%obv5j>;s><987jdu7CRTpe?!h}fmu2?vtfupAZg~K|k~#;7J;sOJwDG&+$)&TqWt)cv{z%kssTMN( zoY;_tV%bl@V`kQU`05)T;`Q>IF%$&|r|7~6xs1%b`ZFV0O3wbCgE+R0so$wk34f_V z4sLfm1vt6EZ4#w@y$`?)c9R^Hs7FZ3U~oOJ+%*0I#cQb&A~n&O&VzQwaM+oL}m+m#3Mi zd*@|Y^*uA9^!7lZVilk82I7uT*LROMMw0u-lU{zW| zWIi+tw83vZ{sNSRwoL$bvhjv-Fj`kVYi70(6GG=UK(Z}9PN+VOv(qwQop^v?S*wAP zq)otqgKJemqQy8vG>oV9gt}N+U=>?6l=Jlb=C~MAS zXV0UCZ7eo~mnnGQ^M_wEdq2(Oa$Xx)QpY%cKFeEiZ;|kG;~!8d7GP|>&}CzmCZtQj z(O@A7)!low#yn(19iN__TOFvk=^e2c_56+e?`$4<7ajNoF0)$b#gTwQ3O2Yq0?c)K zlb283U|bVSJt6xe{iNP!a05W+Y*aR!!igV=ww-cS{YbgpP&6ayFqp6@#MPZlP#MHO zA9ZW6yc1 zrps!Z^CQYPZgt(AKB;Daz@}tuq|eTu+9BMdxGcUA=4r{a}qMp>bj6PXnlCDeQOCc%=`&w$PeW>0LPj6o+uXJG!oct3^Fv7q;N< zjoqWksw_KLD%)-zG%BeLneZG?fUb1)*uNd~uYFvZsh=@{SmlrsoLWb(U8?9~437S# zje;C7&*sxaDGQ;>pJM-^sS;E@alpK!0S=sK{qyalS`!sW(@Et+Y=VWQbwR@i30%(8^&EGwc^b$7D z83i}lQxZ25*Eq7jx|yIupCsd2e0I+Ys_qJ>@$NDa0C{VF{!Mp{0N%etMo7R{Q2*xU z(pp{7O2(L(6N^Mf>;~r9L0_GQHEcfHLuL$r0Q&QT4b!!z9#2^=e+|eqIKb$<V9_rxL)1{1E2^7#j={o=oF5A>Tl`t={R(?Aj^o#S^~<2 zG|iU8LFz}C#f<)@ZmIeMGYzTVQ6ufyyGPp_p=lFkA>GY96X$&8gQpKi35+;m>%tHi z^QF)QK7<3IFo^&n#X@F^Xpg`lzXEp)fv3{IC}zaS&#cpT7KM%9LDMwY(HU(rh+aq2 zM;jXNDJWI){0Y98$;!{t9AQ)lp*4w>-M6<4pZ1F)=|W#k$m+_?#C82y{Wvs8QR<%> zMa|>aoo;ZZs+=0ymjlntwh&|jwS#K5lVqP?)1rOr)BRi8BFhf9s7zfalveAd)%TVm zX7r*&lgVE^K2SaE6;%1i5mXoquDMA8^yFph(uGxQgDUB8<}Ci*NNJy0`2F~^_qyOO zRgf@e52n*jf;x|pc9B{Z7^z>np}sOXjZNEyd9;-v{^|NJIR!I{JL0)Pk92IPlP}=z zZLcM51|z;rkKIjH56)xzGcgA3dyp&Bf`Yj!Kk|a^r3jmS{>YxP#|zJ%Gr#ARu91{T zhM1t9eGJcr35y}#Cyrwb!)VAhnvxg~EIi+EKqDU{E}I_{IdR(RBIFZNIAx&iKs52^ z!}ds;;2HfW$ZvpoH-JX}QcMpZVbxSz`I#we+oB*LS}Z#-icyq_pLr3pp0&RNm&kKF zl_GP)n<^h5I=Z@7RW-kQaz!g<*9sR8@Eb_Vj{yIe4?N~#t@>)gVOI=UN_v#8| zJGk3=#2*VbbZ#q1nl?fK4`dv>A zzXiy|U6cizc>DuZm6Qi{>N|8-amvTfX%b&QR9VFIXq!}1-py9cp+G%9zMf2eI^LbS zJCGfu&(4|dGa4bm<52JUS z4rui_)+_G&;*Acu?aLh;tt$>hYEM9(F!DGL@A8i$2x9n=4 z1%&9`+O6}K%)lf|j5eKv%wL67+#yU!bQI-lL#nb zA_uhAkbCy@5kLRbf=2Y~1M2-$iy(ZhMC`Kam;ya2u)yKN*}O9ya=Xs#EjoC0O>ohb z-Q!rU6)f1|`=eI_36cg_;Y&Y;$|!w{rG&Zhl_PE?k`{ zGzWV~Tmf$OOO?t*+?r>!SOhhP(x`K5S2-DLG11+#WDb41tTC0C3~F=yy$@j9LJ zLFBoyi)OQ{YN|Yv45dKuNLvRAO1Znm_GVOygt0NGgJG`O| zlI}|fjbRlO#o`;CIuUx)`Q7#rF9r%Y_gv9`5h6 z{!msW#(%p%5fNOWRk7Y!f5yuX789vn4AT3c=x*j9jxG zv{Yk?mpej}NV7FpSB$SaniNbo^ix~%AFG}+&0BaK9+XkKEl-!Zbr8{XJ^g|i<-hb_ z_fqc)Od;J+>vEyomYihnCKbnac8YxpiX~D) z6AqTjp@c!Z;FX}zy?P{a)Uq;;jhX!y2K2)q&>&;0^6+-RS!(lb#^IaT@7VXa&}w&C zD{`mu5$LTLJz5&|)h`->DH&9Orj4JM;Y)*C5Wq5|ub|DtM1hNP8L0D0RPlR~_)QEt z;6hbNp84&nxBg6#8EWCv`nLS7mC#0aZ9U`lr$Bz0k5NfIJ3eB49R0C@X9@1Rnd=|! zNu2t<8HEbcjRq}g0kVi!rmu)6s+*-1w+!ASxXmLx2je1@IG8BQrl!`(3I~Y4&R*fN zeI~RD!?sg4#P7-+a6w;Y|2pO(d%a(YiPLlUhl3*`-q`R`T{!l&?}9zLe|8H$A zjj;OK! zoX1Vyn>L#^w0Dpm8JBf6 z0y<$CaHb!?yks-9g&fYp4-WmJ$S)B7Etw&;Ao&FfGo`Zc`iqHvKXt?g$?;vZ1qsN( zz$LF3PSZEE%z}J%w3bqe*WHa+%7&EJ$<7i8W!A9A3z?h78(01vfeEyKd};?a|1C!a z`|c-qskQggx{PEep%P|6>H*DeN7q$x&^nw602+apd3hu2p)Q?H^F*xMfAnKQeKU1fkEu>gkRx9fxy%jfoJa>bBrO*#E%b0sA$jU8s&;;A; z3u?0|ok4 z=sljbXO5NfAWnK^EUQ_8~TtzrYJq4-uH zH;X@rz#hBvbXBjqP?LPbZ}wIshe)f9ERlNwf@rpNTC$?i(@wbH z)kcDJ%zq|uUcp5E88`XilQ2lXRPf^YmSQ_E(ND?~toY{3%u&Gho^{s{;*swZ$cjz? z`Rzc{P_cl|J(|6&@q+p16F8_u9?F?7WJQBs&j`QG!> zMcX8SBfw^PS)sP^cpw%BaNsu5QpZy)Cs5-C9`k-?OZ(D>>Mn6c)+Z<{wtCn$RqLLy^Xj z79olMA}sDt2d&n;uS(X$bo`f8x4*)mFM?z$9_Cjtii(x2bE!e}aRwxQbEd_o46GhP zv6O#knGtizRRwOr#CEeLRjDn9R6YgOrw$bQf1%BGwYb=vcN&NS8F9-G3e@s2rHo;`$rF~wHB>ZqiQo8|AYEei{R0J9540tv@@uFhwg<{UG@<(sN!0DH^|l zh_%TgexusHe1G}ro-Z#$+t|L79Q1&F&WkQVL4PCD)fP9??)qXOTb(@W@8j=Q* z2g0v0ZoPj(cZ{KZ)~YeYjWAIh{q7H2iH3i&(fJ7g*WS{%mV)S6=4X{S1cSyzZtg$& zrusMEq=$yP4P5G9Y0#Z1rE0xCvdn2o>Mu#`eNwwQKtFZ5lf{MAdEK}o-HY7Xvb063 z?su_V$`@ z3}ZH%qwLLZlm5{C#+&SuIVo3D0w^joODM@SH8j2ca+BuM;haC4&U($@lDlL_28etr zR62Yop{SS+zHuZxutOj)$MQ2g#s}sB;y`t**iNp+zsp$xB96qO|0gB0NrhLooyGMN z@{FG73!*VxhKP$>&FeeH$AXagTr!J^g3U(}P&|R*J98}>CN8r(QmO{g0!Aup+~4+! zTYc}_c|$9Uu}Ol9aXVAPo|>4TwwFYHi43<7fB81k>M}jLK6k(M&j?8?t>jlJ7w(6Y z@vDRmFG`OG0-KOtw<=xOAkj}R$eJ@ikWl~X4M_<{`RoGWQ%>Q4Sw-CW{)vT0VQ$HK zdnL`w$t18K{~6RDopXjmt{`W@KJGtFo6kpWMp_`kd}m~AtvcY%m+ARp06nRS=f|i~ zz71%R4B26;if>Y946&<$PqcaN7Ric{%h~VWZ*~Y1%Qm*1G@8zaGoOv?_B>qb2S2yF z3JOp;f7>owo5PsY%&TRB?nDJS^IsBJ!z%eivhG}H4v`&v(H@gUg*}TLFTMd=C~H?c zD*JhS5O@B)ijGwsx0{+<{rcCeqkxMc_l%&=>U?&$o?g0(=^D6UY-)2gZ+>We_(*P@&Z3}(3Eg8Xo z-vUsl4M*<%7N1XsrT<+l!Bo1W)y2*1B8PcHtw$j73?uIbD+HRB;GeO+@mCm@0+uN#!WVLyrWgq?v7reFqtvip%$2 z9@%0r*hZCtISPXl4)5B8cPmpR`SIefo+MP4C$C-iVN(WGI zoH+I(-qG&AtzmtjhwB`tWZ8bg$?-zu`RMYRTA!B^dyR`tnnkJC2S^B@r|>=Lh*ube zUz@h~30C4cX*m1Gx_Er8uA{uaEvhn7y3ARgWUV^HpTo0>L^l74+1`8!pp_| zP%kD3+mFeLv)lx)3v!dbU7AaFM%@R07|duOyo6vShB?+PzMm0mfVDj!gRQv(QTXmL z-pyiU^~GS$V9&kkN5aulnR*K=o+`tE%a026=xb@_leyHiJ&bDGA_N?AYkswadu(Zm zdOTSuW18RQ$5DfhruUL4H&Np-pQj#qZt0_Rfu|Ck%;`kd#E0-DfaG?-|VTAo-x#>k%HQy+_JyHNby7~5IxQIVcwk<&YL z#&B}B9CY~D!;Ze+Er3WLYCMSVqHCTJHseE(XWjKCnF@*hFrR;vM^#NM+tarDww19% z!j0ZZ>X`7Ry5m&6_Im#?&9;W>5Tx?>s7Chu%#7-xX~pmJa0yzjS~~d#Zb1b_GG3d0 zY)>ZFwRgH7*L*DZPOx>Z%5AQ^5MXEhn!XC zK{OlK;Y0Xa~fFR|KtU+z8O&H<@}yQ1ri z!3xNmcazDu;-||LH+fHO>;Ed2La&{12pHBf^op6fdTRSHFxh>k6}w(gzeOpFO$RLrHKABx+e*JlCGuyE~s-)*G9BjkGDgesK8$$ zrkg%%Mzf5fE+puz_elj2W{PvsRyUzmD#*!!gj?M6fnA37z5s@Ak8M2QHQvhiFVso? z?VgXKJ6v-+nDrHG;|R1Zu3bGhMFJ;EfV%h0lEIGob?0;G`ZYu8RIDYNf66QIC&9ev zp!1bf^ zdGb4_ylI4{q(bUs+gS^joWXkFk-)pVjHsy-Tb7_gn&-K7ifC5dC))ZH=y~hVw&dnM zgK-Y99`78W!yM;x_%e|7sq@+9X<>T`H!$52n*!0`= z6|U_FzyADZJeCE+nM(B`3+VE~f=;MN8h$RurMpyRzH*mI$4B+V3w!Zj=$D#*z5Ifb z*00@x3bzIo1v!9=Sbxr+XBnA?NHG1T1==DPTrTBa|99~Cay#|mcDcL?Tab|&W3hFh zQus4)GjQ#3cP_OFx47f?CCP_Jzz@qSlM2F2Bw15{L@&1JhHQTAsoHgH8R+~;SorI% z^*Lk+2gKt6xxeKs__6M(ukhOyaLdACNR5Z|lCo*-bHEAnGTJg)r~n<9nB_zH&JqbZ0nid8v9se+CTu)o>};9C}+1I%A=a)dS`BywS7~IhP0hf=JWVJ={M(9 zPLJvK`S;0$VPS1lJK&4GPZIj?Q014C2j6QtM;4N#gG)9Tk^xdydKNUEQ2qi zd?YClpDpGtF({r~awjz#W03*=7YD;w&+ycVH7wPTaNH(2VZ=9<>zVh|we#95x6Cy5 zVR@@4IaS$PN@7|CnT;>cW{mOPS_q2Mi*noLe$COmUqN#?<@tQLl=|sNWf71nEQ-s_ z3OkGn>(VwCxl~dr_&RbBS;b|!eNpB_zFUf^EU||?X<)9Mpsl+Xs8XA2(4*~-6PB!F7@ul4pgsORTA2(22Oyh46kM;XM->qPH(jxi@Gk$B*6H8Sv3`Qf4uKKI!@+mQug4bFpmIxqL|LWJb035 zXt6xIMj+xXsdG#VMO$=`&)LM1ps6VO8-N{t50w5cDuZqU5DT*Ki?g3!vV-7P&-Uo>dT(}wGLY@? z*|KdFKS}tv^+zlHp7jf&>B@;8$;oS93~|C$$o#5^3CK>Y$~<4sera1O&Ew2pG&PeYkCGvXx>1uOA?7zga#a z4X=}mr;VX*BbOhoGvpXGUn*Qua7xotFVWYbS|CHJ3kznoD0cUEUcK1ENr2-r_*k8z zd+VL@-=lSQ9*OfdF}8UQLk4B4ge#9uk&HE(MWP`JzaeASuNBgiTwHU`_drAnc_UA8 z&#ydF*WuiMr!R>A(C=qJD$voP~tP z!wYUf@K32uu@bnh)Y{8oy@Al#R=2hd=*_|>JW~6Id_HRmj7HRG>$bUcRu53%-3>`D z@Yu`GqmCIZ8Q-`~4dNkubeU`@KeVKbxeEcxC(3BYLi;B@8L)%-8mL+jql9 z{nQQD)lM9t*lgCbE8xICWUjR+dxV2fgjgzgHke&Ix;YHI38re2hsn~SF33I$kQ8K z0ENgK*I#JwWt4lzcq7@;aO*cmr!Ouqzs`rnuH8zzUPOabFRo_wquzZ3WW)ns?p|7E z)h>Ary6Mtg1Ku~Jy%lawU%UanBE~-5D8D@OdNygLO&LEI{6|2#hOSvG^yj=Jhvo~| z-mOo#T(b7FKu`}C5$9OUrl4NGC(oN+F7A5fMVyoHBm(T&A?n(wKSSyPDc#CA*zd|d zIYfj{K6@n_chH>fG+#SQv=w-E^Iub2q57cpL&(i~y5bIRKaCu(o0|DQsgC^e{H?3Y zb-ksx`q6k^DFKI0Wf!Hy_Il;51GB^*H+jC<+2beqoh;ACY^5_R6SpHSN26q=afpJ5 zm0`j*El_R8XY#Z&NpIl8Ak)kB;Mws=@#7xZ%~lLsed~FTL5mxz^{7f9bTBFNZJg+2 z-7_#jAMxA=i`Z^GjSS)RfRfh+v&!0M^wc<8;R|Q@E~)nm+9RU0qISaeqLyACGw_S* zXw2f!gUon_&ak4Qv~Hg+j-Ma4jOKr9Zz;-YLq_NDfw`>P*-LZvS#w#J$)5;_U2irm zpCXEz($U{@!812a5Ed?+v0af=S!O*slnPEHROC&Yg5SgaM6b@X==B=|ku0N*mYw=Z2d%q zW2T^Z^Jsslul_U;(%GLDU?rXjTBs~1eX*TQnBN)yci*Ef0LYDx`veGPn{XRuOV-`d zZ*i0^)C-x(Q&%9e zyjf4Sh&-5Q$8&f~|d-w-3=-d4ZOuep%hwKC(MM}PVkYtZ4P zkr=Rw*jAHH!hJtjBWqrY(O%H(lD!Fao6o~qC~lW=Us)*qC+9<> zcg4tBxF7H!Gaqd)kH_Kh1H`ACSJP8>+JU?=^&x$?__NkjeuBHh5N+lvz4`oTswvV( zrdhf$B7#vR@nPZD;@^@`UISRU*-XgxzB_9jMDR$V^R9O5#V%_oa+LKvi>x71oUZGo+cI6qPT6pNE z7DtAzDYD+KRUi0Y8gJ)7Ta(#=D!mn78|OATwqyU}Uo{wfIbIECJb;n#hkUg_bhBj* zp4FX}@_F-Lz;Z;=Z+T(ufiv@6KzDkR!y#xY{R*>tCun|NLwnD)Z?ys1eoH*(yL^(c zdgHHmUe&U@eC`X_OgW94%If_s7AqvbyZ%E!o_=yg@qZ{(28xW`b6h9~{D29sZVq6l zY%?pQ&n-&wMo&(>>VJ?G|CVTWGE9)QkvvWMvCbv(Q~3=*TVOiXbyt(vfT_{#aqq5o zYO8ZUTFj7BdKA*DL_p>o;EQus)h8Pm%Xf7Ec!zRo@56$6k7GLuKWC0L9U_|0F6rd; zfN^YQdsJjjU+ae5ieR-a*2JwDa%A}fgBwMFfa>$ z^==pv_)JJ#6$~~co$$4%a=|~~>PAhY1WbM}5O;-ep>R&Nu+Yf>%YH@6s(P;!dc>*=4~YQfomfx@BdOvHflxCAM94$s7ptBVGaL>znkw=RucVdg!4u#w#AcW&@?; z*ZLDt*_F9)@E{0nx=m6r&d{xY{w=^Y7L7sQNE=42q4a_sF3J{J8fk8F85vT zDClY*B%&9{MYsVD*;N9#@dwS|Y{N*dx`SxSeq6~_o^cy}c_@^zL8J0rVpu-l7QZw3 zRjrn%j|8ig5c+dA6+yBH2MMyxf}O@lGFO!d{JshsyfY@Hk@a&8AfaEr{KHperPHMJ zqafilOZMXV(WZYt3r%)1u%enU3AcDD_56`Q=*8gow=N2$vN1SD+7ElOg8&oOe>a0O z4Z4$XlD)3zH*!@zuU9^wb(}j`w$MEL+kyaDF>sHa<+o*gjjDU*O--cPXkgLyx)fR^ z6>=kcb#U8%+VnH0O}xJf@i8;Lq{vNFas?)Yl@>Ps9g&24z4|~JV3MurPE!?y2c`7+ zDvQzu7TMNqN%|pzyJRFsMuHeq+(36t4~IL&$&}fUh``SO!CSU&R>p4?;0}SQ;Tb)$ z7lVlY{7xY-kGHiwLf9N(ldh{wvKsh_URIy*Z<7Sm!{HnflkU-rZz%y;O*j;3l;OY~ zK`s83!QS;p6J*U@2dC#0dR7zKtvT>QKb(69OuZDhaGep56gVx@9mTTmJ2nOr8V4Yx z1!UN;(RrzY?5^@7k{ZIGt$-0y(inA^cKZ_6x%y}4}eOn z27)_7@bZSY2xH6de#-g9WqOVYI5=r%^IQr{4tX?pfUM+@8xgm*)9*g&Tu*%6>8^6^ zM5Azzb)_~HHYc||3X)bCdC-_1B9G0k zpvsDMeiQ72>8H-3z13$%1NWndJhrggz;7;J&B+>B`c^O(_2O~6E)rMsEd%~z7jhmm z1)(iynL^0{4gM36#Zu8N0_iHq1zp=TG0EV*LR`1UF8n)wh zc-q?c+s=;OT>Il3ul7AwSUUXJu7@Xc7W z&1G_{S;sYB#TTjkve(9s#z7R?augi)V2=AtZkBcx8JHYB3_v*;HMq#(fV2b(9KL$s zYm8jduj)&NUbdRto~Eh|)S{N$_l}UU+buAnrGzPaM^!1D#Z%aQ_Sww8u42bpgc!;r z75%?C3E6Qyw))E0sK4jS#w2I@95vZlra_9|dgwneA$G@DobZ>g+$)h7AFGTXm}4&Uta&YGYLR}jo>^?$T&Q7)Z2YbLvy`CX z*{;yVP+7k@0~Tq##bqkrq-l}Wf^};#+$^$R8Z>_LzT=+rTT)8@Fl!(AHsyhZr=n|u zv}LF+y|lyF;@8XCGlfN(s!np*uae$MjkSe8))bM@3=u<~?f@=gMFhlC=hbVsLsQuEK)(Fx$e3(*y{p-Gb&Y75V5$P$;w zUxDw$*OTU8uIAmFsu5^C=9%dHC>t%4(zuzdfM~wE@|M(jUR-HjZ@U&f{$g&^>Y15Z z`&hnvYpyN9uiyJnhc!8>L%l*iT%JANBQP;Bm($TtEM?c)h$vo0Rcl4E?%`w8tlBuUe8GRprIPc~fH`DtI@0K4zN}J<3S#ER{+FHx zrvgs4)7r1D+{cj@6x&mlSd6N$kNIyc4bNJhhRUA1&&IvC7u_clr)GMh_hwbon;^n` z61>0Y^!q&Mi_LirL1dpFIioQpb+S(Ym|LKS`%JO76mY5GNuH&7XW6n610oQpf0g(p zKj+<(9&MsBubBv8NALJXqUqQ9-9DJI$0p-BZDF7krk?E5x>j{w@>1^fV31o3=u^Uz z^}n*Dq?mot-Oh3UKDCq z5NArTE3zK`nWa;$nSRmstdTx~4$h4x!=#11-4eLEJf0L;%Um)20C936tZ&WsK<^M)u^=0rgy{1Orp7k(BA`dP7zwbmkA#|F#kdIhh^!#9LyJQcVLKm%YUa`wvdyMjeu zZ*~0a%bAEd{Q1u`zs&6{@h4Tb*$MPp3A?R^6kyj!YkopWWr$_5-{+#GcQu0y6h%?V zYJMd0SFha2bgRDbU01aQ`}seu#NqO&#h}?)7@kaYg>|RUN=P)cYundz6h_Dg$qf`$ z>DLWO(e++*Kh?Qs87YA1*Ldq2N1I+17=0IjK@(G+tWDhp47w=0u`8qsVCV@@7iZS& z7790f_3-RF5{m#!&~j6(DL3fIsA;?vsKko8yPy#tcsDrl1`4aA$`7A{y9*|)KtWQ8 zYhNs_c6Rxf42t7^z7}9);V9YEZjbGoL`zEvihekMTrDUtac_}t#(?KoC(x=in-h>P zQ9+l+XeF+Smu9l0huktgcJ8MAGOC3~4@?-RRh@CJA$jQ6ARF^3rvY-gnIIc_ON-Nu z!|@4@qhS(hhjuaN=OtkxkB=#kmko2Mwzp7T4N37zStfojp`T@hJFb`j z$jr2?-}<@5|Iu`oQBl3$+ZO`_QKU;4Dd`SDVhln$rKCf;;Y%~p4blR_NK1zxB@Ert zT|=jmGcXJ@bN=&t)_T@DFV8wJ?sd+6_PzIYeXdvECvg46nw(xyGrSQAOolR3FbJI% zbbxYrEwlaK)iFK7{CfWLA_QWoH=~eba7j3|J3(l(fyVR{)Y!H?lOlxQEPJ1{q z@t;@I;|ZxmuA?_60Jx8GS?+b|WBS8pF#~+ATRa~FD)?C~%Jm5_w&RAr!>6r20=sAZ zJ=uda`}3OuDNKWqF81Dk^HB)?)B#L#pl^cS?bov=Kbo9k94o(?(oH4?l3;>Z|D*L5 z7sNO2KjcC1JpcS~DIC|}QoH3l*xDdgytW#lN#Tphzz9Z7i5@o!MJ{~9saBp|n13`nfA*)U-?9*!S!&@Clyl2qGNC-NVVQh z3`s~FQ8o>Wi^kG?q%v6G(@iL15)Z0Vym^F1!m~ra!huDvPQ&DR!lv68T+3t@1%%zFw=w05*$ChFY;i$$S>#1S&{I=J`bwy zdu=2|ogkr&;f*DC*;uE@E~cAGq^5tLIfd$tK#A}>1}`BZ%OvZ?n~$zHjEbMN70OEJ zP8*J=ahyHxqn~DjDftIiZbBr?r;=`B3Gd5xBtM_cnDD|bd|%2H#&UB)83?yh5+J5$ zs*U0sS%k`}yPWqHDKVS9M)Q!FjHe2&S1&Lh^J4|LwnOUsGh^U~4i-=J;srDq$sX=o zz48_K_3#(LnRWEOe1F`J%|JSrI@DcoN<-Z!!%pagy3#dD1^it{Nvu~@agGnXoEbp!hq{|#L z%Pq&Hlh%yf9zfM^$TkUFFLspsEu)$BgSu;Yd>@(M_IYQpZ>LM z_+;W=`CA#&PVvOE(raKi z7uC-VZhXy3tk*bCx=LREByX2XJVR~1Rc!x{FND}oUPL4R|FZz<)DaV2pMCHYg_=P~ zPwlhR$D=YJk<2fgMd&fvYneOBsWhR_WqF&)&GON|L4#>@Z7b)49%D;emIGw3ElZ41gO?%%e$M~Udf%P{%xq-bkipo(N4ttxs=5)c3UrP%pSx;G5!kf=55aOi&* zDrSdaw)Mbw5(l3!_qH;;;U0c|2lBC)5H#+?DG^uT_T+JEMbX|c ziVfy}_dS|q=q!y{dd#2eb%^lbd1`&YyBqWWx zTlB!tOjUkmoetJ6r#$g8+ zqE2Q`E=G6-Ed|kEMCZ-qaRgP`x5vU&#ntMVD-4X{C9(Vn&iQ345+59YXFqOKP*C4!Z8FaRx6N9yIqZgBQCDzLSC5EsHO7Te z!hXfo#=bfz`6-_X>B&4h7TO!{Uwr-`SvVwBn3j;>FGh3a)Pe6+pxn;;q}!uK@{eR$ z!>+InP}_gO!8Y;^#B<7^-Q?M_Cc$OJnh>n({s9Ti2&#$kQZi3rC2PE05QZQb)UvR~ z90c#Ui?yTcgst4re$(uKpNyRk?PS-DjN*}AN`dkNP+O-Q=rnFbUXEs9yLJzk9cBccBcDRqQ5I0zMsawx&6PCw7yr9m73nhk%Z#yTlx&YrpIfPui9VrU{W>Y zFqh|$968?&AHA~o;t*pl?>9A-671v}BL5uGtUqKlB+vbLxe8kG+IcOCW?2(Da`*O# z4)wdl=!h3<(Pjg5h8a}_(#?C#C4)1XBj7fBt-6~2oo|h+O}ZV;l6ghw)H_CPqS(E^PtZP(@@IZljxQ$>$lFU-DeD|9maw?q2w4Wc_FO zr(73a1b8kA6l&e`L`Y?T$6_oJn$m7)8)*?&>xt#W$+l1<%JohgdgF1ed^@AGe)`O@ zkdU~96Nrw~>a{wtDnGsSx=8R9JDUbu??Juc0T=Id#*W)CMiktFgR)WORH^QNhC>sJ(xHOHNeNZMIY z>S-!|cxo!Cr%$7dtEYIep}6xjuW{ScZqM^GH@=+!TqQ(Jm1(wnjYqTN5TANVj_lx5F#erJrP@}CyU1!hiQV(+DV1<)uGK)g{B4D}Cle2iPm>{@&}mkE1; z0wATyLNS10bN#QQMA$B_HUXI31Fe>;)SI+3*eTJ#VDM zR@Sx+z$A&i>r7~tf2y-Uf(;IiD+zJl%jKT?h+iigA(B`e_mW0H&=4NU)BZ!+fFl*tY%xi(Q?ezIp#v*oFUP(*hG1<+OK{>6s6H609! z75mJhB0;(i5cbdfC|{kBtb<;NHSjLV<*i+U9HuD+B9g7`^!sb9MoJJaTcRNjSw>IR zxm})#xh*C%JObC;wUE7&_X3+7mu2&l2AI^`2JqPnZt*z0N7|G*(CiFr`}0tso!UEx z(AQ+&>E099{X7E|K`!op&r&T7!v-i+h2d3&wVblzZac+2hRBX4RJ5FHwMSmmiu{1N zMzjU#VU3a}yv*Yl=rV(~hU?YHPPhgNC#zZJ#>2>bzqa(e0uGpB{9m;n-ve(m@ z>G^4nuu3G#ETEjDDRkx?HftUliQzA>tKUdO)|N!g zGsxQZiH@v8N?$-yl4{~N?}w6x3mL7n*;tNxm+eMrfXG#l%LL3~$A zW=6jOC~pL3_WNvCpJzBJ`j=Yvwi^Qkuf5(YU5ra}FcB{uw{pC5pviRBHQjjiDZxe& zrh^^S5if(6dnv*1NxUz^2&om5ow8=549ob2;*;lYYnjp4=5z4lKj8h0DJ8yGQaL@^ z(+Y4OBXPic67K{Jy$0g#D-MQOATHPDPP7~LQX1RmQn7Y(eEXST%BQVUe;EWH#VjyD zs<$neIy>e!r#(!{n!v9r%IH0f20EO0-b%{_2v3&RRU)f^h@AS;7R8oBKQR?0d`P= zj+Pox!{YbkHGt!$wg$lWr=oW=PkBQKZ))D3_wDl_eS z(GU57yGw{PZS`g$#UOvK1&9JJgV@(|8C#xulP`xXQ3mFX{2HJ_@*+U!Jj_7VpgB?^ z_jogT#cuu2tp5u}ySW|n-FxP%B))TskMmbdeo+7&Hecv(@ySkHU(R4giWFt}41;2O zNs1yqfD17rrQ9xL=CV7}~$_Czt8Vjbk?KgTSc`&O+`+htdI{ z08~L8UPOhu-}v3Pk=_t=X$p*BHOsPvDkd-4C5KcWK&)QY0s&Y&7+1!5Ofr06lHp=O z*(+WVJ>Kya+yp41S>4bACVgLPdCXgJy0@wqzVT?TWsn(-Py`1%rt+rN74pzs6?-aA zAL+->Dl3ibCZ4B8BY(QCwh_(^9-74m*67cG>Mp(N3d5FRg+QCdbHX{ zY&g4o|58N#!h=0wHbv5FhD*z(Y%|!+bC?m4Qd0b(~p^--xzG>?Lg4 zLw7ziyb%jFG0b#c{!&0SE^k|=RGWz_QlY zi+;gGj6NW6PR0R6MU-BgtP+DdaRo$)h{G7}E(0j!aE8ofWqf0pMf-=FhLh2!%7a1g zsY1KdRprJxhba-K1v!^fMWve1jJFJW zaG{i#*Xgfo_&!MwRwTSOIPeO~05yhBfUT_yQy^wqX65=#m=)GQvN7i(C6pWB&rR=hQs1Jo2urpo$6?0bV&deLAG0@BLt7Xo{bJRk=27(4t%}+5}y5L zxKRRGb-^j_^*?#(7GtesQq_rH2~H8J?Xv4Xfa79H$tKik6|n@On{lCAlq#1b0ZMmA z$f33$VyDiUp@y0P1&uH0kAiOIDj?qlMq!W(OD%?5Fy((QkjD@?zJ`n^IP;L3{v52J zQPwdWrur`#K8LDp*@`R3s!DLEEK*W&h*UfLnFA?{ko#vI8Dq8HfO#{4EE#j(efy&n zEPi8+qYT%TNCCT*q%Y@McL@UY)(?-Q1)ulP;##%HA@1t`Kx`Gp7zodj@9;1s4mOB7 z7HM-%M8bZgYr7pGP)ZFrU}t6`IP1>2@eyPMMZ44*gFJ%vKlJykaJl4{_(?7BoSp{8 zedZC_lHQ|Wi$E1c^i4^BudD$`g6}u#fm+ZzOxL!;;5p~fbc_}Vw0Sl0;CoU*E#Pzo zN$J#Wz6&{mHXP~FXC6VJGBahj=KMk1_Jg_yY%iO3;r^+Ogjh-VZb>?Hj5i(9gz=d! zB;er^;H33pTP^0qX-a=sXNj}=Ob_OR_W-SS&^ef0q16XQByxw$jc8n+{=1AwZ4>Gx z!KUskco!>&VSKe;?yQ0&V@&6~pk`}P1CkH#`8Zo`kR5$KUpsemz;!Dw3i;Dm;BK*J z$u2CJQyEKYIN;{M`r_GnMSpY}ne^YfaNA{M75g{$ZQRu&bDTbVX8l!?VdE5oNBYTU z>wn%=7na{%e=^K+JSjbGdC8*_6>F|B`^~!Q@-{Z%{YsOIQa8g&?v5LtJS;l2aooCO z>~!0_eR!`|7bh&(%dx4JquSM_{&Jn`Rmw-wdiUl^J`{z)}-QV*&xHn1Q&g!^Ww<)l{N*B)k#b$hI z$tD36*fBK2gOgrC8Qlzjpynj}+fSs=sw>yuQM)R+g+B@8ev4>w^77PYzkX0!N=fTg zKTN($hI1N*M~hrdKiW6X2ev*OGW~JuSl1PZ?G*k{KZEKu+4q8`{?G*;1PfK-al(*( zb6~H*^Fuehrfr&Yq@O~~s8qWpHTq@-9;WTZz$-Id1`W_=tov=QIe*4fl6J={HT`gf zF+<3<+DsOB4kP1(+|e9S#LbA`5&Vr3T#LsQ?v!v*O;PFGN@EeC-w+o5`1E74cL;Wf zXy9J~iu5B`+C1qHXn?dO8tHJvbHk}i%dOwI)}f%bxRYiX)%~?F&F_)6^PhN|Gn>`y7dU97oO~URkE4c)M*}B0+@`u(Cr0U;$a3Z!*tQBmxX}@Nl5^BNGD3~3zGipJNK2$0G2#byMolBB;+%XWnCh}SC0roC zc`wZ~VTOvf{J2}b`j&Z|F=dh4clhVR!%MRV5!ATDGSIDRLe~PSt{!Woi2R}(vT8&< z^Hi7m4`xNPG-74~m39M0eFwe~=Q3S?Fe)+dvHm%lxy0KO6K%7gqSILH{E4q`tAK#o9~NNGwT znysX}Jh-0|GL`peCytW(vj2I~V_FxU%Ctn`{l4uZShZA$JAK(>r|o_sTi#90t60c9 z@^_NqSs^*__34XJGk`9(1^BQeH;J~*H2UIm2os+#N>-#*f;QAkq|45yl|6)s)2w9{ z9x3(vDfn|$gu!Qv@do`86JTd6>~%8mt(KV@@#t-7#M7x?a+uHcSuyH|UM}RxLr~q% z!h{}FaaWq~Uhr}eoHO79Y9*t5ON)6`T$*+;5mi)cq!X|jT>>z1)OzNmmIn_|WUPQh z&^<6Sp$_Cr!{xWt8WFm*BK3qTe`5Y3Qh|CtpDB*~>hUh%(nl z4r(*XTT6D^uailrq!2+2A*MjU07_b0vATtcljLOBuF=C?7n5bK5v0T_abXyk=d-m( zwy1nZZsAj%==YkZuDhh!$?L!nT$urSpc)FXX|KnYVK!m@W(oQKuUTnbSq$c-WuSXN*2>MDR4?SSD{GVF-Q;#3wz{Um>AawUeN2Gh$ z`)-?=NKwd^j6NAMFZlvBlN9|WF+88@dA7`&mo)( z+>MeaRJtC$+YQD$FKIIIsIWeHm1cK0qqH}avsC}BxGYTS3WyHnUU-CUhm-lh!{&?pc6X0;LAMr zl#%B8NES2HD{$PC6SL923bwMen8@T*D|A=B#C!Y?G+GEoT;f(`VmKSPU*(zl>gK)o zXBaJi<MlfUMVhr(ka zo^A*0-=q5$`p0wRssFPHq1jfCWfVaRPXt{m($)s7w*QoYd)wnjF*Lzm#bOH?6P9uOoAnvV_J;6k9cU;Y4w~Y zuRn@B2Xz277lVb@sz+MR4P6}aowKkXkKF~Ig|;J}yh8c%D6_B!NZ7>i6(J&G9p5E0 zSC=M(|JD|_u+$BILzRWU^b62veK?2Fg{D&{fU}+{9(u?Z=_Nx}m4ZqlnSEj&*pi}E z%`h9<-3%dXcKOOQ4gvRqc{9^p3Ap!ywlYy91FYMg-iU&cLdWihno zshd&>rl>deqJTZo-TRRvkCcjLR#Jrc1_v%FNE8-g>lFsLl8@Q z9U?-wxV1RIOwB&4`Qub4@2R_}>W%-$S{%12KUz3XL>sLKDC5c=0P@hpP3Fh4Hcy3R zNSQHp{GU2dT6{Dy7D!Lu3;&fw>Bz))n@ewSB zi-a5kNPOq{{FVP2GNjA~a6>37LSZAXZMnKQkcl3XRi-w4XXj-(k2*|#Z*q7bpvz~+ zZogBQ5ByaT!?4#+MHFtM+4%)SSfwzuhnFrl)aa-cqP5M71ZG(s--+SERR?2E$l(dt z#J&gQpKB5ua_#z9#;0qsIBPGUIv*mL@u)ax6Re`03cR1x%bmP_(KNl)wu4+)e;CjI z>qp$&5K!q^_Lk8%gUi2ED>`H zSmt{5vi`Tqh-s&+cypx!tl*=sCp(dg;>N&`dG0JMaR~9Xm6K4fuluv*rkQMpN_ls> z$W7o*@M4`MEA5(b$`ga#rh_!nuZmtGMnKcT-muO$mFLp3$wAq1aD!1O8~F$ALYo2a zAWf{M_I8{+miA-whfDDOwu}{eegptG(Xsfu>MQsmvmaGa&0;_o2gFal#<4i4r;XwI zGd~hsuJ-2$_LR@2lA_`W5O1<1j?jd<*8Y);7}8N=sFyGyG;Enj?1`l6znVBCpV#nk ztr6d{q9)2RpWM}=$aqW(d3`EL$=_0r16dE65_6M0fN{kc;2^VZ5V4k9tM-3 zvx~(Zoz8QYh&{px|veQAkMF&fTW`J|OR>{kj<0Ozx; zj8>l1l2=Tdf4CKef4uDlerU7h32fRZA{emK`#KgyXPkW#U$0T;+v2Ca2QiN$T|FPk zSc^I9%Sh-=qZtkC6K^W?`cZc8l*pl)UY7^2jOY&`UUv#8aE&tS3D1OeAV~GY0EF{o z8eMt&-ct{Z!LxIUHD-wm^Z1Z#U{P%;0`*)5HEEG$-A}Eb&?ay|jj)!}#!WK)#>AaS zO)D~ZHTo$zvf<{Ls4k+%B!8^N0>%iIaHYFA&z8^P0w^o{*!Z^dRLwnZt@2FBR)6Zb zNJtqj(5YsG`Z0UYB6D+AKsCG`C#Bu5D)S1#<(-?P)dK``|2&^mu+)DlFjc}oYeM1a zCFL|lv?79ohlm;ll-2S9CIH*}Ri&0mftT4*qn|*w7)oI1z)oZ}23h+%9i-whBC^>* z+$j?7?JVzoFuBgyG~T%Z)GL7=D?MXbs8or0g8z~y9_7s@&!)nR5y5Q}VsrW86Fx#9 zpPgi!(y0{7X?<%SctKrVr`7LNqH=6+_J#BB{BrWl2vJYFqG!9p@o1Zx`Rw7c>#a|u z{~lmGkkYx{inCruxOKYHkb%$IjtXL~=T6y>b&3t>bI&*xZp@zvE-xP1DO5fh8k6gn z={y5?-VF>*C3kf@T=n>;DkGD=6t9vZej`_NOGNyQ)$w48O~>T{HWMMJj7x!0=}2)y zvH{OqP66!1koFdb!t~ER*sTuM0xt`ujs86YdGRiL4LCFkZ3j}hY|=jvE+s`CdUHBz zJi0vSn}lxTKMo*Y&QYIl?8PQ~EIv~PP40H;bCRFOs3mA%yXbDj2f@>2(-k+hb3l(2 zVN2iO!&8^TiM>H5y%cFgx$h5c+CEXmNrTp$nFUeSyM`Q+g#^+?z;1>j<8sE}acMPVb? z3O%Ug^r)A$m?1zjgj$J++E0Fu$z^tFEAOHbrYpJkuaY3?E=6w9-yjy+5V+LAco@Mt zwH{Lu4^_m84LiY1~sf5eZP~%FW3Vc&U6OOoHX^yHr@aCyx z2|78u?;ED(2hax@d-{!r1UFiZA?Iw|{Zy;n;U^munikHCG$}fhZ>A1O#i>xH_y8%O zSvBe4cNfSvR~h#n7AxRXf?KL;`Iz;6dAwdhDNp>i;jS3KqpjOHE*}T zQy}kKrdJKpQ(yU675o#}-o}BdH#X!8NPt@Jtpkno!#DECUtd?>=IjR`Yx%79Ew1=_ z)9c2-C~I-jB4;^|)o*%F9t5Anv2}rvBH}mUZ&m-DKFUKkPJVHCeA6C0`R`ZpoljK1 zsfhmGi3uUb-L&SQDH9&1Vl*eWc+r@w6*E(-Q6_nf5`>9P()14+pzn>*$sgH%Q?cRX z1K*TdM>tWD?(a8 zgf7(j04UtQ4i>yEJd|jg^e1vt>DOzc{2&m_`buTu9qxxk`eRa}Ck$M2usJvNzq?yM zX>inp^5y}ocJJu7UzSukLT1ZsMYLb=6nrOx4oSmkP1SPmXPD4~^q@QZHy?fGJ~TZo z7`Gy%Y&^f3O-mrFa5CLVyft2b15GPMqQOC(GaAohtb(-952tzA(Em8H(%V0E6qz6% z-xu6NQiIPYWPxu`pO1C9E8y7fBxzuX$Z56xw4;n3d;4$XQH2K|%Q3m}q%#lm%d}P3 zng@d~D^3GXTQy-ssHISt)MO(rsM}mD$)%#@UQcUV!g_%Q)?gdD1Iiy$k4O%aEJhQx zoBFOOOe{P0TsEC#V7>mK1xNCBl4I8>HDwCCZ5DsyV5#Rlq71YwD_)j~Wj+U@MsGUd zGk2-bPsEoY9N}S*5zspqboI8m!wudrxm(+ciBH`=a8t)*5cPbQw7ofQo*wyhyNO2u zafWdV^?&H1vkxORVhwt)h zVg#h9)9gsTFFgKM#~gQlm%#iRDWFetM*ZS=!;Mb?n)((-gX3c#`k9ZBWi@Ki(a$%e zGrw8j?HSr+qw4q%>+59yuth35^Ol3gj|1beFtYl-c6ZvIW$+%52x+TN0J}a}fcvHK z5x9}QJUD$U!q=`1;BeQ+RN=-`zrDke_|)rFIsxE#H$VpjNw}n9;cNffa3#@=iH0|! z+{$qo6?Z+Hb_9{IYI>lw2?&o4KxrBvIOt}%FK8>vt}wvu7}!}k@!`?VbblLJvl%u} zRPAEtg3gpgahLb34n=XQl)E9G~W}NKsuaI69@9s5}O}V@uOEdEp5gH=)}SPk|jVc%Mr_mw*r7zSa;FoRumDMJxq zkiAz4m0attHbEVmgo*Vp16Hw1`X71SMrL1_1RQcCHBaFWd!7g;6UNs|)tVK?5UclZ zf zB=mqR{o|P%lKE@%V$dUNol^4wXgl#H=-yu7+(b)0MF`phz+MkJBZ---3xF+{S$e_# zc4>0=J861RcC_0OWp(HzxeHqKSii}Z#{{)v5aI~i0^`9=x3p4|Ojb73i zxd+y+IRRb2Ha+wB@S*H$T0_VBAK8jjDgnXFg!LacTZ-k$6u~E&<#dv| zDIs@ib8s)GIZ5^4il$nFqbg6B;=*3;!}$kRSCht#3S@Ak(~?JaR$j!&HJjflClpn4 zxE4_y`q=g93-Wm6PDj|yDL(SsGDMi_m#U67qd@p9JA{1H?`gRB$C9FQ2FT&S_hd{c z3z(DfYbmPNF%_nATip%7ynCF7zHmOv3K#p=c&PLlAjo|`XgYZeH*fQ7MXMnOi+HnE zRLri;AIqYhGtht>I?EH-52Hfdh&G|^a8f2%MCGe=ojnki(_rQEIR!&}&H}_3@YZZ4>O)yA1!>xRnjOPpW?T#~XkYyiq8quwHL`e&_6r zZR71IKbmK1aBY881oa#zIw8+gL`j3;ZCHH@J`qd*MeBF)sFklk`0+4Iv(0`l;Ds`K zoccr{A^))d-|}e; zb$2h7uKDp0bfyw_+IFci;d0Z_`vkmz61b_D0@9pJBHt*yWp<#YWjLmd?21PE8M$m` z?mThfGxgcckbfMn{D$Er*oxi(WoX%dqH$KScKU5PW~Af3#16(z^g z9&$XA;CoQor=d?z&r+gvsPgX#NRIUz>XuU6GSf<@{|1$o+>@g8?2yT%!kFx*5gureqnHa%X7Q#;%$DJIlxe8t2Qr*Ose%7&kSb23g|1P zyem$=n=9k7{a+99;Bj&B3&A)bCFub4VWaQ)@43v6DVAeO^onL>Tx&wDWRfgFe-0UK z5mSSpD7Iv(PUp^8;TPPoxCL`{Qm3Q!{&1gH2yJdn7oURROIpv+i=7$G71;TY6gF|c z`!4x4&*L>7r>E=R6joU@_#WD39eU0!^kyx8v*>z3ww~uX%{`D6)x4ME^h$jTVmrs7 z-?jnCIl1im@VW;$X+OETf1k8Y3q7opvq+2gl237D7L5u}|5-4*{6v|l+ep8j=Y64^ z6hAj)T&a}vyf13T*r|&AiPVAbW{MKC4?SnR<_HEcS;pQRNK3;$)l(J!;{K%I0-)uh zA}hY5?2;~19%`656Bl}0vtSmumdm+nB!yTi2w=W<5gor)vqjkjcpsH-NXpUL+ zX-1_NK7B1^*_JLailD14Bjn3~%oMtj6sEWmYvYOYJ&%0{$7RqI?(1r~l0Qrm%RgS8XuigIY+e>0 zp}5sw`Cl^&lztQVC5--~DhN~4M{em-3SIO)&bYx8?U-gO7fnZ{F#41jwA*-Qp;E`J?euy_31_%gmd0q>6QhIg2UTaJC->KPh zZ2Fx^i!!F{M?S;hXkZk9 z)JnDjM&lzOtyoIVVRN;rn7flVTu9BA%Z4Fawt3aRTPrVGtdo9baQq`%u+endY`@fi zr9v-eco7~_Klk$kqs$Kr@eTRoAGz`XHPVgfSslz&XA%h0mPJ1rZlm%KA9uJ=0_Up> z)kV_E>Ae87jW9(U=8EX^JV1>Xu&HtW-mgSnu?w%gli5RsFdg`6^6&TeS~^>d?~0E> zGPuQd+4_3TNBDN~EOwP&mc74ESP8`Oiz0Z=;t|5>93Ii>759L5#@xR9LGOjco+D+= zr6Spb2<6}yvmMD12tRt%FQrDhR&TG@r;M6J??f~EHC$Ag`g!UaBSX)x71yF#4*}ol zVa`$C4m9l??PYT9tbq3T$#cUTvr`|f*Qc>GO3_)3t;2Uepq>*8o;_hbot@olT}FS64q@5P*kp_lC1{5Lb! zLP%H`fR~^&S_$C>(6z~6VIk7b5Gpul{*Mr4zf@q*)5v#L`zY%xBe!#PE2rQHk_`9f zAdPNh^7=aS@aNL)9;4fm11FW%j=!zZ&6s^|H z2S>;p5(wS{jkUXjH2Y0~>*L!ZDyq8W~B2P&?#1#L|~ z-602B2;OE72E{-AeeGQ_eg8wgZPv%}GLi3)=!EH$=~qlnZV9#?Oem?`44!)f^2Cq` zE8Et}<7FS$8M}Wy=q#C=)0)7Oi{%GqH2+GZu&KuFT8m-$7TKjWY9kL2>xUXN?IhnH zgN?y%VP6^0O)HQfO;h&;n!{|)X8{K+o4nPR-+@tcT-+?W3^X8t3x&+@t%8*-I=sJ1 zjC6i+4W)xEA7&{ah9Kg>=v7u}2>0dbzQS#wUYUi)T%K2z)1rML4p;uCCGWpwWo8|* zC*_pu|F!?~1~dXy3~feYv+QRjf>3Afg?qW?mYCA6JR7`QUC%`N_*(y?Q#D^$tXz#W z$Zz9K+eF=%=jcIav)Lx`8cS4kk!0? z1AA?%D?X4a7%==Z!@!JVEKxi2%qAo%l=$!qXL`OF(Ge%-=S<@xPWj8*PsmewcJ>1$ z7C=i43GaMI#F#vdJ8eIeTXPX(XSlbbwBQraM2QO=(-(UW> z3=R$rAE|`ayK|sN1>p-MI)1i)t|IC#gXI4mrm6~F4OBRATaOyD>;44P5v{y0kzg9% zgUo}UmYM)9lAZHMjqL_E>nv7#-ggM46Xe`FmsvlF4#`M}__g-wqYIx|Eu~ly9|*37 z9$;<>@!BBRtXEblUz>>a7?SuKSFF%U}%nqIu zvneBCCvC?O+dc{tlVwpya_407|HZBTf`MG;3CHnd-{Urp3G)h<6e#^X6ic=!xPDve zGfP19Y@@xM0@z4)8V5rIJ5Oot!Usu-H*B*^$2o<{-4KLaI#Q4O4qvXm4|EY=%~hqv zYbwMZC`HO$L&!gA1LI7_k$(DT_`iF}w8sVsvSCypWBpK^aVvGn@9?ugo8hY@-ARuj z%9KyzV{V&pnTs+pAQW#2vSoSO3OL1f7PX&^Yqj1gk9E_hnxB;(65O7i&P46NMm40P zU+S49kVeV80TsbS?3pk6w$JmG_o+ga5la{pf^vO3_^sx_4def13oKefxNHCH*v}5vzF1%96N}%f!dH8RXfLL8J3QK%HEw|`}s7; zbOD>=f>|z3CAj;+el(Hzix)UJuo3RQXc_IWhOR$`3uvh#Ph(iSqUb!n@26REpvU9M zGT;#Q_=AxB{M>q>2ryO~%Rr<}^#yzqXmgp}ut`iF&KzrI53ldAscyGdJ2$(hIE@e% zieXu-g(OyWm*e8k+GK1Rw^Vpv`R@7rFZKv|kWR#K9mkA)h}j-4Fo#JBmgR(S=aFuc zy_)S!l2rR===JCv_=WB+N|rG$<HB{OZ&PF}{U&24`Kr5NIuM3Nn#l1rC~oUihtA z^OVro0#nhbWX&B<-viNnKomeOfByj(lqjiO!tF|=3#wv)SwM8&i~p&Kdsr%FxVa5W zj(?o_$svcey$P2oFXO+Rta(=7f;YUM9mo<&pIm^eE)11`_sEaq_cbpe{A2;EPedNfJ#@3r(}n9 zrkhOeN4(IfS9Bwe@OU`Ycc5je5aq14Dbe%yb!_8^%e~eVI?RTJ`S+Vf9-Di+;b;Eg ziuHCG=3CZDuLx6Bwlods5O`uzUmYBGyL`0kPAvMUw07w%^^4F=!NvTSNY?U*>gj&O z|I&ITX5tzgtzOeFcGzvbJrG%`S`TV0p(C?MfoUXv%v9FbG3Jry)Mu0Fmqcx>AKB&D zT>eBg$G)&9lR5kRAZwJRe#}brzJlb44C|Hd_Kwc-*OZgfpW@*oqVW<)o2f4&nyVtX z%Br?Fj1yQe5@knmQr5%6TU(*wsIqAB&QconMl-1UzhLVXvoc8GmcRb_@NV_}xRV}q zEhP4t)%WjYs2>9`6W}+|4i|+AC;EQ=Wo-hCqxuH~rgeXC-dsYnD>k+p9~pf#Q^3{h zL2zGVr@t_u13B-+3UTg~b%&kJ*=*@^pGp1^zc%rbW=aglEQtwsMq;$@OSs{~ZskU+ z3m0?3idGUWhB`7d0`tDB_c>zV3|M{1>u*1O=+C8ivR)XutQbjHU6D7+`mW5>7>;0? zT^1DMeiex=GFL^RLa8>TRcYD+W?rJllWXjkzSc=6ea(m$+p8Ad{N^<=<&ft^%5be& z|K=noOnGkUr2UjUq~Y&$2$|XEsL}esS&17W+^XP~x5_(_t+AS-t-)MPu!9cZ{GYpH z0!A&$&FaX?hne;eeBe7v9(bno@CRfhr13^Zo-&QBN2C4kR=cEBV#M9ALCc55R9V9> z46La7FABhcPWRRr7waW6!3U!C$l(2e^?F^RrgHm&`zNb^{u^J~kNEjP@V*J!ivEMm zrd|8L`t}nmDmfd){sY0&WN93#4#3^|f05og>+NuVO&_N~r2TR(!X7EE?}hQa^~!rr zWC#5x!mu)&$au=W?m{*3;GkMF)&uF&g+n`qiKrBtpYFbLq8<_0> zQTCQmaW&hza1sI}XbA4^?k))yTm!*Fun^px4k18r4^HC*_uvxTU4sR8x29>i>wVAO z-`)4SXOFv2|5#)67|>O#YSy%R<}=^aN~CCOV@!{niTP)HRQl|Q>dE|ksS9VmU$*cX zTANl8e`|oqo@P3eMqJ=tjVdr?^v4vexb%5LNsAwF;=dTuk=7)agB^SpR&DzAAS}E$ zxT~uTL3P*DBN*s#O&VN;xr@H2d6AdxXEJ8uHorHflu8%Q{Jm%|f)MET6Ot;Im7sck zNYrKJGXf)@lS*iPD?P6gg;ZSUmL*R$GO$#`;gqrndJT~Y_*5L$CW_i*h@7Lf;&`JX z-h9^KcYS6my_emtqjsmu8dt&GfNF18jlhq*p=Bf(W&vPg>M_QK({ z^r}iDKqevgg+V_p*QG#+6em6}aV*Znb7?3=%K|&ni26;vj(BlawLt|KkE@m2ygaxi zyHDBEf2(RBFduii_r-`^4hB^2(oa#ZT-R%OVL~Zyfb#~~6birc*$YE?3$ou{^v~H7O>OTkFkC?5DlFuAvSut4eoxQL_MJ_vaR;)aUj?hZRK8@Yj z;v70)OXne{e-kN%S#!Ugp2yYM z-Ie#_WZ5eYZ;o#5x)F=5>YHs6Xiuv*I!`OMN@`YFpdW zPaEGhG35>(*{v`K<~c2}BhP*5xH5OYK20vqKRqqsi_^~f{`^KnWddS)V)<+7* z-}#seZ#y2{Ov6b{AI*3>w1f&A;~Alr$4{u zoz%w!M&V}pURO2W8g5O%33u-G9S}x}(sP}5dOHr`QfB}Tn-CziEk56#Vv&Y@Pojwn zyx+><7BbOrxx!q^VkqY`=d-)GoVkwvoam1*x~|A6dBuV1kByb9aM@P5g5)C*Z8IR4KJGTS&vBa!R7pC4MYwsg*0- zB$G@6Z=02Or0f3pWJITU3b7=FgjTb~{ETiDS@n9G48(T9HuVZCns##KyGwCFQvD!B zYLD^`)}-w!zT(7-Ih0`PXSfycxQCipftb4Z#7%ssN}mGAD<1h232=heltX$-Pzz@Z zJ3MWdqR!)DRj~tQO^IwLwqe|-&-b&Kwo5PO0$m&aEyu3jHZlVRca~{Ror`2L$D2B^lI!qIyyRu=0_z2)^AHR9=ds3&~R+|@44^7(+tv(Dktwa-F*a@4RPJ+}%x`p_`2V|Dy0GCFaC=5k;JQC3-WvppPv8bo$| z6D3x?DSu&s*e2V`@a9FhN@E8wApb16WXhNk3a#xIn=|kB9%SWdN}~uZaa8)W>nRlT z@VL)CpYihWnk`^8>|ryNj-D$|9)Yjx$bzrM-$>kzx|wrVoP5i8ZGUs|OB#8v(fsG= zcmdwWYodZK+a#ia&HGt&`|JEdqSXbQ!>wm&mB`LoK4d8s#?E&gJr zE0M03CsI!RXpTT_XTf|CGpAED5lWr$(^$}Dq@wYS2A}3>eBoJ~{njfC*p!#^9gWW~ zChZ9EP3g??)-QD55Jm<_RyxP88WI;ztLonDrB4oYq=R{>Kk#pfjg2|ZhLWH5txUWL z6AT%{=`+%2&b_YYL-J7%?;Ye$e2wRmV6d;ALdy;2DIrjeR}C9{nw%Ag*25l!3;d5_ zx5?3Z;6sDZ2WgjSQtMQ${)`&1i#G32e^*803X`g%hn{g(+_iLI4z5J_RAov<6q&J z7A9m;mPMB;Ya%4VmItr;V0mvai5GZ$6eG7q<)GO$AVk;rLYk4Yf?iT zwUZ@uTR{S0&=?ZMH*bdsnG)uro`HzVC}5ZI&f_azcg7<64EnI>L4>eUi2ma-Y1Fsx z)r(^m(0a&A)c*8S5ceq|7eNglMk`A}-r=z_^m^%a+SyR~ekje^n@+#j)5C>ZOq(o^ z@0K@_=j1~)UZdu5=P~n{*W_PMF+DKtO@)gV^j{Fy7&&$f3D{_^WjJz>GVc2rf?mgi z!le{|dZ>T`cggASPdf3@&QQVr*GIkt#3mE8=+v81i%t6$UM53*B*Uqp@z)fW%7g;~ z718p!US}Z=y5UjD1M9)=-QUMPVqH;_NW8n6YB+HvgWK`75G$F4dsd$|%=#zM_=`M` zFsC9{4L$?$luv;K{TTfGj*aZAn$#59e+060l&Pz#+aWQ*QMnIipwC#3Iwzs;H5{VG z9abqVJ`UiVI6&;gJ_$cZ>Vo}F8jA0tJ|GndHMtz9fKCQDJ;s*zhXsM3qkD9bCGb^% zn>jGH>|#GTW}1cU-6f-Sp@iD1@8sEUWM$!)Z&VcTWHUTwIp9SM3e#CsfT9PqVeMvC zq)RgXNqj9k0~CGG`_cWw>k|<7MmId)tb{V3zCW7pfYp{0KA>5_ipFG8HB3F=yE)um zWvmHC6!VuK3HA+|@kwU+;Yf*tif)MQ!8-Vjf2 zRN{bp;7~*ICRVwz(BIZecO;Hlw~&4>1ocI+;s>#8?-sdvoOiKE`R^Inzu`rEZRW)( zkS=6jOs6yRUVenK;(GdPaW#Su292Huk4Gvut{e3yOtmXZ$^)SLDPN>zUegc~W@F@R zW~7L^>w>2Gh!@~Kf)p5`P*T3sHAT3JFYX%bVoBb-nK4j*A#*uvmgsGgSa2q zj_gu3Txt5mJqx8s7SM2%rhv?TD;HdmdAMF?SF0HqsYHl_>{$72RrQ+>)sNqwrfqBA z5N`0J9`^6ElMhK;I*EnTZYJ*!Jm8vOEj;%b`=LI$^8%a0JPtqb?s%%lqxNp?LC$|r z1mSczGIV(VMcVA6m#FfgP7@Y1tKoUg7PqG+$TbuCC`L-W<;oD8W* zS~mof-1rGV^lkGMX#FhCba}-BGAR&f(T2HgriMSd}96Es7@kYxnEWq ztMaX`x_V}M(M5#9v+%%R=yDwg`sNI4#?Ma12aW?&!m~w;Vmn*zG(*#S(||d_+$zhA z_d@U~g%mPk0UH7^>Z5nX1yHBB4<}Ll6BrL&#fNNf_46ha-eL?=r#)mz=|B2HT<{BMzKxPCP)dN*XD|Z4?U{ za#yq>Lwb+s`VjIOGOkPmqm9P>*u8Kwhq^$dDRiND;h5K;)5S zZO@KrHLD3f|>nN>ia85Un#|i&C0Dzej=2` zd&4gQ1e!w^5&S7dB~Ywk97YDKY9ANV9_0SBz_K?2H;W&xx0|wAa~W&USF!yWeiRBR zfzQn2Bb%t34@=8>r2I}S3i0uE`kjP`s;B$%JOx=Pv|gti%ux66Ur`fv&A}#QKov-c z(Q{NJ3z8Hhlw_{EAiBqpQr+c``IWPAMZ4d2KuqkUN@p((#zj{$kpR;ot{;=ECk?7W zgMUOtFLYf}hP1Xt{JAxdb5B#_Y_jL^Lx%ZK;%9zr_=;M;<>C8798pH&bL? z7`HhsX~uEDuo5ojtCs11|8c=YPT*Zc-N(zLoS#nd3 z&Mk6~FWu&JuR|+tZqWg=xV=XH(bhU z`$v2NQfY0nQ}+m5sqM;x{5UE;ENua2EzkNHb!0&B#?&l=A>$jdU38O(_W7Jydyv6ha?oQ8az&@Uf>Q~Q%X(CLvgS7UrPLT#^5Xu+T(lcBwe}u@vc{D-&jhP@x&uJk@dqZp zVIKtp5*w&JD{Zxa+_Vb&yz%_bsgp5;5Kg`Im^pnyZ133m+Tcj$F&5AjV0lt6VB5%I zU=b3>Yt4QjGA{8@{v`U{mrqbCr=;iCtcteRyw*DiC&c~UmC5)1RMB8I5-3ZX=4bdu zL89F_NNjMC_kcj`lMaqW!w;SJ9ZTvNHLbmgwZj#v)TF_W-f20$kD?fG>6y5xtU2An z_ZGctlU}xx5K&FyGCxkO$zDEXDU^hZ^Dh122W>ybhKG6K?>64%(dC_Kd^?iaznh2M zI`zT6Kbb2-&MGAK$|cD?A{!0^O)gt@_1|vtCiXiF!!{JDmCYr_D<5#BkDVvr8({x9 z+G*V{e56&;tHs&Azhlp}`R@SyG_~jyb8^0B(YnU47NpL+h_5#TjU0x_(exQGz?G9Z z73qqXEEvXW)Cl_9$xZQwy{8vCW=p*y1HK6r<;(Ym9XN3)VHbZ1?wT+hBUzzdTIm)LN zdCn#6Ok%ZKYT7Vj!AdvouIsFf$zvNn`O6{V@rx!4AByjzM{~ zAni_JlgZeg=uYueQL6=jl4D!w#IHbU6?ZMzu1$^ye=e&>Rk>-x%Zz*wR$0)BRjZ^>X6oRc~ZLrGf>M=|L-^{-J2By|N4vYKVDY7v+`(YBvEHH zlqfJ+`Wq8Mppa~TZ)I0!okr?8;u<|o^*MXR%EXD(q~?kyng65d^z z_d2Di+Fms(jaS46uipg+ORt5|Od43gxf${SLe`(t!i3iqPB1Dcu{Y1dODV+5m8u|K ze=V&GQ0Er?5F<40L?By}ssGrierjT6+@k7Q_3I&&yB5>Ing!}UMWc3z%p819et=Xi zrd71x{NI%U4uji9FHab7!SpF&L-(&A< z&Yk8dCDjRTJ6i`sZF(Ej>c=7-MAQ!M;Ka`5mPNdX6nTMD^{z2m#lw_I z7r%1+=e%2V;)D^QiQnRBQ5MRoI(9?W6I8g&%{{v}>51gUb6A=8@X~&{9`~h~UQ%MT z`vUDWza~jMraSSU&%+&C*ycKi<4PxCCNQc9jD1LJ`=NdN`ug4d%CH93LV-G+yH`|D$HeE%eRw?{^L?%D?$-+1*9X;vjSXPR*;)s zK4RvfS2|Ijg9CtKY>lxAOmK`KGFBhOaikBg zw;md&7Ibo_6$WwqP`3`cCr%;^A$TeOBLvx7wVkL>Nqc!$BR19CGG0=TIYil)>2cJV z4kCD<7%QqfU2@yVGZ%K%RRinTSbTjx09}&UDqu;R62&OAQn|d#j=6BlI}XNOCq`?b z*R-;#&d~a9H3wmCIdI}c)G*PSSlHfF#K7FH;mIjxE*ZyjWyPGq^kdX|2^MZXUpV$TPbaf#C?bU~i{p=1aQyTAfz7TX7%B$m8I<;_MtQnXGS~ zDsYWW>XEWWz!4wuJm4!E8F{VqR`>ZF1jLCtmOAAmFB;cfXt&T@o(k5PuPew`KfD2f z{V(Gy)b{h2o)t}GYGK6B{`_!=VG9b9DsG?ypV{#cjfu7n7Y@A+ImW99gfshdvcElv zwK-@HPiBZ1I!NWs@7oKL@{Mh4m1-T&l`8kRRDAGX+UjX*!L3P2l1_gX@$pMzx|HMl zG-v-Dcb2rKKUp0u0q8=@kqPq$pg0gwZzczc=0CxxKS z;oZBFufB}B3!wIkM$-osh+ zmh}G0_9|os!K&&63wCS2)t5x*j+g;78U15lz|eKK*mnDnfuWKa#5FU^YxmL&FwoxTSZn(Qdnw?Bp= zHYIjNP4K(iC$;MR(wdPQp%C@+nQ6pJByRu=K(^)#_@`Xvo;O~`?iXrCA{51P`%0*v zRMNJNGxmgodLXihhW$oQgraYhv#Ixn*&4(M=u7W0{6lAIukUx|0)pq%XCs98xaNlj zxNkMAS%PyE`QwALBPW98XBu}5`Ca962tje`cVquddeMkdW zznr>oG89aNn2IkblOxhIQSbuqJF~oPt{3~5Gqap;x%lfXX;Uaz2km~fRrpQX@>^ab zeWcm2rc3WR-sTnM!SL>Rs=#`i*px`}een$%cZa?I5%3%baOt{GTq&d?hBlm;G|lj#j2Seejhs;i5x7MPhuzl$RW$SSAcMRdwI2i0 zXgS7=0tldd4&8xvuE*;XnFT87wvmL6Hm9d1qj8(tu0=H?+rkyrHYN@LuxTY`C8|MzALw6^C9Fz-XU1Xi+h`Xe&rpj zEqXRSgLkxmBu0C8tIasB+z@fs91B&;G#6=6CU;<(q$r zu!0&d$inku_vamcrEi%vzyeCujyK54rmSj<-oq@ZL(Ey{eYSs^!W*Y{($W(T8)WET zOj(e{uFT}tvc5Y9Z??Kctp~s|lAurGc=7onNcrLhVDzIB>Mp8uGu-E_@0DKIz&N7} z5ZbbNs|*`CcztKh@F2NUkSj7{04#w}2Vcd;S~hn~X$aTSxdD|ViGEjbM8#DVkgi!G z_B`V_x`5w_|521gis�S2k_Bf|I+0+ak) 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/dev/null || exit +} + +function popd_quiet() { + popd &>/dev/null || exit +} + +function echoerr() { + local IFS=" " + cat <<< "$* ❌" 1>&2; +} + +function echo_progress() { + echo "$1 ⚙️" +} diff --git a/Scripts/Templates/artifactbundle-info.json.template b/Scripts/Templates/artifactbundle-info.json.template new file mode 100644 index 0000000..f43d382 --- /dev/null +++ b/Scripts/Templates/artifactbundle-info.json.template @@ -0,0 +1,15 @@ +{ + "schemaVersion": "1.0", + "artifacts": { + "__NAME__": { + "type": "executable", + "version": "__VERSION__", + "variants": [ + { + "path": "__NAME__-__VERSION__-macos/bin/__NAME__", + "supportedTriples": ["x86_64-apple-macosx", "arm64-apple-macosx"] + } + ] + } + } +} \ No newline at end of file diff --git a/Scripts/generate_release_artifacts.sh b/Scripts/generate_release_artifacts.sh new file mode 100755 index 0000000..d1e3148 --- /dev/null +++ b/Scripts/generate_release_artifacts.sh @@ -0,0 +1,224 @@ +#!/usr/bin/env bash + +# shellcheck disable=SC1091,SC2155 + +set -Eeuo pipefail + +source "$(dirname "$0")"/Commons/common.sh + +################# +# CONSTANTS # +################# + +readonly SCRIPT_NAME=$(basename -s ".sh" "$0") +readonly SCRIPT_FULL_NAME=$(basename "$0") +readonly SCRIPT_ABS_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd -P)" +readonly SCRIPT_TEMPLATES_ABS_PATH="$SCRIPT_ABS_PATH/Templates" + +readonly OPTION_HELP_SHORT="-h" +readonly OPTION_HELP="--help" + +readonly PRODUCT_CONFIDENTIAL="confidential" + +readonly SWIFT_BUILD_ARCH_X86="x86_64" +readonly SWIFT_BUILD_ARCH_ARM="arm64" +readonly SWIFT_BUILD_DIR_NAME=".build" + +readonly UNIVERSAL_BIN_DIR_ABS_PATH="$SCRIPT_ABS_PATH/../$SWIFT_BUILD_DIR_NAME/universal" + +readonly LICENSE_ABS_PATH="$SCRIPT_ABS_PATH/../LICENSE" +readonly ARTIFACT_BUNDLE_INFO_TEMPLATE_ABS_PATH="$SCRIPT_TEMPLATES_ABS_PATH/artifactbundle-info.json.template" + +readonly RELEASE_DIR_NAME=".release" +readonly RELEASE_DIR_ABS_PATH="$SCRIPT_ABS_PATH/../$RELEASE_DIR_NAME" + +readonly ERROR_MSG_SEE_USAGE_HELP="Use ${BOLD}$OPTION_HELP_SHORT${NORMAL} | ${BOLD}$OPTION_HELP${NORMAL} option for usage help." + +######################## +# GLOBAL VARIABLES # +######################## + +VERSION_STRING="" + +TMP_DIR_PATH="" +UNIVERSAL_BIN_ABS_PATH="" + +################# +# FUNCTIONS # +################# + +function help() { + cat << MANUAL + +${BOLD}NAME${NORMAL} + ${BOLD}$SCRIPT_NAME${NORMAL} + +${BOLD}SYNOPSIS${NORMAL} + ${BOLD}$SCRIPT_FULL_NAME${NORMAL} ${UNDERLINE}version${NORMAL} + ${BOLD}$SCRIPT_FULL_NAME${NORMAL} ${BOLD}$OPTION_HELP_SHORT${NORMAL} | ${BOLD}$OPTION_HELP${NORMAL} + +${BOLD}DESCRIPTION${NORMAL} + ${BOLD}$SCRIPT_NAME${NORMAL} is a script that generates the release artifacts tagging + them with the supplied ${UNDERLINE}version${NORMAL} string. The generated artifacts are saved in the + ${BOLD}$RELEASE_DIR_NAME${NORMAL} directory located in the package's root directory. + + Generated artifacts include: + • The zip archive containing SwiftPM artifact bundle with ${BOLD}$PRODUCT_CONFIDENTIAL${NORMAL} CLI tool + binary for macOS. + +${BOLD}DEPENDENCIES${NORMAL} + The ${BOLD}$SCRIPT_NAME${NORMAL} script has the following dependencies: + • ${BOLD}Bash 4.2 or newer${NORMAL} - you can upgrade Bash with ${UNDERLINE}upgrade_bash.sh${NORMAL} script. + • ${BOLD}Swift 5.6${NORMAL} - Swift toolchain comes bundled with Xcode. + + Make sure that all dependencies are installed before you start using the script. + +${BOLD}ARGUMENTS${NORMAL} + + ${UNDERLINE}version${NORMAL} + The release version following the MAJOR.MINOR.PATCH scheme. + +${BOLD}OPTIONS${NORMAL} + Options start with one or two dashes. + + ${BOLD}$OPTION_HELP_SHORT${NORMAL}, ${BOLD}$OPTION_HELP${NORMAL} + Show usage description. + +${BOLD}EXAMPLE USAGE${NORMAL} + Generate artifacts for release tagged with version 0.0.1. + ${BOLD}$SCRIPT_FULL_NAME 0.0.1${NORMAL} + +MANUAL +} + +function read_version_argument() { + if [[ $# -eq 0 ]] + then + echoerr "No version provided. $ERROR_MSG_SEE_USAGE_HELP" + exit 1 + fi + if [[ ! $1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]] + then + echoerr "Invalid version format: $1" + exit 1 + fi + + VERSION_STRING="$1" +} + +function set_up() { + echo "---------------------------- SET UP ----------------------------" + echo "🍳" + + echo "Cleaning up SPM build artifacts" + swift package clean + + echo "Making temporary output directory" + TMP_DIR_PATH=$(mktemp -d "$(pwd -P)/$SCRIPT_NAME.tmp.XXXXXXXXXX") + + echo "-------------------------- END SET UP --------------------------" +} + +function clean_up() { + echo "--------------------------- CLEAN UP ---------------------------" + echo "🧽" + + # SPM .build directory generated by SPM interferes with + # Xcode build system, so it needs to be removed once script execution is done. + local -r swift_build_dir_path="$SCRIPT_ABS_PATH/../$SWIFT_BUILD_DIR_NAME" + if [[ -d "$swift_build_dir_path" ]] + then + echo "Deleting SPM $SWIFT_BUILD_DIR_NAME directory" + rm -rf "$swift_build_dir_path" + fi + + if [[ -d "$TMP_DIR_PATH" ]] + then + echo "Removing temporary output directory" + rm -rf "$TMP_DIR_PATH" + fi + + echo "------------------------- END CLEAN UP -------------------------" +} + +function swift_build_cmd() { + echo "swift build --product $1 --configuration release -Xlinker -dead_strip --arch $2" +} + +function build_product() { + eval "$(swift_build_cmd "$1" "$2") > /dev/null" + local -r bin_path=$(eval "$(swift_build_cmd "$1" "$2") --show-bin-path") + + echo "$bin_path/$1" +} + +function build_universal_binary() { + local -r product="$1" + echo_progress "Building $product product for $SWIFT_BUILD_ARCH_X86 architecture" + local -r x86_bin_path=$(build_product "$product" "$SWIFT_BUILD_ARCH_X86") + echo_progress "Building $product product for $SWIFT_BUILD_ARCH_ARM architecture" + local -r arm_bin_path=$(build_product "$product" "$SWIFT_BUILD_ARCH_ARM") + + echo_progress "Creating fat binary for $SWIFT_BUILD_ARCH_X86+$SWIFT_BUILD_ARCH_ARM" + mkdir -p "$UNIVERSAL_BIN_DIR_ABS_PATH" + UNIVERSAL_BIN_ABS_PATH="$UNIVERSAL_BIN_DIR_ABS_PATH/$product" + lipo "$x86_bin_path" "$arm_bin_path" -create -output "$UNIVERSAL_BIN_ABS_PATH" + strip -rSTx "$UNIVERSAL_BIN_ABS_PATH" +} + +function spm_artifactbundle() { + echo "---------------------- SPM ARTIFACT BUNDLE ---------------------" + + local -r product="$1" + build_universal_binary "$product" + + echo_progress "Generating SPM artifact bundle" + local -r bundle_name="$product.artifactbundle" + local -r bundle_path="$TMP_DIR_PATH/$bundle_name" + local -r bundle_bin_path="$bundle_path/$product-$VERSION_STRING-macos/bin" + mkdir -p "$bundle_bin_path" + sed "s/__NAME__/$product/g; s/__VERSION__/$VERSION_STRING/g" "$ARTIFACT_BUNDLE_INFO_TEMPLATE_ABS_PATH" > "$bundle_path/info.json" + cp -f "$UNIVERSAL_BIN_ABS_PATH" "$bundle_bin_path" + cp -f "$LICENSE_ABS_PATH" "$bundle_path" + + mkdir -p "$RELEASE_DIR_ABS_PATH" + + echo_progress "Archiving SPM artifact bundle" + local -r bundle_archive_name="${product^}Binary-macos.artifactbundle.zip" + pushd_quiet "$TMP_DIR_PATH" + zip -qr "$RELEASE_DIR_ABS_PATH/$bundle_archive_name" "$bundle_name" + popd_quiet + + pushd_quiet "$SCRIPT_ABS_PATH/.." + echo -e "Bundle checksum:\n$(swift package compute-checksum "./$RELEASE_DIR_NAME/$bundle_archive_name")" + popd_quiet + + echo "-------------------- END SPM ARTIFACT BUNDLE -------------------" +} + +################### +# ENTRY POINT # +################### + +while [[ $# -gt 0 ]] +do +key="$1" + +case $key in + "$OPTION_HELP_SHORT" | "$OPTION_HELP") + help + exit 0 + ;; + *) + break + ;; +esac +done + +read_version_argument "$@" + +trap clean_up EXIT + +set_up + +spm_artifactbundle "$PRODUCT_CONFIDENTIAL" diff --git a/Scripts/run_tests.sh b/Scripts/run_tests.sh new file mode 100755 index 0000000..bce127b --- /dev/null +++ b/Scripts/run_tests.sh @@ -0,0 +1,96 @@ +#!/usr/bin/env bash + +# shellcheck disable=SC1091,SC2155 + +set -Eeuo pipefail + +source "$(dirname "$0")"/Commons/common.sh + +################# +# CONSTANTS # +################# + +readonly SCRIPT_ABS_PATH="$(cd "$(dirname "${BASH_SOURCE[0]}")" >/dev/null 2>&1 && pwd -P)" + +readonly SWIFT_BUILD_DIR_NAME=".build" + +readonly COVERAGE_DIR_NAME=".coverage" +readonly COVERAGE_INCLUDE_LIST=( + "Sources/ConfidentialCore/" + "Sources/ConfidentialKit/" + ) + +################# +# FUNCTIONS # +################# + +function set_up() { + echo "---------------------------- SET UP ----------------------------" + echo "🍳" + + echo "Cleaning up SPM build artifacts" + swift package clean + + echo "-------------------------- END SET UP --------------------------" +} + +function clean_up() { + echo "--------------------------- CLEAN UP ---------------------------" + echo "🧽" + + # SPM .build directory generated by SPM interferes with + # Xcode build system, so it needs to be removed once script execution is done. + local -r swift_build_dir_path="$SCRIPT_ABS_PATH/../$SWIFT_BUILD_DIR_NAME" + if [[ -d "$swift_build_dir_path" ]] + then + echo "Deleting SPM $SWIFT_BUILD_DIR_NAME directory" + rm -rf "$swift_build_dir_path" + fi + + echo "------------------------- END CLEAN UP -------------------------" +} + +function swift_test() { + echo "-------------------------- SWIFT TEST --------------------------" + echo "🧪" + + swift test --parallel --enable-code-coverage + + echo "------------------------ END SWIFT TEST ------------------------" +} + +function swift_package_name() { + swift package describe | awk '/Name:/ { print $2; exit; }' +} + +function export_coverage_data() { + echo "------------------------ COVERAGE DATA -------------------------" + + echo_progress "Exporting code coverage data" + + local -r package_name=$(swift_package_name) + local -r bin_path="$SWIFT_BUILD_DIR_NAME/debug/${package_name}PackageTests.xctest/Contents/MacOS/${package_name}PackageTests" + local -r profdata_path="$SWIFT_BUILD_DIR_NAME/debug/codecov/default.profdata" + local -r coverage_report_path="$COVERAGE_DIR_NAME/$package_name.lcov" + + pushd_quiet "$SCRIPT_ABS_PATH/.." + mkdir -p "$COVERAGE_DIR_NAME" + # shellcheck disable=SC2068 + xcrun llvm-cov export -format="lcov" "$bin_path" -instr-profile "$profdata_path" ${COVERAGE_INCLUDE_LIST[@]} \ + > "$coverage_report_path" + echo "Code coverage report: $(pwd -P)/$coverage_report_path" + popd_quiet + + echo "---------------------- END COVERAGE DATA -----------------------" +} + +################### +# ENTRY POINT # +################### + +trap clean_up EXIT + +set_up + +swift_test +export_coverage_data diff --git a/Scripts/upgrade_bash.sh b/Scripts/upgrade_bash.sh new file mode 100755 index 0000000..0db3d06 --- /dev/null +++ b/Scripts/upgrade_bash.sh @@ -0,0 +1,44 @@ +#!/usr/bin/env bash + +set -Eeuo pipefail + +readonly LOGIN_SHELLS_FILE_PATH="/etc/shells" + +readonly HOMEBREW_BASH_FORMULA="bash" +readonly HOMEBREW_BASH_X86_INSTALL_DIR="/usr/local/bin/bash" +readonly HOMEBREW_BASH_ARM_INSTALL_DIR="/opt/homebrew/bin/bash" + +if ! command -v "brew" &>/dev/null +then + echo "Error: 'brew' command not found. Please install Homebrew before running this script." 1>&2 + exit 1 +fi + +echo "-------------------------------- UPGRADE BASH --------------------------------" + +if ! brew list $HOMEBREW_BASH_FORMULA &>/dev/null +then + echo "Installing Bash ⚙️" + brew install $HOMEBREW_BASH_FORMULA > /dev/null +else + echo "Updating Bash ⚙️" + brew upgrade $HOMEBREW_BASH_FORMULA > /dev/null +fi + +if [[ -f "$HOMEBREW_BASH_ARM_INSTALL_DIR" ]] +then + HOMEBREW_BASH_INSTALL_DIR="$HOMEBREW_BASH_ARM_INSTALL_DIR" +else + HOMEBREW_BASH_INSTALL_DIR="$HOMEBREW_BASH_X86_INSTALL_DIR" +fi + +if ! grep -q $HOMEBREW_BASH_INSTALL_DIR $LOGIN_SHELLS_FILE_PATH +then + echo $HOMEBREW_BASH_INSTALL_DIR | sudo tee -a $LOGIN_SHELLS_FILE_PATH +fi + +sudo chsh -s $HOMEBREW_BASH_INSTALL_DIR + +echo -e "\n$(bash --version)" + +echo "------------------------------ END UPGRADE BASH ------------------------------" diff --git a/Sources/ConfidentialCore/Coding/DataEncoder.swift b/Sources/ConfidentialCore/Coding/DataEncoder.swift new file mode 100644 index 0000000..56528d8 --- /dev/null +++ b/Sources/ConfidentialCore/Coding/DataEncoder.swift @@ -0,0 +1,7 @@ +import Foundation + +protocol DataEncoder { + func encode(_ value: E) throws -> Data +} + +extension JSONEncoder: DataEncoder {} diff --git a/Sources/ConfidentialCore/Constants/Constants.swift b/Sources/ConfidentialCore/Constants/Constants.swift new file mode 100644 index 0000000..888fa78 --- /dev/null +++ b/Sources/ConfidentialCore/Constants/Constants.swift @@ -0,0 +1,27 @@ +enum C { + + enum Code { + + enum Format { + static let indentWidth: Int = 4 + } + + enum Generation { + static let deobfuscateDataFuncName: String = "deobfuscateData" + static let deobfuscateDataFuncParamName: String = "data" + } + } + + enum Parsing { + + enum Keywords { + static let compress: String = "compress" + static let encrypt: String = "encrypt" + static let shuffle: String = "shuffle" + static let using: String = "using" + static let create: String = "create" + static let extend: String = "extend" + static let from: String = "from" + } + } +} diff --git a/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CaseIterable.swift b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CaseIterable.swift new file mode 100644 index 0000000..84c520a --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CaseIterable.swift @@ -0,0 +1,13 @@ +import ConfidentialKit + +extension Obfuscation.Compression.CompressionAlgorithm: CaseIterable { + + public static var allCases: [Self] { + [ + .lzfse, + .lz4, + .lzma, + .zlib + ] + } +} diff --git a/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CustomStringConvertible.swift b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CustomStringConvertible.swift new file mode 100644 index 0000000..f7ca393 --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+CustomStringConvertible.swift @@ -0,0 +1,19 @@ +import ConfidentialKit + +extension Obfuscation.Compression.CompressionAlgorithm: CustomStringConvertible { + + public var description: String { + switch self { + case .lzfse: + return "lzfse" + case .lz4: + return "lz4" + case .lzma: + return "lzma" + case .zlib: + return "zlib" + @unknown default: + return "unknown" + } + } +} diff --git a/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+Name.swift b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+Name.swift new file mode 100644 index 0000000..861b19b --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Compression/CompressionAlgorithm+Name.swift @@ -0,0 +1,19 @@ +import ConfidentialKit + +extension Obfuscation.Compression.CompressionAlgorithm { + + var name: String { + switch self { + case .lzfse: + return "lzfse" + case .lz4: + return "lz4" + case .lzma: + return "lzma" + case .zlib: + return "zlib" + @unknown default: + return "unknown" + } + } +} diff --git a/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CaseIterable.swift b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CaseIterable.swift new file mode 100644 index 0000000..c56dff7 --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CaseIterable.swift @@ -0,0 +1,13 @@ +import ConfidentialKit + +extension Obfuscation.Encryption.SymmetricEncryptionAlgorithm: CaseIterable { + + public static var allCases: [Self] { + [ + .aes128GCM, + .aes192GCM, + .aes256GCM, + .chaChaPoly + ] + } +} diff --git a/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CustomStringConvertible.swift b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CustomStringConvertible.swift new file mode 100644 index 0000000..0d781d9 --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+CustomStringConvertible.swift @@ -0,0 +1,17 @@ +import ConfidentialKit + +extension Obfuscation.Encryption.SymmetricEncryptionAlgorithm: CustomStringConvertible { + + public var description: String { + switch self { + case .aes128GCM: + return "aes-128-gcm" + case .aes192GCM: + return "aes-192-gcm" + case .aes256GCM: + return "aes-256-gcm" + case .chaChaPoly: + return "chacha20-poly" + } + } +} diff --git a/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+Name.swift b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+Name.swift new file mode 100644 index 0000000..004ac74 --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/ConfidentialKit/Obfuscation/Encryption/SymmetricEncryptionAlgorithm+Name.swift @@ -0,0 +1,6 @@ +import ConfidentialKit + +extension Obfuscation.Encryption.SymmetricEncryptionAlgorithm { + + var name: String { rawValue } +} diff --git a/Sources/ConfidentialCore/Extensions/Foundation/Data/Data+HexString.swift b/Sources/ConfidentialCore/Extensions/Foundation/Data/Data+HexString.swift new file mode 100644 index 0000000..17176bd --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/Foundation/Data/Data+HexString.swift @@ -0,0 +1,20 @@ +import Foundation + +extension Data { + + struct HexEncodingOptions: OptionSet { + static let upperCase: Self = .init(rawValue: 1 << 0) + static let numericLiteral: Self = .init(rawValue: 1 << 1) + + let rawValue: Int + } + + func hexEncodedStringComponents(options: HexEncodingOptions = []) -> [String] { + var format = options.contains(.upperCase) ? "%02hhX" : "%02hhx" + if options.contains(.numericLiteral) { + format = "0x\(format)" + } + + return map { String(format: format, $0) } + } +} diff --git a/Sources/ConfidentialCore/Extensions/Swift/Encodable/Encodable+TypeErasure.swift b/Sources/ConfidentialCore/Extensions/Swift/Encodable/Encodable+TypeErasure.swift new file mode 100644 index 0000000..294a91c --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/Swift/Encodable/Encodable+TypeErasure.swift @@ -0,0 +1,19 @@ +struct AnyEncodable: Encodable { + + private let encode: (Encoder) throws -> Void + + init(_ encodable: any Encodable) { + self.encode = encodable.encode(to:) + } + + func encode(to encoder: Encoder) throws { + try encode(encoder) + } +} + +extension Encodable { + + func eraseToAnyEncodable() -> AnyEncodable { + .init(self) + } +} diff --git a/Sources/ConfidentialCore/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandom.swift b/Sources/ConfidentialCore/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandom.swift new file mode 100644 index 0000000..1816dc9 --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandom.swift @@ -0,0 +1,26 @@ +import Foundation + +extension FixedWidthInteger { + + typealias SecureRandomNumberSource = (inout [UInt8]) -> OSStatus + + static func secureRandom( + using source: SecureRandomNumberSource = { + SecRandomCopyBytes(kSecRandomDefault, $0.count, &$0) + } + ) throws -> Self { + let count = MemoryLayout.stride + var bytes = [UInt8](repeating: .zero, count: count) + let status = source(&bytes) + guard status == errSecSuccess else { + let errorDescription = SecCopyErrorMessageString(status, nil) as String? ?? "Unknown error" + throw NSError( + domain: NSOSStatusErrorDomain, + code: .init(status), + userInfo: [NSLocalizedDescriptionKey: errorDescription] + ) + } + + return bytes.withUnsafeBytes { $0.load(as: Self.self) } + } +} diff --git a/Sources/ConfidentialCore/Extensions/SwiftSyntax/TokenSyntax/TokenSyntax+Tokens.swift b/Sources/ConfidentialCore/Extensions/SwiftSyntax/TokenSyntax/TokenSyntax+Tokens.swift new file mode 100644 index 0000000..c8aac9a --- /dev/null +++ b/Sources/ConfidentialCore/Extensions/SwiftSyntax/TokenSyntax/TokenSyntax+Tokens.swift @@ -0,0 +1,79 @@ +import SwiftSyntax + +extension TokenSyntax { + + static func atSign( + leadingNewlines: Int, + followedByLeadingSpaces leadingSpaces: Int = C.Code.Format.indentWidth + ) -> Self { + makeToken( + .atSign.withoutTrivia(), + withLeadingNewlines: leadingNewlines, + followedByLeadingSpaces: leadingSpaces + ) + } + + static func period( + leadingNewlines: Int, + followedByLeadingSpaces leadingSpaces: Int = C.Code.Format.indentWidth + ) -> Self { + makeToken( + .period.withoutTrivia(), + withLeadingNewlines: leadingNewlines, + followedByLeadingSpaces: leadingSpaces + ) + } + + static func rightParen( + leadingNewlines: Int, + followedByLeadingSpaces leadingSpaces: Int = C.Code.Format.indentWidth + ) -> Self { + makeToken( + .rightParen.withoutTrivia(), + withLeadingNewlines: leadingNewlines, + followedByLeadingSpaces: leadingSpaces + ) + } + + static func `private`( + leadingNewlines: Int, + followedByLeadingSpaces leadingSpaces: Int = C.Code.Format.indentWidth, + trailingSpaces: Int = 1 + ) -> Self { + makeToken( + .private.withoutTrivia().withTrailingTrivia(.spaces(trailingSpaces)), + withLeadingNewlines: leadingNewlines, + followedByLeadingSpaces: leadingSpaces + ) + } + + static func `static`( + leadingNewlines: Int, + followedByLeadingSpaces leadingSpaces: Int = C.Code.Format.indentWidth, + trailingSpaces: Int = 1 + ) -> Self { + makeToken( + .static.withoutTrivia().withTrailingTrivia(.spaces(trailingSpaces)), + withLeadingNewlines: leadingNewlines, + followedByLeadingSpaces: leadingSpaces + ) + } +} + +private extension TokenSyntax { + + static func makeToken( + _ token: Self, + withLeadingNewlines leadingNewlines: Int, + followedByLeadingSpaces leadingSpaces: Int + ) -> Self { + guard leadingNewlines > .zero else { + return token + } + + return token.withLeadingTrivia( + .newlines(leadingNewlines) + .appending(.spaces(leadingSpaces)) + ) + } +} diff --git a/Sources/ConfidentialCore/Models/Configuration/Configuration.Secret.Value+UnderlyingValue.swift b/Sources/ConfidentialCore/Models/Configuration/Configuration.Secret.Value+UnderlyingValue.swift new file mode 100644 index 0000000..25d66a7 --- /dev/null +++ b/Sources/ConfidentialCore/Models/Configuration/Configuration.Secret.Value+UnderlyingValue.swift @@ -0,0 +1,11 @@ +extension Configuration.Secret.Value { + + var underlyingValue: AnyEncodable { + switch self { + case let .array(value): + return value.eraseToAnyEncodable() + case let .singleValue(value): + return value.eraseToAnyEncodable() + } + } +} diff --git a/Sources/ConfidentialCore/Models/Configuration/Configuration.swift b/Sources/ConfidentialCore/Models/Configuration/Configuration.swift new file mode 100644 index 0000000..fabf4f4 --- /dev/null +++ b/Sources/ConfidentialCore/Models/Configuration/Configuration.swift @@ -0,0 +1,65 @@ +import ConfidentialKit + +public struct Configuration: Equatable, Decodable { + var algorithm: ArraySlice + var defaultNamespace: String? + var secrets: ArraySlice + + init( + algorithm: ArraySlice, + defaultNamespace: String?, + secrets: ArraySlice + ) { + self.algorithm = algorithm + self.defaultNamespace = defaultNamespace + self.secrets = secrets + } + + public init(from decoder: Decoder) throws { + let container = try decoder.container(keyedBy: CodingKeys.self) + self = .init( + algorithm: try container.decode([String].self, forKey: .algorithm)[...], + defaultNamespace: try? container.decodeIfPresent(String.self, forKey: .defaultNamespace), + secrets: try container.decode([Secret].self, forKey: .secrets)[...] + ) + } +} + +extension Configuration { + + struct Secret: Equatable, Hashable, Decodable { + let name: String + let value: Value + let namespace: String? + } +} + +extension Configuration.Secret { + + enum Value: Equatable, Hashable, Decodable { + + typealias DataTypes = Obfuscation.SupportedDataTypes + + case array(DataTypes.Array) + case singleValue(DataTypes.SingleValue) + + init(from decoder: Decoder) throws { + let container = try decoder.singleValueContainer() + if let value = try? container.decode(DataTypes.Array.self) { + self = .array(value) + } else { + let value = try container.decode(DataTypes.SingleValue.self) + self = .singleValue(value) + } + } + } +} + +private extension Configuration { + + enum CodingKeys: String, CodingKey { + case algorithm + case defaultNamespace + case secrets + } +} diff --git a/Sources/ConfidentialCore/Models/SourceSpecification/SourceSpecification.swift b/Sources/ConfidentialCore/Models/SourceSpecification/SourceSpecification.swift new file mode 100644 index 0000000..62a490b --- /dev/null +++ b/Sources/ConfidentialCore/Models/SourceSpecification/SourceSpecification.swift @@ -0,0 +1,108 @@ +import ConfidentialKit +import Foundation + +public struct SourceSpecification: Equatable { + var algorithm: Algorithm + var secrets: Secrets +} + +public extension SourceSpecification { + + typealias Algorithm = ArraySlice + + struct ObfuscationStep: Equatable { + let technique: Technique + } + + struct Secret { + let name: String + var data: Data + let dataAccessWrapperInfo: DataAccessWrapperInfo + } + + struct Secrets: Equatable, Hashable { + + public typealias Secret = SourceSpecification.Secret + + private var secrets: [Secret.Namespace: ArraySlice] + + var namespaces: Dictionary>.Keys { + secrets.keys + } + + init(_ secrets: [Secret.Namespace: ArraySlice]) { + self.secrets = secrets + } + + subscript(namespace: Secret.Namespace) -> ArraySlice? { + _read { yield self.secrets[namespace] } + _modify { yield &self.secrets[namespace] } + } + } +} + +public extension SourceSpecification.ObfuscationStep { + + enum Technique: Equatable, Hashable { + case compression(algorithm: Obfuscation.Compression.CompressionAlgorithm) + case encryption(algorithm: Obfuscation.Encryption.SymmetricEncryptionAlgorithm) + case randomization(nonce: UInt64) + } +} + +extension SourceSpecification.Secret: Equatable, Hashable { + + public static func == (lhs: Self, rhs: Self) -> Bool { + lhs.name == rhs.name && lhs.data == rhs.data + } + + public func hash(into hasher: inout Hasher) { + hasher.combine(name) + hasher.combine(data) + } +} + +extension SourceSpecification.Secret { + + struct DataAccessWrapperInfo { + + typealias Argument = (label: String?, value: String) + + let typeInfo: TypeInfo + let arguments: [Argument] + } + + public enum Namespace: Equatable, Hashable { + case create(identifier: String) + case extend(identifier: String, moduleName: String? = nil) + } +} + +extension SourceSpecification.Secrets: Collection { + + public typealias Element = Dictionary>.Element + public typealias Index = Dictionary>.Index + + public var startIndex: Index { + secrets.startIndex + } + + public var endIndex: Index { + secrets.endIndex + } + + public subscript(position: Index) -> Element { + secrets[position] + } + + public func index(after index: Index) -> Index { + secrets.index(after: index) + } +} + +extension SourceSpecification.Secrets: ExpressibleByDictionaryLiteral { + + public init(dictionaryLiteral elements: (Secret.Namespace, ArraySlice)...) { + self.init(.init(uniqueKeysWithValues: elements)) + } +} diff --git a/Sources/ConfidentialCore/Obfuscation/DataObfuscationStep.swift b/Sources/ConfidentialCore/Obfuscation/DataObfuscationStep.swift new file mode 100644 index 0000000..f0742ac --- /dev/null +++ b/Sources/ConfidentialCore/Obfuscation/DataObfuscationStep.swift @@ -0,0 +1,5 @@ +import Foundation + +protocol DataObfuscationStep { + func obfuscate(_ data: Data) throws -> Data +} diff --git a/Sources/ConfidentialCore/Obfuscation/SourceObfuscator+ObfuscationStepResolver.swift b/Sources/ConfidentialCore/Obfuscation/SourceObfuscator+ObfuscationStepResolver.swift new file mode 100644 index 0000000..d4ca477 --- /dev/null +++ b/Sources/ConfidentialCore/Obfuscation/SourceObfuscator+ObfuscationStepResolver.swift @@ -0,0 +1,33 @@ +import ConfidentialKit + +protocol DataObfuscationStepResolver { + + typealias Technique = SourceSpecification.ObfuscationStep.Technique + + func obfuscationStep(for technique: Technique) -> any DataObfuscationStep +} + +extension SourceObfuscator { + + struct ObfuscationStepResolver: DataObfuscationStepResolver { + + @inline(__always) + func obfuscationStep(for technique: Technique) -> any DataObfuscationStep { + switch technique { + case let .compression(algorithm): + return Obfuscation.Compression.DataCompressor(algorithm: algorithm) + case let .encryption(algorithm): + return Obfuscation.Encryption.DataCrypter(algorithm: algorithm) + case let .randomization(nonce): + return Obfuscation.Randomization.DataShuffler(nonce: nonce) + } + } + } +} + +public extension SourceObfuscator { + + init() { + self.init(obfuscationStepResolver: ObfuscationStepResolver()) + } +} diff --git a/Sources/ConfidentialCore/Obfuscation/SourceObfuscator.swift b/Sources/ConfidentialCore/Obfuscation/SourceObfuscator.swift new file mode 100644 index 0000000..13da7a9 --- /dev/null +++ b/Sources/ConfidentialCore/Obfuscation/SourceObfuscator.swift @@ -0,0 +1,47 @@ +import Foundation + +public struct SourceObfuscator { + + private let obfuscationStepResolver: DataObfuscationStepResolver + + init(obfuscationStepResolver: DataObfuscationStepResolver) { + self.obfuscationStepResolver = obfuscationStepResolver + } + + public func obfuscate(_ source: inout SourceSpecification) throws { + guard !source.secrets.isEmpty else { + return + } + + let obfuscateData = obfuscationFunc(given: source.algorithm) + try source.secrets.namespaces.forEach { namespace in + guard let secrets = source.secrets[namespace] else { + fatalError("Unexpected source specification integrity violation") + } + + source.secrets[namespace] = try secrets.map { secret in + var secret = secret + secret.data = try obfuscateData(secret.data) + return secret + }[...] + } + } +} + +private extension SourceObfuscator { + + typealias Algorithm = SourceSpecification.Algorithm + typealias ObfuscationFunc = (Data) throws -> Data + + @inline(__always) + func obfuscationFunc(given algorithm: Algorithm) -> ObfuscationFunc { + algorithm + .map(\.technique) + .map(obfuscationStepResolver.obfuscationStep(for:)) + .reduce({ $0 }) { partialFunc, step in + return { + try step.obfuscate(partialFunc($0)) + } + } + } +} diff --git a/Sources/ConfidentialCore/Obfuscation/Techniques/Compression/DataCompressor+DataObfuscationStep.swift b/Sources/ConfidentialCore/Obfuscation/Techniques/Compression/DataCompressor+DataObfuscationStep.swift new file mode 100644 index 0000000..d869740 --- /dev/null +++ b/Sources/ConfidentialCore/Obfuscation/Techniques/Compression/DataCompressor+DataObfuscationStep.swift @@ -0,0 +1,10 @@ +import ConfidentialKit +import Foundation + +extension Obfuscation.Compression.DataCompressor: DataObfuscationStep { + + func obfuscate(_ data: Data) throws -> Data { + let compressedData = try NSData(data: data).compressed(using: algorithm) + return .init(referencing: compressedData) + } +} diff --git a/Sources/ConfidentialCore/Obfuscation/Techniques/Encryption/DataCrypter+DataObfuscationStep.swift b/Sources/ConfidentialCore/Obfuscation/Techniques/Encryption/DataCrypter+DataObfuscationStep.swift new file mode 100644 index 0000000..7284484 --- /dev/null +++ b/Sources/ConfidentialCore/Obfuscation/Techniques/Encryption/DataCrypter+DataObfuscationStep.swift @@ -0,0 +1,32 @@ +import ConfidentialKit +import CryptoKit +import Foundation + +extension Obfuscation.Encryption.DataCrypter: DataObfuscationStep { + + func obfuscate(_ data: Data) throws -> Data { + let key = SymmetricKey(size: algorithm.keySize) + + var obfuscatedData: Data + switch algorithm { + case .aes128GCM, .aes192GCM, .aes256GCM: + let sealedBox = try AES.GCM.seal(data, using: key, nonce: .init()) + /* + As the official documentation states, when we use the nonce of the + default size of 12 bytes, the combined representation is available, + hence the use of force unwrap. + See https://developer.apple.com/documentation/cryptokit/aes/gcm/sealedbox + for more details + */ + obfuscatedData = sealedBox.combined! + case .chaChaPoly: + let sealedBox = try ChaChaPoly.seal(data, using: key, nonce: .init()) + obfuscatedData = sealedBox.combined + } + + let keyData = key.withUnsafeBytes(Data.init(_:)) + obfuscatedData.append(keyData) + + return obfuscatedData + } +} diff --git a/Sources/ConfidentialCore/Obfuscation/Techniques/Randomization/DataShuffler+DataObfuscationStep.swift b/Sources/ConfidentialCore/Obfuscation/Techniques/Randomization/DataShuffler+DataObfuscationStep.swift new file mode 100644 index 0000000..b051317 --- /dev/null +++ b/Sources/ConfidentialCore/Obfuscation/Techniques/Randomization/DataShuffler+DataObfuscationStep.swift @@ -0,0 +1,62 @@ +import ConfidentialKit +import Foundation + +extension Obfuscation.Randomization.DataShuffler: DataObfuscationStep { + + func obfuscate(_ data: Data) throws -> Data { + let shuffledIndexes: [Int] = (0.. [UInt8] { + var result: [UInt8] = .init(repeating: .zero, count: bytes.count) + indexes.enumerated().forEach { oldIdx, newIdx in + result[newIdx] = bytes[oldIdx] + } + + return result + } + + @inline(__always) + func obfuscateIndexes(_ indexes: [Int]) -> (bytes: [UInt8], byteWidth: UInt8) { + let highestIndex = indexes.count - 1 + switch highestIndex { + case _ where highestIndex <= UInt8.max: + return ( + bytes: obfuscateIndexes(indexes, indexTransform: UInt8.init), + byteWidth: .init(UInt8.byteWidth) + ) + case _ where highestIndex <= UInt16.max: + return ( + bytes: obfuscateIndexes(indexes, indexTransform: UInt16.init), + byteWidth: .init(UInt16.byteWidth) + ) + default: + return ( + bytes: obfuscateIndexes(indexes, indexTransform: { $0 }), + byteWidth: .init(Int.byteWidth) + ) + } + } + + @inline(__always) + func obfuscateIndexes(_ indexes: [Int], indexTransform: (Int) -> I) -> [UInt8] { + indexes + .map(indexTransform) + .flatMap { withUnsafeBytes(of: $0 ^ .init(bytes: nonce.bytes), [UInt8].init) } + } +} diff --git a/Sources/ConfidentialCore/Parsing/Builders/Variadics.swift b/Sources/ConfidentialCore/Parsing/Builders/Variadics.swift new file mode 100644 index 0000000..cb60177 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Builders/Variadics.swift @@ -0,0 +1,38 @@ +import Parsing +import SwiftSyntaxBuilder + +public struct ExpressibleAsCodeBlockItemFlatMap: Parser +where +P.Input == SourceSpecification, +P.Output == [ExpressibleAsCodeBlockItem] +{ + + private let parsers: [P] + + init(_ parsers: [P]) { + self.parsers = parsers + } + + public func parse(_ input: inout SourceSpecification) throws -> [ExpressibleAsCodeBlockItem] { + try parsers.flatMap { parser in + try parser.parse(&input) + } + } +} + +extension ParserBuilder { + + static func buildBlock

(_ parsers: P...) -> ExpressibleAsCodeBlockItemFlatMap

{ + .init(parsers) + } +} + +extension OneOfBuilder { + + static func buildBlock

(_ parsers: P...) -> Parsers.OneOfMany

+ where + P.Input == Substring, + P.Output == SourceSpecification.ObfuscationStep.Technique { + .init(parsers) + } +} diff --git a/Sources/ConfidentialCore/Parsing/ConvenienceTypealiases.swift b/Sources/ConfidentialCore/Parsing/ConvenienceTypealiases.swift new file mode 100644 index 0000000..4f1880c --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/ConvenienceTypealiases.swift @@ -0,0 +1,3 @@ +import Parsing + +public typealias Parsers = Parsing.Parsers diff --git a/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/DeobfuscateDataFunctionDeclParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/DeobfuscateDataFunctionDeclParser.swift new file mode 100644 index 0000000..ce21ca3 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/DeobfuscateDataFunctionDeclParser.swift @@ -0,0 +1,130 @@ +import Parsing +import SwiftSyntaxBuilder + +struct DeobfuscateDataFunctionDeclParser: Parser { + + typealias Algorithm = SourceSpecification.Algorithm + + private let functionNestingLevel: UInt8 + + init(functionNestingLevel: UInt8) { + self.functionNestingLevel = functionNestingLevel + } + + func parse(_ input: inout Algorithm) throws -> ExpressibleAsMemberDeclListItem { + var obfuscationStepsCount = input.count + guard obfuscationStepsCount > .zero else { + throw ParsingError.assertionFailed( + description: "Obfuscation algorithm must consist of at least one obfuscation step." + ) + } + + let reversedAlgorithm = input.reversed() + let innerMostObfuscationStep = try obfuscationStepExpr( + for: reversedAlgorithm[reversedAlgorithm.startIndex], + indentWidthMultiplier: obfuscationStepsCount + ) + let bodyExpr = try reversedAlgorithm + .dropFirst() + .reduce(innerMostObfuscationStep) { innerExpr, step in + obfuscationStepsCount -= 1 + return try obfuscationStepExpr( + for: step, + withInnerExpr: innerExpr, + indentWidthMultiplier: obfuscationStepsCount + ) + } + + input.removeAll() + + return DeobfuscateDataFunctionDecl( + declNestingLevel: functionNestingLevel, + body: bodyExpr + ) + } +} + +private extension DeobfuscateDataFunctionDeclParser { + + typealias ObfuscationStep = SourceSpecification.ObfuscationStep + + func obfuscationStepExpr( + for obfuscationStep: ObfuscationStep, + indentWidthMultiplier: Int + ) throws -> ExpressibleAsExprBuildable { + let tryIndentWidth = try exprIndentWidth(with: indentWidthMultiplier) + let calledExprIndentWidth = tryIndentWidth + C.Code.Format.indentWidth + return TryExpr( + tryKeyword: .try.withLeadingTrivia(.spaces(tryIndentWidth)), + expression: FunctionCallExpr( + calledExpression: deobfuscateFunctionAccessExpr( + for: obfuscationStep.technique, + indentWidth: calledExprIndentWidth), + leftParen: .leftParen, + rightParen: .rightParen, + argumentListBuilder: { + TupleExprElement( + expression: IdentifierExpr(C.Code.Generation.deobfuscateDataFuncParamName) + ) + } + ) + ) + } + + func obfuscationStepExpr( + for obfuscationStep: ObfuscationStep, + withInnerExpr innerExpr: ExpressibleAsExprBuildable, + indentWidthMultiplier: Int + ) throws -> ExpressibleAsExprBuildable { + let tryIndentWidth = try exprIndentWidth(with: indentWidthMultiplier) + let calledExprIndentWidth = tryIndentWidth + C.Code.Format.indentWidth + return TryExpr( + tryKeyword: .try.withLeadingTrivia(.spaces(tryIndentWidth)), + expression: FunctionCallExpr( + calledExpression: deobfuscateFunctionAccessExpr( + for: obfuscationStep.technique, + indentWidth: calledExprIndentWidth + ), + leftParen: .leftParen.withTrailingTrivia(.newlines(1)), + rightParen: .rightParen( + leadingNewlines: 1, + followedByLeadingSpaces: calledExprIndentWidth + ), + argumentListBuilder: { + TupleExprElement(expression: innerExpr) + } + ) + ) + } + + func deobfuscateFunctionAccessExpr( + for technique: ObfuscationStep.Technique, + indentWidth: Int + ) -> ExpressibleAsExprBuildable { + let initCallExpr: ExpressibleAsExprBuildable + switch technique { + case let .compression(algorithm): + initCallExpr = DataCompressorInitializerCallExpr(compressionAlgorithm: algorithm) + case let .encryption(algorithm): + initCallExpr = DataCrypterInitializerCallExpr(encryptionAlgorithm: algorithm) + case let .randomization(nonce): + initCallExpr = DataShufflerInitializerCallExpr(nonce: nonce) + } + + return DeobfuscateFunctionAccessExpr(initCallExpr, dotIndentWidth: indentWidth) + } +} + +private extension DeobfuscateDataFunctionDeclParser { + + func exprIndentWidth(with indentWidthMultiplier: Int) throws -> Int { + guard indentWidthMultiplier > .zero else { + throw ParsingError.assertionFailed( + description: "Indent width multiplier must be greater than zero." + ) + } + let multiplier = 1 + Int(functionNestingLevel) + (indentWidthMultiplier - 1) * 2 + + return multiplier * C.Code.Format.indentWidth + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceDeclParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceDeclParser.swift new file mode 100644 index 0000000..ea04659 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceDeclParser.swift @@ -0,0 +1,60 @@ +import Parsing +import SwiftSyntaxBuilder + +struct NamespaceDeclParser: Parser +where +MembersParser.Input == ArraySlice, +MembersParser.Output == [ExpressibleAsMemberDeclListItem], +DeobfuscateDataFunctionDeclParser.Input == SourceSpecification.Algorithm, +DeobfuscateDataFunctionDeclParser.Output == ExpressibleAsMemberDeclListItem +{ + + private let membersParser: MembersParser + private let deobfuscateDataFunctionDeclParser: DeobfuscateDataFunctionDeclParser + + init( + membersParser: MembersParser, + deobfuscateDataFunctionDeclParser: DeobfuscateDataFunctionDeclParser + ) { + self.membersParser = membersParser + self.deobfuscateDataFunctionDeclParser = deobfuscateDataFunctionDeclParser + } + + func parse(_ input: inout SourceSpecification) throws -> [ExpressibleAsCodeBlockItem] { + let deobfuscateDataFunctionDecl = try deobfuscateDataFunctionDeclParser.parse(&input.algorithm) + let codeBlocks = try input.secrets.namespaces + .map { namespace -> ExpressibleAsCodeBlockItem in + guard var secrets = input.secrets[namespace] else { + fatalError("Unexpected source specification integrity violation") + } + + var declarations = try membersParser.parse(&secrets) + declarations.append(deobfuscateDataFunctionDecl) + let members = MemberDeclBlock( + leftBrace: .leftBrace.withLeadingTrivia(.spaces(1)), + members: MemberDeclList(declarations) + ) + let decl: ExpressibleAsCodeBlockItem + switch namespace { + case let .create(identifier): + decl = EnumDecl( + enumKeyword: .enum.withLeadingTrivia(.newlines(1)), + identifier: identifier, + members: members + ) + case let .extend(identifier, _): + decl = ExtensionDecl( + modifiers: .none, + extensionKeyword: .extension.withLeadingTrivia(.newlines(1)), + extendedType: SimpleTypeIdentifier(identifier), + members: members + ) + } + input.secrets[namespace] = secrets.isEmpty ? nil : secrets + + return decl + } + + return codeBlocks + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceMembersParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceMembersParser.swift new file mode 100644 index 0000000..e035426 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/NamespaceMembersParser.swift @@ -0,0 +1,34 @@ +import Parsing +import SwiftSyntaxBuilder + +struct NamespaceMembersParser: Parser +where +SecretDeclParser.Input == SourceSpecification.Secret, +SecretDeclParser.Output == ExpressibleAsSecretDecl +{ + + private let secretDeclParser: SecretDeclParser + + init(secretDeclParser: SecretDeclParser) { + self.secretDeclParser = secretDeclParser + } + + func parse(_ input: inout ArraySlice) throws -> [ExpressibleAsMemberDeclListItem] { + var parsedSecretsCount: Int = .zero + let declarations: [SecretDecl] + do { + declarations = try input.map { secret in + let decl = try secretDeclParser.parse(secret).createSecretDecl() + parsedSecretsCount += 1 + + return decl + } + input.removeFirst(parsedSecretsCount) + } catch let error { + input.removeFirst(parsedSecretsCount) + throw error + } + + return declarations + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/Parsers+CodeGeneration.swift b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/Parsers+CodeGeneration.swift new file mode 100644 index 0000000..f8b66df --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/Parsers+CodeGeneration.swift @@ -0,0 +1,4 @@ +public extension Parsers { + + enum CodeGeneration {} +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SecretDeclParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SecretDeclParser.swift new file mode 100644 index 0000000..b0b5347 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SecretDeclParser.swift @@ -0,0 +1,47 @@ +import Parsing +import SwiftSyntaxBuilder + +struct SecretDeclParser: Parser { + + typealias Secret = SourceSpecification.Secret + + func parse(_ input: inout Secret) throws -> ExpressibleAsSecretDecl { + let valueHexComponents = input.data.hexEncodedStringComponents(options: .numericLiteral) + let dataArgumentElements = valueHexComponents + .enumerated() + .map { idx, component in + ArrayElement( + expression: IntegerLiteralExpr(digits: component), + trailingComma: idx < valueHexComponents.endIndex - 1 ? .comma : .none + ) + } + + return SecretDecl( + name: input.name, + dataArgumentExpression: ArrayExpr(elements: ArrayElementList(dataArgumentElements)), + dataAccessWrapper: dataAccessWrapper(with: input.dataAccessWrapperInfo) + ) + } +} + +private extension SecretDeclParser { + + func dataAccessWrapper(with wrapperInfo: Secret.DataAccessWrapperInfo) -> ExpressibleAsCustomAttribute { + CustomAttribute( + atSignToken: .atSign(leadingNewlines: 1), + attributeName: SimpleTypeIdentifier(wrapperInfo.typeInfo.fullyQualifiedName), + leftParen: .leftParen, + argumentList: TupleExprElementList( + wrapperInfo.arguments + .map { argument in + TupleExprElement( + label: argument.label.map { .identifier($0) }, + colon: argument.label.map { _ in .colon }, + expression: IdentifierExpr(argument.value) + ) + } + ), + rightParen: .rightParen + ) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SourceFileParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SourceFileParser.swift new file mode 100644 index 0000000..b48bbb8 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/CodeGeneration/SourceFileParser.swift @@ -0,0 +1,66 @@ +import ConfidentialKit +import Foundation +import Parsing +import SwiftSyntaxBuilder + +public struct SourceFileParser: Parser +where +CodeBlockParsers.Input == SourceSpecification, +CodeBlockParsers.Output == [ExpressibleAsCodeBlockItem] +{ + + private let codeBlockParsers: CodeBlockParsers + + init(@ParserBuilder with build: () -> CodeBlockParsers) { + self.codeBlockParsers = build() + } + + public func parse(_ input: inout SourceSpecification) throws -> SourceFileText { + var statements = Self.makeModuleImportList(from: input.secrets.namespaces) + .enumerated() + .map { idx, moduleName -> ExpressibleAsCodeBlockItem in + ImportDecl( + path: AccessPath([AccessPathComponent(name: .identifier(moduleName))]) + ) + } + statements.append( + contentsOf: try codeBlockParsers.parse(&input) + ) + + return .init(from: SourceFile( + statements: CodeBlockItemList(statements), + eofToken: .eof + )) + } +} + +private extension SourceFileParser { + + static func makeModuleImportList(from namespaces: Namespaces) -> [String] + where + Namespaces.Element == SourceSpecification.Secret.Namespace + { + let confidentialKitModuleName = TypeInfo(of: Obfuscation.self).moduleName + let foundationModuleName = TypeInfo(of: Data.self).moduleName + let defaultModuleNames = [confidentialKitModuleName, foundationModuleName] + let moduleNames = defaultModuleNames + namespaces + .compactMap { namespace -> String? in + guard + case let .extend(_, moduleName) = namespace, + let moduleName = moduleName, + !defaultModuleNames.contains(moduleName) + else { + return nil + } + + return moduleName + } + + return moduleNames.sorted() + } +} + +public extension Parsers.CodeGeneration { + + typealias SourceFile = SourceFileParser +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/AlgorithmParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/AlgorithmParser.swift new file mode 100644 index 0000000..5b78041 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/AlgorithmParser.swift @@ -0,0 +1,34 @@ +import Parsing + +struct AlgorithmParser: Parser +where +ObfuscationStepParser.Input == Substring, +ObfuscationStepParser.Output == SourceSpecification.ObfuscationStep +{ + typealias Algorithm = SourceSpecification.Algorithm + + private let obfuscationStepParser: ObfuscationStepParser + + init(obfuscationStepParser: ObfuscationStepParser) { + self.obfuscationStepParser = obfuscationStepParser + } + + func parse(_ input: inout Configuration) throws -> Algorithm { + var parsedObfuscationStepsCount: Int = .zero + let output: [ObfuscationStepParser.Output] + do { + output = try input.algorithm.reduce(into: .init(), { steps, step in + let obfuscationStep = try obfuscationStepParser.parse(step) + parsedObfuscationStepsCount += 1 + + steps.append(obfuscationStep) + }) + input.algorithm.removeFirst(parsedObfuscationStepsCount) + } catch let error { + input.algorithm.removeFirst(parsedObfuscationStepsCount) + throw error + } + + return output[...] + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/CompressionTechniqueParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/CompressionTechniqueParser.swift new file mode 100644 index 0000000..c8dc0b6 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/CompressionTechniqueParser.swift @@ -0,0 +1,29 @@ +import ConfidentialKit +import Parsing + +struct CompressionTechniqueParser: Parser { + + typealias Technique = SourceSpecification.ObfuscationStep.Technique + + private typealias Algorithm = Obfuscation.Compression.CompressionAlgorithm + + func parse(_ input: inout Substring) throws -> Technique { + try Parse { + Parse { + Whitespace() + C.Parsing.Keywords.compress + Whitespace(1...) + C.Parsing.Keywords.using + Whitespace(1...) + } + OneOf { + for algorithm in Algorithm.allCases { + algorithm.description.map { algorithm } + } + } + End() + }.map { + .compression(algorithm: $0) + }.parse(&input) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/EncryptionTechniqueParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/EncryptionTechniqueParser.swift new file mode 100644 index 0000000..03207a1 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/EncryptionTechniqueParser.swift @@ -0,0 +1,29 @@ +import ConfidentialKit +import Parsing + +struct EncryptionTechniqueParser: Parser { + + typealias Technique = SourceSpecification.ObfuscationStep.Technique + + private typealias Algorithm = Obfuscation.Encryption.SymmetricEncryptionAlgorithm + + func parse(_ input: inout Substring) throws -> Technique { + try Parse { + Parse { + Whitespace() + C.Parsing.Keywords.encrypt + Whitespace(1...) + C.Parsing.Keywords.using + Whitespace(1...) + } + OneOf { + for algorithm in Algorithm.allCases { + algorithm.description.map { algorithm } + } + } + End() + }.map { + .encryption(algorithm: $0) + }.parse(&input) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/ObfuscationStepParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/ObfuscationStepParser.swift new file mode 100644 index 0000000..6a34ecf --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/ObfuscationStepParser.swift @@ -0,0 +1,21 @@ +import Parsing + +struct ObfuscationStepParser: Parser +where +TechniqueParsers.Input == Substring, +TechniqueParsers.Output == SourceSpecification.ObfuscationStep.Technique +{ + typealias ObfuscationStep = SourceSpecification.ObfuscationStep + + private let techniqueParsers: TechniqueParsers + + init(@OneOfBuilder with build: () -> TechniqueParsers) { + self.techniqueParsers = build() + } + + func parse(_ input: inout Substring) throws -> ObfuscationStep { + try techniqueParsers + .map(ObfuscationStep.init(technique:)) + .parse(&input) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/Parsers+ModelTransform.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/Parsers+ModelTransform.swift new file mode 100644 index 0000000..084692e --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/Parsers+ModelTransform.swift @@ -0,0 +1,4 @@ +public extension Parsers { + + enum ModelTransform {} +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/RandomizationTechniqueParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/RandomizationTechniqueParser.swift new file mode 100644 index 0000000..09bad12 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/RandomizationTechniqueParser.swift @@ -0,0 +1,23 @@ +import Parsing + +struct RandomizationTechniqueParser: Parser { + + typealias GenerateNonce = () throws -> UInt64 + typealias Technique = SourceSpecification.ObfuscationStep.Technique + + private let generateNonce: GenerateNonce + + init(generateNonce: @escaping GenerateNonce = { try UInt64.secureRandom() }) { + self.generateNonce = generateNonce + } + + func parse(_ input: inout Substring) throws -> Technique { + try Parse { + Whitespace() + C.Parsing.Keywords.shuffle + End() + }.parse(&input) + + return .randomization(nonce: try generateNonce()) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretNamespaceParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretNamespaceParser.swift new file mode 100644 index 0000000..aa8af09 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretNamespaceParser.swift @@ -0,0 +1,50 @@ +import ConfidentialKit +import Parsing + +struct SecretNamespaceParser: Parser { + + typealias Namespace = SourceSpecification.Secret.Namespace + + private enum NamespaceKind: Equatable { + case create + case extend + } + + func parse(_ input: inout Substring) throws -> Namespace { + guard !input.isEmpty else { + let defaultNamespaceInfo = TypeInfo(of: Obfuscation.Secret.self) + return .extend( + identifier: defaultNamespaceInfo.fullyQualifiedName, + moduleName: defaultNamespaceInfo.moduleName + ) + } + + return try Parse { + Whitespace() + OneOf { + C.Parsing.Keywords.create.map { NamespaceKind.create } + C.Parsing.Keywords.extend.map { NamespaceKind.extend } + } + }.flatMap { namespaceKind in + Always(namespaceKind) + Whitespace() + Prefix(1...) { !$0.isWhitespace } + if case .extend = namespaceKind { + Optionally { + Whitespace() + C.Parsing.Keywords.from + Whitespace() + Prefix(1...) { !$0.isWhitespace } + } + } + End() + }.map { namespaceKind, identifier, moduleName -> Namespace in + switch namespaceKind { + case .create: + return .create(identifier: .init(identifier)) + case .extend: + return .extend(identifier: .init(identifier), moduleName: moduleName?.map(String.init)) + } + }.parse(&input) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretsParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretsParser.swift new file mode 100644 index 0000000..c3ef27b --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SecretsParser.swift @@ -0,0 +1,79 @@ +import ConfidentialKit +import Foundation +import Parsing + +struct SecretsParser: Parser +where +NamespaceParser.Input == Substring, +NamespaceParser.Output == SourceSpecification.Secret.Namespace +{ + typealias Secrets = SourceSpecification.Secrets + + private let namespaceParser: NamespaceParser + private let secretValueEncoder: DataEncoder + + init( + namespaceParser: NamespaceParser, + secretValueEncoder: DataEncoder = JSONEncoder() + ) { + self.namespaceParser = namespaceParser + self.secretValueEncoder = secretValueEncoder + } + + func parse(_ input: inout Configuration) throws -> Secrets { + guard !input.secrets.isEmpty else { + throw ParsingError.assertionFailed(description: "`secrets` list must not be empty.") + } + + var parsedSecretsCount: Int = .zero + let output: Secrets + do { + output = try input.secrets.reduce(into: .init(), { secrets, secret in + let namespace = try namespaceParser.parse( + secret.namespace ?? input.defaultNamespace ?? "" + ) + let secret = SourceSpecification.Secret( + name: secret.name, + data: try secretValueEncoder.encode(secret.value.underlyingValue), + dataAccessWrapperInfo: dataAccessWrapperInfo(for: secret.value) + ) + parsedSecretsCount += 1 + + switch secrets[namespace]?.append(secret) { + case .none: + secrets[namespace] = [secret] + case .some: + return + } + }) + input.secrets.removeFirst(parsedSecretsCount) + } catch let error { + input.secrets.removeFirst(parsedSecretsCount) + throw error + } + + return output + } +} + +private extension SecretsParser { + + func dataAccessWrapperInfo(for value: Configuration.Secret.Value) -> SourceSpecification.Secret.DataAccessWrapperInfo { + typealias DataTypes = Configuration.Secret.Value.DataTypes + + let typeInfo: TypeInfo + switch value { + case .array: + typeInfo = .init(of: Obfuscated.self) + case .singleValue: + typeInfo = .init(of: Obfuscated.self) + } + + return .init( + typeInfo: typeInfo, + arguments: [ + (label: .none, value: C.Code.Generation.deobfuscateDataFuncName) + ] + ) + } +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SourceSpecificationParser.swift b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SourceSpecificationParser.swift new file mode 100644 index 0000000..0c25339 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ModelTransform/SourceSpecificationParser.swift @@ -0,0 +1,33 @@ +import Parsing + +public struct SourceSpecificationParser: Parser +where +AlgorithmParser.Input == Configuration, +AlgorithmParser.Output == SourceSpecification.Algorithm, +SecretsParser.Input == Configuration, +SecretsParser.Output == SourceSpecification.Secrets +{ + + private let algorithmParser: AlgorithmParser + private let secretsParser: SecretsParser + + init(algorithmParser: AlgorithmParser, secretsParser: SecretsParser) { + self.algorithmParser = algorithmParser + self.secretsParser = secretsParser + } + + public func parse(_ input: inout Configuration) throws -> SourceSpecification { + let spec = SourceSpecification( + algorithm: try algorithmParser.parse(&input), + secrets: try secretsParser.parse(&input) + ) + input.defaultNamespace = nil + + return spec + } +} + +public extension Parsers.ModelTransform { + + typealias SourceSpecification = SourceSpecificationParser +} diff --git a/Sources/ConfidentialCore/Parsing/Parsers/ParsingError.swift b/Sources/ConfidentialCore/Parsing/Parsers/ParsingError.swift new file mode 100644 index 0000000..ee1f742 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/Parsers/ParsingError.swift @@ -0,0 +1,13 @@ +enum ParsingError: Error { + case assertionFailed(description: String) +} + +extension ParsingError: CustomStringConvertible { + + var description: String { + switch self { + case let .assertionFailed(description): + return description + } + } +} diff --git a/Sources/ConfidentialCore/Parsing/ParsersConvenienceInitializers.swift b/Sources/ConfidentialCore/Parsing/ParsersConvenienceInitializers.swift new file mode 100644 index 0000000..3b94747 --- /dev/null +++ b/Sources/ConfidentialCore/Parsing/ParsersConvenienceInitializers.swift @@ -0,0 +1,46 @@ +import Parsing +import SwiftSyntaxBuilder + +public typealias AnyAlgorithmParser = AnyParser +public typealias AnySecretsParser = AnyParser + +public extension Parsers.ModelTransform.SourceSpecification +where +AlgorithmParser == AnyAlgorithmParser, +SecretsParser == AnySecretsParser { + + private typealias OneOfManyTechniques = Parsers.OneOfMany> + + init() { + self.init( + algorithmParser: ConfidentialCore.AlgorithmParser( + obfuscationStepParser: ObfuscationStepParser { + CompressionTechniqueParser().eraseToAnyParser() + EncryptionTechniqueParser().eraseToAnyParser() + RandomizationTechniqueParser().eraseToAnyParser() + } + ).eraseToAnyParser(), + secretsParser: ConfidentialCore.SecretsParser( + namespaceParser: SecretNamespaceParser() + ).eraseToAnyParser() + ) + } +} + +public typealias AnyCodeBlockParser = AnyParser + +public extension Parsers.CodeGeneration.SourceFile +where +CodeBlockParsers == AnyCodeBlockParser { + + init() { + self.init { + NamespaceDeclParser( + membersParser: NamespaceMembersParser( + secretDeclParser: SecretDeclParser() + ), + deobfuscateDataFunctionDeclParser: DeobfuscateDataFunctionDeclParser(functionNestingLevel: 1) + ).eraseToAnyParser() + } + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Declarations/DeobfuscateDataFunctionDecl.swift b/Sources/ConfidentialCore/SyntaxBuilders/Declarations/DeobfuscateDataFunctionDecl.swift new file mode 100644 index 0000000..99b316e --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Declarations/DeobfuscateDataFunctionDecl.swift @@ -0,0 +1,59 @@ +import Foundation +import SwiftSyntax +import SwiftSyntaxBuilder + +struct DeobfuscateDataFunctionDecl: DeclBuildable { + + private let declNestingLevel: UInt8 + private let body: ExpressibleAsSyntaxBuildable + + init(declNestingLevel: UInt8 = .zero, body: ExpressibleAsSyntaxBuildable) { + self.declNestingLevel = declNestingLevel + self.body = body + } + + func buildDecl(format: Format, leadingTrivia: Trivia?) -> DeclSyntax { + makeUnderlyingDecl().buildDecl(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension DeobfuscateDataFunctionDecl { + + func makeUnderlyingDecl() -> DeclBuildable { + let dataTypeInfo = TypeInfo(of: Data.self) + let indentation = Int(declNestingLevel) * C.Code.Format.indentWidth + return FunctionDecl( + identifier: .identifier(C.Code.Generation.deobfuscateDataFuncName), + signature: FunctionSignature( + input: ParameterClause { + FunctionParameter( + attributes: .none, + firstName: .wildcard, + secondName: .identifier(C.Code.Generation.deobfuscateDataFuncParamName), + colon: .colon, + type: SimpleTypeIdentifier(dataTypeInfo.fullyQualifiedName) + ) + }, + throwsOrRethrowsKeyword: .throws.withLeadingTrivia(.spaces(1)), + output: ReturnClause( + returnType: SimpleTypeIdentifier(dataTypeInfo.fullyQualifiedName) + ) + ), + body: CodeBlock( + leftBrace: .leftBrace.withLeadingTrivia(.spaces(1)), + rightBrace: .rightBrace.withLeadingTrivia(.spaces(indentation)) + ) { + CodeBlockItem(item: body) + }, + attributesBuilder: { + InlineAlwaysAttribute( + leadingTrivia: .newlines(1).appending(.spaces(indentation)) + ) + }, + modifiersBuilder: { + DeclModifier(name: .private(leadingNewlines: 1, followedByLeadingSpaces: indentation)) + DeclModifier(name: .static) + } + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Declarations/SecretDecl.swift b/Sources/ConfidentialCore/SyntaxBuilders/Declarations/SecretDecl.swift new file mode 100644 index 0000000..b72e8a6 --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Declarations/SecretDecl.swift @@ -0,0 +1,67 @@ +import ConfidentialKit +import SwiftSyntax +import SwiftSyntaxBuilder + +struct SecretDecl: DeclBuildable { + + private let name: TokenSyntax + private let dataArgumentExpression: ExpressibleAsArrayExpr + private let dataAccessWrapper: ExpressibleAsCustomAttribute + + init( + name: String, + dataArgumentExpression: ExpressibleAsArrayExpr, + dataAccessWrapper: ExpressibleAsCustomAttribute + ) { + self.name = .identifier(name) + self.dataArgumentExpression = dataArgumentExpression + self.dataAccessWrapper = dataAccessWrapper + } + + func buildDecl(format: Format, leadingTrivia: Trivia?) -> DeclSyntax { + makeUnderlyingDecl().buildDecl(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension SecretDecl { + + static let dataArgumentName: String = "data" + + func makeUnderlyingDecl() -> DeclBuildable { + VariableDecl( + letOrVarKeyword: .var, + attributesBuilder: { + dataAccessWrapper.createCustomAttribute() + }, + modifiersBuilder: { + DeclModifier(name: .static(leadingNewlines: 1)) + }, + bindingsBuilder: { + PatternBinding( + pattern: IdentifierPattern(identifier: name), + typeAnnotation: TypeAnnotation( + TypeInfo(of: Obfuscation.Secret.self).fullyQualifiedName + ), + initializer: InitializerClause( + value: InitializerCallExpr { + TupleExprElement( + label: .identifier(Self.dataArgumentName), + colon: .colon, + expression: dataArgumentExpression.createArrayExpr() + ) + } + ) + ) + } + ) + } +} + +protocol ExpressibleAsSecretDecl { + func createSecretDecl() -> SecretDecl +} + +extension SecretDecl: ExpressibleAsSecretDecl { + + func createSecretDecl() -> SecretDecl { self } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCompressorInitializerCallExpr.swift b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCompressorInitializerCallExpr.swift new file mode 100644 index 0000000..a7f4dcd --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCompressorInitializerCallExpr.swift @@ -0,0 +1,43 @@ +import ConfidentialKit +import SwiftSyntax +import SwiftSyntaxBuilder + +struct DataCompressorInitializerCallExpr: ExprBuildable { + + typealias Algorithm = Obfuscation.Compression.CompressionAlgorithm + + private let compressionAlgorithm: Algorithm + + init(compressionAlgorithm: Algorithm) { + self.compressionAlgorithm = compressionAlgorithm + } + + func buildExpr(format: Format, leadingTrivia: Trivia?) -> ExprSyntax { + makeUnderlyingExpr().buildExpr(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension DataCompressorInitializerCallExpr { + + static let algorithmArgumentName: String = "algorithm" + + func makeUnderlyingExpr() -> ExprBuildable { + FunctionCallExpr( + IdentifierExpr( + TypeInfo(of: Obfuscation.Compression.DataCompressor.self).fullyQualifiedName + ), + leftParen: .leftParen, + rightParen: .rightParen, + argumentListBuilder: { + TupleExprElement( + label: .identifier(Self.algorithmArgumentName), + colon: .colon, + expression: MemberAccessExpr( + dot: .prefixPeriod, + name: .identifier(compressionAlgorithm.name) + ) + ) + } + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCrypterInitializerCallExpr.swift b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCrypterInitializerCallExpr.swift new file mode 100644 index 0000000..096323e --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataCrypterInitializerCallExpr.swift @@ -0,0 +1,43 @@ +import ConfidentialKit +import SwiftSyntax +import SwiftSyntaxBuilder + +struct DataCrypterInitializerCallExpr: ExprBuildable { + + typealias Algorithm = Obfuscation.Encryption.SymmetricEncryptionAlgorithm + + private let encryptionAlgorithm: Algorithm + + init(encryptionAlgorithm: Algorithm) { + self.encryptionAlgorithm = encryptionAlgorithm + } + + func buildExpr(format: Format, leadingTrivia: Trivia?) -> ExprSyntax { + makeUnderlyingExpr().buildExpr(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension DataCrypterInitializerCallExpr { + + static let algorithmArgumentName: String = "algorithm" + + func makeUnderlyingExpr() -> ExprBuildable { + FunctionCallExpr( + IdentifierExpr( + TypeInfo(of: Obfuscation.Encryption.DataCrypter.self).fullyQualifiedName + ), + leftParen: .leftParen, + rightParen: .rightParen, + argumentListBuilder: { + TupleExprElement( + label: .identifier(Self.algorithmArgumentName), + colon: .colon, + expression: MemberAccessExpr( + dot: .prefixPeriod, + name: .identifier(encryptionAlgorithm.name) + ) + ) + } + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataShufflerInitializerCallExpr.swift b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataShufflerInitializerCallExpr.swift new file mode 100644 index 0000000..beb683d --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DataShufflerInitializerCallExpr.swift @@ -0,0 +1,38 @@ +import ConfidentialKit +import SwiftSyntax +import SwiftSyntaxBuilder + +struct DataShufflerInitializerCallExpr: ExprBuildable { + + private let nonce: UInt64 + + init(nonce: UInt64) { + self.nonce = nonce + } + + func buildExpr(format: Format, leadingTrivia: Trivia?) -> ExprSyntax { + makeUnderlyingExpr().buildExpr(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension DataShufflerInitializerCallExpr { + + static let nonceArgumentName: String = "nonce" + + func makeUnderlyingExpr() -> ExprBuildable { + FunctionCallExpr( + IdentifierExpr( + TypeInfo(of: Obfuscation.Randomization.DataShuffler.self).fullyQualifiedName + ), + leftParen: .leftParen, + rightParen: .rightParen, + argumentListBuilder: { + TupleExprElement( + label: .identifier(Self.nonceArgumentName), + colon: .colon, + expression: IntegerLiteralExpr(digits: "\(nonce)") + ) + } + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DeobfuscateFunctionAccessExpr.swift b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DeobfuscateFunctionAccessExpr.swift new file mode 100644 index 0000000..11d8495 --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/DeobfuscateFunctionAccessExpr.swift @@ -0,0 +1,34 @@ +import ConfidentialKit +import SwiftSyntax +import SwiftSyntaxBuilder + +struct DeobfuscateFunctionAccessExpr: ExprBuildable { + + private let deobfuscationStepInitializerExpr: ExpressibleAsExprBuildable + private let dotIndentWidth: Int + + init(_ deobfuscationStepInitializerExpr: ExpressibleAsExprBuildable, dotIndentWidth: Int) { + self.deobfuscationStepInitializerExpr = deobfuscationStepInitializerExpr + self.dotIndentWidth = dotIndentWidth + } + + func buildExpr(format: Format, leadingTrivia: Trivia?) -> ExprSyntax { + makeUnderlyingExpr().buildExpr(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension DeobfuscateFunctionAccessExpr { + + static let deobfuscateFuncName: String = "deobfuscate" + + func makeUnderlyingExpr() -> ExprBuildable { + MemberAccessExpr( + base: deobfuscationStepInitializerExpr, + dot: .period( + leadingNewlines: 1, + followedByLeadingSpaces: dotIndentWidth + ), + name: .identifier(Self.deobfuscateFuncName) + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/Expressions/InitializerCallExpr.swift b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/InitializerCallExpr.swift new file mode 100644 index 0000000..b74882b --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/Expressions/InitializerCallExpr.swift @@ -0,0 +1,31 @@ +import SwiftSyntax +import SwiftSyntaxBuilder + +struct InitializerCallExpr: ExprBuildable { + + private let argumentList: ExpressibleAsTupleExprElementList + + init( + @TupleExprElementListBuilder argumentListBuilder: () -> ExpressibleAsTupleExprElementList = { + TupleExprElementList.empty + } + ) { + self.argumentList = argumentListBuilder() + } + + func buildExpr(format: Format, leadingTrivia: Trivia?) -> ExprSyntax { + makeUnderlyingExpr().buildExpr(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension InitializerCallExpr { + + func makeUnderlyingExpr() -> ExprBuildable { + FunctionCallExpr( + calledExpression: MemberAccessExpr(dot: .period, name: .`init`.withoutTrivia()), + leftParen: .leftParen, + argumentList: argumentList, + rightParen: .rightParen + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxBuilders/InlineAlwaysAttribute.swift b/Sources/ConfidentialCore/SyntaxBuilders/InlineAlwaysAttribute.swift new file mode 100644 index 0000000..2e0c279 --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxBuilders/InlineAlwaysAttribute.swift @@ -0,0 +1,29 @@ +import SwiftSyntax +import SwiftSyntaxBuilder + +struct InlineAlwaysAttribute: SyntaxBuildable { + + private let leadingTrivia: Trivia? + + init(leadingTrivia: Trivia? = .none) { + self.leadingTrivia = leadingTrivia + } + + func buildSyntax(format: Format, leadingTrivia: Trivia?) -> Syntax { + makeUnderlyingSyntax().buildSyntax(format: format, leadingTrivia: leadingTrivia) + } +} + +private extension InlineAlwaysAttribute { + + func makeUnderlyingSyntax() -> SyntaxBuildable { + Attribute( + atSignToken: .atSign.withLeadingTrivia(leadingTrivia ?? .zero), + attributeName: .identifier("inline"), + leftParen: .leftParen, + argument: IdentifierExpr("__always"), + rightParen: .rightParen, + tokenList: .none + ) + } +} diff --git a/Sources/ConfidentialCore/SyntaxText/SourceFileText.swift b/Sources/ConfidentialCore/SyntaxText/SourceFileText.swift new file mode 100644 index 0000000..eae8782 --- /dev/null +++ b/Sources/ConfidentialCore/SyntaxText/SourceFileText.swift @@ -0,0 +1,28 @@ +import Foundation +import SwiftSyntax +import SwiftSyntaxBuilder + +public struct SourceFileText: Equatable { + + private let syntax: Syntax + + init(from sourceFile: ExpressibleAsSourceFile) { + self.syntax = sourceFile + .createSourceFile() + .buildSyntax(format: .init(indentWidth: .zero)) + } + + public func write(to url: URL, encoding: String.Encoding = .utf8) throws { + var text = "" + syntax.write(to: &text) + + try text + .trimmingCharacters(in: .newlines) + .write(to: url, atomically: true, encoding: encoding) + } +} + +extension SourceFileText: CustomStringConvertible { + + public var description: String { syntax.description } +} diff --git a/Sources/ConfidentialCore/Utils/TypeInfo.swift b/Sources/ConfidentialCore/Utils/TypeInfo.swift new file mode 100644 index 0000000..da72fca --- /dev/null +++ b/Sources/ConfidentialCore/Utils/TypeInfo.swift @@ -0,0 +1,40 @@ +struct TypeInfo { + + private let type: Any.Type + + init(of type: Any.Type) { + self.type = type + } +} + +extension TypeInfo { + + var fullyQualifiedName: String { + let name = String(reflecting: type) + guard let typeLocationEndIndex = name.lastIndex(of: ":") else { + return name + } + + return .init(name.suffix(from: typeLocationEndIndex).dropFirst()) + } + + var moduleName: String { + .init(fullyQualifiedName.prefix { $0 != "." }) + } + + var fullName: String { + let fullyQualifiedName = fullyQualifiedName + guard + let index = fullyQualifiedName.firstIndex(of: "."), + fullyQualifiedName.distance(from: index, to: fullyQualifiedName.endIndex) > 1 + else { + fatalError("Unexpected metatype string representation") + } + + return .init(fullyQualifiedName.suffix(from: index).dropFirst()) + } + + var name: String { + .init(describing: type) + } +} diff --git a/Sources/ConfidentialKit/Coding/DataDecoder.swift b/Sources/ConfidentialKit/Coding/DataDecoder.swift new file mode 100644 index 0000000..8026c62 --- /dev/null +++ b/Sources/ConfidentialKit/Coding/DataDecoder.swift @@ -0,0 +1,8 @@ +import Foundation + +@usableFromInline +protocol DataDecoder { + func decode(_ type: D.Type, from data: Data) throws -> D +} + +extension JSONDecoder: DataDecoder {} diff --git a/Sources/ConfidentialKit/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCount.swift b/Sources/ConfidentialKit/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCount.swift new file mode 100644 index 0000000..c0e8218 --- /dev/null +++ b/Sources/ConfidentialKit/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCount.swift @@ -0,0 +1,13 @@ +import CryptoKit + +extension SymmetricKeySize { + + /// The number of bytes in the key. + /// + /// The returned value is not rounded up, since ``init(bitCount:)`` only accepts + /// positive integers that are a multiple of 8. + @usableFromInline + var byteCount: Int { + bitCount / 8 + } +} diff --git a/Sources/ConfidentialKit/Extensions/Swift/BinaryInteger/BinaryInteger+Bytes.swift b/Sources/ConfidentialKit/Extensions/Swift/BinaryInteger/BinaryInteger+Bytes.swift new file mode 100644 index 0000000..73b83bd --- /dev/null +++ b/Sources/ConfidentialKit/Extensions/Swift/BinaryInteger/BinaryInteger+Bytes.swift @@ -0,0 +1,23 @@ +public extension BinaryInteger { + + /// This value's binary representation, as a sequence of contiguous bytes. + @inlinable + @inline(__always) + var bytes: [UInt8] { withUnsafeBytes(of: self, [UInt8].init) } + + /// Creates a new instance from the given binary representation. + /// + /// - Parameter bytes: A collection containing the bytes of this value’s binary representation, + /// in order from the least significant to most significant. + @inlinable + @inline(__always) + init(bytes: Bytes) where Bytes.Element == UInt8 { + var bytes = Array(bytes) + let size = MemoryLayout.stride + if bytes.count < size { + bytes.append(contentsOf: (bytes.count.. Data +} diff --git a/Sources/ConfidentialKit/Obfuscation/Obfuscation+Secret.swift b/Sources/ConfidentialKit/Obfuscation/Obfuscation+Secret.swift new file mode 100644 index 0000000..39a260e --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Obfuscation+Secret.swift @@ -0,0 +1,17 @@ +public extension Obfuscation { + + /// A model representing an obfuscated secret. + struct Secret: Equatable { + + /// The obfuscated secret's bytes. + public let data: [UInt8] + + /// Creates a new instance of a sequence containing obfuscated secret's bytes. + /// + /// - Parameter data: The sequence of obfuscated secret's bytes. + @inlinable + public init(data: Data) where Data.Element == UInt8 { + self.data = .init(data) + } + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Obfuscation+SupportedDataTypes.swift b/Sources/ConfidentialKit/Obfuscation/Obfuscation+SupportedDataTypes.swift new file mode 100644 index 0000000..7f0d7ed --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Obfuscation+SupportedDataTypes.swift @@ -0,0 +1,11 @@ +public extension Obfuscation { + + /// A namespace for the plain data types supported by ``Obfuscation`` API. + enum SupportedDataTypes { + /// A type that represents a sequence of values. + public typealias Array = [String] + + /// A type that represents a single value. + public typealias SingleValue = String + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Obfuscation.swift b/Sources/ConfidentialKit/Obfuscation/Obfuscation.swift new file mode 100644 index 0000000..87ca0c5 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Obfuscation.swift @@ -0,0 +1,19 @@ +/// A namespace for types associated with obfuscation-related tasks, which all together +/// constitute an API for (de)obfuscating secret data. +/// +/// The various implementations of obfuscation techniques are defined within their own +/// namespaces defined as extensions on ``Obfuscation``. +/// +/// Your choice of technique determines the strategy used for data obfuscation: +/// - The ``Obfuscation/Compression`` namespace encapsulates +/// implementations of technique involving data compression/decompression. +/// - The ``Obfuscation/Encryption`` namespace encapsulates +/// implementations of technique involving data encryption/decryption. +/// - The ``Obfuscation/Randomization`` namespace encapsulates +/// implementations of technique involving data randomization. +/// +/// > Important: The ``ConfidentialKit`` library was designed to be used in +/// conjunction with `confidential` CLI tool and, as such, it only ships +/// with a subset of API needed for deobfuscating obfuscated secret data +/// embedded in the application code. +public enum Obfuscation {} diff --git a/Sources/ConfidentialKit/Obfuscation/PropertyWrappers/Obfuscated.swift b/Sources/ConfidentialKit/Obfuscation/PropertyWrappers/Obfuscated.swift new file mode 100644 index 0000000..09479c9 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/PropertyWrappers/Obfuscated.swift @@ -0,0 +1,65 @@ +import Foundation + +/// A property wrapper that can deobfuscate the wrapped secret value. +@propertyWrapper +public struct Obfuscated { + + /// A type that represents a wrapped value. + public typealias Value = Obfuscation.Secret + + /// A type that represents a deobfuscation function. + public typealias DeobfuscateDataFunc = (Data) throws -> Data + + @usableFromInline + let deobfuscateData: DeobfuscateDataFunc + + @usableFromInline + let decoder: DataDecoder + + /// The underlying secret value. + public let wrappedValue: Value + + /// A plain secret value after transforming obfuscated secret's data with a deobfuscation function. + @inlinable + public var projectedValue: PlainValue { + let secretData = Data(wrappedValue.data) + let value: PlainValue + + do { + let deobfuscatedData = try deobfuscateData(secretData) + value = try decoder.decode(PlainValue.self, from: deobfuscatedData) + } catch { + preconditionFailure("Unexpected error: \(error)") + } + + return value + } + + @usableFromInline + init( + wrappedValue: Value, + deobfuscateData: @escaping DeobfuscateDataFunc, + decoder: DataDecoder + ) { + self.wrappedValue = wrappedValue + self.deobfuscateData = deobfuscateData + self.decoder = decoder + } + + /// Creates a property that can deobfuscate the wrapped secret value using the given closure. + /// + /// - Parameters: + /// - wrappedValue: A secret value containing obfuscated data. + /// - deobfuscateData: The closure to execute when calling ``projectedValue``. + @inlinable + public init( + wrappedValue: Value, + _ deobfuscateData: @escaping DeobfuscateDataFunc + ) { + self.init( + wrappedValue: wrappedValue, + deobfuscateData: deobfuscateData, + decoder: JSONDecoder() + ) + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/CompressionAlgorithm.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/CompressionAlgorithm.swift new file mode 100644 index 0000000..93cfa10 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/CompressionAlgorithm.swift @@ -0,0 +1,7 @@ +import Foundation + +public extension Obfuscation.Compression { + + /// An algorithm that indicates how to compress or decompress data. + typealias CompressionAlgorithm = NSData.CompressionAlgorithm +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/DataCompressor.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/DataCompressor.swift new file mode 100644 index 0000000..e402dd3 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/DataCompressor.swift @@ -0,0 +1,33 @@ +import Foundation + +public extension Obfuscation.Compression { + + /// An implementation of obfuscation technique utilizing data compression. + /// + /// See ``CompressionAlgorithm`` for a list of supported compression algorithms. + struct DataCompressor: DataDeobfuscationStep { + + /// An algorithm used to compress and decompress the data. + public let algorithm: CompressionAlgorithm + + /// Creates a new instance with the specified compression algorithm. + /// + /// - Parameter algorithm: An algorithm used to compress and decompress the data. + @inlinable + @inline(__always) + public init(algorithm: CompressionAlgorithm) { + self.algorithm = algorithm + } + + /// Decompresses the given data using preset ``algorithm``. + /// + /// - Parameter data: A compressed input data. + /// - Returns: A decompressed output data. + @inlinable + @inline(__always) + public func deobfuscate(_ data: Data) throws -> Data { + let decompressedData = try NSData(data: data).decompressed(using: algorithm) + return .init(referencing: decompressedData) + } + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/Obfuscation+Compression.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/Obfuscation+Compression.swift new file mode 100644 index 0000000..f2d6e14 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Compression/Obfuscation+Compression.swift @@ -0,0 +1,5 @@ +public extension Obfuscation { + + /// A namespace for types that use data compression as obfuscation technique. + enum Compression {} +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/DataCrypter.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/DataCrypter.swift new file mode 100644 index 0000000..d87c572 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/DataCrypter.swift @@ -0,0 +1,47 @@ +import CryptoKit +import Foundation + +public extension Obfuscation.Encryption { + + /// An implementation of obfuscation technique utilizing data encryption. + /// + /// See ``SymmetricEncryptionAlgorithm`` for a list of supported encryption algorithms. + struct DataCrypter: DataDeobfuscationStep { + + /// An algorithm used to encrypt and decrypt the data. + public let algorithm: SymmetricEncryptionAlgorithm + + /// Creates a new instance with the specified symmetric encryption algorithm. + /// + /// - Parameter algorithm: An algorithm used to encrypt and decrypt the data. + @inlinable + @inline(__always) + public init(algorithm: SymmetricEncryptionAlgorithm) { + self.algorithm = algorithm + } + + /// Decrypts the given data using preset ``algorithm``. + /// + /// - Parameter data: An encrypted input data. + /// - Returns: A decrypted output data. + @inlinable + @inline(__always) + public func deobfuscate(_ data: Data) throws -> Data { + var obfuscatedData = data + let keyData = obfuscatedData.suffix(algorithm.keySize.byteCount) + obfuscatedData.removeLast(algorithm.keySize.byteCount) + + let deobfuscatedData: Data + switch algorithm { + case .aes128GCM, .aes192GCM, .aes256GCM: + let sealedBox = try AES.GCM.SealedBox(combined: obfuscatedData) + deobfuscatedData = try AES.GCM.open(sealedBox, using: .init(data: keyData)) + case .chaChaPoly: + let sealedBox = try ChaChaPoly.SealedBox(combined: obfuscatedData) + deobfuscatedData = try ChaChaPoly.open(sealedBox, using: .init(data: keyData)) + } + + return deobfuscatedData + } + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/Obfuscation+Encryption.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/Obfuscation+Encryption.swift new file mode 100644 index 0000000..09155f8 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/Obfuscation+Encryption.swift @@ -0,0 +1,5 @@ +public extension Obfuscation { + + /// A namespace for types that use data encryption as obfuscation technique. + enum Encryption {} +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithm.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithm.swift new file mode 100644 index 0000000..1e88571 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithm.swift @@ -0,0 +1,39 @@ +import CryptoKit + +public extension Obfuscation.Encryption { + + /// A symmetric algorithm that indicates how to encrypt or decrypt data. + enum SymmetricEncryptionAlgorithm: String { + /// The Advanced Encryption Standard (AES) algorithm in Galois/Counter Mode (GCM) + /// with 128-bit key. + case aes128GCM + + /// The Advanced Encryption Standard (AES) algorithm in Galois/Counter Mode (GCM) + /// with 192-bit key. + case aes192GCM + + /// The Advanced Encryption Standard (AES) algorithm in Galois/Counter Mode (GCM) + /// with 256-bit key. + case aes256GCM + + /// The ChaCha20-Poly1305 algorithm. + case chaChaPoly + } +} + +public extension Obfuscation.Encryption.SymmetricEncryptionAlgorithm { + + /// The size of the symmetric cryptographic key associated with the algorithm. + var keySize: SymmetricKeySize { + switch self { + case .aes128GCM: + return .bits128 + case .aes192GCM: + return .bits192 + case .aes256GCM: + return .bits256 + case .chaChaPoly: + return .bits256 + } + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/DataShuffler.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/DataShuffler.swift new file mode 100644 index 0000000..093eecd --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/DataShuffler.swift @@ -0,0 +1,110 @@ +import Foundation + +public extension Obfuscation.Randomization { + + /// An implementation of obfuscation technique utilizing data randomization. + /// + /// The ``DataShuffler`` uses a pseudorandom number generator (PRNG) to + /// shuffle the bytes stored in ``Data`` instance being processed, along with a + /// ``nonce``, which is used to obfuscate the shuffling parameters. + /// + /// > Warning: The current implementation of this technique is best suited for secrets of + /// which size does not exceed 256 bytes. For larger secrets, the size of the + /// obfuscated data will grow from 2N to 3N, where N is the input data size + /// in bytes, or even 5N (32-bit platform) or 9N (64-bit platform) if the size of + /// input data is larger than 65 536 bytes. + struct DataShuffler: DataDeobfuscationStep { + + /// The nonce used to obfuscate the data. + public let nonce: UInt64 + + /// Creates a new instance with the specified cryptographic nonce. + /// + /// - Parameter nonce: The nonce. + @inlinable + @inline(__always) + public init(nonce: UInt64) { + self.nonce = nonce + } + + /// Deshuffles the given data using preset ``nonce``. + /// + /// - Parameter data: A shuffled input data. + /// - Returns: A deshuffled output data. + @inlinable + @inline(__always) + public func deobfuscate(_ data: Data) throws -> Data { + let countByteWidth = Int.byteWidth + let nonceBytes = nonce.bytes + let count = data + .prefix(upTo: countByteWidth) + .withUnsafeBytes { $0.load(as: Int.self) } ^ .init(bytes: nonceBytes) + let indexByteWidthPos = countByteWidth + count + let indexByteWidth = data[indexByteWidthPos] + let indexes = Internal.deobfuscateIndexes( + bytes: .init(data.suffix(from: indexByteWidthPos + 1)), + byteWidth: indexByteWidth, + nonceBytes: nonceBytes + ) + let shuffledBytes = data.subdata(in: countByteWidth.. [UInt8] { + var result: [UInt8] = .init(repeating: .zero, count: bytes.count) + indexes.enumerated().forEach { newIdx, oldIdx in + result[newIdx] = bytes[oldIdx] + } + + return result + } + + @usableFromInline + @inline(__always) + static func deobfuscateIndexes(bytes: [UInt8], byteWidth: UInt8, nonceBytes: [UInt8]) -> [Int] { + var bytes = bytes[...] + let byteWidth = Int(byteWidth) + switch byteWidth { + case UInt8.byteWidth: + return deobfuscateIndexes(bytes: &bytes, indexType: UInt8.self, nonceBytes: nonceBytes) + case UInt16.byteWidth: + return deobfuscateIndexes(bytes: &bytes, indexType: UInt16.self, nonceBytes: nonceBytes) + default: + return deobfuscateIndexes(bytes: &bytes, indexType: Int.self, nonceBytes: nonceBytes) + } + } + + @usableFromInline + @inline(__always) + static func deobfuscateIndexes( + bytes: inout ArraySlice, + indexType: I.Type, + nonceBytes: [UInt8] + ) -> [Int] { + let byteWidth = indexType.byteWidth + var indexes: [Int] = [] + while !bytes.isEmpty { + let index = Int( + bytes + .prefix(upTo: bytes.startIndex + byteWidth) + .withUnsafeBytes { $0.load(as: indexType) } ^ .init(bytes: nonceBytes) + ) + indexes.append(index) + bytes.removeFirst(byteWidth) + } + + return indexes + } + } +} diff --git a/Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/Obfuscation+Randomization.swift b/Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/Obfuscation+Randomization.swift new file mode 100644 index 0000000..290bea2 --- /dev/null +++ b/Sources/ConfidentialKit/Obfuscation/Techniques/Randomization/Obfuscation+Randomization.swift @@ -0,0 +1,5 @@ +public extension Obfuscation { + + /// A namespace for types that use data randomization as obfuscation technique. + enum Randomization {} +} diff --git a/Sources/confidential/Confidential.swift b/Sources/confidential/Confidential.swift new file mode 100644 index 0000000..cc9bc59 --- /dev/null +++ b/Sources/confidential/Confidential.swift @@ -0,0 +1,14 @@ +import ArgumentParser + +@main +struct Confidential: ParsableCommand { + + static let configuration = CommandConfiguration( + commandName: "confidential", + abstract: "A command-line tool to obfuscate secret literals embedded in Swift project.", + subcommands: [ + Obfuscate.self + ], + defaultSubcommand: Obfuscate.self + ) +} diff --git a/Sources/confidential/Errors/RuntimeError.swift b/Sources/confidential/Errors/RuntimeError.swift new file mode 100644 index 0000000..cc97866 --- /dev/null +++ b/Sources/confidential/Errors/RuntimeError.swift @@ -0,0 +1,3 @@ +struct RuntimeError: Error, CustomStringConvertible { + let description: String +} diff --git a/Sources/confidential/Subcommands/Obfuscate.swift b/Sources/confidential/Subcommands/Obfuscate.swift new file mode 100644 index 0000000..9c1f1ed --- /dev/null +++ b/Sources/confidential/Subcommands/Obfuscate.swift @@ -0,0 +1,58 @@ +import ArgumentParser +import ConfidentialCore +import Foundation +import Yams + +extension Confidential { + + struct Obfuscate: ParsableCommand { + + static let configuration = CommandConfiguration( + commandName: "obfuscate", + abstract: "Obfuscate secret literals.", + discussion: """ + The generated Swift code provides accessors for each secret literal, \ + grouped into namespaces as defined in configuration file. \ + The accessor allows for retrieving a deobfuscated literal at \ + runtime. + """ + ) + + @Option( + help: "The path to a Confidential configuration file.", + transform: URL.init(fileURLWithPath:) + ) + var configuration: URL + + @Option( + help: "The path to an output source file where the generated Swift code is to be written.", + transform: URL.init(fileURLWithPath:) + ) + var output: URL + + private var fileManager: FileManager { FileManager.default } + + mutating func run() throws { + guard fileManager.isReadableFile(atPath: configuration.path) else { + throw RuntimeError(description: #"Unable to read configuration file at \#(configuration.path)"#) + } + + let configurationYAML = try Data(contentsOf: configuration) + let configuration = try YAMLDecoder().decode(Configuration.self, from: configurationYAML) + + guard fileManager.createFile(atPath: output.path, contents: .none) else { + throw RuntimeError(description: #"Failed to create output file at "\#(output.path)""#) + } + + var sourceSpecification = try Parsers.ModelTransform.SourceSpecification() + .parse(configuration) + + try SourceObfuscator().obfuscate(&sourceSpecification) + + let sourceFileText = try Parsers.CodeGeneration.SourceFile() + .parse(&sourceSpecification) + + try sourceFileText.write(to: output) + } + } +} diff --git a/Tests/ConfidentialCoreTests/Extensions/Foundation/Data/Data+HexStringTests.swift b/Tests/ConfidentialCoreTests/Extensions/Foundation/Data/Data+HexStringTests.swift new file mode 100644 index 0000000..5f80345 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Extensions/Foundation/Data/Data+HexStringTests.swift @@ -0,0 +1,74 @@ +@testable import ConfidentialCore +import XCTest + +final class Data_HexStringTests: XCTestCase { + + private let bytesStub: [UInt8] = [0xff, 0x36, 0xb4, 0xcb, 0x34, 0xff, 0x8c, 0x8f, 0xbf, 0x0f, 0x43, 0x45] + + func test_givenEmptyData_whenHexEncodedStringComponents_thenReturnsEmptyArray() { + // given + let data = Data() + + // when + let hexComponents = data.hexEncodedStringComponents() + + // then + XCTAssertTrue(hexComponents.isEmpty) + } + + func test_givenNonEmptyData_whenHexEncodedStringComponents_thenReturnsExpectedComponents() { + // given + let data = Data(bytesStub) + + // when + let hexComponents = data.hexEncodedStringComponents() + + // then + XCTAssertEqual( + ["ff", "36", "b4", "cb", "34", "ff", "8c", "8f", "bf", "0f", "43", "45"], + hexComponents + ) + } + + func test_givenNonEmptyData_whenHexEncodedStringComponentsOptionsUpperCase_thenReturnsExpectedComponents() { + // given + let data = Data(bytesStub) + + // when + let hexComponents = data.hexEncodedStringComponents(options: .upperCase) + + // then + XCTAssertEqual( + ["FF", "36", "B4", "CB", "34", "FF", "8C", "8F", "BF", "0F", "43", "45"], + hexComponents + ) + } + + func test_givenNonEmptyData_whenHexEncodedStringComponentsOptionsNumericLiteral_thenReturnsExpectedComponents() { + // given + let data = Data(bytesStub) + + // when + let hexComponents = data.hexEncodedStringComponents(options: .numericLiteral) + + // then + XCTAssertEqual( + ["0xff", "0x36", "0xb4", "0xcb", "0x34", "0xff", "0x8c", "0x8f", "0xbf", "0x0f", "0x43", "0x45"], + hexComponents + ) + } + + func test_givenNonEmptyData_whenHexEncodedStringComponentsOptionsUpperCaseAndNumericLiteral_thenReturnsExpectedComponents() { + // given + let data = Data(bytesStub) + + // when + let hexComponents = data.hexEncodedStringComponents(options: [.upperCase, .numericLiteral]) + + // then + XCTAssertEqual( + ["0xFF", "0x36", "0xB4", "0xCB", "0x34", "0xFF", "0x8C", "0x8F", "0xBF", "0x0F", "0x43", "0x45"], + hexComponents + ) + } +} diff --git a/Tests/ConfidentialCoreTests/Extensions/Swift/Encodable/Encodable+TypeErasureTests.swift b/Tests/ConfidentialCoreTests/Extensions/Swift/Encodable/Encodable+TypeErasureTests.swift new file mode 100644 index 0000000..3d66533 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Extensions/Swift/Encodable/Encodable+TypeErasureTests.swift @@ -0,0 +1,21 @@ +@testable import ConfidentialCore +import XCTest + +final class Encodable_TypeErasureTests: XCTestCase { + + func test_givenTypeErasedEncodable_whenJSONEncoded_thenNoThrowAndUnderlyingEncodableProducesExpectedResult() { + // given + let encodableValue = "Test" + let encodableSpy = EncodableSpy() + encodableSpy.encodableValue = encodableValue + let anyEncodable = encodableSpy.eraseToAnyEncodable() + + // when & then + var result: Data = .init() + XCTAssertNoThrow( + result = try JSONEncoder().encode(anyEncodable) + ) + XCTAssertEqual(1, encodableSpy.encodeCallCount) + XCTAssertEqual(#""\#(encodableValue)""#, String(data: result, encoding: .utf8)) + } +} diff --git a/Tests/ConfidentialCoreTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandomTests.swift b/Tests/ConfidentialCoreTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandomTests.swift new file mode 100644 index 0000000..a49c444 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+SecureRandomTests.swift @@ -0,0 +1,50 @@ +@testable import ConfidentialCore +import XCTest + +final class FixedWidthInteger_SecureRandomTests: XCTestCase { + + func test_givenFixedWidthIntegerTypes_whenSecureRandom_thenReturnsNonZeroValues() throws { + // given + let types: [Any] = [ + UInt8.self, UInt16.self, UInt32.self, UInt64.self, + Int8.self, Int16.self, Int32.self, Int64.self + ] + + // when + let values = try types.map { try ($0 as! FixedWidthInteger.Type).secureRandom() } + + // then + values.forEach { + XCTAssertNotEqual(.zero, $0.nonzeroBitCount) + } + } + + func test_givenSecureRandomNumberSource_whenSecureRandom_thenReturnsExpectedValue() throws { + // given + let source: FixedWidthInteger.SecureRandomNumberSource = { bytes in + (0.. \(expectedFuncReturnTypeName) { + try \(dataCompressorFullyQualifiedName)(algorithm: .\(compressionAlgorithmStub.name)) + .deobfuscate( + try \(dataShufflerFullyQualifiedName)(nonce: \(randomizationNonceStub)) + .deobfuscate( + try \(dataCrypterFullyQualifiedName)(algorithm: .\(encryptionAlgorithmStub.name)) + .deobfuscate(\(expectedFuncParamName)) + ) + ) + } + """, + .init(describing: functionDeclSyntax) + ) + XCTAssertTrue(algorithm.isEmpty) + } + + func test_givenEmptyAlgorithm_whenParse_thenThrowsExpectedError() { + // given + var algorithm = Algorithm() + let parser = DeobfuscateDataFunctionDeclParser(functionNestingLevel: .zero) + + // when & then + XCTAssertThrowsError(try parser.parse(&algorithm)) { error in + XCTAssertEqual( + "Obfuscation algorithm must consist of at least one obfuscation step.", + "\(error)" + ) + } + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceDeclParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceDeclParserTests.swift new file mode 100644 index 0000000..d5e6b7a --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceDeclParserTests.swift @@ -0,0 +1,134 @@ +@testable import ConfidentialCore +import XCTest + +import SwiftSyntaxBuilder + +final class NamespaceDeclParserTests: XCTestCase { + + private typealias MembersParserSpy = ParserSpy< + ArraySlice, + [ExpressibleAsMemberDeclListItem] + > + private typealias DeobfuscateDataFunctionDeclParserSpy = ParserSpy< + SourceSpecification.Algorithm, + ExpressibleAsMemberDeclListItem + > + + private let memberNameStub = "tested" + private let memberTypeNameStub = "Bool" + private let deobfuscateDataFunctionNameStub = "test" + + private var membersParserSpy: MembersParserSpy! + private var deobfuscateDataFunctionDeclParserSpy: DeobfuscateDataFunctionDeclParserSpy! + + private var sut: NamespaceDeclParser! + + override func setUp() { + super.setUp() + membersParserSpy = .init(result: membersStub) + membersParserSpy.consumeInput = { $0 = [] } + deobfuscateDataFunctionDeclParserSpy = .init(result: deobfuscateDataFunctionDeclStub) + deobfuscateDataFunctionDeclParserSpy.consumeInput = { $0 = [] } + sut = .init( + membersParser: membersParserSpy, + deobfuscateDataFunctionDeclParser: deobfuscateDataFunctionDeclParserSpy + ) + } + + override func tearDown() { + sut = nil + deobfuscateDataFunctionDeclParserSpy = nil + membersParserSpy = nil + super.tearDown() + } + + func test_givenSourceSpecification_whenParse_thenReturnsExpectedNamespaceDeclarationsAndSourceSpecificationIsEmpty() throws { + // given + let namespaceNameStub = "Secrets" + let secretStub = SourceSpecification.Secret.StubFactory.makeSecret() + var sourceSpecification = SourceSpecification.StubFactory.makeSpecification( + secrets: [ + .create(identifier: namespaceNameStub): [secretStub], + .extend(identifier: namespaceNameStub, moduleName: .none): [secretStub] + ] + ) + + // when + let namespaceDeclarations: [ExpressibleAsCodeBlockItem] = try sut.parse(&sourceSpecification) + + // then + let namespaceDeclarationsSyntax = namespaceDeclarations + .map { $0.createCodeBlockItem() } + .map { $0.buildSyntax(format: .init(indentWidth: .zero)) } + .map { String(describing: $0) } + .sorted() + + XCTAssertEqual( + [ + """ + + enum \(namespaceNameStub) { + + static var \(memberNameStub): \(memberTypeNameStub) = false + + static func \(deobfuscateDataFunctionNameStub)() { + } + } + """, + """ + + extension \(namespaceNameStub) { + + static var \(memberNameStub): \(memberTypeNameStub) = false + + static func \(deobfuscateDataFunctionNameStub)() { + } + } + """ + ], + namespaceDeclarationsSyntax + ) + XCTAssertEqual([[secretStub], [secretStub]], membersParserSpy.parseRecordedInput) + XCTAssertEqual([[]], deobfuscateDataFunctionDeclParserSpy.parseRecordedInput) + XCTAssertTrue(sourceSpecification.algorithm.isEmpty) + XCTAssertTrue(sourceSpecification.secrets.isEmpty) + } +} + +private extension NamespaceDeclParserTests { + + var membersStub: [ExpressibleAsMemberDeclListItem] { + [ + VariableDecl( + modifiers: ModifierList([ + DeclModifier(name: .static.withLeadingTrivia(.newlines(1).appending(.spaces(4)))) + ]), + letOrVarKeyword: .var, + bindings: PatternBindingList([ + PatternBinding( + pattern: IdentifierPattern(memberNameStub), + typeAnnotation: TypeAnnotation(memberTypeNameStub), + initializer: InitializerClause( + value: BooleanLiteralExpr(booleanLiteral: .false.withoutTrivia()) + ) + ) + ]) + ) + ] + } + + var deobfuscateDataFunctionDeclStub: ExpressibleAsMemberDeclListItem { + FunctionDecl( + modifiers: ModifierList([ + DeclModifier(name: .static.withLeadingTrivia(.newlines(1).appending(.spaces(4)))) + ]), + identifier: .identifier(deobfuscateDataFunctionNameStub), + signature: FunctionSignature(input: ParameterClause()), + body: CodeBlock( + leftBrace: .leftBrace.withLeadingTrivia(.spaces(1)), + statements: CodeBlockItemList([]), + rightBrace: .rightBrace.withLeadingTrivia(.spaces(4)) + ) + ) + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceMembersParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceMembersParserTests.swift new file mode 100644 index 0000000..2d3ffdc --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/NamespaceMembersParserTests.swift @@ -0,0 +1,91 @@ +@testable import ConfidentialCore +import XCTest + +import SwiftSyntaxBuilder + +final class NamespaceMembersParserTests: XCTestCase { + + private typealias Secret = SourceSpecification.Secret + private typealias SecretDeclParserSpy = ParserSpy + + private let secretDeclStub = SecretDecl( + name: "secret", + dataArgumentExpression: ArrayExpr { + ArrayElement(expression: IntegerLiteralExpr(digits: "0x20"), trailingComma: .comma) + ArrayElement(expression: IntegerLiteralExpr(digits: "0x20")) + }, + dataAccessWrapper: CustomAttribute( + attributeName: SimpleTypeIdentifier("Test"), + argumentList: .none + ) + ) + private let secretsStub: ArraySlice = [ + .StubFactory.makeSecret(), + .StubFactory.makeSecret() + ] + + private var secretDeclParserSpy: SecretDeclParserSpy! + + private var sut: NamespaceMembersParser! + + override func setUp() { + super.setUp() + secretDeclParserSpy = .init(result: secretDeclStub) + sut = .init(secretDeclParser: secretDeclParserSpy) + } + + override func tearDown() { + sut = nil + secretDeclParserSpy = nil + super.tearDown() + } + + func test_givenSecrets_whenParse_thenReturnsExpectedMemberDeclarationsAndSecretsIsEmpty() throws { + // given + var secrets = secretsStub + + // when + let memberDeclarations: [ExpressibleAsMemberDeclListItem] = try sut.parse(&secrets) + + // then + let format = Format(indentWidth: .zero) + let membersSourceText = memberDeclarations + .map { $0.createMemberDeclListItem() } + .map { $0.buildSyntax(format: format) } + .map { String(describing: $0) } + let expectedMembersSourceText = secretsStub + .map { _ in secretDeclStub.buildSyntax(format: format) } + .map { String(describing: $0) } + XCTAssertEqual(expectedMembersSourceText, membersSourceText) + XCTAssertEqual(secretsStub, secretDeclParserSpy.parseRecordedInput[...]) + XCTAssertTrue(secrets.isEmpty) + } + + func test_givenSecretDeclParserFailsOnFirstSecret_whenParse_thenThrowsErrorAndSecretsLeftIntact() { + // given + var secrets = secretsStub + secretDeclParserSpy.consumeInput = { _ in throw ErrorDummy() } + + // when & then + XCTAssertThrowsError(try sut.parse(&secrets)) + XCTAssertEqual([secretsStub.first!], secretDeclParserSpy.parseRecordedInput) + XCTAssertEqual(secretsStub, secrets) + } + + func test_givenSecretDeclParserFailsOnSecondSecret_whenParse_thenThrowsErrorAndSecretsContainAll() { + // given + var secrets = secretsStub + var secretCount: Int = .zero + secretDeclParserSpy.consumeInput = { _ in + guard secretCount == .zero else { + throw ErrorDummy() + } + secretCount += 1 + } + + // when & then + XCTAssertThrowsError(try sut.parse(&secrets)) + XCTAssertEqual(secretsStub, secretDeclParserSpy.parseRecordedInput[...]) + XCTAssertEqual(secretsStub.dropFirst(), secrets) + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SecretDeclParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SecretDeclParserTests.swift new file mode 100644 index 0000000..deebb6a --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SecretDeclParserTests.swift @@ -0,0 +1,41 @@ +@testable import ConfidentialCore +import XCTest + +import ConfidentialKit + +final class SecretDeclParserTests: XCTestCase { + + private typealias Secret = SourceSpecification.Secret + + func test_givenSecret_whenParse_thenReturnsExpectedSecretDecl() throws { + // given + let deobfuscateArgumentName = "deobfuscate" + let deobfuscateDataFuncName = "deobfuscateData" + let secret = Secret( + name: "secret", + data: .init([0x20, 0x20]), + dataAccessWrapperInfo: .init( + typeInfo: .init(of: Obfuscated.self), + arguments: [(label: deobfuscateArgumentName, value: deobfuscateDataFuncName)] + ) + ) + + // when + let secretDecl = try SecretDeclParser().parse(secret) + + // then + let secretDeclSyntax = secretDecl + .createSecretDecl() + .buildSyntax(format: .init(indentWidth: .zero)) + let expectedAttributeName = secret.dataAccessWrapperInfo.typeInfo.fullyQualifiedName + let expectedDeclTypeName = TypeInfo(of: Obfuscation.Secret.self).fullyQualifiedName + XCTAssertEqual( + """ + + @\(expectedAttributeName)(\(deobfuscateArgumentName): \(deobfuscateDataFuncName)) + static var \(secret.name): \(expectedDeclTypeName) = .init(data: [0x20, 0x20]) + """, + .init(describing: secretDeclSyntax) + ) + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SourceFileParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SourceFileParserTests.swift new file mode 100644 index 0000000..8404419 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/CodeGeneration/SourceFileParserTests.swift @@ -0,0 +1,88 @@ +@testable import ConfidentialCore +import XCTest + +import SwiftSyntaxBuilder + +final class SourceFileParserTests: XCTestCase { + + private typealias CodeBlockParserSpy = ParserSpy + + private let moduleNameStub = "SecretModule" + private let enumNameStub = "Test" + + private var codeBlockParserSpy: CodeBlockParserSpy! + + private var sut: SourceFileParser! + + override func setUp() { + super.setUp() + codeBlockParserSpy = .init(result: codeBlockStub) + codeBlockParserSpy.consumeInput = { + $0.algorithm = [] + $0.secrets = [:] + } + sut = .init { + codeBlockParserSpy! + } + } + + override func tearDown() { + sut = nil + codeBlockParserSpy = nil + super.tearDown() + } + + func test_givenSourceSpecification_whenParse_thenReturnsExpectedSourceFileTextAndSourceSpecificationIsEmpty() throws { + // given + var sourceSpecification = SourceSpecification.StubFactory.makeSpecification( + secrets: [ + .create(identifier: "Secrets"): [], + .extend(identifier: "Secret", moduleName: moduleNameStub): [] + ] + ) + + // when + let sourceFileText: SourceFileText = try sut.parse(&sourceSpecification) + + // then + XCTAssertEqual( + """ + + import ConfidentialKit + import Foundation + import \(moduleNameStub) + + enum \(enumNameStub) { + } + """, + .init(describing: sourceFileText) + ) + XCTAssertTrue(sourceSpecification.algorithm.isEmpty) + XCTAssertTrue(sourceSpecification.secrets.isEmpty) + } + + func test_givenCodeBlockParserFails_whenParse_thenThrowsError() { + // given + var sourceSpecification = SourceSpecification.StubFactory.makeSpecification() + codeBlockParserSpy.consumeInput = { _ in throw ErrorDummy() } + + // when & then + XCTAssertThrowsError(try sut.parse(&sourceSpecification)) + } +} + +private extension SourceFileParserTests { + + var codeBlockStub: [ExpressibleAsCodeBlockItem] { + [ + EnumDecl( + enumKeyword: .enum.withLeadingTrivia(.newlines(1)), + identifier: .identifier(enumNameStub), + members: MemberDeclBlock( + leftBrace: .leftBrace.withLeadingTrivia(.spaces(1)), + members: MemberDeclList([]) + ) + ) + ] + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/AlgorithmParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/AlgorithmParserTests.swift new file mode 100644 index 0000000..f4fb743 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/AlgorithmParserTests.swift @@ -0,0 +1,81 @@ +@testable import ConfidentialCore +import XCTest + +final class AlgorithmParserTests: XCTestCase { + + private typealias ObfuscationStepParserSpy = ParserSpy + + private let obfuscationStepStub = "test" + private lazy var algorithmStub = (0..<2).map { _ in obfuscationStepStub }[...] + + private var obfuscationStepParserSpy: ObfuscationStepParserSpy! + + private var sut: AlgorithmParser! + + override func setUp() { + super.setUp() + obfuscationStepParserSpy = .init(result: .init(technique: .compression(algorithm: .lzfse))) + obfuscationStepParserSpy.consumeInput = { $0 = "" } + sut = .init(obfuscationStepParser: obfuscationStepParserSpy) + } + + override func tearDown() { + sut = nil + obfuscationStepParserSpy = nil + super.tearDown() + } + + func test_givenConfiguration_whenParse_thenReturnsExpectedValueAndConfigurationAlgorithmIsEmpty() throws { + // given + var configuration = Configuration.StubFactory.makeConfiguration(algorithm: algorithmStub) + + // when + let algorithm = try sut.parse(&configuration) + + // then + XCTAssertEqual( + (0.. + + private let inputStub = "test"[...] + + private var compressionTechniqueParserSpy: TechniqueParserSpy! + private var randomizationTechniqueParserSpy: TechniqueParserSpy! + + private var sut: ObfuscationStepParser>! + + override func setUp() { + super.setUp() + compressionTechniqueParserSpy = .init(result: .compression(algorithm: .lz4)) + randomizationTechniqueParserSpy = .init(result: .randomization(nonce: 123456789)) + sut = ObfuscationStepParser { + compressionTechniqueParserSpy! + randomizationTechniqueParserSpy! + } + } + + override func tearDown() { + sut = nil + randomizationTechniqueParserSpy = nil + compressionTechniqueParserSpy = nil + super.tearDown() + } + + func test_givenFirstTechniqueParserSucceeds_whenParse_thenReturnsExpectedValue() throws { + // given + var input = inputStub + compressionTechniqueParserSpy.consumeInput = { _ in } + randomizationTechniqueParserSpy.consumeInput = { _ in throw ErrorDummy() } + + // when + let obfuscationStep = try sut.parse(&input) + + // then + XCTAssertEqual(.init(technique: compressionTechniqueParserSpy.result), obfuscationStep) + XCTAssertEqual([inputStub], compressionTechniqueParserSpy.parseRecordedInput) + XCTAssertEqual([], randomizationTechniqueParserSpy.parseRecordedInput) + } + + func test_givenSecondTechniqueParserSucceeds_whenParse_thenReturnsExpectedValue() throws { + // given + var input = inputStub + compressionTechniqueParserSpy.consumeInput = { _ in throw ErrorDummy() } + randomizationTechniqueParserSpy.consumeInput = { _ in } + + // when + let obfuscationStep = try sut.parse(&input) + + // then + XCTAssertEqual(.init(technique: randomizationTechniqueParserSpy.result), obfuscationStep) + XCTAssertEqual([inputStub], compressionTechniqueParserSpy.parseRecordedInput) + XCTAssertEqual([inputStub], randomizationTechniqueParserSpy.parseRecordedInput) + } + + func test_givenBothTechniqueParsersFail_whenParse_thenThrowsError() { + // given + var input = inputStub + compressionTechniqueParserSpy.consumeInput = { _ in throw ErrorDummy() } + randomizationTechniqueParserSpy.consumeInput = { _ in throw ErrorDummy() } + + // when & then + XCTAssertThrowsError(try sut.parse(&input)) + XCTAssertEqual([inputStub], compressionTechniqueParserSpy.parseRecordedInput) + XCTAssertEqual([inputStub], randomizationTechniqueParserSpy.parseRecordedInput) + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/RandomizationTechniqueParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/RandomizationTechniqueParserTests.swift new file mode 100644 index 0000000..0fc7ae6 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/RandomizationTechniqueParserTests.swift @@ -0,0 +1,70 @@ +@testable import ConfidentialCore +import XCTest + +final class RandomizationTechniqueParserTests: XCTestCase { + + private let nonceStub: UInt64 = 123456789 + + private var generateNonceSpy: ParameterlessClosureSpy! + + private var sut: RandomizationTechniqueParser! + + override func setUp() { + super.setUp() + generateNonceSpy = .init(result: nonceStub) + sut = .init(generateNonce: generateNonceSpy.closureWithError) + } + + override func tearDown() { + sut = nil + generateNonceSpy = nil + super.tearDown() + } + + func test_givenValidInput_whenParse_thenReturnsExpectedEnumValueAndInputIsEmpty() throws { + // given + var input = " \(C.Parsing.Keywords.shuffle)"[...] + + // when + let technique = try sut.parse(&input) + + // then + XCTAssertEqual(.randomization(nonce: nonceStub), technique) + XCTAssertEqual(1, generateNonceSpy.callCount) + XCTAssertTrue(input.isEmpty) + } + + func test_givenInvalidInput_whenParse_thenThrowsErrorAndInputLeftIntact() { + // given + var input = "\(C.Parsing.Keywords.compress)"[...] + + // when & then + XCTAssertThrowsError(try sut.parse(&input)) + XCTAssertEqual(.zero, generateNonceSpy.callCount) + XCTAssertEqual("\(C.Parsing.Keywords.compress)", input) + } + + func test_givenInputWithUnexpectedTrailingData_whenParse_thenThrowsErrorAndInputEqualsTrailingData() { + // given + var input = "\(C.Parsing.Keywords.shuffle) Test"[...] + + // when & then + XCTAssertThrowsError(try sut.parse(&input)) + XCTAssertEqual(.zero, generateNonceSpy.callCount) + XCTAssertEqual(" Test", input) + } + + func test_givenValidInputAndGenerateNonceError_whenParse_thenThrowsExpectedErrorAndInputIsEmpty() { + // given + var input = "\(C.Parsing.Keywords.shuffle)"[...] + let error = ErrorDummy() + generateNonceSpy.error = error + + // when & then + XCTAssertThrowsError(try sut.parse(&input)) { + XCTAssertEqual(error, $0 as? ErrorDummy) + } + XCTAssertEqual(1, generateNonceSpy.callCount) + XCTAssertTrue(input.isEmpty) + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretNamespaceParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretNamespaceParserTests.swift new file mode 100644 index 0000000..7dd1c01 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretNamespaceParserTests.swift @@ -0,0 +1,81 @@ +@testable import ConfidentialCore +import XCTest + +final class SecretNamespaceParserTests: XCTestCase { + + private typealias Namespace = SecretNamespaceParser.Namespace + + private let secretsNamespaceStub = "Secrets" + private let secretModuleStub = "SecretModule" + + private var sut: SecretNamespaceParser! + + override func setUp() { + super.setUp() + sut = .init() + } + + override func tearDown() { + sut = nil + super.tearDown() + } + + func test_givenValidInputData_whenParse_thenReturnsExpectedEnumValuesAndInputIsEmpty() throws { + // given + var inputData = [ + ""[...], + "\(C.Parsing.Keywords.create) \(secretsNamespaceStub)"[...], + "\(C.Parsing.Keywords.extend) \(secretsNamespaceStub)"[...], + "\(C.Parsing.Keywords.extend) \(secretsNamespaceStub) \(C.Parsing.Keywords.from) \(secretModuleStub)" + ] + + // when + let namespaces = try inputData.indices.map { + try sut.parse(&inputData[$0]) + } + + // then + let expectedNamespaces: [Namespace] = [ + .extend(identifier: "ConfidentialKit.Obfuscation.Secret", moduleName: "ConfidentialKit"), + .create(identifier: secretsNamespaceStub), + .extend(identifier: secretsNamespaceStub, moduleName: .none), + .extend(identifier: secretsNamespaceStub, moduleName: secretModuleStub) + ] + XCTAssertEqual(inputData.count, namespaces.count) + XCTAssertEqual(expectedNamespaces.count, namespaces.count) + namespaces.enumerated().forEach { idx, namespace in + XCTAssertEqual(expectedNamespaces[idx], namespace) + XCTAssertTrue(inputData[idx].isEmpty) + } + } + + func test_givenValidInputWithExtraWhitespaces_whenParse_thenReturnsExpectedEnumValueAndInputIsEmpty() throws { + // given + var input = " \(C.Parsing.Keywords.extend) \(secretsNamespaceStub) \(C.Parsing.Keywords.from) \(secretModuleStub)"[...] + + // when + let namespace = try sut.parse(&input) + + // then + XCTAssertEqual(.extend(identifier: secretsNamespaceStub, moduleName: secretModuleStub), namespace) + XCTAssertTrue(input.isEmpty) + } + + func test_givenInvalidInput_whenParse_thenThrowsErrorAndInputLeftIntact() { + // given + var input = "\(C.Parsing.Keywords.shuffle)"[...] + + // when & then + XCTAssertThrowsError(try sut.parse(&input)) + XCTAssertEqual("\(C.Parsing.Keywords.shuffle)", input) + } + + func test_givenInputWithUnexpectedTrailingData_whenParse_thenThrowsErrorAndInputEqualsTrailingData() { + // given + var input = "\(C.Parsing.Keywords.create) \(secretsNamespaceStub) Test"[...] + + // when & then + XCTAssertThrowsError(try sut.parse(&input)) + XCTAssertEqual(" Test", input) + } +} diff --git a/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretsParserTests.swift b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretsParserTests.swift new file mode 100644 index 0000000..6a11a29 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Parsing/Parsers/ModelTransform/SecretsParserTests.swift @@ -0,0 +1,103 @@ +@testable import ConfidentialCore +import XCTest + +final class SecretsParserTests: XCTestCase { + + private typealias Namespace = SourceSpecification.Secret.Namespace + private typealias NamespaceParserSpy = ParserSpy + private typealias Secrets = SourceSpecification.Secrets + + private let secretsNamespaceStub: Namespace = .create(identifier: "Secrets") + private let secretsStub: ArraySlice = [ + .init(name: "secret1", value: .singleValue("message"), namespace: .none), + .init(name: "secret2", value: .array(["mess", "age"]), namespace: .none) + ] + + private var namespaceParserSpy: NamespaceParserSpy! + private var secretValueEncoderSpy: DataEncoderSpy! + + private var sut: SecretsParser! + + override func setUp() { + super.setUp() + namespaceParserSpy = .init(result: secretsNamespaceStub) + namespaceParserSpy.consumeInput = { $0 = "" } + secretValueEncoderSpy = .init(underlyingEncoder: JSONEncoder()) + sut = .init( + namespaceParser: namespaceParserSpy, + secretValueEncoder: secretValueEncoderSpy + ) + } + + override func tearDown() { + sut = nil + secretValueEncoderSpy = nil + namespaceParserSpy = nil + super.tearDown() + } + + func test_givenConfiguration_whenParse_thenReturnsExpectedValueAndConfigurationSecretsIsEmpty() throws { + // given + var configuration = Configuration.StubFactory.makeConfiguration(secrets: secretsStub) + + // when + let secrets: Secrets = try sut.parse(&configuration) + + // then + let expectedSecrets: SourceSpecification.Secrets = [ + secretsNamespaceStub: try secretsStub.map { + try SourceSpecification.Secret.StubFactory.makeSecret( + from: $0, + using: secretValueEncoderSpy.underlyingEncoder + ) + }[...] + ] + XCTAssertEqual(expectedSecrets, secrets) + XCTAssertEqual( + ["Obfuscated", "Obfuscated>"], + secrets[secretsNamespaceStub]?.map { $0.dataAccessWrapperInfo.typeInfo.name } + ) + XCTAssertEqual((0.. + private typealias SecretsParserSpy = ParserSpy + + private let configurationStub: Configuration = { + var configuration = Configuration.StubFactory.makeConfiguration() + configuration.defaultNamespace = "Secrets" + return configuration + }() + private let algorithmStub: SourceSpecification.Algorithm = [ + .init(technique: .encryption(algorithm: .chaChaPoly)) + ] + private let secretsStub: SourceSpecification.Secrets = [ + .extend(identifier: "Secrets", moduleName: "SecretModule"): [.StubFactory.makeSecret()] + ] + + private var algorithmParserSpy: AlgorithmParserSpy! + private var secretsParserSpy: SecretsParserSpy! + + private var sut: SourceSpecificationParser! + + override func setUp() { + super.setUp() + algorithmParserSpy = .init(result: algorithmStub) + algorithmParserSpy.consumeInput = { $0.algorithm = [] } + secretsParserSpy = .init(result: secretsStub) + secretsParserSpy.consumeInput = { $0.secrets = [] } + sut = .init( + algorithmParser: algorithmParserSpy, + secretsParser: secretsParserSpy + ) + } + + override func tearDown() { + sut = nil + secretsParserSpy = nil + algorithmParserSpy = nil + super.tearDown() + } + + func test_givenConfiguration_whenParse_thenReturnsExpectedValueAndConfigurationDefaultNamespaceIsNil() throws { + // given + var configuration = configurationStub + + // when + let sourceSpecification: SourceSpecification = try sut.parse(&configuration) + + // then + XCTAssertEqual(.init(algorithm: algorithmStub, secrets: secretsStub), sourceSpecification) + XCTAssertEqual([configurationStub], algorithmParserSpy.parseRecordedInput) + XCTAssertEqual([configurationStub], secretsParserSpy.parseRecordedInput) + XCTAssertNil(configuration.defaultNamespace) + } + + func test_givenAlgorithmParserFails_whenParse_thenThrowsError() { + // given + var configuration = configurationStub + algorithmParserSpy.consumeInput = { _ in throw ErrorDummy() } + + // when & then + XCTAssertThrowsError(try sut.parse(&configuration)) + } + + func test_givenSecretsParserFails_whenParse_thenThrowsError() { + // given + var configuration = configurationStub + secretsParserSpy.consumeInput = { _ in throw ErrorDummy() } + + // when & then + XCTAssertThrowsError(try sut.parse(&configuration)) + } +} diff --git a/Tests/ConfidentialCoreTests/SyntaxText/SourceFileTextTests.swift b/Tests/ConfidentialCoreTests/SyntaxText/SourceFileTextTests.swift new file mode 100644 index 0000000..0c5600e --- /dev/null +++ b/Tests/ConfidentialCoreTests/SyntaxText/SourceFileTextTests.swift @@ -0,0 +1,68 @@ +@testable import ConfidentialCore +import XCTest + +import SwiftSyntaxBuilder + +final class SourceFileTextTests: XCTestCase { + + private var temporaryFileURL: URL! + + override func setUp() { + super.setUp() + temporaryFileURL = .init(fileURLWithPath: NSTemporaryDirectory()) + .appendingPathComponent("\(UUID().uuidString).swift") + } + + override func tearDownWithError() throws { + try FileManager.default.removeItem(at: temporaryFileURL) + temporaryFileURL = nil + super.tearDown() + } + + func test_givenSourceFileTextWithSourceFileSyntax_whenWriteToFile_thenFileContainsExpectedSyntaxText() throws { + // given + let sourceFile = SourceFile(eofToken: .eof) { + ImportDecl( + path: AccessPath([AccessPathComponent(name: .identifier("Foundation"))]) + ) + StructDecl( + structKeyword: .struct.withLeadingTrivia(.newlines(1)), + identifier: "Test", + members: MemberDeclBlock( + leftBrace: .leftBrace.withLeadingTrivia(.spaces(1)), + rightBrace: .rightBrace + ) { + VariableDecl( + .let.withLeadingTrivia(.spaces(2)), + name: IdentifierPattern("id"), + type: TypeAnnotation("UUID") + ) + VariableDecl( + .var.withLeadingTrivia(.spaces(2)), + name: IdentifierPattern("data"), + type: TypeAnnotation("Data") + ) + } + ) + } + let sourceFileText = SourceFileText(from: sourceFile) + let encoding = String.Encoding.utf8 + + // when + try sourceFileText.write(to: temporaryFileURL, encoding: encoding) + + // then + let fileContents = try String(contentsOf: temporaryFileURL, encoding: encoding) + XCTAssertEqual( + """ + import Foundation + + struct Test { + let id: UUID + var data: Data + } + """, + fileContents + ) + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Dummies/ErrorDummy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Dummies/ErrorDummy.swift new file mode 100644 index 0000000..e05305a --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Dummies/ErrorDummy.swift @@ -0,0 +1 @@ +struct ErrorDummy: Error, Equatable {} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Spies/DataEncoderSpy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Spies/DataEncoderSpy.swift new file mode 100644 index 0000000..70671f3 --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Spies/DataEncoderSpy.swift @@ -0,0 +1,18 @@ +@testable import ConfidentialCore +import Foundation + +final class DataEncoderSpy: DataEncoder { + + var underlyingEncoder: DataEncoder + + private(set) var encodeRecordedValues: [any Encodable] = [] + + init(underlyingEncoder: DataEncoder) { + self.underlyingEncoder = underlyingEncoder + } + + func encode(_ value: E) throws -> Data { + encodeRecordedValues.append(value) + return try underlyingEncoder.encode(value) + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Spies/EncodableSpy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Spies/EncodableSpy.swift new file mode 100644 index 0000000..523b06b --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Spies/EncodableSpy.swift @@ -0,0 +1,13 @@ +final class EncodableSpy: Encodable { + + var encodableValue: Value? + + private(set) var encodeCallCount: Int = .zero + + func encode(to encoder: Encoder) throws { + encodeCallCount += 1 + guard let encodableValue = encodableValue else { return } + var container = encoder.singleValueContainer() + try container.encode(encodableValue) + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepResolverSpy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepResolverSpy.swift new file mode 100644 index 0000000..485a7a5 --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepResolverSpy.swift @@ -0,0 +1,17 @@ +@testable import ConfidentialCore + +final class ObfuscationStepResolverSpy: DataObfuscationStepResolver { + + var obfuscationStepReturnValue: any DataObfuscationStep + + private(set) var recordedTechniques: [Technique] = [] + + init(obfuscationStepReturnValue: any DataObfuscationStep) { + self.obfuscationStepReturnValue = obfuscationStepReturnValue + } + + func obfuscationStep(for technique: Technique) -> DataObfuscationStep { + recordedTechniques.append(technique) + return obfuscationStepReturnValue + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepSpy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepSpy.swift new file mode 100644 index 0000000..acbdc0b --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ObfuscationStepSpy.swift @@ -0,0 +1,14 @@ +@testable import ConfidentialCore +import Foundation + +final class ObfuscationStepSpy: DataObfuscationStep { + + var obfuscateReturnValue: Data? + + private(set) var recordedData: [Data] = [] + + func obfuscate(_ data: Data) throws -> Data { + recordedData.append(data) + return obfuscateReturnValue ?? data + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Spies/ParameterlessClosureSpy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ParameterlessClosureSpy.swift new file mode 100644 index 0000000..bf62d01 --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ParameterlessClosureSpy.swift @@ -0,0 +1,22 @@ +final class ParameterlessClosureSpy { + + var result: Result + var error: Error? + + private(set) var callCount: Int = .zero + + init(result: Result) { + self.result = result + } + + func closure() -> Result { + callCount += 1 + return result + } + + func closureWithError() throws -> Result { + callCount += 1 + if let error = error { throw error } + return result + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Spies/ParserSpy.swift b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ParserSpy.swift new file mode 100644 index 0000000..6001227 --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Spies/ParserSpy.swift @@ -0,0 +1,19 @@ +import Parsing + +final class ParserSpy: Parser { + + var result: Output + var consumeInput: ((inout Input) throws -> Void)? + + private(set) var parseRecordedInput: [Input] = [] + + init(result: Output) { + self.result = result + } + + func parse(_ input: inout Input) throws -> Output { + parseRecordedInput.append(input) + try consumeInput?(&input) + return result + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Stubs/ConfigurationStubFactory.swift b/Tests/ConfidentialCoreTests/TestDoubles/Stubs/ConfigurationStubFactory.swift new file mode 100644 index 0000000..2099b03 --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Stubs/ConfigurationStubFactory.swift @@ -0,0 +1,18 @@ +@testable import ConfidentialCore + +extension Configuration { + + enum StubFactory { + + static func makeConfiguration( + algorithm: ArraySlice = [], + secrets: ArraySlice = [] + ) -> Configuration { + .init( + algorithm: algorithm, + defaultNamespace: .none, + secrets: secrets + ) + } + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecification.SecretStubFactory.swift b/Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecification.SecretStubFactory.swift new file mode 100644 index 0000000..3b64a8c --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecification.SecretStubFactory.swift @@ -0,0 +1,24 @@ +@testable import ConfidentialCore +import Foundation + +extension SourceSpecification.Secret { + + enum StubFactory { + + static func makeSecret(named name: String = "secret", with data: Data = .init()) -> SourceSpecification.Secret { + .init( + name: name, + data: data, + dataAccessWrapperInfo: .init(typeInfo: TypeInfo(of: Any.self), arguments: []) + ) + } + + static func makeSecret(from secret: Configuration.Secret, using encoder: DataEncoder) throws -> SourceSpecification.Secret { + .init( + name: secret.name, + data: try encoder.encode(secret.value.underlyingValue), + dataAccessWrapperInfo: .init(typeInfo: TypeInfo(of: Any.self), arguments: []) + ) + } + } +} diff --git a/Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecificationStubFactory.swift b/Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecificationStubFactory.swift new file mode 100644 index 0000000..e20525f --- /dev/null +++ b/Tests/ConfidentialCoreTests/TestDoubles/Stubs/SourceSpecificationStubFactory.swift @@ -0,0 +1,14 @@ +@testable import ConfidentialCore + +extension SourceSpecification { + + enum StubFactory { + + static func makeSpecification( + algorithm: SourceSpecification.Algorithm = [], + secrets: SourceSpecification.Secrets = [:] + ) -> SourceSpecification { + .init(algorithm: algorithm, secrets: secrets) + } + } +} diff --git a/Tests/ConfidentialCoreTests/Utils/TypeInfoTests.swift b/Tests/ConfidentialCoreTests/Utils/TypeInfoTests.swift new file mode 100644 index 0000000..0103d96 --- /dev/null +++ b/Tests/ConfidentialCoreTests/Utils/TypeInfoTests.swift @@ -0,0 +1,93 @@ +@testable import ConfidentialCore +import XCTest + +final class TypeInfoTests: XCTestCase { + + func test_givenNestedTypeInfo_whenFullyQualifiedName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Swift.String.Encoding.self) + + // when + let fullyQualifiedName = typeInfo.fullyQualifiedName + + // then + XCTAssertEqual("Swift.String.Encoding", fullyQualifiedName) + } + + func test_givenNestedTypeInfo_whenModuleName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Swift.String.Encoding.self) + + // when + let moduleName = typeInfo.moduleName + + // then + XCTAssertEqual("Swift", moduleName) + } + + func test_givenNestedTypeInfo_whenFullName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Swift.String.Encoding.self) + + // when + let fullName = typeInfo.fullName + + // then + XCTAssertEqual("String.Encoding", fullName) + } + + func test_givenNestedTypeInfo_whenName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Swift.String.Encoding.self) + + // when + let name = typeInfo.name + + // then + XCTAssertEqual("Encoding", name) + } + + func test_givenTopLevelTypeInfo_whenFullyQualifiedName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Foundation.Data.self) + + // when + let fullyQualifiedName = typeInfo.fullyQualifiedName + + // then + XCTAssertEqual("Foundation.Data", fullyQualifiedName) + } + + func test_givenTopLevelTypeInfo_whenModuleName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Foundation.Data.self) + + // when + let moduleName = typeInfo.moduleName + + // then + XCTAssertEqual("Foundation", moduleName) + } + + func test_givenTopLevelTypeInfo_whenFullName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Foundation.Data.self) + + // when + let fullName = typeInfo.fullName + + // then + XCTAssertEqual("Data", fullName) + } + + func test_givenTopLevelTypeInfo_whenName_thenReturnsExpectedValue() { + // given + let typeInfo = TypeInfo(of: Foundation.Data.self) + + // when + let name = typeInfo.name + + // then + XCTAssertEqual("Data", name) + } +} diff --git a/Tests/ConfidentialKitTests/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCountTests.swift b/Tests/ConfidentialKitTests/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCountTests.swift new file mode 100644 index 0000000..d5d0163 --- /dev/null +++ b/Tests/ConfidentialKitTests/Extensions/CryptoKit/SymmetricKeySize/SymmetricKeySize+ByteCountTests.swift @@ -0,0 +1,29 @@ +@testable import ConfidentialKit +import XCTest + +import CryptoKit + +final class SymmetricKeySize_ByteCountTests: XCTestCase { + + func test_givenStandardKeySize_whenByteCount_thenReturnsExpectedValue() { + // given + let keySize = SymmetricKeySize.bits192 + + // when + let byteCount = keySize.byteCount + + // then + XCTAssertEqual(24, byteCount) + } + + func test_givenNonStandardKeySize_whenByteCount_thenReturnsExpectedValue() { + // given + let keySize = SymmetricKeySize(bitCount: 72) + + // when + let byteCount = keySize.byteCount + + // then + XCTAssertEqual(9, byteCount) + } +} diff --git a/Tests/ConfidentialKitTests/Extensions/Swift/BinaryInteger/BinaryInteger+BytesTests.swift b/Tests/ConfidentialKitTests/Extensions/Swift/BinaryInteger/BinaryInteger+BytesTests.swift new file mode 100644 index 0000000..5233099 --- /dev/null +++ b/Tests/ConfidentialKitTests/Extensions/Swift/BinaryInteger/BinaryInteger+BytesTests.swift @@ -0,0 +1,58 @@ +@testable import ConfidentialKit +import XCTest + +final class BinaryInteger_BytesTests: XCTestCase { + + func test_givenBinaryIntegers_whenBytes_thenReturnsExpectedValues() { + // given + let integers: [Any] = [ + UInt8(1), UInt16(1), UInt32(1), UInt64(1), + Int8(1), Int16(1), Int32(1), Int64(1) + ] + + // when + let bytes = integers.map { ($0 as! FixedWidthInteger).littleEndian.bytes } + + // then + XCTAssertEqual( + [ + [0x01], [0x01, 0x00], [0x01, 0x00, 0x00, 0x00], [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00], + [0x01], [0x01, 0x00], [0x01, 0x00, 0x00, 0x00], [0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00] + ], + bytes + ) + } + + func test_givenCollectionOfTwoBytes_whenUInt8InitBytes_thenReturnsUInt8WithExpectedValue() { + // given + let bytes: [UInt8] = [0x01, 0x01] + + // when + let uInt8 = UInt8(bytes: bytes) + + // then + XCTAssertEqual(1, uInt8) + } + + func test_givenCollectionOfTwoBytes_whenUInt32InitBytes_thenReturnsUInt32WithExpectedValue() { + // given + let bytes: [UInt8] = [0x01, 0x01] + + // when + let uInt32 = UInt32(bytes: bytes) + + // then + XCTAssertEqual(257, uInt32) + } + + func test_givenEmptyCollection_whenIntInitBytes_thenReturnsIntWithValueEqualToZero() { + // given + let bytes: [UInt8] = [] + + // when + let int = Int(bytes: bytes) + + // then + XCTAssertEqual(.zero, int) + } +} diff --git a/Tests/ConfidentialKitTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+ByteWidthTests.swift b/Tests/ConfidentialKitTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+ByteWidthTests.swift new file mode 100644 index 0000000..0509d01 --- /dev/null +++ b/Tests/ConfidentialKitTests/Extensions/Swift/FixedWidthInteger/FixedWidthInteger+ByteWidthTests.swift @@ -0,0 +1,25 @@ +@testable import ConfidentialKit +import XCTest + +final class FixedWidthInteger_ByteWidthTests: XCTestCase { + + func test_givenFixedWidthIntegerTypes_whenByteWidth_thenReturnsExpectedValues() { + // given + let types: [Any] = [ + UInt8.self, UInt16.self, UInt32.self, UInt64.self, + Int8.self, Int16.self, Int32.self, Int64.self + ] + + // when + let byteWidths = types.map { ($0 as! FixedWidthInteger.Type).byteWidth } + + // then + XCTAssertEqual( + [ + 1, 2, 4, 8, + 1, 2, 4, 8 + ], + byteWidths + ) + } +} diff --git a/Tests/ConfidentialKitTests/Obfuscation/Obfuscation+SecretTests.swift b/Tests/ConfidentialKitTests/Obfuscation/Obfuscation+SecretTests.swift new file mode 100644 index 0000000..6fa4a81 --- /dev/null +++ b/Tests/ConfidentialKitTests/Obfuscation/Obfuscation+SecretTests.swift @@ -0,0 +1,28 @@ +@testable import ConfidentialKit +import XCTest + +final class Obfuscation_SecretTests: XCTestCase { + + func test_givenSecretWithTestBytes_whenData_thenReturnsTestBytes() { + // given + let testBytes: [UInt8] = [0x35, 0x9d, 0x82, 0x1f, 0x68, 0x81, 0x02, 0x64] + let secret = Obfuscation.Secret(data: testBytes) + + // when + let data = secret.data + + // then + XCTAssertEqual(testBytes, data) + } + + func test_givenSecretWithEmptyByteArray_whenData_thenReturnsEmptyArray() { + // given + let secret = Obfuscation.Secret(data: []) + + // when + let data = secret.data + + // then + XCTAssertTrue(data.isEmpty) + } +} diff --git a/Tests/ConfidentialKitTests/Obfuscation/PropertyWrappers/ObfuscatedTests.swift b/Tests/ConfidentialKitTests/Obfuscation/PropertyWrappers/ObfuscatedTests.swift new file mode 100644 index 0000000..d785729 --- /dev/null +++ b/Tests/ConfidentialKitTests/Obfuscation/PropertyWrappers/ObfuscatedTests.swift @@ -0,0 +1,65 @@ +@testable import ConfidentialKit +import XCTest + +final class ObfuscatedTests: XCTestCase { + + private let secretPlainValue: SingleValue = .StubFactory.makeSecretMessage() + + private var secretStub: Obfuscation.Secret! + private var deobfuscateDataSpy: DeobfuscateDataFuncSpy! + private var dataDecoderSpy: DataDecoderSpy! + + private var sut: Obfuscated! + + override func setUp() { + super.setUp() + secretStub = .StubFactory.makeJSONEncodedSecret(with: secretPlainValue) + deobfuscateDataSpy = .init() + dataDecoderSpy = .init(underlyingDecoder: JSONDecoder()) + sut = .init( + wrappedValue: secretStub, + deobfuscateData: deobfuscateDataSpy.deobfuscateData, + decoder: dataDecoderSpy + ) + } + + override func tearDown() { + sut = nil + dataDecoderSpy = nil + deobfuscateDataSpy = nil + secretStub = nil + super.tearDown() + } + + func test_whenWrappedValue_thenReturnsExpectedSecretStub() { + // when + let wrappedValue = sut.wrappedValue + + // then + XCTAssertEqual(secretStub, wrappedValue) + } + + func test_whenProjectedValue_thenReturnsExpectedPlainValue() { + // when + let projectedValue = sut.projectedValue + + // then + XCTAssertEqual(secretPlainValue, projectedValue) + } + + func test_whenProjectedValue_thenDeobfuscateDataFuncCalledOnce() { + // when + _ = sut.projectedValue + + // then + XCTAssertEqual([.init(secretStub.data)], deobfuscateDataSpy.recordedData) + } + + func test_whenProjectedValue_thenDataDecoderCalledOnce() { + // when + _ = sut.projectedValue + + // then + XCTAssertEqual([.init(secretStub.data)], dataDecoderSpy.decodeRecordedData) + } +} diff --git a/Tests/ConfidentialKitTests/Obfuscation/Techniques/Compression/DataCompressorTests.swift b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Compression/DataCompressorTests.swift new file mode 100644 index 0000000..cc49af1 --- /dev/null +++ b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Compression/DataCompressorTests.swift @@ -0,0 +1,33 @@ +@testable import ConfidentialKit +import XCTest + +final class DataCompressorTests: XCTestCase { + + private typealias Algorithm = Obfuscation.Compression.CompressionAlgorithm + private typealias DataCompressor = Obfuscation.Compression.DataCompressor + + private let plainData: Data = SingleValue.StubFactory.makeSecretMessageData() + private let compressionAlgorithms: [Algorithm] = [ + .lzfse, .lz4, .lzma, .zlib + ] + + func test_givenCompressedData_whenDeobfuscate_thenReturnsDecompressedData() throws { + // given + let compressedData = compressionAlgorithms + .map { algorithm in + ( + algorithm, + Data(referencing: try! NSData(data: plainData).compressed(using: algorithm)) + ) + } + + // when + let decompressedData = try compressedData + .map { algorithm, data in + try DataCompressor(algorithm: algorithm).deobfuscate(data) + } + + // then + decompressedData.forEach { XCTAssertEqual(plainData, $0) } + } +} diff --git a/Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/DataCrypterTests.swift b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/DataCrypterTests.swift new file mode 100644 index 0000000..4a85252 --- /dev/null +++ b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/DataCrypterTests.swift @@ -0,0 +1,50 @@ +@testable import ConfidentialKit +import XCTest + +import CryptoKit + +final class DataCrypterTests: XCTestCase { + + private typealias Algorithm = Obfuscation.Encryption.SymmetricEncryptionAlgorithm + private typealias DataCrypter = Obfuscation.Encryption.DataCrypter + + private let plainData: Data = SingleValue.StubFactory.makeSecretMessageData() + private let encryptionAlgorithms: [Algorithm] = [ + .aes128GCM, .aes192GCM, .aes256GCM, .chaChaPoly + ] + + func test_givenEncryptedData_whenDeobfuscate_thenReturnsDecryptedData() throws { + // given + let encryptedData = encryptionAlgorithms + .map(makeEncryptedData(using:)) + + // when + let decryptedData = try encryptedData + .map { algorithm, data in + try DataCrypter(algorithm: algorithm).deobfuscate(data) + } + + // then + decryptedData.forEach { XCTAssertEqual(plainData, $0) } + } +} + +extension DataCrypterTests { + + private func makeEncryptedData(using algorithm: Algorithm) -> (Algorithm, Data) { + let key = SymmetricKey(size: algorithm.keySize) + + var encryptedData: Data + switch algorithm { + case .aes128GCM, .aes192GCM, .aes256GCM: + encryptedData = try! AES.GCM.seal(plainData, using: key, nonce: .init()).combined! + case .chaChaPoly: + encryptedData = try! ChaChaPoly.seal(plainData, using: key, nonce: .init()).combined + } + + let keyData = key.withUnsafeBytes(Data.init(_:)) + encryptedData.append(keyData) + + return (algorithm, encryptedData) + } +} diff --git a/Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithmTests.swift b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithmTests.swift new file mode 100644 index 0000000..5c889da --- /dev/null +++ b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Encryption/SymmetricEncryptionAlgorithmTests.swift @@ -0,0 +1,14 @@ +@testable import ConfidentialKit +import XCTest + +final class SymmetricEncryptionAlgorithmTests: XCTestCase { + + private typealias Algorithm = Obfuscation.Encryption.SymmetricEncryptionAlgorithm + + func test_whenKeySizeBitCount_thenReturnsExpectedNumberOfBits() { + XCTAssertEqual(Algorithm.aes128GCM.keySize.bitCount, 128) + XCTAssertEqual(Algorithm.aes192GCM.keySize.bitCount, 192) + XCTAssertEqual(Algorithm.aes256GCM.keySize.bitCount, 256) + XCTAssertEqual(Algorithm.chaChaPoly.keySize.bitCount, 256) + } +} diff --git a/Tests/ConfidentialKitTests/Obfuscation/Techniques/Randomization/DataShufflerTests.swift b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Randomization/DataShufflerTests.swift new file mode 100644 index 0000000..620abf4 --- /dev/null +++ b/Tests/ConfidentialKitTests/Obfuscation/Techniques/Randomization/DataShufflerTests.swift @@ -0,0 +1,77 @@ +@testable import ConfidentialKit +import XCTest + +final class DataShufflerTests: XCTestCase { + + private typealias DataShuffler = Obfuscation.Randomization.DataShuffler + + private let nonce: UInt64 = 4213634601671549038 + + private var sut: DataShuffler! + + override func setUp() { + super.setUp() + sut = .init(nonce: nonce) + } + + override func tearDown() { + sut = nil + super.tearDown() + } + + func test_givenShuffledData_whenDeobfuscate_thenReturnsDeshuffledData() throws { + // given + let plainData: [Data] = [ + .init([0x5d, 0x9b, 0xe7, 0xde]), + .init([0xe4, 0xe3, 0x34, 0xd8]), + .init([0x55, 0x2a, 0x49, 0x30]) + ] + let count = Int(4 ^ nonce) + let shuffledIndexes = [3,0,2,1] + let shuffledData = plainData.enumerated().map { idx, data -> Data in + let dataBytes = reorderBytes(.init(data), given: shuffledIndexes) + let indexesByteWidth = UInt8(1 << idx) + let obfuscatedIndexes = obfuscateIndexes( + shuffledIndexes, + byteWidth: indexesByteWidth + ) + return Data( + count.bytes + dataBytes + [indexesByteWidth] + obfuscatedIndexes + ) + } + + // when + let deshuffledData = try shuffledData.map { try sut.deobfuscate($0) } + + // then + XCTAssertEqual(plainData, deshuffledData) + } +} + +private extension DataShufflerTests { + + func reorderBytes(_ bytes: [UInt8], given indexes: [Int]) -> [UInt8] { + var result: [UInt8] = .init(repeating: .zero, count: bytes.count) + indexes.enumerated().forEach { oldIdx, newIdx in + result[newIdx] = bytes[oldIdx] + } + + return result + } + + func obfuscateIndexes(_ indexes: [Int], byteWidth: UInt8) -> [UInt8] { + switch Int(byteWidth) { + case UInt8.byteWidth: + return indexes + .map(UInt8.init) + .map { $0 ^ .init(bytes: nonce.bytes) } + case UInt16.byteWidth: + return indexes + .map(UInt16.init) + .flatMap { withUnsafeBytes(of: $0 ^ .init(bytes: nonce.bytes), [UInt8].init) } + default: + return indexes + .flatMap { withUnsafeBytes(of: $0 ^ .init(bytes: nonce.bytes), [UInt8].init) } + } + } +} diff --git a/Tests/ConfidentialKitTests/TestDoubles/Spies/DataDecoderSpy.swift b/Tests/ConfidentialKitTests/TestDoubles/Spies/DataDecoderSpy.swift new file mode 100644 index 0000000..49c9ba3 --- /dev/null +++ b/Tests/ConfidentialKitTests/TestDoubles/Spies/DataDecoderSpy.swift @@ -0,0 +1,18 @@ +@testable import ConfidentialKit +import Foundation + +final class DataDecoderSpy: DataDecoder { + + var underlyingDecoder: DataDecoder + + private(set) var decodeRecordedData: [Data] = [] + + init(underlyingDecoder: DataDecoder) { + self.underlyingDecoder = underlyingDecoder + } + + func decode(_ type: D.Type, from data: Data) throws -> D { + decodeRecordedData.append(data) + return try underlyingDecoder.decode(type, from: data) + } +} diff --git a/Tests/ConfidentialKitTests/TestDoubles/Spies/DeobfuscateDataFuncSpy.swift b/Tests/ConfidentialKitTests/TestDoubles/Spies/DeobfuscateDataFuncSpy.swift new file mode 100644 index 0000000..cae0763 --- /dev/null +++ b/Tests/ConfidentialKitTests/TestDoubles/Spies/DeobfuscateDataFuncSpy.swift @@ -0,0 +1,11 @@ +import Foundation + +final class DeobfuscateDataFuncSpy { + + private(set) var recordedData: [Data] = [] + + func deobfuscateData(_ data: Data) -> Data { + recordedData.append(data) + return data + } +} diff --git a/Tests/ConfidentialKitTests/TestDoubles/Stubs/SecretStubFactory.swift b/Tests/ConfidentialKitTests/TestDoubles/Stubs/SecretStubFactory.swift new file mode 100644 index 0000000..521495e --- /dev/null +++ b/Tests/ConfidentialKitTests/TestDoubles/Stubs/SecretStubFactory.swift @@ -0,0 +1,12 @@ +import ConfidentialKit +import Foundation + +extension Obfuscation.Secret { + + enum StubFactory { + + static func makeJSONEncodedSecret(with singleValue: SingleValue) -> Obfuscation.Secret { + .init(data: try! JSONEncoder().encode(singleValue).map { $0 }) + } + } +} diff --git a/Tests/ConfidentialKitTests/TestDoubles/Stubs/SingleValueStubFactory.swift b/Tests/ConfidentialKitTests/TestDoubles/Stubs/SingleValueStubFactory.swift new file mode 100644 index 0000000..cb34404 --- /dev/null +++ b/Tests/ConfidentialKitTests/TestDoubles/Stubs/SingleValueStubFactory.swift @@ -0,0 +1,18 @@ +import ConfidentialKit +import Foundation + +typealias SingleValue = Obfuscation.SupportedDataTypes.SingleValue + +extension SingleValue { + + enum StubFactory { + + static func makeSecretMessage() -> SingleValue { + "Secret message 🔐" + } + + static func makeSecretMessageData() -> Data { + makeSecretMessage().data(using: .utf8)! + } + } +} diff --git a/codecov.yml b/codecov.yml new file mode 100644 index 0000000..d5ed7ff --- /dev/null +++ b/codecov.yml @@ -0,0 +1,9 @@ +coverage: + status: + project: + default: + target: 90% + threshold: 0.25% + patch: + default: + informational: true \ No newline at end of file