├── .swift-version ├── Hash ├── Assets │ └── .gitkeep ├── Classes │ ├── .gitkeep │ ├── String │ │ ├── StringAdditions.swift │ │ ├── StringRepresentable.swift │ │ └── DataAdditions.swift │ ├── Cryptography │ │ ├── EncryptedData.swift │ │ ├── DecryptedData.swift │ │ ├── Cryptable.swift │ │ └── EncryptionAlgorithm.swift │ ├── Message Authentication Codes │ │ └── HMAC.swift │ └── Message Digest │ │ ├── HashAlgorithm.swift │ │ └── Hash.swift └── _Pods.xcodeproj ├── docs └── images │ └── hash-banner.png ├── Example ├── Pods │ ├── Target Support Files │ │ ├── Hash │ │ │ ├── Hash.modulemap │ │ │ ├── Hash-dummy.m │ │ │ ├── Hash-prefix.pch │ │ │ ├── Hash-umbrella.h │ │ │ ├── Hash.xcconfig │ │ │ └── Hash-Info.plist │ │ ├── Pods-Hash_Tests │ │ │ ├── Pods-Hash_Tests.modulemap │ │ │ ├── Pods-Hash_Tests-dummy.m │ │ │ ├── Pods-Hash_Tests-acknowledgements.markdown │ │ │ ├── Pods-Hash_Tests-umbrella.h │ │ │ ├── Pods-Hash_Tests.debug.xcconfig │ │ │ ├── Pods-Hash_Tests.release.xcconfig │ │ │ ├── Pods-Hash_Tests-Info.plist │ │ │ └── Pods-Hash_Tests-acknowledgements.plist │ │ └── Pods-Hash_Example │ │ │ ├── Pods-Hash_Example.modulemap │ │ │ ├── Pods-Hash_Example-dummy.m │ │ │ ├── Pods-Hash_Example-umbrella.h │ │ │ ├── Pods-Hash_Example.debug.xcconfig │ │ │ ├── Pods-Hash_Example.release.xcconfig │ │ │ ├── Pods-Hash_Example-Info.plist │ │ │ ├── Pods-Hash_Example-acknowledgements.markdown │ │ │ ├── Pods-Hash_Example-acknowledgements.plist │ │ │ └── Pods-Hash_Example-frameworks.sh │ ├── Manifest.lock │ ├── Local Podspecs │ │ └── Hash.podspec.json │ └── Pods.xcodeproj │ │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Hash.xcscheme │ │ └── project.pbxproj ├── Podfile ├── Hash.xcodeproj │ ├── project.xcworkspace │ │ └── contents.xcworkspacedata │ ├── xcshareddata │ │ └── xcschemes │ │ │ └── Hash-Example.xcscheme │ └── project.pbxproj ├── Hash.xcworkspace │ ├── contents.xcworkspacedata │ └── xcshareddata │ │ └── IDEWorkspaceChecks.plist ├── Podfile.lock ├── Tests │ ├── Info.plist │ ├── HashAlgorithm+ExpectedString.swift │ └── Tests.swift └── Hash │ ├── ViewController.swift │ ├── Images.xcassets │ └── AppIcon.appiconset │ │ └── Contents.json │ ├── Info.plist │ ├── Base.lproj │ ├── Main.storyboard │ └── LaunchScreen.xib │ └── AppDelegate.swift ├── .gitignore ├── Package.swift ├── .travis.yml ├── .swiftformat ├── Hash.podspec ├── LICENSE ├── CHANGELOG.md └── README.md /.swift-version: -------------------------------------------------------------------------------- 1 | 5.0 -------------------------------------------------------------------------------- /Hash/Assets/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Hash/Classes/.gitkeep: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /Hash/_Pods.xcodeproj: -------------------------------------------------------------------------------- 1 | Example/Pods/Pods.xcodeproj -------------------------------------------------------------------------------- /docs/images/hash-banner.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/rwbutler/Hash/HEAD/docs/images/hash-banner.png -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Hash/Hash.modulemap: -------------------------------------------------------------------------------- 1 | framework module Hash { 2 | umbrella header "Hash-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Hash/Hash-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Hash : NSObject 3 | @end 4 | @implementation PodsDummy_Hash 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Podfile: -------------------------------------------------------------------------------- 1 | use_frameworks! 2 | 3 | target 'Hash_Example' do 4 | pod 'Hash', :path => '../' 5 | 6 | target 'Hash_Tests' do 7 | inherit! :search_paths 8 | 9 | 10 | end 11 | end 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Hash_Tests { 2 | umbrella header "Pods-Hash_Tests-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Hash/Hash-prefix.pch: -------------------------------------------------------------------------------- 1 | #ifndef FOUNDATION_EXPORT 2 | #if defined(__cplusplus) 3 | #define FOUNDATION_EXPORT extern "C" 4 | #else 5 | #define FOUNDATION_EXPORT extern 6 | #endif 7 | #endif 8 | 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example.modulemap: -------------------------------------------------------------------------------- 1 | framework module Pods_Hash_Example { 2 | umbrella header "Pods-Hash_Example-umbrella.h" 3 | 4 | export * 5 | module * { export * } 6 | } 7 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Hash_Tests : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Hash_Tests 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-dummy.m: -------------------------------------------------------------------------------- 1 | #import 2 | @interface PodsDummy_Pods_Hash_Example : NSObject 3 | @end 4 | @implementation PodsDummy_Pods_Hash_Example 5 | @end 6 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | Generated by CocoaPods - https://cocoapods.org 4 | -------------------------------------------------------------------------------- /Example/Hash.xcodeproj/project.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 8 | -------------------------------------------------------------------------------- /Example/Hash.xcworkspace/contents.xcworkspacedata: -------------------------------------------------------------------------------- 1 | 2 | 4 | 6 | 7 | 9 | 10 | 11 | -------------------------------------------------------------------------------- /Example/Hash.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | IDEDidComputeMac32BitWarning 6 | 7 | 8 | 9 | -------------------------------------------------------------------------------- /Example/Podfile.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Hash (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - Hash (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | Hash: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | Hash: c0a1ed40de9935617473d491132fd1fd83bc72a8 13 | 14 | PODFILE CHECKSUM: d5021c5442f326686b4bcb68522ccda7061d1933 15 | 16 | COCOAPODS: 1.7.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Manifest.lock: -------------------------------------------------------------------------------- 1 | PODS: 2 | - Hash (0.1.0) 3 | 4 | DEPENDENCIES: 5 | - Hash (from `../`) 6 | 7 | EXTERNAL SOURCES: 8 | Hash: 9 | :path: "../" 10 | 11 | SPEC CHECKSUMS: 12 | Hash: c0a1ed40de9935617473d491132fd1fd83bc72a8 13 | 14 | PODFILE CHECKSUM: d5021c5442f326686b4bcb68522ccda7061d1933 15 | 16 | COCOAPODS: 1.7.1 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Hash/Hash-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifndef FOUNDATION_EXPORT 2 | #if defined(__cplusplus) 3 | #define FOUNDATION_EXPORT extern "C" 4 | #else 5 | #define FOUNDATION_EXPORT extern 6 | #endif 7 | #endif 8 | 9 | FOUNDATION_EXPORT double HashVersionNumber; 10 | FOUNDATION_EXPORT const unsigned char HashVersionString[]; 11 | 12 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store 2 | *.afdesign 3 | build/ 4 | *.pbxuser 5 | !default.pbxuser 6 | *.mode1v3 7 | !default.mode1v3 8 | *.mode2v3 9 | !default.mode2v3 10 | *.perspectivev3 11 | !default.perspectivev3 12 | xcuserdata/ 13 | *.xccheckout 14 | profile 15 | *.moved-aside 16 | DerivedData 17 | *.hmap 18 | *.ipa 19 | *.key 20 | .bundle 21 | Carthage 22 | .build -------------------------------------------------------------------------------- /Package.swift: -------------------------------------------------------------------------------- 1 | // swift-tools-version:4.2 2 | import PackageDescription 3 | 4 | let package = Package( 5 | name: "Hash", 6 | products: [ 7 | .library( 8 | name: "Hash", 9 | targets: ["Hash"]) 10 | ], 11 | targets: [ 12 | .target( 13 | name: "Hash", 14 | path: "Hash/Classes") 15 | ] 16 | ) 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_Hash_TestsVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_Hash_TestsVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-umbrella.h: -------------------------------------------------------------------------------- 1 | #ifdef __OBJC__ 2 | #import 3 | #else 4 | #ifndef FOUNDATION_EXPORT 5 | #if defined(__cplusplus) 6 | #define FOUNDATION_EXPORT extern "C" 7 | #else 8 | #define FOUNDATION_EXPORT extern 9 | #endif 10 | #endif 11 | #endif 12 | 13 | 14 | FOUNDATION_EXPORT double Pods_Hash_ExampleVersionNumber; 15 | FOUNDATION_EXPORT const unsigned char Pods_Hash_ExampleVersionString[]; 16 | 17 | -------------------------------------------------------------------------------- /.travis.yml: -------------------------------------------------------------------------------- 1 | language: objective-c 2 | osx_image: xcode12 3 | before_install: 4 | - gem install cocoapods -v '1.8.3' 5 | script: 6 | - gem install travis 7 | - travis lint .travis.yml --no-interactive 8 | - xcodebuild clean build test -workspace Example/Connectivity.xcworkspace -scheme Connectivity-Example -destination "platform=iOS Simulator,name=iPhone 11 Pro" CODE_SIGN_IDENTITY="" CODE_SIGNING_REQUIRED=NO ONLY_ACTIVE_ARCH=NO | xcpretty 9 | - pod lib lint --allow-warnings 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Hash/Hash.xcconfig: -------------------------------------------------------------------------------- 1 | CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Hash 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 4 | PODS_BUILD_DIR = ${BUILD_DIR} 5 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 6 | PODS_ROOT = ${SRCROOT} 7 | PODS_TARGET_SRCROOT = ${PODS_ROOT}/../.. 8 | PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} 9 | SKIP_INSTALL = YES 10 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.debug.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash/Hash.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "Hash" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.release.xcconfig: -------------------------------------------------------------------------------- 1 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash" 2 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 3 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash/Hash.framework/Headers" 4 | OTHER_LDFLAGS = $(inherited) -framework "Hash" 5 | PODS_BUILD_DIR = ${BUILD_DIR} 6 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 7 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 8 | PODS_ROOT = ${SRCROOT}/Pods 9 | -------------------------------------------------------------------------------- /Hash/Classes/String/StringAdditions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // StringAdditions.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/10/19. 6 | // 7 | 8 | import Foundation 9 | 10 | public extension String { 11 | 12 | enum Representation { 13 | case base64 14 | case encoded(using: String.Encoding) 15 | case hex 16 | } 17 | 18 | init?(hex: String, encoding: String.Encoding = .utf8) { 19 | guard let data = Data(hex: hex) else { 20 | return nil 21 | } 22 | self.init(data: data, encoding: encoding) 23 | } 24 | 25 | } 26 | -------------------------------------------------------------------------------- /Example/Pods/Local Podspecs/Hash.podspec.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "Hash", 3 | "version": "0.1.0", 4 | "summary": "A short description of Hash.", 5 | "description": "TODO: Add long description of the pod here.", 6 | "homepage": "https://github.com/rwbutler/Hash", 7 | "license": { 8 | "type": "MIT", 9 | "file": "LICENSE" 10 | }, 11 | "authors": { 12 | "rwbutler": "ross.butler@argos.co.uk" 13 | }, 14 | "source": { 15 | "git": "https://github.com/rwbutler/Hash.git", 16 | "tag": "0.1.0" 17 | }, 18 | "platforms": { 19 | "ios": "8.0" 20 | }, 21 | "source_files": "Hash/Classes/**/*" 22 | } 23 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example.debug.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash/Hash.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "Hash" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example.release.xcconfig: -------------------------------------------------------------------------------- 1 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES 2 | FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash" 3 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 4 | HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/Hash/Hash.framework/Headers" 5 | LD_RUNPATH_SEARCH_PATHS = $(inherited) '@executable_path/Frameworks' '@loader_path/Frameworks' 6 | OTHER_LDFLAGS = $(inherited) -framework "Hash" 7 | OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS 8 | PODS_BUILD_DIR = ${BUILD_DIR} 9 | PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) 10 | PODS_PODFILE_DIR_PATH = ${SRCROOT}/. 11 | PODS_ROOT = ${SRCROOT}/Pods 12 | -------------------------------------------------------------------------------- /Example/Tests/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | BNDL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | 24 | 25 | -------------------------------------------------------------------------------- /Example/Hash/ViewController.swift: -------------------------------------------------------------------------------- 1 | // 2 | // ViewController.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 06/04/2019. 6 | // Copyright (c) 2019 Ross Butler. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | import Hash 11 | 12 | class ViewController: UIViewController { 13 | 14 | override func viewDidLoad() { 15 | super.viewDidLoad() 16 | 17 | if let messageDigest = Hash(message: "Hello World!", algorithm: .sha256) { 18 | print(messageDigest.description) 19 | } 20 | if let hmac = HMAC(message: "Hello World!", key: "123", algorithm: .sha1) { 21 | print(hmac.description) 22 | } 23 | } 24 | 25 | override func didReceiveMemoryWarning() { 26 | super.didReceiveMemoryWarning() 27 | // Dispose of any resources that can be recreated. 28 | } 29 | 30 | } 31 | 32 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Hash/Hash-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | $(MARKETING_VERSION) 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /.swiftformat: -------------------------------------------------------------------------------- 1 | --allman false 2 | --binarygrouping none 3 | --closingparen balanced 4 | --commas always 5 | --conflictmarkers reject 6 | --decimalgrouping none 7 | --disable redundantReturn 8 | --elseposition same-line 9 | --empty void 10 | --exclude Example/Pods 11 | --exclude Package.swift 12 | --exclude ObjCExample 13 | --exponentcase lowercase 14 | --exponentgrouping disabled 15 | --fractiongrouping disabled 16 | --fragment false 17 | --header ignore 18 | --hexgrouping none 19 | --hexliteralcase uppercase 20 | --ifdef outdent 21 | --importgrouping alphabetized 22 | --indent 4 23 | --indentcase false 24 | --linebreaks lf 25 | --maxwidth none 26 | --octalgrouping none 27 | --operatorfunc spaced 28 | --patternlet hoist 29 | --ranges spaced 30 | --self init-only 31 | --selfrequired 32 | --semicolons never 33 | --stripunusedargs always 34 | --tabwidth unspecified 35 | --trailingclosures 36 | --trimwhitespace always 37 | --wraparguments before-first 38 | --wrapcollections preserve 39 | --xcodeindentation disabled 40 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | ${EXECUTABLE_NAME} 9 | CFBundleIdentifier 10 | ${PRODUCT_BUNDLE_IDENTIFIER} 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | ${PRODUCT_NAME} 15 | CFBundlePackageType 16 | FMWK 17 | CFBundleShortVersionString 18 | 1.0.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | ${CURRENT_PROJECT_VERSION} 23 | NSPrincipalClass 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Generated by CocoaPods - https://cocoapods.org 18 | Title 19 | 20 | Type 21 | PSGroupSpecifier 22 | 23 | 24 | StringsTable 25 | Acknowledgements 26 | Title 27 | Acknowledgements 28 | 29 | 30 | -------------------------------------------------------------------------------- /Hash.podspec: -------------------------------------------------------------------------------- 1 | Pod::Spec.new do |s| 2 | s.name = 'Hash' 3 | s.version = '1.5.0' 4 | s.swift_version = '5.0' 5 | s.summary = 'Lightweight means of generating message digests & HMACs with support for AES encryption / decryption.' 6 | s.description = <<-DESC 7 | Provides a convenient means of generating message digests / HMACs from Swift Strings or Data using popular hash functions including MD2, MD4, MD5, SHA-1, SHA224, SHA-256, SHA-384 or SHA-512. Also supports encryption and decryption using AES-128, AES-192 or AES-256. 8 | DESC 9 | s.homepage = 'https://github.com/rwbutler/Hash' 10 | s.license = { :type => 'MIT', :file => 'LICENSE' } 11 | s.author = { 'Ross Butler' => 'github@rwbutler.com' } 12 | s.source = { :git => 'https://github.com/rwbutler/Hash.git', :tag => s.version.to_s } 13 | s.social_media_url = 'https://twitter.com/ross_w_butler' 14 | s.ios.deployment_target = '8.0' 15 | s.source_files = 'Hash/Classes/**/*' 16 | end 17 | -------------------------------------------------------------------------------- /Hash/Classes/String/StringRepresentable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HexStringConvertible.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/5/19. 6 | // 7 | 8 | import Foundation 9 | 10 | public protocol StringRepresentable { 11 | func data() -> Data 12 | func hexString() -> String 13 | func string(representation: String.Representation) -> String 14 | } 15 | 16 | extension StringRepresentable { 17 | 18 | /// Convenience method for obtaining hexadecimal Strings. 19 | public func hexString() -> String { 20 | return string(representation: .hex) 21 | } 22 | 23 | public func string(representation: String.Representation) -> String { 24 | switch representation { 25 | case .base64: 26 | return data().base64EncodedString() 27 | case .encoded(let encoding): 28 | return String(data: data(), encoding: encoding) ?? "" 29 | case .hex: 30 | return data().map { String(format: "%02hhx", $0) }.joined() 31 | } 32 | } 33 | 34 | } 35 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Copyright (c) 2019 Ross Butler 2 | 3 | Permission is hereby granted, free of charge, to any person obtaining a copy 4 | of this software and associated documentation files (the "Software"), to deal 5 | in the Software without restriction, including without limitation the rights 6 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 7 | copies of the Software, and to permit persons to whom the Software is 8 | furnished to do so, subject to the following conditions: 9 | 10 | The above copyright notice and this permission notice shall be included in 11 | all copies or substantial portions of the Software. 12 | 13 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 14 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 15 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 16 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 17 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 18 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 19 | THE SOFTWARE. 20 | -------------------------------------------------------------------------------- /Example/Hash/Images.xcassets/AppIcon.appiconset/Contents.json: -------------------------------------------------------------------------------- 1 | { 2 | "images" : [ 3 | { 4 | "idiom" : "iphone", 5 | "size" : "20x20", 6 | "scale" : "2x" 7 | }, 8 | { 9 | "idiom" : "iphone", 10 | "size" : "20x20", 11 | "scale" : "3x" 12 | }, 13 | { 14 | "idiom" : "iphone", 15 | "size" : "29x29", 16 | "scale" : "2x" 17 | }, 18 | { 19 | "idiom" : "iphone", 20 | "size" : "29x29", 21 | "scale" : "3x" 22 | }, 23 | { 24 | "idiom" : "iphone", 25 | "size" : "40x40", 26 | "scale" : "2x" 27 | }, 28 | { 29 | "idiom" : "iphone", 30 | "size" : "40x40", 31 | "scale" : "3x" 32 | }, 33 | { 34 | "idiom" : "iphone", 35 | "size" : "60x60", 36 | "scale" : "2x" 37 | }, 38 | { 39 | "idiom" : "iphone", 40 | "size" : "60x60", 41 | "scale" : "3x" 42 | }, 43 | { 44 | "idiom" : "ios-marketing", 45 | "size" : "1024x1024", 46 | "scale" : "1x" 47 | } 48 | ], 49 | "info" : { 50 | "version" : 1, 51 | "author" : "xcode" 52 | } 53 | } 54 | -------------------------------------------------------------------------------- /Hash/Classes/String/DataAdditions.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DataAdditions.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/10/19. 6 | // 7 | 8 | import Foundation 9 | 10 | public extension Data { 11 | 12 | init?(hex: String) { 13 | var data = Data(capacity: hex.count / 2) 14 | let regExStr = "[0-9a-f]{1,2}" 15 | guard let hexRegEx = try? NSRegularExpression(pattern: regExStr, options: .caseInsensitive) else { 16 | return nil 17 | } 18 | let entireStringRange = NSRange(hex.startIndex..., in: hex) 19 | hexRegEx.enumerateMatches(in: hex, range: entireStringRange) { match, _, _ in 20 | guard let range = match?.range else { return } 21 | let byteString = (hex as NSString).substring(with: range) 22 | if let byte = UInt8(byteString, radix: 16) { 23 | data.append(byte) 24 | } 25 | } 26 | guard !data.isEmpty else { 27 | return nil 28 | } 29 | self = data 30 | } 31 | 32 | } 33 | 34 | extension Data: StringRepresentable { 35 | 36 | public func data() -> Data { 37 | self 38 | } 39 | 40 | } 41 | -------------------------------------------------------------------------------- /Example/Hash/Info.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | CFBundleDevelopmentRegion 6 | en 7 | CFBundleExecutable 8 | $(EXECUTABLE_NAME) 9 | CFBundleIdentifier 10 | $(PRODUCT_BUNDLE_IDENTIFIER) 11 | CFBundleInfoDictionaryVersion 12 | 6.0 13 | CFBundleName 14 | $(PRODUCT_NAME) 15 | CFBundlePackageType 16 | APPL 17 | CFBundleShortVersionString 18 | 1.0 19 | CFBundleSignature 20 | ???? 21 | CFBundleVersion 22 | 1 23 | LSRequiresIPhoneOS 24 | 25 | UILaunchStoryboardName 26 | LaunchScreen 27 | UIMainStoryboardFile 28 | Main 29 | UIRequiredDeviceCapabilities 30 | 31 | armv7 32 | 33 | UISupportedInterfaceOrientations 34 | 35 | UIInterfaceOrientationPortrait 36 | UIInterfaceOrientationLandscapeLeft 37 | 38 | 39 | 40 | -------------------------------------------------------------------------------- /Example/Tests/HashAlgorithm+ExpectedString.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HashAlgorithm+ExpectedString.swift 3 | // Hash_Example 4 | // 5 | // Created by Ross Butler on 6/19/19. 6 | // Copyright © 2019 Ross Butler. All rights reserved. 7 | // 8 | 9 | import Foundation 10 | import Hash 11 | 12 | extension HashAlgorithm { 13 | 14 | /// The expected hex string for 'Hello World!' 15 | var expectedString: String { 16 | switch self { 17 | case .md2: 18 | return "315f7c67223f01fb7cab4b95100e872e" 19 | case .md4: 20 | return "b2a5cc34fc21a764ae2fad94d56fadf6" 21 | case .md5: 22 | return "ed076287532e86365e841e92bfc50d8c" 23 | case .sha1: 24 | return "2ef7bde608ce5404e97d5f042f95f89f1c232871" 25 | case .sha224: 26 | return "4575bb4ec129df6380cedde6d71217fe0536f8ffc4e18bca530a7a1b" 27 | case .sha256: 28 | return "7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069" 29 | case .sha384: 30 | return "bfd76c0ebbd006fee583410547c1887b0292be76d582d96c242d2a792723e3fd6fd061f9d5cfd13b8f961358e6adba4a" 31 | case .sha512: 32 | return "861844d6704e8573fec34d967e20bcfef3d424cf48be04e6dc08f2bd58c729743371015ead891cc3cf1c9d34b49264b510751b1ff9e537937bc46b5d6ff4ecc8" 33 | } 34 | } 35 | 36 | } 37 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-acknowledgements.markdown: -------------------------------------------------------------------------------- 1 | # Acknowledgements 2 | This application makes use of the following third party libraries: 3 | 4 | ## Hash 5 | 6 | Copyright (c) 2019 Ross Butler 7 | 8 | Permission is hereby granted, free of charge, to any person obtaining a copy 9 | of this software and associated documentation files (the "Software"), to deal 10 | in the Software without restriction, including without limitation the rights 11 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 12 | copies of the Software, and to permit persons to whom the Software is 13 | furnished to do so, subject to the following conditions: 14 | 15 | The above copyright notice and this permission notice shall be included in 16 | all copies or substantial portions of the Software. 17 | 18 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 19 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 20 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 21 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 22 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 23 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 24 | THE SOFTWARE. 25 | 26 | Generated by CocoaPods - https://cocoapods.org 27 | -------------------------------------------------------------------------------- /Hash/Classes/Cryptography/EncryptedData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EncryptedData.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/4/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | public typealias CipherText = EncryptedData 12 | 13 | public class EncryptedData: NSObject, Cryptable, StringRepresentable { 14 | 15 | // MARK: - Type definitions 16 | public typealias Algorithm = EncryptionAlgorithm 17 | 18 | internal let algorithm: Algorithm 19 | internal let ivData: Data? 20 | internal let keyData: Data 21 | internal let message: Data 22 | 23 | /// Result of the previous encrypt / decrypt operation. 24 | public var result: CCCryptorStatus? 25 | 26 | public init(message: Data, key: Data, iv: Data? = nil, algorithm: Algorithm) { 27 | self.algorithm = algorithm 28 | self.ivData = iv 29 | self.keyData = key 30 | self.message = message 31 | } 32 | 33 | public init?(message: String, key: String, iv: String? = nil, encoding: String.Encoding = .utf8, algorithm: Algorithm) { 34 | guard let keyData = key.data(using: encoding), let messageData = message.data(using: encoding) else { 35 | return nil 36 | } 37 | self.algorithm = algorithm 38 | self.ivData = iv?.data(using: encoding) 39 | self.keyData = keyData 40 | self.message = messageData 41 | } 42 | 43 | public func data() -> Data { 44 | return data(operation: CCOperation(kCCEncrypt)) 45 | } 46 | 47 | override public var description: String { 48 | return string(representation: .hex) 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /Hash/Classes/Cryptography/DecryptedData.swift: -------------------------------------------------------------------------------- 1 | // 2 | // DecryptedData.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/5/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | public typealias PlainText = DecryptedData 12 | 13 | public class DecryptedData: NSObject, Cryptable, StringRepresentable { 14 | 15 | // MARK: - Type definitions 16 | public typealias Algorithm = DecryptionAlgorithm 17 | 18 | internal let algorithm: Algorithm 19 | internal let ivData: Data? 20 | internal let keyData: Data 21 | internal let message: Data 22 | 23 | /// Result of the previous encrypt / decrypt operation. 24 | public var result: CCCryptorStatus? 25 | 26 | public init(message: Data, key: Data, iv: Data? = nil, algorithm: Algorithm) { 27 | self.algorithm = algorithm 28 | self.ivData = iv 29 | self.keyData = key 30 | self.message = message 31 | } 32 | 33 | public init?(message: String, key: String, iv: String? = nil, encoding: String.Encoding = .utf8, algorithm: Algorithm) { 34 | guard let keyData = key.data(using: encoding), let messageData = message.data(using: encoding) else { 35 | return nil 36 | } 37 | self.algorithm = algorithm 38 | self.ivData = iv?.data(using: encoding) 39 | self.keyData = keyData 40 | self.message = messageData 41 | } 42 | 43 | public func data() -> Data { 44 | return data(operation: CCOperation(kCCDecrypt)) 45 | } 46 | 47 | override public var description: String { 48 | return string(representation: .encoded(using: .utf8)) 49 | } 50 | 51 | } 52 | -------------------------------------------------------------------------------- /CHANGELOG.md: -------------------------------------------------------------------------------- 1 | # Changelog 2 | All notable changes to this project will be documented in this file. 3 | 4 | The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), 5 | and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). 6 | 7 | ## [1.5.0] - 2020-07-19 8 | ### Added 9 | - `Data` now conforms to `StringRepresentable` enabling a hex string to be obtained from `Data`. 10 | 11 | ## [1.4.0] - 2019-07-12 12 | ### Added 13 | - Limited support for additional encryption / decryption algorithms including: 14 | - Blowfish 15 | - CAST 16 | - DES 17 | - 3DES (Triple DES) 18 | - RC2 19 | - RC4 20 | 21 | ## [1.3.0] - 2019-07-11 22 | ### Added 23 | - Support for macOS. 24 | 25 | ## [1.2.0] - 2019-07-10 26 | ### Added 27 | - Support for conversion to String representations including hexadecimal, base 64 and encoded using `StringRepresentable`. 28 | - Initializers for initializing `Data` or `String` from a hexadecimal String. 29 | 30 | ## [1.1.3] - 2019-07-08 31 | ### Added 32 | - Support for AES-192 and AES-256. 33 | 34 | ## [1.1.2] - 2019-07-08 35 | ### Changed 36 | - Support for optional IV with AES-128 CBC mode. 37 | 38 | ## [1.1.1] - 2019-07-05 39 | ### Added 40 | - Support for encryption and decryption using AES-128. 41 | 42 | ## [1.1.0] - 2019-06-19 43 | ### Changed 44 | - Support for HMACs. 45 | 46 | ## [1.0.0] - 2019-06-18 47 | ### Changed 48 | - Added support for Swift Package Manager. 49 | 50 | ## [0.0.2] - 2019-06-05 51 | ### Changed 52 | - This release introduces support for integration using the Carthage dependency manager. In order to integrate Hash into your project via Carthage, add the following line to your project's Cartfile: 53 | 54 | ``` 55 | github "rwbutler/Hash" 56 | ``` 57 | 58 | ## [0.0.1] - 2019-06-05 59 | ### Added 60 | - Initial release providing support for hashing Data or String using MD2 MD4, MD5, SHA-1, SHA224, SHA-256, SHA-384 or SHA-512. 61 | -------------------------------------------------------------------------------- /Example/Hash/Base.lproj/Main.storyboard: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | -------------------------------------------------------------------------------- /Hash/Classes/Message Authentication Codes/HMAC.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HMAC.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 6/19/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | @objcMembers public class HMAC: NSObject, StringRepresentable { 12 | 13 | public typealias Algorithm = HashAlgorithm 14 | 15 | private let key: String 16 | private let message: Data 17 | private let hashAlgorithm: Algorithm 18 | 19 | public init?(message: Data, key: String, algorithm: Algorithm) { 20 | guard algorithm.ccAlgorithm() != nil else { 21 | return nil 22 | } 23 | self.key = key 24 | self.message = message 25 | self.hashAlgorithm = algorithm 26 | } 27 | 28 | public init?(message: String, encoding: String.Encoding = .utf8, key: String, algorithm: Algorithm) { 29 | guard let messageData = message.data(using: encoding), algorithm.ccAlgorithm() != nil else { 30 | return nil 31 | } 32 | self.key = key 33 | self.message = messageData 34 | self.hashAlgorithm = algorithm 35 | } 36 | 37 | public func data() -> Data { 38 | let data = message 39 | let length = hashAlgorithm.digestLength() 40 | var digestData = Data(count: length) 41 | _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in 42 | data.withUnsafeBytes { messageBytes -> UInt8 in 43 | if let baseAddress = messageBytes.baseAddress, let digestBytes = digestBytes.bindMemory(to: UInt8.self).baseAddress { 44 | let messageLength = size_t(messageBytes.count) 45 | if let algorithm = hashAlgorithm.ccAlgorithm() { 46 | CCHmac(algorithm, key, key.count, baseAddress, messageLength, digestBytes) 47 | } 48 | } 49 | return 0 50 | } 51 | } 52 | return digestData 53 | } 54 | 55 | override public var description: String { 56 | return string(representation: .hex) 57 | } 58 | 59 | } 60 | -------------------------------------------------------------------------------- /Example/Hash/AppDelegate.swift: -------------------------------------------------------------------------------- 1 | // 2 | // AppDelegate.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 06/04/2019. 6 | // Copyright (c) 2019 Ross Butler. All rights reserved. 7 | // 8 | 9 | import UIKit 10 | 11 | @UIApplicationMain 12 | class AppDelegate: UIResponder, UIApplicationDelegate { 13 | 14 | var window: UIWindow? 15 | 16 | 17 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?) -> Bool { 18 | // Override point for customization after application launch. 19 | return true 20 | } 21 | 22 | func applicationWillResignActive(_ application: UIApplication) { 23 | // Sent when the application is about to move from active to inactive state. This can occur for certain types of temporary interruptions (such as an incoming phone call or SMS message) or when the user quits the application and it begins the transition to the background state. 24 | // Use this method to pause ongoing tasks, disable timers, and throttle down OpenGL ES frame rates. Games should use this method to pause the game. 25 | } 26 | 27 | func applicationDidEnterBackground(_ application: UIApplication) { 28 | // Use this method to release shared resources, save user data, invalidate timers, and store enough application state information to restore your application to its current state in case it is terminated later. 29 | // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. 30 | } 31 | 32 | func applicationWillEnterForeground(_ application: UIApplication) { 33 | // Called as part of the transition from the background to the inactive state; here you can undo many of the changes made on entering the background. 34 | } 35 | 36 | func applicationDidBecomeActive(_ application: UIApplication) { 37 | // Restart any tasks that were paused (or not yet started) while the application was inactive. If the application was previously in the background, optionally refresh the user interface. 38 | } 39 | 40 | func applicationWillTerminate(_ application: UIApplication) { 41 | // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. 42 | } 43 | 44 | 45 | } 46 | 47 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-acknowledgements.plist: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | PreferenceSpecifiers 6 | 7 | 8 | FooterText 9 | This application makes use of the following third party libraries: 10 | Title 11 | Acknowledgements 12 | Type 13 | PSGroupSpecifier 14 | 15 | 16 | FooterText 17 | Copyright (c) 2019 Ross Butler 18 | 19 | Permission is hereby granted, free of charge, to any person obtaining a copy 20 | of this software and associated documentation files (the "Software"), to deal 21 | in the Software without restriction, including without limitation the rights 22 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 23 | copies of the Software, and to permit persons to whom the Software is 24 | furnished to do so, subject to the following conditions: 25 | 26 | The above copyright notice and this permission notice shall be included in 27 | all copies or substantial portions of the Software. 28 | 29 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 30 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 31 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 32 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 33 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 34 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN 35 | THE SOFTWARE. 36 | 37 | License 38 | MIT 39 | Title 40 | Hash 41 | Type 42 | PSGroupSpecifier 43 | 44 | 45 | FooterText 46 | Generated by CocoaPods - https://cocoapods.org 47 | Title 48 | 49 | Type 50 | PSGroupSpecifier 51 | 52 | 53 | StringsTable 54 | Acknowledgements 55 | Title 56 | Acknowledgements 57 | 58 | 59 | -------------------------------------------------------------------------------- /Hash/Classes/Message Digest/HashAlgorithm.swift: -------------------------------------------------------------------------------- 1 | // 2 | // HashAlgorithm.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 5/28/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | /// Warning: MD2, MD4, MD5 or SHA-1 are known to be insecure - do not use for security purposes. 12 | @objc public enum HashAlgorithm: Int, CaseIterable { 13 | case md2 14 | case md4 15 | case md5 16 | case sha1 17 | case sha224 18 | case sha256 19 | case sha384 20 | case sha512 21 | } 22 | 23 | extension HashAlgorithm: CustomStringConvertible { 24 | 25 | public var description: String { 26 | switch self { 27 | case .md2: 28 | return "MD2" 29 | case .md4: 30 | return "MD4" 31 | case .md5: 32 | return "MD5" 33 | case .sha1: 34 | return "SHA-1" 35 | case .sha224: 36 | return "SHA-224" 37 | case .sha256: 38 | return "SHA-256" 39 | case .sha384: 40 | return "SHA-384" 41 | case .sha512: 42 | return "SHA-512" 43 | } 44 | } 45 | 46 | } 47 | 48 | extension HashAlgorithm { 49 | 50 | func ccAlgorithm() -> CCHmacAlgorithm? { 51 | switch self { 52 | case .md2, .md4: 53 | return nil 54 | case .md5: 55 | return CCHmacAlgorithm(kCCHmacAlgMD5) 56 | case .sha1: 57 | return CCHmacAlgorithm(kCCHmacAlgSHA1) 58 | case .sha224: 59 | return CCHmacAlgorithm(kCCHmacAlgSHA224) 60 | case .sha256: 61 | return CCHmacAlgorithm(kCCHmacAlgSHA256) 62 | case .sha384: 63 | return CCHmacAlgorithm(kCCHmacAlgSHA384) 64 | case .sha512: 65 | return CCHmacAlgorithm(kCCHmacAlgSHA512) 66 | } 67 | } 68 | 69 | func digestLength() -> Int { 70 | switch self { 71 | case .md2: 72 | return Int(CC_MD2_DIGEST_LENGTH) 73 | case .md4: 74 | return Int(CC_MD4_DIGEST_LENGTH) 75 | case .md5: 76 | return Int(CC_MD5_DIGEST_LENGTH) 77 | case .sha1: 78 | return Int(CC_SHA1_DIGEST_LENGTH) 79 | case .sha224: 80 | return Int(CC_SHA224_DIGEST_LENGTH) 81 | case .sha256: 82 | return Int(CC_SHA256_DIGEST_LENGTH) 83 | case .sha384: 84 | return Int(CC_SHA384_DIGEST_LENGTH) 85 | case .sha512: 86 | return Int(CC_SHA512_DIGEST_LENGTH) 87 | } 88 | } 89 | 90 | } 91 | -------------------------------------------------------------------------------- /Hash/Classes/Message Digest/Hash.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Hash.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 5/28/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | public typealias MessageDigest = Hash 12 | 13 | @objcMembers public class Hash: NSObject, StringRepresentable { 14 | 15 | public typealias Algorithm = HashAlgorithm 16 | 17 | private let algorithm: Algorithm 18 | private let message: Data 19 | 20 | public init(message: Data, algorithm: Algorithm) { 21 | self.message = message 22 | self.algorithm = algorithm 23 | } 24 | 25 | public init?(message: String, encoding: String.Encoding = .utf8, algorithm: Algorithm) { 26 | guard let messageData = message.data(using: encoding) else { 27 | return nil 28 | } 29 | self.message = messageData 30 | self.algorithm = algorithm 31 | } 32 | 33 | public func data() -> Data { 34 | let data = message 35 | let length = algorithm.digestLength() 36 | var digestData = Data(count: length) 37 | _ = digestData.withUnsafeMutableBytes { digestBytes -> UInt8 in 38 | data.withUnsafeBytes { messageBytes -> UInt8 in 39 | if let baseAddress = messageBytes.baseAddress, let digestBytes = digestBytes.bindMemory(to: UInt8.self).baseAddress { 40 | let messageLength = CC_LONG(data.count) 41 | switch algorithm { 42 | case .md2: 43 | CC_MD2(baseAddress, messageLength, digestBytes) 44 | case .md4: 45 | CC_MD4(baseAddress, messageLength, digestBytes) 46 | case .md5: 47 | CC_MD5(baseAddress, messageLength, digestBytes) 48 | case .sha1: 49 | CC_SHA1(baseAddress, messageLength, digestBytes) 50 | case .sha224: 51 | CC_SHA224(baseAddress, messageLength, digestBytes) 52 | case .sha256: 53 | CC_SHA256(baseAddress, messageLength, digestBytes) 54 | case .sha384: 55 | CC_SHA384(baseAddress, messageLength, digestBytes) 56 | case .sha512: 57 | CC_SHA512(baseAddress, messageLength, digestBytes) 58 | } 59 | } 60 | return 0 61 | } 62 | } 63 | return digestData 64 | } 65 | 66 | override public var description: String { 67 | return string(representation: .hex) 68 | } 69 | 70 | } 71 | -------------------------------------------------------------------------------- /Hash/Classes/Cryptography/Cryptable.swift: -------------------------------------------------------------------------------- 1 | // 2 | // Cryptable.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/5/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | protocol Cryptable: class { 12 | 13 | var algorithm: Cipher { get } 14 | var ivData: Data? { get } 15 | var keyData: Data { get } 16 | var message: Data { get } 17 | var result: CCCryptorStatus? { get set } 18 | 19 | func data() -> Data 20 | func data(operation: CCOperation) -> Data 21 | 22 | } 23 | 24 | extension Cryptable { 25 | 26 | func data(operation: CCOperation) -> Data { 27 | var outLength = Int(0) 28 | let inputData = message 29 | let length = (algorithm.blockSize() + inputData.count) 30 | var outputData = Data(count: length) 31 | var result: CCCryptorStatus = CCCryptorStatus(kCCSuccess) 32 | _ = outputData.withUnsafeMutableBytes { outputBytes -> UInt8 in 33 | inputData.withUnsafeBytes { inputBytes -> UInt8 in 34 | keyData.withUnsafeBytes { keyBytes -> UInt8 in 35 | let messageLength = size_t(outputBytes.count) 36 | let keyLength = size_t(keyData.count) 37 | if let keyBytes = keyBytes.bindMemory(to: UInt8.self).baseAddress, 38 | let inputBytes = inputBytes.bindMemory(to: UInt8.self).baseAddress, 39 | let outputBytes = outputBytes.bindMemory(to: UInt8.self).baseAddress { 40 | guard let ivData = ivData else { 41 | result = CCCrypt(operation, algorithm.ccAlgorithm(), CCOptions(kCCOptionPKCS7Padding), 42 | keyBytes, keyLength, nil, inputBytes, inputData.count, outputBytes, 43 | messageLength, &outLength) 44 | return 0 45 | } 46 | let _ = ivData.withUnsafeBytes { ivBytes -> UInt8 in 47 | if let ivBytes = ivBytes.bindMemory(to: UInt8.self).baseAddress { 48 | result = CCCrypt(operation, algorithm.ccAlgorithm(), CCOptions(kCCOptionPKCS7Padding), 49 | keyBytes, keyLength, ivBytes, inputBytes, inputData.count, outputBytes, 50 | messageLength, &outLength) 51 | } 52 | return 0 53 | } 54 | } 55 | return 0 56 | } 57 | } 58 | } 59 | self.result = result 60 | outputData.removeLast(outputData.count - outLength) 61 | return outputData 62 | } 63 | 64 | } 65 | 66 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/xcshareddata/xcschemes/Hash.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 24 | 25 | 30 | 31 | 32 | 33 | 34 | 35 | 45 | 46 | 52 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 66 | 67 | 70 | 71 | 72 | -------------------------------------------------------------------------------- /Hash/Classes/Cryptography/EncryptionAlgorithm.swift: -------------------------------------------------------------------------------- 1 | // 2 | // EncryptionAlgorithm.swift 3 | // Hash 4 | // 5 | // Created by Ross Butler on 7/4/19. 6 | // 7 | 8 | import Foundation 9 | import CommonCrypto 10 | 11 | public typealias EncryptionAlgorithm = Cipher 12 | public typealias DecryptionAlgorithm = Cipher 13 | 14 | @objc public enum Cipher: Int, CaseIterable { 15 | case aes128 16 | case aes192 17 | case aes256 18 | case blowfish 19 | case cast 20 | case des 21 | case rc2 22 | case rc4 23 | case tripleDES 24 | } 25 | 26 | extension Cipher: CustomStringConvertible { 27 | 28 | public var description: String { 29 | switch self { 30 | case .aes128: 31 | return "AES-128" 32 | case .aes192: 33 | return "AES-192" 34 | case .aes256: 35 | return "AES-256" 36 | case .blowfish: 37 | return "Blowfish" 38 | case .cast: 39 | return "CAST" 40 | case .des: 41 | return "DES" 42 | case .rc2: 43 | return "RC2" 44 | case .rc4: 45 | return "RC4" 46 | case .tripleDES: 47 | return "3DES" 48 | } 49 | } 50 | 51 | } 52 | 53 | extension Cipher { 54 | 55 | func blockSize() -> Int { 56 | switch self { 57 | case .aes128, .aes192, .aes256: 58 | return kCCBlockSizeAES128 59 | case .blowfish: 60 | return kCCBlockSizeBlowfish 61 | case .cast: 62 | return kCCBlockSizeCAST 63 | case .des: 64 | return kCCBlockSizeDES 65 | case .rc2: 66 | return kCCBlockSizeRC2 67 | case .rc4: 68 | return 0 69 | case .tripleDES: 70 | return kCCBlockSize3DES 71 | } 72 | } 73 | 74 | func ccAlgorithm() -> CCAlgorithm { 75 | switch self { 76 | case .aes128, .aes192, .aes256: 77 | return CCAlgorithm(kCCAlgorithmAES) 78 | case .blowfish: 79 | return CCAlgorithm(kCCAlgorithmBlowfish) 80 | case .cast: 81 | return CCAlgorithm(kCCAlgorithmCAST) 82 | case .des: 83 | return CCAlgorithm(kCCAlgorithmDES) 84 | case .rc2: 85 | return CCAlgorithm(kCCAlgorithmRC2) 86 | case .rc4: 87 | return CCAlgorithm(kCCAlgorithmRC4) 88 | case .tripleDES: 89 | return CCAlgorithm(kCCAlgorithm3DES) 90 | } 91 | } 92 | 93 | func keySize() -> Int { 94 | switch self { 95 | case .aes128: 96 | return kCCKeySizeAES128 97 | case .aes192: 98 | return kCCKeySizeAES192 99 | case .aes256: 100 | return kCCKeySizeAES256 101 | case .blowfish: 102 | return kCCKeySizeMinBlowfish 103 | case .cast: 104 | return kCCKeySizeMinCAST 105 | case .des: 106 | return kCCKeySizeDES 107 | case .rc2: 108 | return kCCKeySizeMinRC2 109 | case .rc4: 110 | return kCCKeySizeMinRC4 111 | case .tripleDES: 112 | return kCCKeySize3DES 113 | } 114 | } 115 | 116 | } 117 | 118 | -------------------------------------------------------------------------------- /Example/Hash/Base.lproj/LaunchScreen.xib: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 24 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /Example/Hash.xcodeproj/xcshareddata/xcschemes/Hash-Example.xcscheme: -------------------------------------------------------------------------------- 1 | 2 | 5 | 8 | 9 | 15 | 21 | 22 | 23 | 29 | 35 | 36 | 37 | 38 | 39 | 44 | 45 | 47 | 53 | 54 | 55 | 56 | 57 | 63 | 64 | 65 | 66 | 67 | 68 | 78 | 80 | 86 | 87 | 88 | 89 | 90 | 91 | 97 | 99 | 105 | 106 | 107 | 108 | 110 | 111 | 114 | 115 | 116 | -------------------------------------------------------------------------------- /Example/Tests/Tests.swift: -------------------------------------------------------------------------------- 1 | import XCTest 2 | import Hash 3 | 4 | class Tests: XCTestCase { 5 | 6 | override func setUp() { 7 | super.setUp() 8 | // Put setup code here. This method is called before the invocation of each test method in the class. 9 | } 10 | 11 | override func tearDown() { 12 | // Put teardown code here. This method is called after the invocation of each test method in the class. 13 | super.tearDown() 14 | } 15 | 16 | func testHashFunctionProducesExpectedString() { 17 | for hashFunction in HashAlgorithm.allCases { 18 | guard let hash = Hash(message: "Hello World!", algorithm: hashFunction) else { 19 | XCTFail("Hash should be non-nil.") 20 | return 21 | } 22 | let hexString = hash.description 23 | let expectedString = hashFunction.expectedString 24 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(hashFunction.description).") 25 | } 26 | } 27 | 28 | func testHMACFunctionProducesExpectedString() { 29 | guard let hmac = HMAC(message: "Hello World!", key: "123", algorithm: .sha1) else { 30 | XCTFail("HMAC should be non-nil.") 31 | return 32 | } 33 | let hexString = hmac.description 34 | let expectedString = "5471001127ed5f6261576c66033d9cbe37c7c91e" 35 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(HashAlgorithm.sha1.description).") 36 | } 37 | 38 | 39 | func testAES128EncryptionProducesExpectedString() { 40 | guard let cipherText = CipherText(message: "Hello World!", key: "0123456789012345", iv: "0123456789012345", algorithm: .aes128) else { 41 | XCTFail("It is possible to encrypt using the provided values.") 42 | return 43 | } 44 | let hexString = cipherText.description 45 | let expectedString = "7a7a5437ef9e2537e5ba430da23f30da" 46 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes128.description).") 47 | } 48 | 49 | func testAES128EncryptionWithoutIVProducesExpectedString() { 50 | guard let cipherText = CipherText(message: "Hello World!", key: "0123456789012345", iv: nil, algorithm: .aes128) else { 51 | XCTFail("It is possible to encrypt using the provided values.") 52 | return 53 | } 54 | let hexString = cipherText.description 55 | let expectedString = "0f43d4b2a5f529fce9049e80f7c60761" 56 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes128.description).") 57 | } 58 | 59 | func testAES192EncryptionProducesExpectedString() { 60 | guard let cipherText = CipherText(message: "Hello World!", key: "012345678901234567890123", iv: "0123456789012345", algorithm: .aes192) else { 61 | XCTFail("It is possible to encrypt using the provided values.") 62 | return 63 | } 64 | let hexString = cipherText.description 65 | let expectedString = "4141c737e097372dc157741e3405526b" 66 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes192.description).") 67 | } 68 | 69 | func testAES192EncryptionWithoutIVProducesExpectedString() { 70 | guard let cipherText = CipherText(message: "Hello World!", key: "012345678901234567890123", iv: nil, algorithm: .aes192) else { 71 | XCTFail("It is possible to encrypt using the provided values.") 72 | return 73 | } 74 | let hexString = cipherText.description 75 | let expectedString = "4bd65c154f1f6011b51c08bab1953160" 76 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes192.description).") 77 | } 78 | 79 | func testAES256EncryptionProducesExpectedString() { 80 | guard let cipherText = CipherText(message: "Hello World!", key: "01234567890123450123456789012345", iv: "0123456789012345", algorithm: .aes256) else { 81 | XCTFail("It is possible to encrypt using the provided values.") 82 | return 83 | } 84 | let hexString = cipherText.description 85 | let expectedString = "6a790fe6c15590a6434d3ee3a866d327" 86 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes256.description).") 87 | } 88 | 89 | func testAES256EncryptionWithoutIVProducesExpectedString() { 90 | guard let cipherText = CipherText(message: "Hello World!", key: "01234567890123450123456789012345", iv: nil, algorithm: .aes256) else { 91 | XCTFail("It is possible to encrypt using the provided values.") 92 | return 93 | } 94 | let hexString = cipherText.description 95 | let expectedString = "739d542666ae1f58913b4a3b76b35d52" 96 | XCTAssert(hexString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes256.description).") 97 | } 98 | 99 | func testAES256DecryptionProducesExpectedString() { 100 | guard let message = Data(hex: "6a790fe6c15590a6434d3ee3a866d327"), 101 | let keyData = "01234567890123450123456789012345".data(using: .utf8) else { 102 | XCTFail("It is possible to decrypt using the provided values.") 103 | return 104 | } 105 | let plainText = PlainText(message: message, key: keyData, iv: "0123456789012345".data(using: .utf8), algorithm: .aes256) 106 | let decryptedString = plainText.description 107 | let expectedString = "Hello World!" 108 | XCTAssert(decryptedString == expectedString, "Hex string should match expected value for algorithm \(Cipher.aes256.description).") 109 | } 110 | 111 | } 112 | -------------------------------------------------------------------------------- /Example/Pods/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-frameworks.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | set -e 3 | set -u 4 | set -o pipefail 5 | 6 | function on_error { 7 | echo "$(realpath -mq "${0}"):$1: error: Unexpected failure" 8 | } 9 | trap 'on_error $LINENO' ERR 10 | 11 | if [ -z ${FRAMEWORKS_FOLDER_PATH+x} ]; then 12 | # If FRAMEWORKS_FOLDER_PATH is not set, then there's nowhere for us to copy 13 | # frameworks to, so exit 0 (signalling the script phase was successful). 14 | exit 0 15 | fi 16 | 17 | echo "mkdir -p ${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 18 | mkdir -p "${CONFIGURATION_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 19 | 20 | COCOAPODS_PARALLEL_CODE_SIGN="${COCOAPODS_PARALLEL_CODE_SIGN:-false}" 21 | SWIFT_STDLIB_PATH="${DT_TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" 22 | 23 | # Used as a return value for each invocation of `strip_invalid_archs` function. 24 | STRIP_BINARY_RETVAL=0 25 | 26 | # This protects against multiple targets copying the same framework dependency at the same time. The solution 27 | # was originally proposed here: https://lists.samba.org/archive/rsync/2008-February/020158.html 28 | RSYNC_PROTECT_TMP_FILES=(--filter "P .*.??????") 29 | 30 | # Copies and strips a vendored framework 31 | install_framework() 32 | { 33 | if [ -r "${BUILT_PRODUCTS_DIR}/$1" ]; then 34 | local source="${BUILT_PRODUCTS_DIR}/$1" 35 | elif [ -r "${BUILT_PRODUCTS_DIR}/$(basename "$1")" ]; then 36 | local source="${BUILT_PRODUCTS_DIR}/$(basename "$1")" 37 | elif [ -r "$1" ]; then 38 | local source="$1" 39 | fi 40 | 41 | local destination="${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}" 42 | 43 | if [ -L "${source}" ]; then 44 | echo "Symlinked..." 45 | source="$(readlink "${source}")" 46 | fi 47 | 48 | # Use filter instead of exclude so missing patterns don't throw errors. 49 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${destination}\"" 50 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${destination}" 51 | 52 | local basename 53 | basename="$(basename -s .framework "$1")" 54 | binary="${destination}/${basename}.framework/${basename}" 55 | 56 | if ! [ -r "$binary" ]; then 57 | binary="${destination}/${basename}" 58 | elif [ -L "${binary}" ]; then 59 | echo "Destination binary is symlinked..." 60 | dirname="$(dirname "${binary}")" 61 | binary="${dirname}/$(readlink "${binary}")" 62 | fi 63 | 64 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 65 | if [[ "$(file "$binary")" == *"dynamically linked shared library"* ]]; then 66 | strip_invalid_archs "$binary" 67 | fi 68 | 69 | # Resign the code if required by the build settings to avoid unstable apps 70 | code_sign_if_enabled "${destination}/$(basename "$1")" 71 | 72 | # Embed linked Swift runtime libraries. No longer necessary as of Xcode 7. 73 | if [ "${XCODE_VERSION_MAJOR}" -lt 7 ]; then 74 | local swift_runtime_libs 75 | swift_runtime_libs=$(xcrun otool -LX "$binary" | grep --color=never @rpath/libswift | sed -E s/@rpath\\/\(.+dylib\).*/\\1/g | uniq -u) 76 | for lib in $swift_runtime_libs; do 77 | echo "rsync -auv \"${SWIFT_STDLIB_PATH}/${lib}\" \"${destination}\"" 78 | rsync -auv "${SWIFT_STDLIB_PATH}/${lib}" "${destination}" 79 | code_sign_if_enabled "${destination}/${lib}" 80 | done 81 | fi 82 | } 83 | 84 | # Copies and strips a vendored dSYM 85 | install_dsym() { 86 | local source="$1" 87 | if [ -r "$source" ]; then 88 | # Copy the dSYM into a the targets temp dir. 89 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${source}\" \"${DERIVED_FILES_DIR}\"" 90 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${source}" "${DERIVED_FILES_DIR}" 91 | 92 | local basename 93 | basename="$(basename -s .framework.dSYM "$source")" 94 | binary="${DERIVED_FILES_DIR}/${basename}.framework.dSYM/Contents/Resources/DWARF/${basename}" 95 | 96 | # Strip invalid architectures so "fat" simulator / device frameworks work on device 97 | if [[ "$(file "$binary")" == *"Mach-O "*"dSYM companion"* ]]; then 98 | strip_invalid_archs "$binary" 99 | fi 100 | 101 | if [[ $STRIP_BINARY_RETVAL == 1 ]]; then 102 | # Move the stripped file into its final destination. 103 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter \"- CVS/\" --filter \"- .svn/\" --filter \"- .git/\" --filter \"- .hg/\" --filter \"- Headers\" --filter \"- PrivateHeaders\" --filter \"- Modules\" \"${DERIVED_FILES_DIR}/${basename}.framework.dSYM\" \"${DWARF_DSYM_FOLDER_PATH}\"" 104 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${DERIVED_FILES_DIR}/${basename}.framework.dSYM" "${DWARF_DSYM_FOLDER_PATH}" 105 | else 106 | # The dSYM was not stripped at all, in this case touch a fake folder so the input/output paths from Xcode do not reexecute this script because the file is missing. 107 | touch "${DWARF_DSYM_FOLDER_PATH}/${basename}.framework.dSYM" 108 | fi 109 | fi 110 | } 111 | 112 | # Copies the bcsymbolmap files of a vendored framework 113 | install_bcsymbolmap() { 114 | local bcsymbolmap_path="$1" 115 | local destination="${BUILT_PRODUCTS_DIR}" 116 | echo "rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}"" 117 | rsync --delete -av "${RSYNC_PROTECT_TMP_FILES[@]}" --filter "- CVS/" --filter "- .svn/" --filter "- .git/" --filter "- .hg/" --filter "- Headers" --filter "- PrivateHeaders" --filter "- Modules" "${bcsymbolmap_path}" "${destination}" 118 | } 119 | 120 | # Signs a framework with the provided identity 121 | code_sign_if_enabled() { 122 | if [ -n "${EXPANDED_CODE_SIGN_IDENTITY:-}" -a "${CODE_SIGNING_REQUIRED:-}" != "NO" -a "${CODE_SIGNING_ALLOWED}" != "NO" ]; then 123 | # Use the current code_sign_identity 124 | echo "Code Signing $1 with Identity ${EXPANDED_CODE_SIGN_IDENTITY_NAME}" 125 | local code_sign_cmd="/usr/bin/codesign --force --sign ${EXPANDED_CODE_SIGN_IDENTITY} ${OTHER_CODE_SIGN_FLAGS:-} --preserve-metadata=identifier,entitlements '$1'" 126 | 127 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 128 | code_sign_cmd="$code_sign_cmd &" 129 | fi 130 | echo "$code_sign_cmd" 131 | eval "$code_sign_cmd" 132 | fi 133 | } 134 | 135 | # Strip invalid architectures 136 | strip_invalid_archs() { 137 | binary="$1" 138 | # Get architectures for current target binary 139 | binary_archs="$(lipo -info "$binary" | rev | cut -d ':' -f1 | awk '{$1=$1;print}' | rev)" 140 | # Intersect them with the architectures we are building for 141 | intersected_archs="$(echo ${ARCHS[@]} ${binary_archs[@]} | tr ' ' '\n' | sort | uniq -d)" 142 | # If there are no archs supported by this binary then warn the user 143 | if [[ -z "$intersected_archs" ]]; then 144 | echo "warning: [CP] Vendored binary '$binary' contains architectures ($binary_archs) none of which match the current build architectures ($ARCHS)." 145 | STRIP_BINARY_RETVAL=0 146 | return 147 | fi 148 | stripped="" 149 | for arch in $binary_archs; do 150 | if ! [[ "${ARCHS}" == *"$arch"* ]]; then 151 | # Strip non-valid architectures in-place 152 | lipo -remove "$arch" -output "$binary" "$binary" 153 | stripped="$stripped $arch" 154 | fi 155 | done 156 | if [[ "$stripped" ]]; then 157 | echo "Stripped $binary of architectures:$stripped" 158 | fi 159 | STRIP_BINARY_RETVAL=1 160 | } 161 | 162 | 163 | if [[ "$CONFIGURATION" == "Debug" ]]; then 164 | install_framework "${BUILT_PRODUCTS_DIR}/Hash/Hash.framework" 165 | fi 166 | if [[ "$CONFIGURATION" == "Release" ]]; then 167 | install_framework "${BUILT_PRODUCTS_DIR}/Hash/Hash.framework" 168 | fi 169 | if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then 170 | wait 171 | fi 172 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | ![Hash](https://raw.githubusercontent.com/rwbutler/Hash/master/docs/images/hash-banner.png) 2 | 3 | [![CI Status](http://img.shields.io/travis/rwbutler/Hash.svg?style=flat)](https://travis-ci.org/rwbutler/Hash) 4 | [![Version](https://img.shields.io/cocoapods/v/Hash.svg?style=flat)](http://cocoapods.org/pods/Hash) 5 | [![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) 6 | [![Maintainability](https://api.codeclimate.com/v1/badges/c3041fef8e33cc4d00df/maintainability)](https://codeclimate.com/github/rwbutler/Hash/maintainability) 7 | [![License](https://img.shields.io/cocoapods/l/Hash.svg?style=flat)](http://cocoapods.org/pods/Hash) 8 | [![Platform](https://img.shields.io/cocoapods/p/Hash.svg?style=flat)](http://cocoapods.org/pods/Hash) 9 | [![Swift 5.0](https://img.shields.io/badge/Swift-5.0-orange.svg?style=flat)](https://swift.org/) 10 | [![Reviewed by Hound](https://img.shields.io/badge/Reviewed_by-Hound-8E64B0.svg)](https://houndci.com) 11 | 12 | Hash provides a convenient means of converting a message in Swift Data or String format to a message digest (hashing) or generating a HMAC using one of the following hash functions: MD2 MD4, MD5, SHA-1, SHA224, SHA-256, SHA-384 or SHA-512. Also supported are encryption and decryption using AES-128, AES-192 or AES-256. 13 | 14 | - [Features](#features) 15 | - [Installation](#installation) 16 | - [Cocoapods](#cocoapods) 17 | - [Carthage](#carthage) 18 | - [Swift Package Manager](#swift-package-manager) 19 | - [Usage](#usage) 20 | - [Message Digests (Hashing)](#message-digests-hashing) 21 | - [HMACs](#hmacs) 22 | - [Encryption](#encryption) 23 | - [Decryption](#decryption) 24 | - [Author](#author) 25 | - [License](#license) 26 | - [Additional Software](#additional-software) 27 | - [Controls](#controls) 28 | - [Frameworks](#frameworks) 29 | - [Tools](#tools) 30 | 31 | ## Features 32 | 33 | - [x] Lightweight and easy to use interface. 34 | - [x] Support for hashing using the following popular algorithms: MD2 MD4, MD5, SHA-1, SHA224, SHA-256, SHA-384 or SHA-512. 35 | - [x] Support for generating HMACs using the following popular algorithms: MD5, SHA-1, SHA224, SHA-256, SHA-384 or SHA-512. 36 | - [x] Support for encryption & decryption using AES-128, AES-192 or AES-256. 37 | - [x] Compatible with iOS 8.0 and above. 38 | 39 | ## Installation 40 | 41 | ### Cocoapods 42 | 43 | [CocoaPods](http://cocoapods.org) is a dependency manager which integrates dependencies into your Xcode workspace. To install it using [Ruby gems](https://rubygems.org/) run: 44 | 45 | ```bash 46 | gem install cocoapods 47 | ``` 48 | 49 | To install Hash using Cocoapods, simply add the following line to your Podfile: 50 | 51 | ```ruby 52 | pod "Hash" 53 | ``` 54 | 55 | Then run the command: 56 | 57 | ```ruby 58 | pod install 59 | ``` 60 | 61 | For more information [see here](https://cocoapods.org/#getstarted). 62 | 63 | ### Carthage 64 | 65 | Carthage is a dependency manager which produces a binary for manual integration into your project. It can be installed via [Homebrew](https://brew.sh/) using the commands: 66 | 67 | ```bash 68 | brew update 69 | brew install carthage 70 | ``` 71 | 72 | In order to integrate Hash into your project via Carthage, add the following line to your project's Cartfile: 73 | 74 | ```ogdl 75 | github "rwbutler/Hash" 76 | ``` 77 | 78 | From the macOS Terminal run `carthage update --platform iOS` to build the framework then drag `Hash.framework` into your Xcode project. 79 | 80 | For more information [see here](https://github.com/Carthage/Carthage#quick-start). 81 | 82 | ### Swift Package Manager 83 | 84 | The [Swift Package Manager](https://swift.org/package-manager/) is a dependency manager for Swift modules and is included as part of the build system as of Swift 3.0. It is used to automate the download, compilation and linking of dependencies. 85 | 86 | To include Hash as a dependency within a Swift package, add the package to the `dependencies` entry in your `Package.swift` file as follows: 87 | 88 | ```swift 89 | dependencies: [ 90 | .package(url: "https://github.com/rwbutler/Hash.git", from: "1.0.0") 91 | ] 92 | ``` 93 | 94 | ## Usage 95 | 96 | For an example of how to use Hash, see the sample app in the [Example](./Example) directory. 97 | 98 | ### Message Digests (Hashing) 99 | 100 | ```swift 101 | if let hash = Hash(message: "Hello World!", algorithm: .sha256) { 102 | print(hash) 103 | } 104 | ``` 105 | 106 | Prints: 107 | 108 | `7f83b1657ff1fc53b92dc18148a1d65dfc2d4b1fa3d677284addd200126d9069` 109 | 110 | ### HMACs 111 | 112 | ```swift 113 | if let hash = HMAC(message: "Hello World!", key: "123", algorithm: .sha1) { 114 | print(hash) 115 | } 116 | ``` 117 | 118 | Prints: 119 | 120 | `‌5471001127ed5f6261576c66033d9cbe37c7c91e` 121 | 122 | ### Encryption 123 | 124 | Currently supported encryption algorithms are: AES-128, AES-192 and AES-256. 125 | 126 | ```swift 127 | if let cipherText = CipherText(message: "Hello World!", key: "01234567890123450123456789012345", iv: "0123456789012345", algorithm: .aes256) { 128 | print(cipherText) 129 | } 130 | ``` 131 | 132 | Prints: 133 | 134 | `‌6a790fe6c15590a6434d3ee3a866d327` 135 | 136 | ### Decryption 137 | 138 | Currently supported decryption algorithms are: AES-128, AES-192 and AES-256. 139 | 140 | ```swift 141 | if let cipherText = Data(hex: "6a790fe6c15590a6434d3ee3a866d327"), 142 | let keyData = "01234567890123450123456789012345".data(using: .utf8) { 143 | let plainText = PlainText(message: message, key: keyData, iv: "0123456789012345".data(using: .utf8), algorithm: .aes256) 144 | print(plainText) 145 | } 146 | ``` 147 | 148 | Prints: 149 | 150 | `‌Hello World!` 151 | 152 | ## Author 153 | 154 | [Ross Butler](https://github.com/rwbutler) 155 | 156 | ## License 157 | 158 | Hash is available under the MIT license. See the [LICENSE file](./LICENSE) for more info. 159 | 160 | ## Additional Software 161 | 162 | ### Controls 163 | 164 | * [AnimatedGradientView](https://github.com/rwbutler/AnimatedGradientView) - Powerful gradient animations made simple for iOS. 165 | 166 | |[AnimatedGradientView](https://github.com/rwbutler/AnimatedGradientView) | 167 | |:-------------------------:| 168 | |[![AnimatedGradientView](https://raw.githubusercontent.com/rwbutler/AnimatedGradientView/master/docs/images/animated-gradient-view-logo.png)](https://github.com/rwbutler/AnimatedGradientView) 169 | 170 | ### Frameworks 171 | 172 | * [Cheats](https://github.com/rwbutler/Cheats) - Retro cheat codes for modern iOS apps. 173 | * [Connectivity](https://github.com/rwbutler/Connectivity) - Improves on Reachability for determining Internet connectivity in your iOS application. 174 | * [FeatureFlags](https://github.com/rwbutler/FeatureFlags) - Allows developers to configure feature flags, run multiple A/B or MVT tests using a bundled / remotely-hosted JSON configuration file. 175 | * [FlexibleRowHeightGridLayout](https://github.com/rwbutler/FlexibleRowHeightGridLayout) - A UICollectionView grid layout designed to support Dynamic Type by allowing the height of each row to size to fit content. 176 | * [Hash](https://github.com/rwbutler/Hash) - Lightweight means of generating message digests and HMACs using popular hash functions including MD5, SHA-1, SHA-256. 177 | * [Skylark](https://github.com/rwbutler/Skylark) - Fully Swift BDD testing framework for writing Cucumber scenarios using Gherkin syntax. 178 | * [TailorSwift](https://github.com/rwbutler/TailorSwift) - A collection of useful Swift Core Library / Foundation framework extensions. 179 | * [TypographyKit](https://github.com/rwbutler/TypographyKit) - Consistent & accessible visual styling on iOS with Dynamic Type support. 180 | * [Updates](https://github.com/rwbutler/Updates) - Automatically detects app updates and gently prompts users to update. 181 | 182 | |[Cheats](https://github.com/rwbutler/Cheats) |[Connectivity](https://github.com/rwbutler/Connectivity) | [FeatureFlags](https://github.com/rwbutler/FeatureFlags) | [Skylark](https://github.com/rwbutler/Skylark) | [TypographyKit](https://github.com/rwbutler/TypographyKit) | [Updates](https://github.com/rwbutler/Updates) | 183 | |:-------------------------:|:-------------------------:|:-------------------------:|:-------------------------:|:-------------------------:|:-------------------------:| 184 | |[![Cheats](https://raw.githubusercontent.com/rwbutler/Cheats/master/docs/images/cheats-logo.png)](https://github.com/rwbutler/Cheats) |[![Connectivity](https://github.com/rwbutler/Connectivity/raw/master/ConnectivityLogo.png)](https://github.com/rwbutler/Connectivity) | [![FeatureFlags](https://raw.githubusercontent.com/rwbutler/FeatureFlags/master/docs/images/feature-flags-logo.png)](https://github.com/rwbutler/FeatureFlags) | [![Skylark](https://github.com/rwbutler/Skylark/raw/master/SkylarkLogo.png)](https://github.com/rwbutler/Skylark) | [![TypographyKit](https://raw.githubusercontent.com/rwbutler/TypographyKit/master/docs/images/typography-kit-logo.png)](https://github.com/rwbutler/TypographyKit) | [![Updates](https://raw.githubusercontent.com/rwbutler/Updates/master/docs/images/updates-logo.png)](https://github.com/rwbutler/Updates) 185 | 186 | ### Tools 187 | 188 | * [Clear DerivedData](https://github.com/rwbutler/ClearDerivedData) - Utility to quickly clear your DerivedData directory simply by typing `cdd` from the Terminal. 189 | * [Config Validator](https://github.com/rwbutler/ConfigValidator) - Config Validator validates & uploads your configuration files and cache clears your CDN as part of your CI process. 190 | * [IPA Uploader](https://github.com/rwbutler/IPAUploader) - Uploads your apps to TestFlight & App Store. 191 | * [Palette](https://github.com/rwbutler/TypographyKitPalette) - Makes your [TypographyKit](https://github.com/rwbutler/TypographyKit) color palette available in Xcode Interface Builder. 192 | 193 | |[Config Validator](https://github.com/rwbutler/ConfigValidator) | [IPA Uploader](https://github.com/rwbutler/IPAUploader) | [Palette](https://github.com/rwbutler/TypographyKitPalette)| 194 | |:-------------------------:|:-------------------------:|:-------------------------:| 195 | |[![Config Validator](https://raw.githubusercontent.com/rwbutler/ConfigValidator/master/docs/images/config-validator-logo.png)](https://github.com/rwbutler/ConfigValidator) | [![IPA Uploader](https://raw.githubusercontent.com/rwbutler/IPAUploader/master/docs/images/ipa-uploader-logo.png)](https://github.com/rwbutler/IPAUploader) | [![Palette](https://raw.githubusercontent.com/rwbutler/TypographyKitPalette/master/docs/images/typography-kit-palette-logo.png)](https://github.com/rwbutler/TypographyKitPalette) -------------------------------------------------------------------------------- /Example/Hash.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 132D23D322BA5F6D00B5938E /* HashAlgorithm+ExpectedString.swift in Sources */ = {isa = PBXBuildFile; fileRef = 132D23D122BA5F6100B5938E /* HashAlgorithm+ExpectedString.swift */; }; 11 | 3D10E71A9361D70D9AE9AAC8 /* Pods_Hash_Example.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0C704F2940752051C1BBDC08 /* Pods_Hash_Example.framework */; }; 12 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD51AFB9204008FA782 /* AppDelegate.swift */; }; 13 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACD71AFB9204008FA782 /* ViewController.swift */; }; 14 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 607FACD91AFB9204008FA782 /* Main.storyboard */; }; 15 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDC1AFB9204008FA782 /* Images.xcassets */; }; 16 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */; }; 17 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 607FACEB1AFB9204008FA782 /* Tests.swift */; }; 18 | C507A440040DF0BBA3A72DA6 /* Pods_Hash_Tests.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 5ECEEC91D0F38F5ADF4A0905 /* Pods_Hash_Tests.framework */; }; 19 | /* End PBXBuildFile section */ 20 | 21 | /* Begin PBXContainerItemProxy section */ 22 | 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */ = { 23 | isa = PBXContainerItemProxy; 24 | containerPortal = 607FACC81AFB9204008FA782 /* Project object */; 25 | proxyType = 1; 26 | remoteGlobalIDString = 607FACCF1AFB9204008FA782; 27 | remoteInfo = Hash; 28 | }; 29 | /* End PBXContainerItemProxy section */ 30 | 31 | /* Begin PBXFileReference section */ 32 | 0C704F2940752051C1BBDC08 /* Pods_Hash_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Hash_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 33 | 132D23D122BA5F6100B5938E /* HashAlgorithm+ExpectedString.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "HashAlgorithm+ExpectedString.swift"; sourceTree = ""; }; 34 | 2B4D578ED892D3DA62A8AABB /* Hash.podspec */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = Hash.podspec; path = ../Hash.podspec; sourceTree = ""; }; 35 | 37511F377E825AE5FBC8D6E7 /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; name = README.md; path = ../README.md; sourceTree = ""; }; 36 | 3DCD2A53D822830A0AFC5BF3 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; name = LICENSE; path = ../LICENSE; sourceTree = ""; }; 37 | 5ECEEC91D0F38F5ADF4A0905 /* Pods_Hash_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Hash_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 38 | 607FACD01AFB9204008FA782 /* Hash_Example.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = Hash_Example.app; sourceTree = BUILT_PRODUCTS_DIR; }; 39 | 607FACD41AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 40 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; 41 | 607FACD71AFB9204008FA782 /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; 42 | 607FACDA1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; 43 | 607FACDC1AFB9204008FA782 /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; }; 44 | 607FACDF1AFB9204008FA782 /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; }; 45 | 607FACE51AFB9204008FA782 /* Hash_Tests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = Hash_Tests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; 46 | 607FACEA1AFB9204008FA782 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 47 | 607FACEB1AFB9204008FA782 /* Tests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tests.swift; sourceTree = ""; }; 48 | 934AB20D2D6F0AAD1317F698 /* Pods-Hash_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Hash_Tests.release.xcconfig"; path = "Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.release.xcconfig"; sourceTree = ""; }; 49 | A8FE7855F9224AA4A50D255F /* Pods-Hash_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Hash_Tests.debug.xcconfig"; path = "Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.debug.xcconfig"; sourceTree = ""; }; 50 | F33DF5E535B5218B8D5EFE2C /* Pods-Hash_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Hash_Example.release.xcconfig"; path = "Target Support Files/Pods-Hash_Example/Pods-Hash_Example.release.xcconfig"; sourceTree = ""; }; 51 | FFBCD70A71AF7A1C87A794CE /* Pods-Hash_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Hash_Example.debug.xcconfig"; path = "Target Support Files/Pods-Hash_Example/Pods-Hash_Example.debug.xcconfig"; sourceTree = ""; }; 52 | /* End PBXFileReference section */ 53 | 54 | /* Begin PBXFrameworksBuildPhase section */ 55 | 607FACCD1AFB9204008FA782 /* Frameworks */ = { 56 | isa = PBXFrameworksBuildPhase; 57 | buildActionMask = 2147483647; 58 | files = ( 59 | 3D10E71A9361D70D9AE9AAC8 /* Pods_Hash_Example.framework in Frameworks */, 60 | ); 61 | runOnlyForDeploymentPostprocessing = 0; 62 | }; 63 | 607FACE21AFB9204008FA782 /* Frameworks */ = { 64 | isa = PBXFrameworksBuildPhase; 65 | buildActionMask = 2147483647; 66 | files = ( 67 | C507A440040DF0BBA3A72DA6 /* Pods_Hash_Tests.framework in Frameworks */, 68 | ); 69 | runOnlyForDeploymentPostprocessing = 0; 70 | }; 71 | /* End PBXFrameworksBuildPhase section */ 72 | 73 | /* Begin PBXGroup section */ 74 | 3FA9894F169D65FA9CD2C7C2 /* Frameworks */ = { 75 | isa = PBXGroup; 76 | children = ( 77 | 0C704F2940752051C1BBDC08 /* Pods_Hash_Example.framework */, 78 | 5ECEEC91D0F38F5ADF4A0905 /* Pods_Hash_Tests.framework */, 79 | ); 80 | name = Frameworks; 81 | sourceTree = ""; 82 | }; 83 | 607FACC71AFB9204008FA782 = { 84 | isa = PBXGroup; 85 | children = ( 86 | 607FACF51AFB993E008FA782 /* Podspec Metadata */, 87 | 607FACD21AFB9204008FA782 /* Example for Hash */, 88 | 607FACE81AFB9204008FA782 /* Tests */, 89 | 607FACD11AFB9204008FA782 /* Products */, 90 | 64C9EAF8D311F4D8AF13EB6C /* Pods */, 91 | 3FA9894F169D65FA9CD2C7C2 /* Frameworks */, 92 | ); 93 | sourceTree = ""; 94 | }; 95 | 607FACD11AFB9204008FA782 /* Products */ = { 96 | isa = PBXGroup; 97 | children = ( 98 | 607FACD01AFB9204008FA782 /* Hash_Example.app */, 99 | 607FACE51AFB9204008FA782 /* Hash_Tests.xctest */, 100 | ); 101 | name = Products; 102 | sourceTree = ""; 103 | }; 104 | 607FACD21AFB9204008FA782 /* Example for Hash */ = { 105 | isa = PBXGroup; 106 | children = ( 107 | 607FACD51AFB9204008FA782 /* AppDelegate.swift */, 108 | 607FACD71AFB9204008FA782 /* ViewController.swift */, 109 | 607FACD91AFB9204008FA782 /* Main.storyboard */, 110 | 607FACDC1AFB9204008FA782 /* Images.xcassets */, 111 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */, 112 | 607FACD31AFB9204008FA782 /* Supporting Files */, 113 | ); 114 | name = "Example for Hash"; 115 | path = Hash; 116 | sourceTree = ""; 117 | }; 118 | 607FACD31AFB9204008FA782 /* Supporting Files */ = { 119 | isa = PBXGroup; 120 | children = ( 121 | 607FACD41AFB9204008FA782 /* Info.plist */, 122 | ); 123 | name = "Supporting Files"; 124 | sourceTree = ""; 125 | }; 126 | 607FACE81AFB9204008FA782 /* Tests */ = { 127 | isa = PBXGroup; 128 | children = ( 129 | 132D23D122BA5F6100B5938E /* HashAlgorithm+ExpectedString.swift */, 130 | 607FACEB1AFB9204008FA782 /* Tests.swift */, 131 | 607FACE91AFB9204008FA782 /* Supporting Files */, 132 | ); 133 | path = Tests; 134 | sourceTree = ""; 135 | }; 136 | 607FACE91AFB9204008FA782 /* Supporting Files */ = { 137 | isa = PBXGroup; 138 | children = ( 139 | 607FACEA1AFB9204008FA782 /* Info.plist */, 140 | ); 141 | name = "Supporting Files"; 142 | sourceTree = ""; 143 | }; 144 | 607FACF51AFB993E008FA782 /* Podspec Metadata */ = { 145 | isa = PBXGroup; 146 | children = ( 147 | 2B4D578ED892D3DA62A8AABB /* Hash.podspec */, 148 | 37511F377E825AE5FBC8D6E7 /* README.md */, 149 | 3DCD2A53D822830A0AFC5BF3 /* LICENSE */, 150 | ); 151 | name = "Podspec Metadata"; 152 | sourceTree = ""; 153 | }; 154 | 64C9EAF8D311F4D8AF13EB6C /* Pods */ = { 155 | isa = PBXGroup; 156 | children = ( 157 | FFBCD70A71AF7A1C87A794CE /* Pods-Hash_Example.debug.xcconfig */, 158 | F33DF5E535B5218B8D5EFE2C /* Pods-Hash_Example.release.xcconfig */, 159 | A8FE7855F9224AA4A50D255F /* Pods-Hash_Tests.debug.xcconfig */, 160 | 934AB20D2D6F0AAD1317F698 /* Pods-Hash_Tests.release.xcconfig */, 161 | ); 162 | path = Pods; 163 | sourceTree = ""; 164 | }; 165 | /* End PBXGroup section */ 166 | 167 | /* Begin PBXNativeTarget section */ 168 | 607FACCF1AFB9204008FA782 /* Hash_Example */ = { 169 | isa = PBXNativeTarget; 170 | buildConfigurationList = 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Hash_Example" */; 171 | buildPhases = ( 172 | B548543A334BB2A45FEC1F5C /* [CP] Check Pods Manifest.lock */, 173 | 607FACCC1AFB9204008FA782 /* Sources */, 174 | 607FACCD1AFB9204008FA782 /* Frameworks */, 175 | 607FACCE1AFB9204008FA782 /* Resources */, 176 | F2D8703EE72CB09912433F74 /* [CP] Embed Pods Frameworks */, 177 | ); 178 | buildRules = ( 179 | ); 180 | dependencies = ( 181 | ); 182 | name = Hash_Example; 183 | productName = Hash; 184 | productReference = 607FACD01AFB9204008FA782 /* Hash_Example.app */; 185 | productType = "com.apple.product-type.application"; 186 | }; 187 | 607FACE41AFB9204008FA782 /* Hash_Tests */ = { 188 | isa = PBXNativeTarget; 189 | buildConfigurationList = 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Hash_Tests" */; 190 | buildPhases = ( 191 | 51C8DD2831DA5BC02210498E /* [CP] Check Pods Manifest.lock */, 192 | 607FACE11AFB9204008FA782 /* Sources */, 193 | 607FACE21AFB9204008FA782 /* Frameworks */, 194 | 607FACE31AFB9204008FA782 /* Resources */, 195 | ); 196 | buildRules = ( 197 | ); 198 | dependencies = ( 199 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */, 200 | ); 201 | name = Hash_Tests; 202 | productName = Tests; 203 | productReference = 607FACE51AFB9204008FA782 /* Hash_Tests.xctest */; 204 | productType = "com.apple.product-type.bundle.unit-test"; 205 | }; 206 | /* End PBXNativeTarget section */ 207 | 208 | /* Begin PBXProject section */ 209 | 607FACC81AFB9204008FA782 /* Project object */ = { 210 | isa = PBXProject; 211 | attributes = { 212 | LastSwiftUpdateCheck = 0830; 213 | LastUpgradeCheck = 1020; 214 | ORGANIZATIONNAME = CocoaPods; 215 | TargetAttributes = { 216 | 607FACCF1AFB9204008FA782 = { 217 | CreatedOnToolsVersion = 6.3.1; 218 | LastSwiftMigration = 1020; 219 | }; 220 | 607FACE41AFB9204008FA782 = { 221 | CreatedOnToolsVersion = 6.3.1; 222 | LastSwiftMigration = 1020; 223 | TestTargetID = 607FACCF1AFB9204008FA782; 224 | }; 225 | }; 226 | }; 227 | buildConfigurationList = 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Hash" */; 228 | compatibilityVersion = "Xcode 3.2"; 229 | developmentRegion = en; 230 | hasScannedForEncodings = 0; 231 | knownRegions = ( 232 | en, 233 | Base, 234 | ); 235 | mainGroup = 607FACC71AFB9204008FA782; 236 | productRefGroup = 607FACD11AFB9204008FA782 /* Products */; 237 | projectDirPath = ""; 238 | projectRoot = ""; 239 | targets = ( 240 | 607FACCF1AFB9204008FA782 /* Hash_Example */, 241 | 607FACE41AFB9204008FA782 /* Hash_Tests */, 242 | ); 243 | }; 244 | /* End PBXProject section */ 245 | 246 | /* Begin PBXResourcesBuildPhase section */ 247 | 607FACCE1AFB9204008FA782 /* Resources */ = { 248 | isa = PBXResourcesBuildPhase; 249 | buildActionMask = 2147483647; 250 | files = ( 251 | 607FACDB1AFB9204008FA782 /* Main.storyboard in Resources */, 252 | 607FACE01AFB9204008FA782 /* LaunchScreen.xib in Resources */, 253 | 607FACDD1AFB9204008FA782 /* Images.xcassets in Resources */, 254 | ); 255 | runOnlyForDeploymentPostprocessing = 0; 256 | }; 257 | 607FACE31AFB9204008FA782 /* Resources */ = { 258 | isa = PBXResourcesBuildPhase; 259 | buildActionMask = 2147483647; 260 | files = ( 261 | ); 262 | runOnlyForDeploymentPostprocessing = 0; 263 | }; 264 | /* End PBXResourcesBuildPhase section */ 265 | 266 | /* Begin PBXShellScriptBuildPhase section */ 267 | 51C8DD2831DA5BC02210498E /* [CP] Check Pods Manifest.lock */ = { 268 | isa = PBXShellScriptBuildPhase; 269 | buildActionMask = 2147483647; 270 | files = ( 271 | ); 272 | inputFileListPaths = ( 273 | ); 274 | inputPaths = ( 275 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 276 | "${PODS_ROOT}/Manifest.lock", 277 | ); 278 | name = "[CP] Check Pods Manifest.lock"; 279 | outputFileListPaths = ( 280 | ); 281 | outputPaths = ( 282 | "$(DERIVED_FILE_DIR)/Pods-Hash_Tests-checkManifestLockResult.txt", 283 | ); 284 | runOnlyForDeploymentPostprocessing = 0; 285 | shellPath = /bin/sh; 286 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 287 | showEnvVarsInLog = 0; 288 | }; 289 | B548543A334BB2A45FEC1F5C /* [CP] Check Pods Manifest.lock */ = { 290 | isa = PBXShellScriptBuildPhase; 291 | buildActionMask = 2147483647; 292 | files = ( 293 | ); 294 | inputFileListPaths = ( 295 | ); 296 | inputPaths = ( 297 | "${PODS_PODFILE_DIR_PATH}/Podfile.lock", 298 | "${PODS_ROOT}/Manifest.lock", 299 | ); 300 | name = "[CP] Check Pods Manifest.lock"; 301 | outputFileListPaths = ( 302 | ); 303 | outputPaths = ( 304 | "$(DERIVED_FILE_DIR)/Pods-Hash_Example-checkManifestLockResult.txt", 305 | ); 306 | runOnlyForDeploymentPostprocessing = 0; 307 | shellPath = /bin/sh; 308 | shellScript = "diff \"${PODS_PODFILE_DIR_PATH}/Podfile.lock\" \"${PODS_ROOT}/Manifest.lock\" > /dev/null\nif [ $? != 0 ] ; then\n # print error to STDERR\n echo \"error: The sandbox is not in sync with the Podfile.lock. Run 'pod install' or update your CocoaPods installation.\" >&2\n exit 1\nfi\n# This output is used by Xcode 'outputs' to avoid re-running this script phase.\necho \"SUCCESS\" > \"${SCRIPT_OUTPUT_FILE_0}\"\n"; 309 | showEnvVarsInLog = 0; 310 | }; 311 | F2D8703EE72CB09912433F74 /* [CP] Embed Pods Frameworks */ = { 312 | isa = PBXShellScriptBuildPhase; 313 | buildActionMask = 2147483647; 314 | files = ( 315 | ); 316 | inputPaths = ( 317 | "${PODS_ROOT}/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-frameworks.sh", 318 | "${BUILT_PRODUCTS_DIR}/Hash/Hash.framework", 319 | ); 320 | name = "[CP] Embed Pods Frameworks"; 321 | outputPaths = ( 322 | "${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Hash.framework", 323 | ); 324 | runOnlyForDeploymentPostprocessing = 0; 325 | shellPath = /bin/sh; 326 | shellScript = "\"${PODS_ROOT}/Target Support Files/Pods-Hash_Example/Pods-Hash_Example-frameworks.sh\"\n"; 327 | showEnvVarsInLog = 0; 328 | }; 329 | /* End PBXShellScriptBuildPhase section */ 330 | 331 | /* Begin PBXSourcesBuildPhase section */ 332 | 607FACCC1AFB9204008FA782 /* Sources */ = { 333 | isa = PBXSourcesBuildPhase; 334 | buildActionMask = 2147483647; 335 | files = ( 336 | 607FACD81AFB9204008FA782 /* ViewController.swift in Sources */, 337 | 607FACD61AFB9204008FA782 /* AppDelegate.swift in Sources */, 338 | ); 339 | runOnlyForDeploymentPostprocessing = 0; 340 | }; 341 | 607FACE11AFB9204008FA782 /* Sources */ = { 342 | isa = PBXSourcesBuildPhase; 343 | buildActionMask = 2147483647; 344 | files = ( 345 | 132D23D322BA5F6D00B5938E /* HashAlgorithm+ExpectedString.swift in Sources */, 346 | 607FACEC1AFB9204008FA782 /* Tests.swift in Sources */, 347 | ); 348 | runOnlyForDeploymentPostprocessing = 0; 349 | }; 350 | /* End PBXSourcesBuildPhase section */ 351 | 352 | /* Begin PBXTargetDependency section */ 353 | 607FACE71AFB9204008FA782 /* PBXTargetDependency */ = { 354 | isa = PBXTargetDependency; 355 | target = 607FACCF1AFB9204008FA782 /* Hash_Example */; 356 | targetProxy = 607FACE61AFB9204008FA782 /* PBXContainerItemProxy */; 357 | }; 358 | /* End PBXTargetDependency section */ 359 | 360 | /* Begin PBXVariantGroup section */ 361 | 607FACD91AFB9204008FA782 /* Main.storyboard */ = { 362 | isa = PBXVariantGroup; 363 | children = ( 364 | 607FACDA1AFB9204008FA782 /* Base */, 365 | ); 366 | name = Main.storyboard; 367 | sourceTree = ""; 368 | }; 369 | 607FACDE1AFB9204008FA782 /* LaunchScreen.xib */ = { 370 | isa = PBXVariantGroup; 371 | children = ( 372 | 607FACDF1AFB9204008FA782 /* Base */, 373 | ); 374 | name = LaunchScreen.xib; 375 | sourceTree = ""; 376 | }; 377 | /* End PBXVariantGroup section */ 378 | 379 | /* Begin XCBuildConfiguration section */ 380 | 607FACED1AFB9204008FA782 /* Debug */ = { 381 | isa = XCBuildConfiguration; 382 | buildSettings = { 383 | ALWAYS_SEARCH_USER_PATHS = NO; 384 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 385 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 386 | CLANG_CXX_LIBRARY = "libc++"; 387 | CLANG_ENABLE_MODULES = YES; 388 | CLANG_ENABLE_OBJC_ARC = YES; 389 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 390 | CLANG_WARN_BOOL_CONVERSION = YES; 391 | CLANG_WARN_COMMA = YES; 392 | CLANG_WARN_CONSTANT_CONVERSION = YES; 393 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 394 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 395 | CLANG_WARN_EMPTY_BODY = YES; 396 | CLANG_WARN_ENUM_CONVERSION = YES; 397 | CLANG_WARN_INFINITE_RECURSION = YES; 398 | CLANG_WARN_INT_CONVERSION = YES; 399 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 400 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 401 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 402 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 403 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 404 | CLANG_WARN_STRICT_PROTOTYPES = YES; 405 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 406 | CLANG_WARN_UNREACHABLE_CODE = YES; 407 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 408 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 409 | COPY_PHASE_STRIP = NO; 410 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 411 | ENABLE_STRICT_OBJC_MSGSEND = YES; 412 | ENABLE_TESTABILITY = YES; 413 | GCC_C_LANGUAGE_STANDARD = gnu99; 414 | GCC_DYNAMIC_NO_PIC = NO; 415 | GCC_NO_COMMON_BLOCKS = YES; 416 | GCC_OPTIMIZATION_LEVEL = 0; 417 | GCC_PREPROCESSOR_DEFINITIONS = ( 418 | "DEBUG=1", 419 | "$(inherited)", 420 | ); 421 | GCC_SYMBOLS_PRIVATE_EXTERN = NO; 422 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 423 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 424 | GCC_WARN_UNDECLARED_SELECTOR = YES; 425 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 426 | GCC_WARN_UNUSED_FUNCTION = YES; 427 | GCC_WARN_UNUSED_VARIABLE = YES; 428 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 429 | MTL_ENABLE_DEBUG_INFO = YES; 430 | ONLY_ACTIVE_ARCH = YES; 431 | SDKROOT = iphoneos; 432 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 433 | }; 434 | name = Debug; 435 | }; 436 | 607FACEE1AFB9204008FA782 /* Release */ = { 437 | isa = XCBuildConfiguration; 438 | buildSettings = { 439 | ALWAYS_SEARCH_USER_PATHS = NO; 440 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 441 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; 442 | CLANG_CXX_LIBRARY = "libc++"; 443 | CLANG_ENABLE_MODULES = YES; 444 | CLANG_ENABLE_OBJC_ARC = YES; 445 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 446 | CLANG_WARN_BOOL_CONVERSION = YES; 447 | CLANG_WARN_COMMA = YES; 448 | CLANG_WARN_CONSTANT_CONVERSION = YES; 449 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 450 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 451 | CLANG_WARN_EMPTY_BODY = YES; 452 | CLANG_WARN_ENUM_CONVERSION = YES; 453 | CLANG_WARN_INFINITE_RECURSION = YES; 454 | CLANG_WARN_INT_CONVERSION = YES; 455 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 456 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 457 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 458 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 459 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 460 | CLANG_WARN_STRICT_PROTOTYPES = YES; 461 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 462 | CLANG_WARN_UNREACHABLE_CODE = YES; 463 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 464 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; 465 | COPY_PHASE_STRIP = NO; 466 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 467 | ENABLE_NS_ASSERTIONS = NO; 468 | ENABLE_STRICT_OBJC_MSGSEND = YES; 469 | GCC_C_LANGUAGE_STANDARD = gnu99; 470 | GCC_NO_COMMON_BLOCKS = YES; 471 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 472 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 473 | GCC_WARN_UNDECLARED_SELECTOR = YES; 474 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 475 | GCC_WARN_UNUSED_FUNCTION = YES; 476 | GCC_WARN_UNUSED_VARIABLE = YES; 477 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 478 | MTL_ENABLE_DEBUG_INFO = NO; 479 | SDKROOT = iphoneos; 480 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 481 | VALIDATE_PRODUCT = YES; 482 | }; 483 | name = Release; 484 | }; 485 | 607FACF01AFB9204008FA782 /* Debug */ = { 486 | isa = XCBuildConfiguration; 487 | baseConfigurationReference = FFBCD70A71AF7A1C87A794CE /* Pods-Hash_Example.debug.xcconfig */; 488 | buildSettings = { 489 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 490 | INFOPLIST_FILE = Hash/Info.plist; 491 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 492 | MODULE_NAME = ExampleApp; 493 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 494 | PRODUCT_NAME = "$(TARGET_NAME)"; 495 | SWIFT_VERSION = 5.0; 496 | }; 497 | name = Debug; 498 | }; 499 | 607FACF11AFB9204008FA782 /* Release */ = { 500 | isa = XCBuildConfiguration; 501 | baseConfigurationReference = F33DF5E535B5218B8D5EFE2C /* Pods-Hash_Example.release.xcconfig */; 502 | buildSettings = { 503 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; 504 | INFOPLIST_FILE = Hash/Info.plist; 505 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; 506 | MODULE_NAME = ExampleApp; 507 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.demo.$(PRODUCT_NAME:rfc1034identifier)"; 508 | PRODUCT_NAME = "$(TARGET_NAME)"; 509 | SWIFT_VERSION = 5.0; 510 | }; 511 | name = Release; 512 | }; 513 | 607FACF31AFB9204008FA782 /* Debug */ = { 514 | isa = XCBuildConfiguration; 515 | baseConfigurationReference = A8FE7855F9224AA4A50D255F /* Pods-Hash_Tests.debug.xcconfig */; 516 | buildSettings = { 517 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 518 | GCC_PREPROCESSOR_DEFINITIONS = ( 519 | "DEBUG=1", 520 | "$(inherited)", 521 | ); 522 | INFOPLIST_FILE = Tests/Info.plist; 523 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 524 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 525 | PRODUCT_NAME = "$(TARGET_NAME)"; 526 | SWIFT_VERSION = 5.0; 527 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Hash_Example.app/Hash_Example"; 528 | }; 529 | name = Debug; 530 | }; 531 | 607FACF41AFB9204008FA782 /* Release */ = { 532 | isa = XCBuildConfiguration; 533 | baseConfigurationReference = 934AB20D2D6F0AAD1317F698 /* Pods-Hash_Tests.release.xcconfig */; 534 | buildSettings = { 535 | FRAMEWORK_SEARCH_PATHS = "$(inherited)"; 536 | INFOPLIST_FILE = Tests/Info.plist; 537 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 538 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.$(PRODUCT_NAME:rfc1034identifier)"; 539 | PRODUCT_NAME = "$(TARGET_NAME)"; 540 | SWIFT_VERSION = 5.0; 541 | TEST_HOST = "$(BUILT_PRODUCTS_DIR)/Hash_Example.app/Hash_Example"; 542 | }; 543 | name = Release; 544 | }; 545 | /* End XCBuildConfiguration section */ 546 | 547 | /* Begin XCConfigurationList section */ 548 | 607FACCB1AFB9204008FA782 /* Build configuration list for PBXProject "Hash" */ = { 549 | isa = XCConfigurationList; 550 | buildConfigurations = ( 551 | 607FACED1AFB9204008FA782 /* Debug */, 552 | 607FACEE1AFB9204008FA782 /* Release */, 553 | ); 554 | defaultConfigurationIsVisible = 0; 555 | defaultConfigurationName = Release; 556 | }; 557 | 607FACEF1AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Hash_Example" */ = { 558 | isa = XCConfigurationList; 559 | buildConfigurations = ( 560 | 607FACF01AFB9204008FA782 /* Debug */, 561 | 607FACF11AFB9204008FA782 /* Release */, 562 | ); 563 | defaultConfigurationIsVisible = 0; 564 | defaultConfigurationName = Release; 565 | }; 566 | 607FACF21AFB9204008FA782 /* Build configuration list for PBXNativeTarget "Hash_Tests" */ = { 567 | isa = XCConfigurationList; 568 | buildConfigurations = ( 569 | 607FACF31AFB9204008FA782 /* Debug */, 570 | 607FACF41AFB9204008FA782 /* Release */, 571 | ); 572 | defaultConfigurationIsVisible = 0; 573 | defaultConfigurationName = Release; 574 | }; 575 | /* End XCConfigurationList section */ 576 | }; 577 | rootObject = 607FACC81AFB9204008FA782 /* Project object */; 578 | } 579 | -------------------------------------------------------------------------------- /Example/Pods/Pods.xcodeproj/project.pbxproj: -------------------------------------------------------------------------------- 1 | // !$*UTF8*$! 2 | { 3 | archiveVersion = 1; 4 | classes = { 5 | }; 6 | objectVersion = 46; 7 | objects = { 8 | 9 | /* Begin PBXBuildFile section */ 10 | 1375E32022D63048003AC429 /* StringRepresentable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31322D63048003AC429 /* StringRepresentable.swift */; }; 11 | 1375E32122D63048003AC429 /* StringAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31422D63048003AC429 /* StringAdditions.swift */; }; 12 | 1375E32222D63048003AC429 /* DataAdditions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31522D63048003AC429 /* DataAdditions.swift */; }; 13 | 1375E32322D63048003AC429 /* Hash.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31722D63048003AC429 /* Hash.swift */; }; 14 | 1375E32422D63048003AC429 /* HashAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31822D63048003AC429 /* HashAlgorithm.swift */; }; 15 | 1375E32522D63048003AC429 /* EncryptionAlgorithm.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31A22D63048003AC429 /* EncryptionAlgorithm.swift */; }; 16 | 1375E32622D63048003AC429 /* EncryptedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31B22D63048003AC429 /* EncryptedData.swift */; }; 17 | 1375E32722D63048003AC429 /* DecryptedData.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31C22D63048003AC429 /* DecryptedData.swift */; }; 18 | 1375E32822D63048003AC429 /* Cryptable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31D22D63048003AC429 /* Cryptable.swift */; }; 19 | 1375E32922D63048003AC429 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1375E31F22D63048003AC429 /* HMAC.swift */; }; 20 | 2F8BD05949E34D1843F1488E420EBF1C /* Hash-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = E2E97E316CA5D4810A11AA1922678BFE /* Hash-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 21 | 3A23FC3C455689ADF5C885AB017A0F67 /* Pods-Hash_Tests-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7D81AFEF7B0C048046DD4335A64DA58C /* Pods-Hash_Tests-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 22 | 6601C40A2E3474CB1B7365D3677D8145 /* Pods-Hash_Example-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2534C2C667B2AEF1DB824E240466F270 /* Pods-Hash_Example-dummy.m */; }; 23 | 7CED70EE2DBB4B774D665820EE4EB3CA /* Pods-Hash_Example-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = A9369E84DABB9A6C9AD8E2EC9A0160E6 /* Pods-Hash_Example-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; 24 | 7DA717408B875A49A3DD89CE47656D47 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; 25 | C5082BADA6F038FCA5D07C7C6D985564 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; 26 | DF8BCAB1BF5734A4BA074E5EAF459544 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */; }; 27 | F0949F113649DD30AE18962FF1FB8950 /* Hash-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E9408C914D3F0D65226C0E2444A9331 /* Hash-dummy.m */; }; 28 | FD700FFE9C9DEE95C7616A9D4175A539 /* Pods-Hash_Tests-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 2DE51AB76DE8B78BF9B33BBED09DB93F /* Pods-Hash_Tests-dummy.m */; }; 29 | /* End PBXBuildFile section */ 30 | 31 | /* Begin PBXContainerItemProxy section */ 32 | 13A129FAE8788BBDE748A4B14F8CCDB8 /* PBXContainerItemProxy */ = { 33 | isa = PBXContainerItemProxy; 34 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 35 | proxyType = 1; 36 | remoteGlobalIDString = 083780B8B05833A821C66D62F3E91F97; 37 | remoteInfo = "Pods-Hash_Example"; 38 | }; 39 | 7B3A5DE260DBD5ADE62F1FC127CCB6B8 /* PBXContainerItemProxy */ = { 40 | isa = PBXContainerItemProxy; 41 | containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; 42 | proxyType = 1; 43 | remoteGlobalIDString = 531D6A44CA7E4210EE4729AF9E8C5651; 44 | remoteInfo = Hash; 45 | }; 46 | /* End PBXContainerItemProxy section */ 47 | 48 | /* Begin PBXFileReference section */ 49 | 0DA449A2E999FC7FD661AD4CB70B52DB /* Hash.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Hash.xcconfig; sourceTree = ""; }; 50 | 119D8CF4C4601F731B7772DFF1FEBB53 /* Pods-Hash_Example-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Hash_Example-acknowledgements.plist"; sourceTree = ""; }; 51 | 1375E31322D63048003AC429 /* StringRepresentable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringRepresentable.swift; sourceTree = ""; }; 52 | 1375E31422D63048003AC429 /* StringAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StringAdditions.swift; sourceTree = ""; }; 53 | 1375E31522D63048003AC429 /* DataAdditions.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DataAdditions.swift; sourceTree = ""; }; 54 | 1375E31722D63048003AC429 /* Hash.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Hash.swift; sourceTree = ""; }; 55 | 1375E31822D63048003AC429 /* HashAlgorithm.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HashAlgorithm.swift; sourceTree = ""; }; 56 | 1375E31A22D63048003AC429 /* EncryptionAlgorithm.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncryptionAlgorithm.swift; sourceTree = ""; }; 57 | 1375E31B22D63048003AC429 /* EncryptedData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EncryptedData.swift; sourceTree = ""; }; 58 | 1375E31C22D63048003AC429 /* DecryptedData.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = DecryptedData.swift; sourceTree = ""; }; 59 | 1375E31D22D63048003AC429 /* Cryptable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cryptable.swift; sourceTree = ""; }; 60 | 1375E31F22D63048003AC429 /* HMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMAC.swift; sourceTree = ""; }; 61 | 2534C2C667B2AEF1DB824E240466F270 /* Pods-Hash_Example-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Hash_Example-dummy.m"; sourceTree = ""; }; 62 | 2DE51AB76DE8B78BF9B33BBED09DB93F /* Pods-Hash_Tests-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-Hash_Tests-dummy.m"; sourceTree = ""; }; 63 | 2F56E06C4BD14BAC62B5F12A52265DA6 /* Pods-Hash_Tests-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Hash_Tests-acknowledgements.markdown"; sourceTree = ""; }; 64 | 337750B30D2D0ACEC5B2CE02E80B0156 /* Pods-Hash_Example-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-Hash_Example-acknowledgements.markdown"; sourceTree = ""; }; 65 | 4309121175518E3733C035BA9F7DAC0C /* Hash.podspec */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; path = Hash.podspec; sourceTree = ""; tabWidth = 2; }; 66 | 516F123242A486CC661CCC85B15F7BB3 /* Pods-Hash_Tests.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Hash_Tests.modulemap"; sourceTree = ""; }; 67 | 531D0B2AF403FB2E913FB55BB8EA4535 /* LICENSE */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = LICENSE; sourceTree = ""; }; 68 | 5E9408C914D3F0D65226C0E2444A9331 /* Hash-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Hash-dummy.m"; sourceTree = ""; }; 69 | 6A8DFF529EEC2248D153A770301576DD /* README.md */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = net.daringfireball.markdown; path = README.md; sourceTree = ""; }; 70 | 70F345821ADED1FA96631743C002E103 /* Pods_Hash_Tests.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Hash_Tests.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 71 | 792A92E9AC1839B51D0F93222F056A74 /* Hash.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Hash.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 72 | 7AAB399BA7BBFCBCF8269B535A05F2C1 /* Pods_Hash_Example.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = Pods_Hash_Example.framework; sourceTree = BUILT_PRODUCTS_DIR; }; 73 | 7D81AFEF7B0C048046DD4335A64DA58C /* Pods-Hash_Tests-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Hash_Tests-umbrella.h"; sourceTree = ""; }; 74 | 860F177DEA7E2073D168052F5D1B6E5E /* Hash-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Hash-prefix.pch"; sourceTree = ""; }; 75 | 87D2B4CD1452B46D4C28E45EC51808B2 /* Pods-Hash_Example.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-Hash_Example.modulemap"; sourceTree = ""; }; 76 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; 77 | A9369E84DABB9A6C9AD8E2EC9A0160E6 /* Pods-Hash_Example-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-Hash_Example-umbrella.h"; sourceTree = ""; }; 78 | B2FFC5F5CCCD43A043552FC624AD5FF3 /* Pods-Hash_Tests.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Hash_Tests.debug.xcconfig"; sourceTree = ""; }; 79 | BDF10AACAB250365A49E1EFC13747CF3 /* Hash.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Hash.modulemap; sourceTree = ""; }; 80 | BED7680F035E182CAA1EC71DF4A4569C /* Hash-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Hash-Info.plist"; sourceTree = ""; }; 81 | CA4F38DD2E84FB712F21F2B900D08300 /* Pods-Hash_Example.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Hash_Example.debug.xcconfig"; sourceTree = ""; }; 82 | CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS12.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; 83 | DB3481B5AADDC3D42F37C8C44B8A9568 /* Pods-Hash_Example-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-Hash_Example-frameworks.sh"; sourceTree = ""; }; 84 | DBE231E059985BBFBF7A3691FA6591EB /* Pods-Hash_Tests-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Hash_Tests-Info.plist"; sourceTree = ""; }; 85 | DF83ACC2CD7C3A6A213453EFD665DADA /* Pods-Hash_Example-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Hash_Example-Info.plist"; sourceTree = ""; }; 86 | E2E97E316CA5D4810A11AA1922678BFE /* Hash-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Hash-umbrella.h"; sourceTree = ""; }; 87 | E2EC0C86D6784A6A40992F3EA3AA9774 /* Pods-Hash_Tests-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-Hash_Tests-acknowledgements.plist"; sourceTree = ""; }; 88 | E724918915E9EAA634AFF42F0FE716A9 /* Pods-Hash_Tests.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Hash_Tests.release.xcconfig"; sourceTree = ""; }; 89 | EA0FB31858C9B881528C4FA56854A315 /* Pods-Hash_Example.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-Hash_Example.release.xcconfig"; sourceTree = ""; }; 90 | /* End PBXFileReference section */ 91 | 92 | /* Begin PBXFrameworksBuildPhase section */ 93 | 00577E41E3F639C99CD20861BFA6BD43 /* Frameworks */ = { 94 | isa = PBXFrameworksBuildPhase; 95 | buildActionMask = 2147483647; 96 | files = ( 97 | 7DA717408B875A49A3DD89CE47656D47 /* Foundation.framework in Frameworks */, 98 | ); 99 | runOnlyForDeploymentPostprocessing = 0; 100 | }; 101 | 07151D80A36484721C2876BF51605A8D /* Frameworks */ = { 102 | isa = PBXFrameworksBuildPhase; 103 | buildActionMask = 2147483647; 104 | files = ( 105 | C5082BADA6F038FCA5D07C7C6D985564 /* Foundation.framework in Frameworks */, 106 | ); 107 | runOnlyForDeploymentPostprocessing = 0; 108 | }; 109 | 35B07699381BCD9A2B3529F5F4665284 /* Frameworks */ = { 110 | isa = PBXFrameworksBuildPhase; 111 | buildActionMask = 2147483647; 112 | files = ( 113 | DF8BCAB1BF5734A4BA074E5EAF459544 /* Foundation.framework in Frameworks */, 114 | ); 115 | runOnlyForDeploymentPostprocessing = 0; 116 | }; 117 | /* End PBXFrameworksBuildPhase section */ 118 | 119 | /* Begin PBXGroup section */ 120 | 12C539A87AC8BD82FFBE0079BC26511D /* Support Files */ = { 121 | isa = PBXGroup; 122 | children = ( 123 | BDF10AACAB250365A49E1EFC13747CF3 /* Hash.modulemap */, 124 | 0DA449A2E999FC7FD661AD4CB70B52DB /* Hash.xcconfig */, 125 | 5E9408C914D3F0D65226C0E2444A9331 /* Hash-dummy.m */, 126 | BED7680F035E182CAA1EC71DF4A4569C /* Hash-Info.plist */, 127 | 860F177DEA7E2073D168052F5D1B6E5E /* Hash-prefix.pch */, 128 | E2E97E316CA5D4810A11AA1922678BFE /* Hash-umbrella.h */, 129 | ); 130 | name = "Support Files"; 131 | path = "Example/Pods/Target Support Files/Hash"; 132 | sourceTree = ""; 133 | }; 134 | 1375E31222D63048003AC429 /* String */ = { 135 | isa = PBXGroup; 136 | children = ( 137 | 1375E31322D63048003AC429 /* StringRepresentable.swift */, 138 | 1375E31422D63048003AC429 /* StringAdditions.swift */, 139 | 1375E31522D63048003AC429 /* DataAdditions.swift */, 140 | ); 141 | name = String; 142 | path = Hash/Classes/String; 143 | sourceTree = ""; 144 | }; 145 | 1375E31622D63048003AC429 /* Message Digest */ = { 146 | isa = PBXGroup; 147 | children = ( 148 | 1375E31722D63048003AC429 /* Hash.swift */, 149 | 1375E31822D63048003AC429 /* HashAlgorithm.swift */, 150 | ); 151 | name = "Message Digest"; 152 | path = "Hash/Classes/Message Digest"; 153 | sourceTree = ""; 154 | }; 155 | 1375E31922D63048003AC429 /* Cryptography */ = { 156 | isa = PBXGroup; 157 | children = ( 158 | 1375E31A22D63048003AC429 /* EncryptionAlgorithm.swift */, 159 | 1375E31B22D63048003AC429 /* EncryptedData.swift */, 160 | 1375E31C22D63048003AC429 /* DecryptedData.swift */, 161 | 1375E31D22D63048003AC429 /* Cryptable.swift */, 162 | ); 163 | name = Cryptography; 164 | path = Hash/Classes/Cryptography; 165 | sourceTree = ""; 166 | }; 167 | 1375E31E22D63048003AC429 /* Message Authentication Codes */ = { 168 | isa = PBXGroup; 169 | children = ( 170 | 1375E31F22D63048003AC429 /* HMAC.swift */, 171 | ); 172 | name = "Message Authentication Codes"; 173 | path = "Hash/Classes/Message Authentication Codes"; 174 | sourceTree = ""; 175 | }; 176 | 3F098001F2152C59EB25C344FE73D7E3 /* Hash */ = { 177 | isa = PBXGroup; 178 | children = ( 179 | 1375E31922D63048003AC429 /* Cryptography */, 180 | 1375E31E22D63048003AC429 /* Message Authentication Codes */, 181 | 1375E31622D63048003AC429 /* Message Digest */, 182 | 1375E31222D63048003AC429 /* String */, 183 | 571C05BA36E5B514CBF07F6F3CFA4432 /* Pod */, 184 | 12C539A87AC8BD82FFBE0079BC26511D /* Support Files */, 185 | ); 186 | name = Hash; 187 | path = ../..; 188 | sourceTree = ""; 189 | }; 190 | 571C05BA36E5B514CBF07F6F3CFA4432 /* Pod */ = { 191 | isa = PBXGroup; 192 | children = ( 193 | 4309121175518E3733C035BA9F7DAC0C /* Hash.podspec */, 194 | 531D0B2AF403FB2E913FB55BB8EA4535 /* LICENSE */, 195 | 6A8DFF529EEC2248D153A770301576DD /* README.md */, 196 | ); 197 | name = Pod; 198 | sourceTree = ""; 199 | }; 200 | 876E5A1F5F63F1E958FB3F8483F37897 /* Pods-Hash_Example */ = { 201 | isa = PBXGroup; 202 | children = ( 203 | 87D2B4CD1452B46D4C28E45EC51808B2 /* Pods-Hash_Example.modulemap */, 204 | 337750B30D2D0ACEC5B2CE02E80B0156 /* Pods-Hash_Example-acknowledgements.markdown */, 205 | 119D8CF4C4601F731B7772DFF1FEBB53 /* Pods-Hash_Example-acknowledgements.plist */, 206 | 2534C2C667B2AEF1DB824E240466F270 /* Pods-Hash_Example-dummy.m */, 207 | DB3481B5AADDC3D42F37C8C44B8A9568 /* Pods-Hash_Example-frameworks.sh */, 208 | DF83ACC2CD7C3A6A213453EFD665DADA /* Pods-Hash_Example-Info.plist */, 209 | A9369E84DABB9A6C9AD8E2EC9A0160E6 /* Pods-Hash_Example-umbrella.h */, 210 | CA4F38DD2E84FB712F21F2B900D08300 /* Pods-Hash_Example.debug.xcconfig */, 211 | EA0FB31858C9B881528C4FA56854A315 /* Pods-Hash_Example.release.xcconfig */, 212 | ); 213 | name = "Pods-Hash_Example"; 214 | path = "Target Support Files/Pods-Hash_Example"; 215 | sourceTree = ""; 216 | }; 217 | 9B055D0CFEA43187E72B03DED11F5662 /* iOS */ = { 218 | isa = PBXGroup; 219 | children = ( 220 | CB4607EFCA7C5F75397649E792E2AFCB /* Foundation.framework */, 221 | ); 222 | name = iOS; 223 | sourceTree = ""; 224 | }; 225 | B385BAAC2AF8AB8F450873C1C5F69D44 /* Targets Support Files */ = { 226 | isa = PBXGroup; 227 | children = ( 228 | 876E5A1F5F63F1E958FB3F8483F37897 /* Pods-Hash_Example */, 229 | FC9D1DC4CE8DBCF4187B538719FC75D4 /* Pods-Hash_Tests */, 230 | ); 231 | name = "Targets Support Files"; 232 | sourceTree = ""; 233 | }; 234 | B58B2ED0BBDC5C0A5BA45CB3D84F79E2 /* Development Pods */ = { 235 | isa = PBXGroup; 236 | children = ( 237 | 3F098001F2152C59EB25C344FE73D7E3 /* Hash */, 238 | ); 239 | name = "Development Pods"; 240 | sourceTree = ""; 241 | }; 242 | CF1408CF629C7361332E53B88F7BD30C = { 243 | isa = PBXGroup; 244 | children = ( 245 | 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, 246 | B58B2ED0BBDC5C0A5BA45CB3D84F79E2 /* Development Pods */, 247 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, 248 | D73C41802DF20E953CFC8448A7461A2E /* Products */, 249 | B385BAAC2AF8AB8F450873C1C5F69D44 /* Targets Support Files */, 250 | ); 251 | sourceTree = ""; 252 | }; 253 | D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { 254 | isa = PBXGroup; 255 | children = ( 256 | 9B055D0CFEA43187E72B03DED11F5662 /* iOS */, 257 | ); 258 | name = Frameworks; 259 | sourceTree = ""; 260 | }; 261 | D73C41802DF20E953CFC8448A7461A2E /* Products */ = { 262 | isa = PBXGroup; 263 | children = ( 264 | 792A92E9AC1839B51D0F93222F056A74 /* Hash.framework */, 265 | 7AAB399BA7BBFCBCF8269B535A05F2C1 /* Pods_Hash_Example.framework */, 266 | 70F345821ADED1FA96631743C002E103 /* Pods_Hash_Tests.framework */, 267 | ); 268 | name = Products; 269 | sourceTree = ""; 270 | }; 271 | FC9D1DC4CE8DBCF4187B538719FC75D4 /* Pods-Hash_Tests */ = { 272 | isa = PBXGroup; 273 | children = ( 274 | 516F123242A486CC661CCC85B15F7BB3 /* Pods-Hash_Tests.modulemap */, 275 | 2F56E06C4BD14BAC62B5F12A52265DA6 /* Pods-Hash_Tests-acknowledgements.markdown */, 276 | E2EC0C86D6784A6A40992F3EA3AA9774 /* Pods-Hash_Tests-acknowledgements.plist */, 277 | 2DE51AB76DE8B78BF9B33BBED09DB93F /* Pods-Hash_Tests-dummy.m */, 278 | DBE231E059985BBFBF7A3691FA6591EB /* Pods-Hash_Tests-Info.plist */, 279 | 7D81AFEF7B0C048046DD4335A64DA58C /* Pods-Hash_Tests-umbrella.h */, 280 | B2FFC5F5CCCD43A043552FC624AD5FF3 /* Pods-Hash_Tests.debug.xcconfig */, 281 | E724918915E9EAA634AFF42F0FE716A9 /* Pods-Hash_Tests.release.xcconfig */, 282 | ); 283 | name = "Pods-Hash_Tests"; 284 | path = "Target Support Files/Pods-Hash_Tests"; 285 | sourceTree = ""; 286 | }; 287 | /* End PBXGroup section */ 288 | 289 | /* Begin PBXHeadersBuildPhase section */ 290 | 1B1BAEC85FC2CFC3071BC930EBD86143 /* Headers */ = { 291 | isa = PBXHeadersBuildPhase; 292 | buildActionMask = 2147483647; 293 | files = ( 294 | 3A23FC3C455689ADF5C885AB017A0F67 /* Pods-Hash_Tests-umbrella.h in Headers */, 295 | ); 296 | runOnlyForDeploymentPostprocessing = 0; 297 | }; 298 | D819F0921A4A3761031B0B064A93F51E /* Headers */ = { 299 | isa = PBXHeadersBuildPhase; 300 | buildActionMask = 2147483647; 301 | files = ( 302 | 2F8BD05949E34D1843F1488E420EBF1C /* Hash-umbrella.h in Headers */, 303 | ); 304 | runOnlyForDeploymentPostprocessing = 0; 305 | }; 306 | DDA5BEDFF42F8A03228445DE67F114CB /* Headers */ = { 307 | isa = PBXHeadersBuildPhase; 308 | buildActionMask = 2147483647; 309 | files = ( 310 | 7CED70EE2DBB4B774D665820EE4EB3CA /* Pods-Hash_Example-umbrella.h in Headers */, 311 | ); 312 | runOnlyForDeploymentPostprocessing = 0; 313 | }; 314 | /* End PBXHeadersBuildPhase section */ 315 | 316 | /* Begin PBXNativeTarget section */ 317 | 083780B8B05833A821C66D62F3E91F97 /* Pods-Hash_Example */ = { 318 | isa = PBXNativeTarget; 319 | buildConfigurationList = 35EE9D1571B3D0C4541A563EFE957A37 /* Build configuration list for PBXNativeTarget "Pods-Hash_Example" */; 320 | buildPhases = ( 321 | DDA5BEDFF42F8A03228445DE67F114CB /* Headers */, 322 | 12C235BB99F9F5326110726446C857F9 /* Sources */, 323 | 07151D80A36484721C2876BF51605A8D /* Frameworks */, 324 | 8D11B558E87FF844FC199EC4F60CBC15 /* Resources */, 325 | ); 326 | buildRules = ( 327 | ); 328 | dependencies = ( 329 | 6C30711C04B07FEAEE084625640CA23A /* PBXTargetDependency */, 330 | ); 331 | name = "Pods-Hash_Example"; 332 | productName = "Pods-Hash_Example"; 333 | productReference = 7AAB399BA7BBFCBCF8269B535A05F2C1 /* Pods_Hash_Example.framework */; 334 | productType = "com.apple.product-type.framework"; 335 | }; 336 | 531D6A44CA7E4210EE4729AF9E8C5651 /* Hash */ = { 337 | isa = PBXNativeTarget; 338 | buildConfigurationList = F50AFDEC0054740C674BAF2A9590BE34 /* Build configuration list for PBXNativeTarget "Hash" */; 339 | buildPhases = ( 340 | D819F0921A4A3761031B0B064A93F51E /* Headers */, 341 | 8CC0EFDEE7F412C16D5DD044395090DB /* Sources */, 342 | 35B07699381BCD9A2B3529F5F4665284 /* Frameworks */, 343 | 425919A63055465D4BCEACC6262FCAC6 /* Resources */, 344 | ); 345 | buildRules = ( 346 | ); 347 | dependencies = ( 348 | ); 349 | name = Hash; 350 | productName = Hash; 351 | productReference = 792A92E9AC1839B51D0F93222F056A74 /* Hash.framework */; 352 | productType = "com.apple.product-type.framework"; 353 | }; 354 | 69175DE89F0D5E8087A7D2BF6EC768D3 /* Pods-Hash_Tests */ = { 355 | isa = PBXNativeTarget; 356 | buildConfigurationList = 71779CE0D0EC5F54B19FEC01027A3977 /* Build configuration list for PBXNativeTarget "Pods-Hash_Tests" */; 357 | buildPhases = ( 358 | 1B1BAEC85FC2CFC3071BC930EBD86143 /* Headers */, 359 | 4E96F05FBD3CED8D4CAC3332CE504D3C /* Sources */, 360 | 00577E41E3F639C99CD20861BFA6BD43 /* Frameworks */, 361 | A9574481F2198A1A39FA91EA28E2F2C7 /* Resources */, 362 | ); 363 | buildRules = ( 364 | ); 365 | dependencies = ( 366 | BBDDBF166579C9E972013A99189FE611 /* PBXTargetDependency */, 367 | ); 368 | name = "Pods-Hash_Tests"; 369 | productName = "Pods-Hash_Tests"; 370 | productReference = 70F345821ADED1FA96631743C002E103 /* Pods_Hash_Tests.framework */; 371 | productType = "com.apple.product-type.framework"; 372 | }; 373 | /* End PBXNativeTarget section */ 374 | 375 | /* Begin PBXProject section */ 376 | BFDFE7DC352907FC980B868725387E98 /* Project object */ = { 377 | isa = PBXProject; 378 | attributes = { 379 | LastSwiftUpdateCheck = 0930; 380 | LastUpgradeCheck = 1020; 381 | TargetAttributes = { 382 | 531D6A44CA7E4210EE4729AF9E8C5651 = { 383 | LastSwiftMigration = 1020; 384 | }; 385 | }; 386 | }; 387 | buildConfigurationList = 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */; 388 | compatibilityVersion = "Xcode 3.2"; 389 | developmentRegion = en; 390 | hasScannedForEncodings = 0; 391 | knownRegions = ( 392 | en, 393 | Base, 394 | ); 395 | mainGroup = CF1408CF629C7361332E53B88F7BD30C; 396 | productRefGroup = D73C41802DF20E953CFC8448A7461A2E /* Products */; 397 | projectDirPath = ""; 398 | projectRoot = ""; 399 | targets = ( 400 | 531D6A44CA7E4210EE4729AF9E8C5651 /* Hash */, 401 | 083780B8B05833A821C66D62F3E91F97 /* Pods-Hash_Example */, 402 | 69175DE89F0D5E8087A7D2BF6EC768D3 /* Pods-Hash_Tests */, 403 | ); 404 | }; 405 | /* End PBXProject section */ 406 | 407 | /* Begin PBXResourcesBuildPhase section */ 408 | 425919A63055465D4BCEACC6262FCAC6 /* Resources */ = { 409 | isa = PBXResourcesBuildPhase; 410 | buildActionMask = 2147483647; 411 | files = ( 412 | ); 413 | runOnlyForDeploymentPostprocessing = 0; 414 | }; 415 | 8D11B558E87FF844FC199EC4F60CBC15 /* Resources */ = { 416 | isa = PBXResourcesBuildPhase; 417 | buildActionMask = 2147483647; 418 | files = ( 419 | ); 420 | runOnlyForDeploymentPostprocessing = 0; 421 | }; 422 | A9574481F2198A1A39FA91EA28E2F2C7 /* Resources */ = { 423 | isa = PBXResourcesBuildPhase; 424 | buildActionMask = 2147483647; 425 | files = ( 426 | ); 427 | runOnlyForDeploymentPostprocessing = 0; 428 | }; 429 | /* End PBXResourcesBuildPhase section */ 430 | 431 | /* Begin PBXSourcesBuildPhase section */ 432 | 12C235BB99F9F5326110726446C857F9 /* Sources */ = { 433 | isa = PBXSourcesBuildPhase; 434 | buildActionMask = 2147483647; 435 | files = ( 436 | 6601C40A2E3474CB1B7365D3677D8145 /* Pods-Hash_Example-dummy.m in Sources */, 437 | ); 438 | runOnlyForDeploymentPostprocessing = 0; 439 | }; 440 | 4E96F05FBD3CED8D4CAC3332CE504D3C /* Sources */ = { 441 | isa = PBXSourcesBuildPhase; 442 | buildActionMask = 2147483647; 443 | files = ( 444 | FD700FFE9C9DEE95C7616A9D4175A539 /* Pods-Hash_Tests-dummy.m in Sources */, 445 | ); 446 | runOnlyForDeploymentPostprocessing = 0; 447 | }; 448 | 8CC0EFDEE7F412C16D5DD044395090DB /* Sources */ = { 449 | isa = PBXSourcesBuildPhase; 450 | buildActionMask = 2147483647; 451 | files = ( 452 | 1375E32322D63048003AC429 /* Hash.swift in Sources */, 453 | F0949F113649DD30AE18962FF1FB8950 /* Hash-dummy.m in Sources */, 454 | 1375E32722D63048003AC429 /* DecryptedData.swift in Sources */, 455 | 1375E32022D63048003AC429 /* StringRepresentable.swift in Sources */, 456 | 1375E32522D63048003AC429 /* EncryptionAlgorithm.swift in Sources */, 457 | 1375E32422D63048003AC429 /* HashAlgorithm.swift in Sources */, 458 | 1375E32822D63048003AC429 /* Cryptable.swift in Sources */, 459 | 1375E32122D63048003AC429 /* StringAdditions.swift in Sources */, 460 | 1375E32622D63048003AC429 /* EncryptedData.swift in Sources */, 461 | 1375E32922D63048003AC429 /* HMAC.swift in Sources */, 462 | 1375E32222D63048003AC429 /* DataAdditions.swift in Sources */, 463 | ); 464 | runOnlyForDeploymentPostprocessing = 0; 465 | }; 466 | /* End PBXSourcesBuildPhase section */ 467 | 468 | /* Begin PBXTargetDependency section */ 469 | 6C30711C04B07FEAEE084625640CA23A /* PBXTargetDependency */ = { 470 | isa = PBXTargetDependency; 471 | name = Hash; 472 | target = 531D6A44CA7E4210EE4729AF9E8C5651 /* Hash */; 473 | targetProxy = 7B3A5DE260DBD5ADE62F1FC127CCB6B8 /* PBXContainerItemProxy */; 474 | }; 475 | BBDDBF166579C9E972013A99189FE611 /* PBXTargetDependency */ = { 476 | isa = PBXTargetDependency; 477 | name = "Pods-Hash_Example"; 478 | target = 083780B8B05833A821C66D62F3E91F97 /* Pods-Hash_Example */; 479 | targetProxy = 13A129FAE8788BBDE748A4B14F8CCDB8 /* PBXContainerItemProxy */; 480 | }; 481 | /* End PBXTargetDependency section */ 482 | 483 | /* Begin XCBuildConfiguration section */ 484 | 0E424A9AF4D34A1BC67514D9149DDF64 /* Release */ = { 485 | isa = XCBuildConfiguration; 486 | baseConfigurationReference = 0DA449A2E999FC7FD661AD4CB70B52DB /* Hash.xcconfig */; 487 | buildSettings = { 488 | APPLICATION_EXTENSION_API_ONLY = YES; 489 | CLANG_ENABLE_MODULES = YES; 490 | CODE_SIGN_IDENTITY = ""; 491 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 492 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 493 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 494 | CURRENT_PROJECT_VERSION = 1; 495 | DEFINES_MODULE = YES; 496 | DYLIB_COMPATIBILITY_VERSION = 1; 497 | DYLIB_CURRENT_VERSION = 1; 498 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 499 | GCC_PREFIX_HEADER = "Target Support Files/Hash/Hash-prefix.pch"; 500 | INFOPLIST_FILE = "Target Support Files/Hash/Hash-Info.plist"; 501 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 502 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 503 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 504 | MARKETING_VERSION = 1.5.0; 505 | MODULEMAP_FILE = "Target Support Files/Hash/Hash.modulemap"; 506 | PRODUCT_BUNDLE_IDENTIFIER = com.rwbutler.Hash; 507 | PRODUCT_MODULE_NAME = Hash; 508 | PRODUCT_NAME = Hash; 509 | SDKROOT = ""; 510 | SKIP_INSTALL = YES; 511 | SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; 512 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 513 | SWIFT_VERSION = 5.0; 514 | TARGETED_DEVICE_FAMILY = "1,2"; 515 | VALIDATE_PRODUCT = YES; 516 | VERSIONING_SYSTEM = "apple-generic"; 517 | VERSION_INFO_PREFIX = ""; 518 | }; 519 | name = Release; 520 | }; 521 | 208DB68824118BF7AFA1B988244C0970 /* Debug */ = { 522 | isa = XCBuildConfiguration; 523 | baseConfigurationReference = B2FFC5F5CCCD43A043552FC624AD5FF3 /* Pods-Hash_Tests.debug.xcconfig */; 524 | buildSettings = { 525 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 526 | CODE_SIGN_IDENTITY = ""; 527 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 528 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 529 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 530 | CURRENT_PROJECT_VERSION = 1; 531 | DEFINES_MODULE = YES; 532 | DYLIB_COMPATIBILITY_VERSION = 1; 533 | DYLIB_CURRENT_VERSION = 1; 534 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 535 | INFOPLIST_FILE = "Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-Info.plist"; 536 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 537 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 538 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 539 | MACH_O_TYPE = staticlib; 540 | MODULEMAP_FILE = "Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.modulemap"; 541 | OTHER_LDFLAGS = ""; 542 | OTHER_LIBTOOLFLAGS = ""; 543 | PODS_ROOT = "$(SRCROOT)"; 544 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 545 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 546 | SDKROOT = iphoneos; 547 | SKIP_INSTALL = YES; 548 | TARGETED_DEVICE_FAMILY = "1,2"; 549 | VERSIONING_SYSTEM = "apple-generic"; 550 | VERSION_INFO_PREFIX = ""; 551 | }; 552 | name = Debug; 553 | }; 554 | 3E829AD09869265B44FF550EF9F5D553 /* Release */ = { 555 | isa = XCBuildConfiguration; 556 | baseConfigurationReference = E724918915E9EAA634AFF42F0FE716A9 /* Pods-Hash_Tests.release.xcconfig */; 557 | buildSettings = { 558 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 559 | CODE_SIGN_IDENTITY = ""; 560 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 561 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 562 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 563 | CURRENT_PROJECT_VERSION = 1; 564 | DEFINES_MODULE = YES; 565 | DYLIB_COMPATIBILITY_VERSION = 1; 566 | DYLIB_CURRENT_VERSION = 1; 567 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 568 | INFOPLIST_FILE = "Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests-Info.plist"; 569 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 570 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 571 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 572 | MACH_O_TYPE = staticlib; 573 | MODULEMAP_FILE = "Target Support Files/Pods-Hash_Tests/Pods-Hash_Tests.modulemap"; 574 | OTHER_LDFLAGS = ""; 575 | OTHER_LIBTOOLFLAGS = ""; 576 | PODS_ROOT = "$(SRCROOT)"; 577 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 578 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 579 | SDKROOT = iphoneos; 580 | SKIP_INSTALL = YES; 581 | TARGETED_DEVICE_FAMILY = "1,2"; 582 | VALIDATE_PRODUCT = YES; 583 | VERSIONING_SYSTEM = "apple-generic"; 584 | VERSION_INFO_PREFIX = ""; 585 | }; 586 | name = Release; 587 | }; 588 | 6591FA946F646EE384776ECB85671A2D /* Debug */ = { 589 | isa = XCBuildConfiguration; 590 | baseConfigurationReference = CA4F38DD2E84FB712F21F2B900D08300 /* Pods-Hash_Example.debug.xcconfig */; 591 | buildSettings = { 592 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 593 | CODE_SIGN_IDENTITY = ""; 594 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 595 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 596 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 597 | CURRENT_PROJECT_VERSION = 1; 598 | DEFINES_MODULE = YES; 599 | DYLIB_COMPATIBILITY_VERSION = 1; 600 | DYLIB_CURRENT_VERSION = 1; 601 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 602 | INFOPLIST_FILE = "Target Support Files/Pods-Hash_Example/Pods-Hash_Example-Info.plist"; 603 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 604 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 605 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 606 | MACH_O_TYPE = staticlib; 607 | MODULEMAP_FILE = "Target Support Files/Pods-Hash_Example/Pods-Hash_Example.modulemap"; 608 | OTHER_LDFLAGS = ""; 609 | OTHER_LIBTOOLFLAGS = ""; 610 | PODS_ROOT = "$(SRCROOT)"; 611 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 612 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 613 | SDKROOT = iphoneos; 614 | SKIP_INSTALL = YES; 615 | TARGETED_DEVICE_FAMILY = "1,2"; 616 | VERSIONING_SYSTEM = "apple-generic"; 617 | VERSION_INFO_PREFIX = ""; 618 | }; 619 | name = Debug; 620 | }; 621 | 795F212B1E9FB9F3A6CCD361A7D76296 /* Release */ = { 622 | isa = XCBuildConfiguration; 623 | baseConfigurationReference = EA0FB31858C9B881528C4FA56854A315 /* Pods-Hash_Example.release.xcconfig */; 624 | buildSettings = { 625 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = NO; 626 | CODE_SIGN_IDENTITY = ""; 627 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 628 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 629 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 630 | CURRENT_PROJECT_VERSION = 1; 631 | DEFINES_MODULE = YES; 632 | DYLIB_COMPATIBILITY_VERSION = 1; 633 | DYLIB_CURRENT_VERSION = 1; 634 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 635 | INFOPLIST_FILE = "Target Support Files/Pods-Hash_Example/Pods-Hash_Example-Info.plist"; 636 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 637 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 638 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 639 | MACH_O_TYPE = staticlib; 640 | MODULEMAP_FILE = "Target Support Files/Pods-Hash_Example/Pods-Hash_Example.modulemap"; 641 | OTHER_LDFLAGS = ""; 642 | OTHER_LIBTOOLFLAGS = ""; 643 | PODS_ROOT = "$(SRCROOT)"; 644 | PRODUCT_BUNDLE_IDENTIFIER = "org.cocoapods.${PRODUCT_NAME:rfc1034identifier}"; 645 | PRODUCT_NAME = "$(TARGET_NAME:c99extidentifier)"; 646 | SDKROOT = iphoneos; 647 | SKIP_INSTALL = YES; 648 | TARGETED_DEVICE_FAMILY = "1,2"; 649 | VALIDATE_PRODUCT = YES; 650 | VERSIONING_SYSTEM = "apple-generic"; 651 | VERSION_INFO_PREFIX = ""; 652 | }; 653 | name = Release; 654 | }; 655 | 7DBB98A89401EE1A38A809516BD9085D /* Debug */ = { 656 | isa = XCBuildConfiguration; 657 | baseConfigurationReference = 0DA449A2E999FC7FD661AD4CB70B52DB /* Hash.xcconfig */; 658 | buildSettings = { 659 | APPLICATION_EXTENSION_API_ONLY = YES; 660 | CLANG_ENABLE_MODULES = YES; 661 | CODE_SIGN_IDENTITY = ""; 662 | "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; 663 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; 664 | "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; 665 | CURRENT_PROJECT_VERSION = 1; 666 | DEFINES_MODULE = YES; 667 | DYLIB_COMPATIBILITY_VERSION = 1; 668 | DYLIB_CURRENT_VERSION = 1; 669 | DYLIB_INSTALL_NAME_BASE = "@rpath"; 670 | GCC_PREFIX_HEADER = "Target Support Files/Hash/Hash-prefix.pch"; 671 | INFOPLIST_FILE = "Target Support Files/Hash/Hash-Info.plist"; 672 | INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; 673 | IPHONEOS_DEPLOYMENT_TARGET = 8.0; 674 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; 675 | MARKETING_VERSION = 1.5.0; 676 | MODULEMAP_FILE = "Target Support Files/Hash/Hash.modulemap"; 677 | PRODUCT_BUNDLE_IDENTIFIER = com.rwbutler.Hash; 678 | PRODUCT_MODULE_NAME = Hash; 679 | PRODUCT_NAME = Hash; 680 | SDKROOT = ""; 681 | SKIP_INSTALL = YES; 682 | SUPPORTED_PLATFORMS = "iphonesimulator iphoneos macosx"; 683 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; 684 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 685 | SWIFT_VERSION = 5.0; 686 | TARGETED_DEVICE_FAMILY = "1,2"; 687 | VERSIONING_SYSTEM = "apple-generic"; 688 | VERSION_INFO_PREFIX = ""; 689 | }; 690 | name = Debug; 691 | }; 692 | AB4D69770D8ACE3A05E80BB3502666F6 /* Debug */ = { 693 | isa = XCBuildConfiguration; 694 | buildSettings = { 695 | ALWAYS_SEARCH_USER_PATHS = NO; 696 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 697 | CLANG_ANALYZER_NONNULL = YES; 698 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 699 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 700 | CLANG_CXX_LIBRARY = "libc++"; 701 | CLANG_ENABLE_MODULES = YES; 702 | CLANG_ENABLE_OBJC_ARC = YES; 703 | CLANG_ENABLE_OBJC_WEAK = YES; 704 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 705 | CLANG_WARN_BOOL_CONVERSION = YES; 706 | CLANG_WARN_COMMA = YES; 707 | CLANG_WARN_CONSTANT_CONVERSION = YES; 708 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 709 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 710 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 711 | CLANG_WARN_EMPTY_BODY = YES; 712 | CLANG_WARN_ENUM_CONVERSION = YES; 713 | CLANG_WARN_INFINITE_RECURSION = YES; 714 | CLANG_WARN_INT_CONVERSION = YES; 715 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 716 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 717 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 718 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 719 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 720 | CLANG_WARN_STRICT_PROTOTYPES = YES; 721 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 722 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 723 | CLANG_WARN_UNREACHABLE_CODE = YES; 724 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 725 | COPY_PHASE_STRIP = NO; 726 | DEBUG_INFORMATION_FORMAT = dwarf; 727 | ENABLE_STRICT_OBJC_MSGSEND = YES; 728 | ENABLE_TESTABILITY = YES; 729 | GCC_C_LANGUAGE_STANDARD = gnu11; 730 | GCC_DYNAMIC_NO_PIC = NO; 731 | GCC_NO_COMMON_BLOCKS = YES; 732 | GCC_OPTIMIZATION_LEVEL = 0; 733 | GCC_PREPROCESSOR_DEFINITIONS = ( 734 | "POD_CONFIGURATION_DEBUG=1", 735 | "DEBUG=1", 736 | "$(inherited)", 737 | ); 738 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 739 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 740 | GCC_WARN_UNDECLARED_SELECTOR = YES; 741 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 742 | GCC_WARN_UNUSED_FUNCTION = YES; 743 | GCC_WARN_UNUSED_VARIABLE = YES; 744 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 745 | MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; 746 | MTL_FAST_MATH = YES; 747 | ONLY_ACTIVE_ARCH = YES; 748 | PRODUCT_NAME = "$(TARGET_NAME)"; 749 | STRIP_INSTALLED_PRODUCT = NO; 750 | SWIFT_ACTIVE_COMPILATION_CONDITIONS = DEBUG; 751 | SWIFT_OPTIMIZATION_LEVEL = "-Onone"; 752 | SWIFT_VERSION = 4.2; 753 | SYMROOT = "${SRCROOT}/../build"; 754 | }; 755 | name = Debug; 756 | }; 757 | F232B5ECA11A71BFA199A229B323F454 /* Release */ = { 758 | isa = XCBuildConfiguration; 759 | buildSettings = { 760 | ALWAYS_SEARCH_USER_PATHS = NO; 761 | CLANG_ANALYZER_LOCALIZABILITY_NONLOCALIZED = YES; 762 | CLANG_ANALYZER_NONNULL = YES; 763 | CLANG_ANALYZER_NUMBER_OBJECT_CONVERSION = YES_AGGRESSIVE; 764 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++14"; 765 | CLANG_CXX_LIBRARY = "libc++"; 766 | CLANG_ENABLE_MODULES = YES; 767 | CLANG_ENABLE_OBJC_ARC = YES; 768 | CLANG_ENABLE_OBJC_WEAK = YES; 769 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES; 770 | CLANG_WARN_BOOL_CONVERSION = YES; 771 | CLANG_WARN_COMMA = YES; 772 | CLANG_WARN_CONSTANT_CONVERSION = YES; 773 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES; 774 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; 775 | CLANG_WARN_DOCUMENTATION_COMMENTS = YES; 776 | CLANG_WARN_EMPTY_BODY = YES; 777 | CLANG_WARN_ENUM_CONVERSION = YES; 778 | CLANG_WARN_INFINITE_RECURSION = YES; 779 | CLANG_WARN_INT_CONVERSION = YES; 780 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES; 781 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES; 782 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES; 783 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; 784 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES; 785 | CLANG_WARN_STRICT_PROTOTYPES = YES; 786 | CLANG_WARN_SUSPICIOUS_MOVE = YES; 787 | CLANG_WARN_UNGUARDED_AVAILABILITY = YES_AGGRESSIVE; 788 | CLANG_WARN_UNREACHABLE_CODE = YES; 789 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; 790 | COPY_PHASE_STRIP = NO; 791 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; 792 | ENABLE_NS_ASSERTIONS = NO; 793 | ENABLE_STRICT_OBJC_MSGSEND = YES; 794 | GCC_C_LANGUAGE_STANDARD = gnu11; 795 | GCC_NO_COMMON_BLOCKS = YES; 796 | GCC_PREPROCESSOR_DEFINITIONS = ( 797 | "POD_CONFIGURATION_RELEASE=1", 798 | "$(inherited)", 799 | ); 800 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES; 801 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; 802 | GCC_WARN_UNDECLARED_SELECTOR = YES; 803 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; 804 | GCC_WARN_UNUSED_FUNCTION = YES; 805 | GCC_WARN_UNUSED_VARIABLE = YES; 806 | IPHONEOS_DEPLOYMENT_TARGET = 9.3; 807 | MTL_ENABLE_DEBUG_INFO = NO; 808 | MTL_FAST_MATH = YES; 809 | PRODUCT_NAME = "$(TARGET_NAME)"; 810 | STRIP_INSTALLED_PRODUCT = NO; 811 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule"; 812 | SWIFT_VERSION = 4.2; 813 | SYMROOT = "${SRCROOT}/../build"; 814 | }; 815 | name = Release; 816 | }; 817 | /* End XCBuildConfiguration section */ 818 | 819 | /* Begin XCConfigurationList section */ 820 | 35EE9D1571B3D0C4541A563EFE957A37 /* Build configuration list for PBXNativeTarget "Pods-Hash_Example" */ = { 821 | isa = XCConfigurationList; 822 | buildConfigurations = ( 823 | 6591FA946F646EE384776ECB85671A2D /* Debug */, 824 | 795F212B1E9FB9F3A6CCD361A7D76296 /* Release */, 825 | ); 826 | defaultConfigurationIsVisible = 0; 827 | defaultConfigurationName = Release; 828 | }; 829 | 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { 830 | isa = XCConfigurationList; 831 | buildConfigurations = ( 832 | AB4D69770D8ACE3A05E80BB3502666F6 /* Debug */, 833 | F232B5ECA11A71BFA199A229B323F454 /* Release */, 834 | ); 835 | defaultConfigurationIsVisible = 0; 836 | defaultConfigurationName = Release; 837 | }; 838 | 71779CE0D0EC5F54B19FEC01027A3977 /* Build configuration list for PBXNativeTarget "Pods-Hash_Tests" */ = { 839 | isa = XCConfigurationList; 840 | buildConfigurations = ( 841 | 208DB68824118BF7AFA1B988244C0970 /* Debug */, 842 | 3E829AD09869265B44FF550EF9F5D553 /* Release */, 843 | ); 844 | defaultConfigurationIsVisible = 0; 845 | defaultConfigurationName = Release; 846 | }; 847 | F50AFDEC0054740C674BAF2A9590BE34 /* Build configuration list for PBXNativeTarget "Hash" */ = { 848 | isa = XCConfigurationList; 849 | buildConfigurations = ( 850 | 7DBB98A89401EE1A38A809516BD9085D /* Debug */, 851 | 0E424A9AF4D34A1BC67514D9149DDF64 /* Release */, 852 | ); 853 | defaultConfigurationIsVisible = 0; 854 | defaultConfigurationName = Release; 855 | }; 856 | /* End XCConfigurationList section */ 857 | }; 858 | rootObject = BFDFE7DC352907FC980B868725387E98 /* Project object */; 859 | } 860 | --------------------------------------------------------------------------------