diff --git a/.coveralls.yml b/.coveralls.yml new file mode 100644 index 0000000..9160059 --- /dev/null +++ b/.coveralls.yml @@ -0,0 +1 @@ +service_name: travis-ci diff --git a/.gitignore b/.gitignore index a3cd143..5a3d528 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,5 @@ +prepate_command.txt +CommonCrypto # Xcode # build/ diff --git a/.slather.yml b/.slather.yml new file mode 100644 index 0000000..433015f --- /dev/null +++ b/.slather.yml @@ -0,0 +1,3 @@ +ci_service: travis_ci +coverage_service: coveralls +xcodeproj: IDZSwiftCommonCrypto diff --git a/.travis.yml b/.travis.yml index 0ddbc10..5f71bb9 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,24 @@ language: objective-c - +osx_image: xcode7.1 install: -- npm install -g swift-playground-builder +- npm install -g playground + +env: + matrix: + secure: a2fi02GPkxw27jVjW47EkvB/BW/SOIxlmLQJaiZ3xqbKe4udUxKE0ZigD0nVJDmxpiVHv5/Uc9ZQDPtKvvmU9kakusxjBVqMy+IxCYsH4+aDaATdaY9WHvVbARXJGjE/KmKnTfos/P8G8XqXahNKznql/gF2wZNoQIQD49JNk8s= + +before_install: +- bundle install script: -# Generate README.playground from README.md - echo Available SDKs - xcodebuild -showsdks - make -- git config --global push.default simple -- git diff-files --exit-code; if [[ "$?" == "1" ]]; then git commit -a -m "Playground update from Travis [ci skip]"; git push; fi -- pushd IDZSwiftCommonCrypto - rm -rf CommonCrypto -- ./GenerateCommonCryptoModule iphonesimulator8.1 . +- ./GenerateCommonCryptoModule iphonesimulator9.0 . - cat CommonCrypto/module.map - pwd -- xcodebuild build -scheme IDZSwiftCommonCrypto -destination 'platform=iOS Simulator,name=iPhone 6,OS=8.1' -# Remove testing pending solution to https://github.com/travis-ci/travis-ci/issues/2829 -- xcodebuild test -scheme IDZSwiftCommonCrypto -destination 'platform=iOS Simulator,name=iPhone 6,OS=8.1' -- popd +- xcodebuild build -scheme IDZSwiftCommonCrypto -destination 'platform=iOS Simulator,name=iPhone 6,OS=9.0' +- make test + +after_success: bundle exec slather coverage --input-format profdata IDZSwiftCommonCrypto.xcodeproj diff --git a/.travis.yml.swp b/.travis.yml.swp deleted file mode 100644 index da17597..0000000 Binary files a/.travis.yml.swp and /dev/null differ diff --git a/IDZSwiftCommonCrypto/DemoPlayground.playground/contents.xcplayground b/DemoPlayground.playground/contents.xcplayground similarity index 72% rename from IDZSwiftCommonCrypto/DemoPlayground.playground/contents.xcplayground rename to DemoPlayground.playground/contents.xcplayground index 8e39341..f06e216 100644 --- a/IDZSwiftCommonCrypto/DemoPlayground.playground/contents.xcplayground +++ b/DemoPlayground.playground/contents.xcplayground @@ -1,5 +1,5 @@ - + diff --git a/DemoPlayground.playground/playground.xcworkspace/contents.xcworkspacedata b/DemoPlayground.playground/playground.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/DemoPlayground.playground/playground.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/IDZSwiftCommonCrypto/DemoPlayground.playground/section-1.swift b/DemoPlayground.playground/section-1.swift similarity index 63% rename from IDZSwiftCommonCrypto/DemoPlayground.playground/section-1.swift rename to DemoPlayground.playground/section-1.swift index 07c3a96..bc4c8c6 100644 --- a/IDZSwiftCommonCrypto/DemoPlayground.playground/section-1.swift +++ b/DemoPlayground.playground/section-1.swift @@ -3,10 +3,9 @@ import UIKit import CommonCrypto import IDZSwiftCommonCrypto -var ss = "" +var ss = "" as NSString ss.stringByAppendingPathComponent("hello") - // MARK: - Message Digest Demo let s = "The quick brown fox jumps over the lazy dog." var md5 = Digest(algorithm: .MD5) @@ -14,6 +13,8 @@ md5.update(s) var digest = md5.final() var md5String = hexStringFromArray(digest) +s.MD5 + // MARK: - HMAC Demo // Data from RFC 2202 var key = arrayFromHexString("0102030405060708090a0b0c0d0e0f10111213141516171819") @@ -34,26 +35,41 @@ for (password, salt, rounds, dkLen, expected) in tests } // MARK: - Random Demo -var randomBytes = hexStringFromArray(Random.generateBytes(16)) +var randomBytes = hexStringFromArray(try Random.generateBytes(16)) + +do { + try Random.generateBytesThrow(16) +} +catch let e { + print("generateBytesThrow threw \(e)") +} + + +do { + try Random.generateBytesThrow(16) +} +catch { + print("generateBytesThrow threw an error (expected).") +} + // MARK: - Crypto Demo +// Test data from NIST Special Publication +// F.1.1 p24 +// http://csrc.nist.gov/publications/nistpubs/800-38a/sp800-38a.pdf func test_StreamCryptor_AES_ECB() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") - var expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") + let expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") - var aesEncrypt = StreamCryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) + let aesEncrypt = StreamCryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) var cipherText : [UInt8] = [] var dataOut = Array(count:plainText.count, repeatedValue:UInt8(0)) - var (byteCount, status) = aesEncrypt.update(plainText, byteArrayOut: &dataOut) + let (byteCount, status) = aesEncrypt.update(plainText, byteArrayOut: &dataOut) dataOut "\(status)" status - - var c = UIColor.redColor() - - cipherText += dataOut[0..()).update(plainText)?.final() + let cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()).update(plainText)?.final() assert(expectedCipherText.count == cipherText!.count , "Counts are as expected") assert(expectedCipherText == cipherText!, "Obtained expected cipher text") @@ -79,14 +95,14 @@ test_Cryptor_AES_ECB_1() // Double repeated block ECB mode // Shows weakness of ECB mode -- same plaintext block gets same ciphertext func test_Cryptor_AES_ECB_2() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") var expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") plainText += plainText expectedCipherText += expectedCipherText - var cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()).update(plainText)?.final() + let cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()).update(plainText)?.final() assert(expectedCipherText.count == cipherText!.count , "Counts are as expected") assert(expectedCipherText == cipherText!, "Obtained expected cipher text") @@ -99,27 +115,29 @@ test_Cryptor_AES_ECB_2() // Single block ECB mode func test_Cryptor_AES_ECB_Short() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e11739317") - var expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e11739317") + let expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") - var cryptor = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) - var cipherText = cryptor.update(plainText)?.final() + let cryptor = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) + let cipherText = cryptor.update(plainText)?.final() if(cipherText == nil) { - println("Encryption failed (as expected) with status \(cryptor.status)") + print("Encryption failed (as expected) with status \(cryptor.status)") } } test_Cryptor_AES_ECB_Short() func test_Cryptor_AES_ECB_Short_Padding() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e11739317") - var expectedCipherText = arrayFromHexString("21ea2ba3e445a0ef710a7c26618d1975") + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e11739317") + let expectedCipherText = arrayFromHexString("21ea2ba3e445a0ef710a7c26618d1975") - var cryptor = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode | .PKCS7Padding, key:key, iv:Array()) - var cipherText = cryptor.update(plainText)?.final() + let cryptor = Cryptor(operation:.Encrypt, + algorithm:.AES, + options:[.ECBMode,.PKCS7Padding], key:key, iv:Array()) + let cipherText = cryptor.update(plainText)?.final() assert(cipherText != nil) assert(cipherText! == expectedCipherText) } @@ -130,13 +148,13 @@ func test_Cryptor_AES_ECB_Short_Padding() { //test_Cryptor_AES_CBC_1() func test_Cryptor_AES_CBC_2() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") - var expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97025c61efee87e604cd1b12ce9dde5c51") + let expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97025c61efee87e604cd1b12ce9dde5c51") plainText += plainText - var optionalCipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.None, key:key, iv:Array()).update(plainText)?.final() + let optionalCipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.None, key:key, iv:Array()).update(plainText)?.final() if let cipherText = optionalCipherText { diff --git a/IDZSwiftCommonCrypto/DemoPlayground.playground/timeline.xctimeline b/DemoPlayground.playground/timeline.xctimeline similarity index 100% rename from IDZSwiftCommonCrypto/DemoPlayground.playground/timeline.xctimeline rename to DemoPlayground.playground/timeline.xctimeline diff --git a/Gemfile b/Gemfile new file mode 100644 index 0000000..6145ff3 --- /dev/null +++ b/Gemfile @@ -0,0 +1,3 @@ +# Gemfile +source 'https://rubygems.org' +gem 'slather', :git => "https://github.com/mattdelves/slather.git", :branch => "feature-profdata" diff --git a/Gemfile.lock b/Gemfile.lock new file mode 100644 index 0000000..8fd5207 --- /dev/null +++ b/Gemfile.lock @@ -0,0 +1,44 @@ +GIT + remote: https://github.com/mattdelves/slather.git + revision: d09ce4f5d5928bebdd121f621f530f1751a6c2c9 + branch: feature-profdata + specs: + slather (1.8.1) + clamp (~> 0.6) + nokogiri (~> 1.6.3) + xcodeproj (~> 0.27.2) + +GEM + remote: https://rubygems.org/ + specs: + activesupport (4.2.4) + i18n (~> 0.7) + json (~> 1.7, >= 1.7.7) + minitest (~> 5.1) + thread_safe (~> 0.3, >= 0.3.4) + tzinfo (~> 1.1) + claide (0.9.1) + clamp (0.6.5) + colored (1.2) + i18n (0.7.0) + json (1.8.3) + mini_portile (0.6.2) + minitest (5.8.2) + nokogiri (1.6.6.2) + mini_portile (~> 0.6.0) + thread_safe (0.3.5) + tzinfo (1.2.2) + thread_safe (~> 0.1) + xcodeproj (0.27.2) + activesupport (>= 3) + claide (~> 0.9.1) + colored (~> 1.2) + +PLATFORMS + ruby + +DEPENDENCIES + slather! + +BUNDLED WITH + 1.10.6 diff --git a/IDZSwiftCommonCrypto/GenerateCommonCryptoModule b/GenerateCommonCryptoModule similarity index 100% rename from IDZSwiftCommonCrypto/GenerateCommonCryptoModule rename to GenerateCommonCryptoModule diff --git a/IDZSwiftCommonCrypto.podspec b/IDZSwiftCommonCrypto.podspec new file mode 100644 index 0000000..f0a4c48 --- /dev/null +++ b/IDZSwiftCommonCrypto.podspec @@ -0,0 +1,136 @@ +# +# Be sure to run `pod spec lint IDZSwiftCommonCrypto.podspec' to ensure this is a +# valid spec and to remove all comments including this before submitting the spec. +# +# To learn more about Podspec attributes see http://docs.cocoapods.org/specification.html +# To see working Podspecs in the CocoaPods repo see https://github.com/CocoaPods/Specs/ +# + +Pod::Spec.new do |s| + + # ――― Spec Metadata ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # These will help people to find your library, and whilst it + # can feel like a chore to fill in it's definitely to your advantage. The + # summary should be tweet-length, and the description more in depth. + # + + s.name = "IDZSwiftCommonCrypto" + s.version = "0.6.4" + s.summary = "A wrapper for Apple's Common Crypto library written in Swift." + + s.homepage = "https://github.com/iosdevzone/IDZSwiftCommonCrypto" + + + # ――― Spec License ――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Licensing your code is important. See http://choosealicense.com for more info. + # CocoaPods will detect a license file if there is a named LICENSE* + # Popular ones are 'MIT', 'BSD' and 'Apache License, Version 2.0'. + # + + s.license = "MIT" + # s.license = { :type => "MIT", :file => "FILE_LICENSE" } + + + # ――― Author Metadata ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Specify the authors of the library, with email addresses. Email addresses + # of the authors are extracted from the SCM log. E.g. $ git log. CocoaPods also + # accepts just a name if you'd rather not provide an email address. + # + # Specify a social_media_url where others can refer to, for example a twitter + # profile URL. + # + + s.author = { "iOSDevZone" => "idz@iosdeveloperzone.com" } + s.social_media_url = "http://twitter.com/iOSDevZone" + + # ――― Platform Specifics ――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # If this Pod runs only on iOS or OS X, then specify the platform and + # the deployment target. You can optionally include the target after the platform. + # + + s.platform = :ios, "9.1" + # s.platform = :ios, "5.0" + + # When using multiple platforms + # s.ios.deployment_target = "9.0" + # s.osx.deployment_target = "10.7" + # s.watchos.deployment_target = "2.0" + + + # ――― Source Location ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Specify the location from where the source should be retrieved. + # Supports git, hg, bzr, svn and HTTP. + # + + s.source = { :git => "https://github.com/iosdevzone/IDZSwiftCommonCrypto.git", :branch => "swift2.0", :tag => s.version.to_s } + + + # ――― Source Code ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # CocoaPods is smart about how it includes source code. For source files + # giving a folder will include any swift, h, m, mm, c & cpp files. + # For header files it will include any header in the folder. + # Not including the public_header_files will make all headers public. + # + s.prepare_command = <<-CMD + + touch prepare_command.txt + echo 'Running prepare_command' + if [ ! -e CommonCrypto ]; then + pwd + echo Running GenerateCommonCryptoModule + ./GenerateCommonCryptoModule iphonesimulator9.1 . + else + echo Skipped GenerateCommonCryptoModule + fi + +CMD + s.source_files = "IDZSwiftCommonCrypto" + + # s.public_header_files = "Classes/**/*.h" + + + # ――― Resources ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # A list of resources included with the Pod. These are copied into the + # target bundle with a build phase script. Anything else will be cleaned. + # You can preserve files from being cleaned, please don't preserve + # non-essential files like tests, examples and documentation. + # + + # s.resource = "icon.png" + # s.resources = "Resources/*.png" + + s.preserve_paths = "CommonCrypto" + + + # ――― Project Linking ―――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # Link your library with frameworks, or libraries. Libraries do not include + # the lib prefix of their name. + # + + # s.framework = "SomeFramework" + # s.frameworks = "SomeFramework", "AnotherFramework" + + # s.library = "iconv" + # s.libraries = "iconv", "xml2" + + + # ――― Project Settings ――――――――――――――――――――――――――――――――――――――――――――――――――――――――― # + # + # If your library depends on compiler flags you can set them in the xcconfig hash + # where they will only apply to your library. If you depend on other Podspecs + # you can include multiple dependencies to ensure it works. + + # s.requires_arc = true + + s.xcconfig = { "SWIFT_INCLUDE_PATHS" => "$(PROJECT_DIR)/IDZSwiftCommonCrypto" } + # s.dependency "JSONKit", "~> 1.4" + +end diff --git a/IDZSwiftCommonCrypto.xcodeproj/project.pbxproj b/IDZSwiftCommonCrypto.xcodeproj/project.pbxproj new file mode 100644 index 0000000..3d2fb39 --- /dev/null +++ b/IDZSwiftCommonCrypto.xcodeproj/project.pbxproj @@ -0,0 +1,899 @@ +// !$*UTF8*$! +{ + archiveVersion = 1; + classes = { + }; + objectVersion = 46; + objects = { + +/* Begin PBXBuildFile section */ + 0C67310219D1EB80009828B8 /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C67310119D1EB80009828B8 /* Status.swift */; }; + 0C9F5B2E19D2948F00E0B5FF /* Cryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9F5B2D19D2948F00E0B5FF /* Cryptor.swift */; }; + 0CCB89B119CE05F800068ED6 /* IDZSwiftCommonCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CCB89B019CE05F800068ED6 /* IDZSwiftCommonCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 0CCB89BB19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */; }; + 0CCB89C919CE071D00068ED6 /* StreamCryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C419CE071D00068ED6 /* StreamCryptor.swift */; }; + 0CCB89CA19CE071D00068ED6 /* Digest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C519CE071D00068ED6 /* Digest.swift */; }; + 0CCB89CB19CE071D00068ED6 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C619CE071D00068ED6 /* HMAC.swift */; }; + 0CCB89CC19CE071D00068ED6 /* KeyDerivation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C719CE071D00068ED6 /* KeyDerivation.swift */; }; + 0CCB89CD19CE071D00068ED6 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C819CE071D00068ED6 /* Random.swift */; }; + 0CCB89D219CF416B00068ED6 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89D119CF416B00068ED6 /* Utilities.swift */; }; + 3012B11B1BAA237C008504EB /* Updateable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3012B11A1BAA237C008504EB /* Updateable.swift */; }; + 3050B9B41BA9F7C700177A38 /* Crypto.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3050B9B31BA9F7C700177A38 /* Crypto.swift */; }; + 308499AA1BA77BC20025B41D /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 308499A91BA77BC20025B41D /* AppDelegate.swift */; }; + 308499AC1BA77BC20025B41D /* ViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 308499AB1BA77BC20025B41D /* ViewController.swift */; }; + 308499AF1BA77BC20025B41D /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 308499AD1BA77BC20025B41D /* Main.storyboard */; }; + 308499B11BA77BC20025B41D /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 308499B01BA77BC20025B41D /* Assets.xcassets */; }; + 308499B41BA77BC20025B41D /* LaunchScreen.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 308499B21BA77BC20025B41D /* LaunchScreen.storyboard */; }; + 308499BF1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 308499BE1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.swift */; }; + 308499CA1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 308499C91BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.swift */; }; + 308499D51BA77F2B0025B41D /* IDZSwiftCommonCrypto.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */; }; + 308499D61BA77F2B0025B41D /* IDZSwiftCommonCrypto.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; }; + 308499DB1BA78C600025B41D /* CommonCryptoAPITests.m in Sources */ = {isa = PBXBuildFile; fileRef = 308499DA1BA78C600025B41D /* CommonCryptoAPITests.m */; }; + 308499DC1BA7A4920025B41D /* IDZSwiftCommonCryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */; }; +/* End PBXBuildFile section */ + +/* Begin PBXContainerItemProxy section */ + 0CCB89CE19CE0EDF00068ED6 /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0CCB89A219CE05F800068ED6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0CCB89AA19CE05F800068ED6; + remoteInfo = IDZSwiftCommonCrypto; + }; + 308499BB1BA77BC20025B41D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0CCB89A219CE05F800068ED6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 308499A61BA77BC20025B41D; + remoteInfo = IDZSwiftCommonCryptoTestApp; + }; + 308499C61BA77BC20025B41D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0CCB89A219CE05F800068ED6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 308499A61BA77BC20025B41D; + remoteInfo = IDZSwiftCommonCryptoTestApp; + }; + 308499D71BA77F2B0025B41D /* PBXContainerItemProxy */ = { + isa = PBXContainerItemProxy; + containerPortal = 0CCB89A219CE05F800068ED6 /* Project object */; + proxyType = 1; + remoteGlobalIDString = 0CCB89AA19CE05F800068ED6; + remoteInfo = IDZSwiftCommonCrypto; + }; +/* End PBXContainerItemProxy section */ + +/* Begin PBXCopyFilesBuildPhase section */ + 308499D91BA77F2B0025B41D /* Embed Frameworks */ = { + isa = PBXCopyFilesBuildPhase; + buildActionMask = 2147483647; + dstPath = ""; + dstSubfolderSpec = 10; + files = ( + 308499D61BA77F2B0025B41D /* IDZSwiftCommonCrypto.framework in Embed Frameworks */, + ); + name = "Embed Frameworks"; + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXCopyFilesBuildPhase section */ + +/* Begin PBXFileReference section */ + 0C09D79919E0CFB500A93684 /* README.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = README.playground; sourceTree = ""; }; + 0C09D79A19E0D4C900A93684 /* README.md */ = {isa = PBXFileReference; explicitFileType = net.daringfireball.markdown; fileEncoding = 4; name = README.md; path = ../README.md; sourceTree = ""; }; + 0C3079D619DD47900018E538 /* GenerateCommonCryptoModule */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = GenerateCommonCryptoModule; sourceTree = ""; }; + 0C67310119D1EB80009828B8 /* Status.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = ""; }; + 0C8D2B7419D2832B00552664 /* DemoPlayground.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DemoPlayground.playground; sourceTree = ""; }; + 0C9F5B2D19D2948F00E0B5FF /* Cryptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cryptor.swift; sourceTree = ""; }; + 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IDZSwiftCommonCrypto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; + 0CCB89AF19CE05F800068ED6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0CCB89B019CE05F800068ED6 /* IDZSwiftCommonCrypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IDZSwiftCommonCrypto.h; sourceTree = ""; }; + 0CCB89B619CE05F800068ED6 /* IDZSwiftCommonCryptoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IDZSwiftCommonCryptoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 0CCB89B919CE05F800068ED6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IDZSwiftCommonCryptoTests.swift; sourceTree = ""; }; + 0CCB89C419CE071D00068ED6 /* StreamCryptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StreamCryptor.swift; sourceTree = ""; }; + 0CCB89C519CE071D00068ED6 /* Digest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Digest.swift; sourceTree = ""; }; + 0CCB89C619CE071D00068ED6 /* HMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMAC.swift; sourceTree = ""; }; + 0CCB89C719CE071D00068ED6 /* KeyDerivation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyDerivation.swift; sourceTree = ""; }; + 0CCB89C819CE071D00068ED6 /* Random.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; + 0CCB89D119CF416B00068ED6 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; + 3012B11A1BAA237C008504EB /* Updateable.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Updateable.swift; sourceTree = ""; }; + 3050B9B31BA9F7C700177A38 /* Crypto.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Crypto.swift; sourceTree = ""; }; + 308499A71BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = IDZSwiftCommonCryptoTestApp.app; sourceTree = BUILT_PRODUCTS_DIR; }; + 308499A91BA77BC20025B41D /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; }; + 308499AB1BA77BC20025B41D /* ViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewController.swift; sourceTree = ""; }; + 308499AE1BA77BC20025B41D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; }; + 308499B01BA77BC20025B41D /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; }; + 308499B31BA77BC20025B41D /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/LaunchScreen.storyboard; sourceTree = ""; }; + 308499B51BA77BC20025B41D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 308499BA1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IDZSwiftCommonCryptoTestAppTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 308499BE1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IDZSwiftCommonCryptoTestAppTests.swift; sourceTree = ""; }; + 308499C01BA77BC20025B41D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 308499C51BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IDZSwiftCommonCryptoTestAppUITests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; + 308499C91BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IDZSwiftCommonCryptoTestAppUITests.swift; sourceTree = ""; }; + 308499CB1BA77BC20025B41D /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; + 308499DA1BA78C600025B41D /* CommonCryptoAPITests.m */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.objc; path = CommonCryptoAPITests.m; sourceTree = ""; }; +/* End PBXFileReference section */ + +/* Begin PBXFrameworksBuildPhase section */ + 0CCB89A719CE05F800068ED6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0CCB89B319CE05F800068ED6 /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499A41BA77BC20025B41D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + 308499D51BA77F2B0025B41D /* IDZSwiftCommonCrypto.framework in Frameworks */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499B71BA77BC20025B41D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499C21BA77BC20025B41D /* Frameworks */ = { + isa = PBXFrameworksBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXFrameworksBuildPhase section */ + +/* Begin PBXGroup section */ + 0CCB89A119CE05F800068ED6 = { + isa = PBXGroup; + children = ( + 0C09D79A19E0D4C900A93684 /* README.md */, + 0C09D79919E0CFB500A93684 /* README.playground */, + 0C3079D619DD47900018E538 /* GenerateCommonCryptoModule */, + 0C8D2B7419D2832B00552664 /* DemoPlayground.playground */, + 0CCB89AD19CE05F800068ED6 /* IDZSwiftCommonCrypto */, + 0CCB89B719CE05F800068ED6 /* IDZSwiftCommonCryptoTests */, + 308499A81BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp */, + 308499BD1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests */, + 308499C81BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests */, + 0CCB89AC19CE05F800068ED6 /* Products */, + ); + sourceTree = ""; + }; + 0CCB89AC19CE05F800068ED6 /* Products */ = { + isa = PBXGroup; + children = ( + 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */, + 0CCB89B619CE05F800068ED6 /* IDZSwiftCommonCryptoTests.xctest */, + 308499A71BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp.app */, + 308499BA1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.xctest */, + 308499C51BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.xctest */, + ); + name = Products; + sourceTree = ""; + }; + 0CCB89AD19CE05F800068ED6 /* IDZSwiftCommonCrypto */ = { + isa = PBXGroup; + children = ( + 3012B11A1BAA237C008504EB /* Updateable.swift */, + 0CCB89C519CE071D00068ED6 /* Digest.swift */, + 0C9F5B2D19D2948F00E0B5FF /* Cryptor.swift */, + 0CCB89C419CE071D00068ED6 /* StreamCryptor.swift */, + 0CCB89C619CE071D00068ED6 /* HMAC.swift */, + 0CCB89C719CE071D00068ED6 /* KeyDerivation.swift */, + 0CCB89C819CE071D00068ED6 /* Random.swift */, + 0C67310119D1EB80009828B8 /* Status.swift */, + 0CCB89D119CF416B00068ED6 /* Utilities.swift */, + 0CCB89B019CE05F800068ED6 /* IDZSwiftCommonCrypto.h */, + 0CCB89AE19CE05F800068ED6 /* Supporting Files */, + 3050B9B31BA9F7C700177A38 /* Crypto.swift */, + ); + path = IDZSwiftCommonCrypto; + sourceTree = ""; + }; + 0CCB89AE19CE05F800068ED6 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 0CCB89AF19CE05F800068ED6 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 0CCB89B719CE05F800068ED6 /* IDZSwiftCommonCryptoTests */ = { + isa = PBXGroup; + children = ( + 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */, + 308499DA1BA78C600025B41D /* CommonCryptoAPITests.m */, + 0CCB89B819CE05F800068ED6 /* Supporting Files */, + ); + path = IDZSwiftCommonCryptoTests; + sourceTree = ""; + }; + 0CCB89B819CE05F800068ED6 /* Supporting Files */ = { + isa = PBXGroup; + children = ( + 0CCB89B919CE05F800068ED6 /* Info.plist */, + ); + name = "Supporting Files"; + sourceTree = ""; + }; + 308499A81BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp */ = { + isa = PBXGroup; + children = ( + 308499A91BA77BC20025B41D /* AppDelegate.swift */, + 308499AB1BA77BC20025B41D /* ViewController.swift */, + 308499AD1BA77BC20025B41D /* Main.storyboard */, + 308499B01BA77BC20025B41D /* Assets.xcassets */, + 308499B21BA77BC20025B41D /* LaunchScreen.storyboard */, + 308499B51BA77BC20025B41D /* Info.plist */, + ); + path = IDZSwiftCommonCryptoTestApp; + sourceTree = ""; + }; + 308499BD1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests */ = { + isa = PBXGroup; + children = ( + 308499BE1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.swift */, + 308499C01BA77BC20025B41D /* Info.plist */, + ); + path = IDZSwiftCommonCryptoTestAppTests; + sourceTree = ""; + }; + 308499C81BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests */ = { + isa = PBXGroup; + children = ( + 308499C91BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.swift */, + 308499CB1BA77BC20025B41D /* Info.plist */, + ); + path = IDZSwiftCommonCryptoTestAppUITests; + sourceTree = ""; + }; +/* End PBXGroup section */ + +/* Begin PBXHeadersBuildPhase section */ + 0CCB89A819CE05F800068ED6 /* Headers */ = { + isa = PBXHeadersBuildPhase; + buildActionMask = 2147483647; + files = ( + 0CCB89B119CE05F800068ED6 /* IDZSwiftCommonCrypto.h in Headers */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXHeadersBuildPhase section */ + +/* Begin PBXNativeTarget section */ + 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0CCB89BE19CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCrypto" */; + buildPhases = ( + 303E19651BAA7E1E00044959 /* ShellScript */, + 0CCB89A619CE05F800068ED6 /* Sources */, + 0CCB89A719CE05F800068ED6 /* Frameworks */, + 0CCB89A819CE05F800068ED6 /* Headers */, + 0CCB89A919CE05F800068ED6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + ); + name = IDZSwiftCommonCrypto; + productName = IDZSwiftCommonCrypto; + productReference = 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */; + productType = "com.apple.product-type.framework"; + }; + 0CCB89B519CE05F800068ED6 /* IDZSwiftCommonCryptoTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 0CCB89C119CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTests" */; + buildPhases = ( + 0CCB89B219CE05F800068ED6 /* Sources */, + 0CCB89B319CE05F800068ED6 /* Frameworks */, + 0CCB89B419CE05F800068ED6 /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 0CCB89CF19CE0EDF00068ED6 /* PBXTargetDependency */, + ); + name = IDZSwiftCommonCryptoTests; + productName = IDZSwiftCommonCryptoTests; + productReference = 0CCB89B619CE05F800068ED6 /* IDZSwiftCommonCryptoTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 308499A61BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp */ = { + isa = PBXNativeTarget; + buildConfigurationList = 308499D21BA77BC20025B41D /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTestApp" */; + buildPhases = ( + 308499A31BA77BC20025B41D /* Sources */, + 308499A41BA77BC20025B41D /* Frameworks */, + 308499A51BA77BC20025B41D /* Resources */, + 308499D91BA77F2B0025B41D /* Embed Frameworks */, + ); + buildRules = ( + ); + dependencies = ( + 308499D81BA77F2B0025B41D /* PBXTargetDependency */, + ); + name = IDZSwiftCommonCryptoTestApp; + productName = IDZSwiftCommonCryptoTestApp; + productReference = 308499A71BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp.app */; + productType = "com.apple.product-type.application"; + }; + 308499B91BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 308499D31BA77BC20025B41D /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTestAppTests" */; + buildPhases = ( + 308499B61BA77BC20025B41D /* Sources */, + 308499B71BA77BC20025B41D /* Frameworks */, + 308499B81BA77BC20025B41D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 308499BC1BA77BC20025B41D /* PBXTargetDependency */, + ); + name = IDZSwiftCommonCryptoTestAppTests; + productName = IDZSwiftCommonCryptoTestAppTests; + productReference = 308499BA1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.xctest */; + productType = "com.apple.product-type.bundle.unit-test"; + }; + 308499C41BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests */ = { + isa = PBXNativeTarget; + buildConfigurationList = 308499D41BA77BC20025B41D /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTestAppUITests" */; + buildPhases = ( + 308499C11BA77BC20025B41D /* Sources */, + 308499C21BA77BC20025B41D /* Frameworks */, + 308499C31BA77BC20025B41D /* Resources */, + ); + buildRules = ( + ); + dependencies = ( + 308499C71BA77BC20025B41D /* PBXTargetDependency */, + ); + name = IDZSwiftCommonCryptoTestAppUITests; + productName = IDZSwiftCommonCryptoTestAppUITests; + productReference = 308499C51BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.xctest */; + productType = "com.apple.product-type.bundle.ui-testing"; + }; +/* End PBXNativeTarget section */ + +/* Begin PBXProject section */ + 0CCB89A219CE05F800068ED6 /* Project object */ = { + isa = PBXProject; + attributes = { + LastSwiftMigration = 0700; + LastSwiftUpdateCheck = 0700; + LastUpgradeCheck = 0700; + ORGANIZATIONNAME = iOSDeveloperZone.com; + TargetAttributes = { + 0CCB89AA19CE05F800068ED6 = { + CreatedOnToolsVersion = 6.0.1; + }; + 0CCB89B519CE05F800068ED6 = { + CreatedOnToolsVersion = 6.0.1; + }; + 308499A61BA77BC20025B41D = { + CreatedOnToolsVersion = 7.0; + }; + 308499B91BA77BC20025B41D = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 308499A61BA77BC20025B41D; + }; + 308499C41BA77BC20025B41D = { + CreatedOnToolsVersion = 7.0; + TestTargetID = 308499A61BA77BC20025B41D; + }; + }; + }; + buildConfigurationList = 0CCB89A519CE05F800068ED6 /* Build configuration list for PBXProject "IDZSwiftCommonCrypto" */; + compatibilityVersion = "Xcode 3.2"; + developmentRegion = English; + hasScannedForEncodings = 0; + knownRegions = ( + en, + Base, + ); + mainGroup = 0CCB89A119CE05F800068ED6; + productRefGroup = 0CCB89AC19CE05F800068ED6 /* Products */; + projectDirPath = ""; + projectRoot = ""; + targets = ( + 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */, + 0CCB89B519CE05F800068ED6 /* IDZSwiftCommonCryptoTests */, + 308499A61BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp */, + 308499B91BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests */, + 308499C41BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests */, + ); + }; +/* End PBXProject section */ + +/* Begin PBXResourcesBuildPhase section */ + 0CCB89A919CE05F800068ED6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0CCB89B419CE05F800068ED6 /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499A51BA77BC20025B41D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 308499B41BA77BC20025B41D /* LaunchScreen.storyboard in Resources */, + 308499B11BA77BC20025B41D /* Assets.xcassets in Resources */, + 308499AF1BA77BC20025B41D /* Main.storyboard in Resources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499B81BA77BC20025B41D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499C31BA77BC20025B41D /* Resources */ = { + isa = PBXResourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXResourcesBuildPhase section */ + +/* Begin PBXShellScriptBuildPhase section */ + 303E19651BAA7E1E00044959 /* ShellScript */ = { + isa = PBXShellScriptBuildPhase; + buildActionMask = 2147483647; + files = ( + ); + inputPaths = ( + ); + outputPaths = ( + ); + runOnlyForDeploymentPostprocessing = 0; + shellPath = /bin/bash; + shellScript = "echo Checking for $PROJECT_DIR/CommonCrypto\nif [ ! -e $PROJECT_DIR/CommonCrypto ] ; then\necho Generating $PROJECT_DIR/CommonCrypto\n./GenerateCommonCryptoModule iphonesimulator9.0 $PROJECT_DIR\nelse\necho Directory exists, skipping generation of $PROJECT_DIR/CommonCrypto\nfi"; + }; +/* End PBXShellScriptBuildPhase section */ + +/* Begin PBXSourcesBuildPhase section */ + 0CCB89A619CE05F800068ED6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 0CCB89D219CF416B00068ED6 /* Utilities.swift in Sources */, + 0CCB89CC19CE071D00068ED6 /* KeyDerivation.swift in Sources */, + 0C67310219D1EB80009828B8 /* Status.swift in Sources */, + 3050B9B41BA9F7C700177A38 /* Crypto.swift in Sources */, + 0C9F5B2E19D2948F00E0B5FF /* Cryptor.swift in Sources */, + 0CCB89C919CE071D00068ED6 /* StreamCryptor.swift in Sources */, + 3012B11B1BAA237C008504EB /* Updateable.swift in Sources */, + 0CCB89CD19CE071D00068ED6 /* Random.swift in Sources */, + 0CCB89CA19CE071D00068ED6 /* Digest.swift in Sources */, + 0CCB89CB19CE071D00068ED6 /* HMAC.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 0CCB89B219CE05F800068ED6 /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 308499DB1BA78C600025B41D /* CommonCryptoAPITests.m in Sources */, + 0CCB89BB19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499A31BA77BC20025B41D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 308499AC1BA77BC20025B41D /* ViewController.swift in Sources */, + 308499AA1BA77BC20025B41D /* AppDelegate.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499B61BA77BC20025B41D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 308499BF1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppTests.swift in Sources */, + 308499DC1BA7A4920025B41D /* IDZSwiftCommonCryptoTests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; + 308499C11BA77BC20025B41D /* Sources */ = { + isa = PBXSourcesBuildPhase; + buildActionMask = 2147483647; + files = ( + 308499CA1BA77BC20025B41D /* IDZSwiftCommonCryptoTestAppUITests.swift in Sources */, + ); + runOnlyForDeploymentPostprocessing = 0; + }; +/* End PBXSourcesBuildPhase section */ + +/* Begin PBXTargetDependency section */ + 0CCB89CF19CE0EDF00068ED6 /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */; + targetProxy = 0CCB89CE19CE0EDF00068ED6 /* PBXContainerItemProxy */; + }; + 308499BC1BA77BC20025B41D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 308499A61BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp */; + targetProxy = 308499BB1BA77BC20025B41D /* PBXContainerItemProxy */; + }; + 308499C71BA77BC20025B41D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 308499A61BA77BC20025B41D /* IDZSwiftCommonCryptoTestApp */; + targetProxy = 308499C61BA77BC20025B41D /* PBXContainerItemProxy */; + }; + 308499D81BA77F2B0025B41D /* PBXTargetDependency */ = { + isa = PBXTargetDependency; + target = 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */; + targetProxy = 308499D71BA77F2B0025B41D /* PBXContainerItemProxy */; + }; +/* End PBXTargetDependency section */ + +/* Begin PBXVariantGroup section */ + 308499AD1BA77BC20025B41D /* Main.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 308499AE1BA77BC20025B41D /* Base */, + ); + name = Main.storyboard; + sourceTree = ""; + }; + 308499B21BA77BC20025B41D /* LaunchScreen.storyboard */ = { + isa = PBXVariantGroup; + children = ( + 308499B31BA77BC20025B41D /* Base */, + ); + name = LaunchScreen.storyboard; + sourceTree = ""; + }; +/* End PBXVariantGroup section */ + +/* Begin XCBuildConfiguration section */ + 0CCB89BC19CE05F800068ED6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = NO; + CURRENT_PROJECT_VERSION = 1; + ENABLE_STRICT_OBJC_MSGSEND = YES; + ENABLE_TESTABILITY = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_DYNAMIC_NO_PIC = NO; + GCC_GENERATE_TEST_COVERAGE_FILES = YES; + GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; + GCC_OPTIMIZATION_LEVEL = 0; + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + GCC_SYMBOLS_PRIVATE_EXTERN = NO; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = YES; + ONLY_ACTIVE_ARCH = YES; + SDKROOT = iphoneos; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + TARGETED_DEVICE_FAMILY = "1,2"; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Debug; + }; + 0CCB89BD19CE05F800068ED6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ALWAYS_SEARCH_USER_PATHS = NO; + CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; + CLANG_CXX_LIBRARY = "libc++"; + CLANG_ENABLE_MODULES = YES; + CLANG_ENABLE_OBJC_ARC = YES; + CLANG_WARN_BOOL_CONVERSION = YES; + CLANG_WARN_CONSTANT_CONVERSION = YES; + CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; + CLANG_WARN_EMPTY_BODY = YES; + CLANG_WARN_ENUM_CONVERSION = YES; + CLANG_WARN_INT_CONVERSION = YES; + CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; + CLANG_WARN_UNREACHABLE_CODE = YES; + CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; + "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; + COPY_PHASE_STRIP = YES; + CURRENT_PROJECT_VERSION = 1; + ENABLE_NS_ASSERTIONS = NO; + ENABLE_STRICT_OBJC_MSGSEND = YES; + GCC_C_LANGUAGE_STANDARD = gnu99; + GCC_GENERATE_TEST_COVERAGE_FILES = YES; + GCC_INSTRUMENT_PROGRAM_FLOW_ARCS = YES; + GCC_WARN_64_TO_32_BIT_CONVERSION = YES; + GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; + GCC_WARN_UNDECLARED_SELECTOR = YES; + GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; + GCC_WARN_UNUSED_FUNCTION = YES; + GCC_WARN_UNUSED_VARIABLE = YES; + IPHONEOS_DEPLOYMENT_TARGET = 8.0; + MTL_ENABLE_DEBUG_INFO = NO; + SDKROOT = iphoneos; + TARGETED_DEVICE_FAMILY = "1,2"; + VALIDATE_PRODUCT = YES; + VERSIONING_SYSTEM = "apple-generic"; + VERSION_INFO_PREFIX = ""; + }; + name = Release; + }; + 0CCB89BF19CE05F800068ED6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = IDZSwiftCommonCrypto/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.iosdeveloperzone.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_INCLUDE_PATHS = "${SRCROOT}"; + }; + name = Debug; + }; + 0CCB89C019CE05F800068ED6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEFINES_MODULE = YES; + DYLIB_COMPATIBILITY_VERSION = 1; + DYLIB_CURRENT_VERSION = 1; + DYLIB_INSTALL_NAME_BASE = "@rpath"; + FRAMEWORK_SEARCH_PATHS = ( + "$(inherited)", + "$(PROJECT_DIR)", + ); + INFOPLIST_FILE = IDZSwiftCommonCrypto/Info.plist; + INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.iosdeveloperzone.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SKIP_INSTALL = YES; + SWIFT_INCLUDE_PATHS = "${SRCROOT}"; + }; + name = Release; + }; + 0CCB89C219CE05F800068ED6 /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + GCC_PREPROCESSOR_DEFINITIONS = ( + "DEBUG=1", + "$(inherited)", + ); + INFOPLIST_FILE = IDZSwiftCommonCryptoTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.iosdeveloperzone.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INCLUDE_PATHS = "${SRCROOT}/CommonCrypto"; + SWIFT_OPTIMIZATION_LEVEL = "-Onone"; + }; + name = Debug; + }; + 0CCB89C319CE05F800068ED6 /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + CLANG_ENABLE_MODULES = YES; + FRAMEWORK_SEARCH_PATHS = ( + "$(SDKROOT)/Developer/Library/Frameworks", + "$(inherited)", + ); + INFOPLIST_FILE = IDZSwiftCommonCryptoTests/Info.plist; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = "com.iosdeveloperzone.$(PRODUCT_NAME:rfc1034identifier)"; + PRODUCT_NAME = "$(TARGET_NAME)"; + SWIFT_INCLUDE_PATHS = "${SRCROOT}/CommonCrypto"; + }; + name = Release; + }; + 308499CC1BA77BC20025B41D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + DEBUG_INFORMATION_FORMAT = dwarf; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = IDZSwiftCommonCryptoTestApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.iosdeveloperzone.IDZSwiftCommonCryptoTestApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Debug; + }; + 308499CD1BA77BC20025B41D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + EMBEDDED_CONTENT_CONTAINS_SWIFT = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = IDZSwiftCommonCryptoTestApp/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.iosdeveloperzone.IDZSwiftCommonCryptoTestApp; + PRODUCT_NAME = "$(TARGET_NAME)"; + }; + name = Release; + }; + 308499CE1BA77BC20025B41D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = IDZSwiftCommonCryptoTestAppTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.iosdeveloperzone.IDZSwiftCommonCryptoTestAppTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/IDZSwiftCommonCryptoTestApp.app/IDZSwiftCommonCryptoTestApp"; + }; + name = Debug; + }; + 308499CF1BA77BC20025B41D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + BUNDLE_LOADER = "$(TEST_HOST)"; + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = IDZSwiftCommonCryptoTestAppTests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.iosdeveloperzone.IDZSwiftCommonCryptoTestAppTests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_HOST = "$(BUILT_PRODUCTS_DIR)/IDZSwiftCommonCryptoTestApp.app/IDZSwiftCommonCryptoTestApp"; + }; + name = Release; + }; + 308499D01BA77BC20025B41D /* Debug */ = { + isa = XCBuildConfiguration; + buildSettings = { + DEBUG_INFORMATION_FORMAT = dwarf; + ENABLE_TESTABILITY = YES; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = IDZSwiftCommonCryptoTestAppUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.iosdeveloperzone.IDZSwiftCommonCryptoTestAppUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = IDZSwiftCommonCryptoTestApp; + USES_XCTRUNNER = YES; + }; + name = Debug; + }; + 308499D11BA77BC20025B41D /* Release */ = { + isa = XCBuildConfiguration; + buildSettings = { + COPY_PHASE_STRIP = NO; + DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; + GCC_NO_COMMON_BLOCKS = YES; + INFOPLIST_FILE = IDZSwiftCommonCryptoTestAppUITests/Info.plist; + IPHONEOS_DEPLOYMENT_TARGET = 9.0; + LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; + PRODUCT_BUNDLE_IDENTIFIER = com.iosdeveloperzone.IDZSwiftCommonCryptoTestAppUITests; + PRODUCT_NAME = "$(TARGET_NAME)"; + TEST_TARGET_NAME = IDZSwiftCommonCryptoTestApp; + USES_XCTRUNNER = YES; + }; + name = Release; + }; +/* End XCBuildConfiguration section */ + +/* Begin XCConfigurationList section */ + 0CCB89A519CE05F800068ED6 /* Build configuration list for PBXProject "IDZSwiftCommonCrypto" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0CCB89BC19CE05F800068ED6 /* Debug */, + 0CCB89BD19CE05F800068ED6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0CCB89BE19CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCrypto" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0CCB89BF19CE05F800068ED6 /* Debug */, + 0CCB89C019CE05F800068ED6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 0CCB89C119CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 0CCB89C219CE05F800068ED6 /* Debug */, + 0CCB89C319CE05F800068ED6 /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 308499D21BA77BC20025B41D /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTestApp" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 308499CC1BA77BC20025B41D /* Debug */, + 308499CD1BA77BC20025B41D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 308499D31BA77BC20025B41D /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTestAppTests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 308499CE1BA77BC20025B41D /* Debug */, + 308499CF1BA77BC20025B41D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; + 308499D41BA77BC20025B41D /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTestAppUITests" */ = { + isa = XCConfigurationList; + buildConfigurations = ( + 308499D01BA77BC20025B41D /* Debug */, + 308499D11BA77BC20025B41D /* Release */, + ); + defaultConfigurationIsVisible = 0; + defaultConfigurationName = Release; + }; +/* End XCConfigurationList section */ + }; + rootObject = 0CCB89A219CE05F800068ED6 /* Project object */; +} diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/IDZSwiftCommonCrypto.xcodeproj/project.xcworkspace/contents.xcworkspacedata similarity index 100% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/project.xcworkspace/contents.xcworkspacedata rename to IDZSwiftCommonCrypto.xcodeproj/project.xcworkspace/contents.xcworkspacedata diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/xcshareddata/xcschemes/IDZSwiftCommonCrypto (Release).xcscheme b/IDZSwiftCommonCrypto.xcodeproj/xcshareddata/xcschemes/IDZSwiftCommonCrypto (Release).xcscheme similarity index 94% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/xcshareddata/xcschemes/IDZSwiftCommonCrypto (Release).xcscheme rename to IDZSwiftCommonCrypto.xcodeproj/xcshareddata/xcschemes/IDZSwiftCommonCrypto (Release).xcscheme index 728342e..312b8c3 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/xcshareddata/xcschemes/IDZSwiftCommonCrypto (Release).xcscheme +++ b/IDZSwiftCommonCrypto.xcodeproj/xcshareddata/xcschemes/IDZSwiftCommonCrypto (Release).xcscheme @@ -1,6 +1,6 @@ + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -48,15 +48,18 @@ ReferencedContainer = "container:IDZSwiftCommonCrypto.xcodeproj"> + + + codeCoverageEnabled = "YES"> @@ -48,15 +49,18 @@ ReferencedContainer = "container:IDZSwiftCommonCrypto.xcodeproj"> + + + shouldUseLaunchSchemeArgsEnv = "YES"> @@ -48,15 +48,18 @@ ReferencedContainer = "container:IDZSwiftCommonCrypto.xcodeproj"> + + + + + + + + + + diff --git a/IDZSwiftCommonCrypto/CommonCrypto/module.map b/IDZSwiftCommonCrypto/CommonCrypto/module.map deleted file mode 100644 index 16ac586..0000000 --- a/IDZSwiftCommonCrypto/CommonCrypto/module.map +++ /dev/null @@ -1,5 +0,0 @@ -module CommonCrypto [system] { - header "/Applications/Xcode-6.0.1-6A317.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk/usr/include/CommonCrypto/CommonCrypto.h" - header "/Applications/Xcode-6.0.1-6A317.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS8.0.sdk/usr/include/CommonCrypto/CommonRandom.h" - export * -} diff --git a/IDZSwiftCommonCrypto/Crypto.swift b/IDZSwiftCommonCrypto/Crypto.swift new file mode 100644 index 0000000..361c4c2 --- /dev/null +++ b/IDZSwiftCommonCrypto/Crypto.swift @@ -0,0 +1,71 @@ +// +// Crypto.swift +// IDZSwiftCommonCrypto +// +// This implements the API of https://github.com/soffes/Crypto +// +// Created by idz on 9/16/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +import Foundation + +/// +/// Implements a simplified API for calculating digests over single buffers +/// +public protocol CryptoDigest { + /// Calculates a message digest + func digest(algorithm : Digest.Algorithm) -> Self +} + +extension CryptoDigest { + /// An MD2 digest of this object + public var MD2: Self { return self.digest(.MD2) } + /// An MD4 digest of this object + public var MD4: Self { return self.digest(.MD4) } + /// An MD5 digest of this object + public var MD5: Self { return self.digest(.MD5) } + /// An SHA1 digest of this object + public var SHA1: Self { return self.digest(.SHA1) } + /// An SHA224 digest of this object + public var SHA224: Self { return self.digest(.SHA224) } + /// An SHA256 digest of this object + public var SHA256: Self { return self.digest(.SHA256) } + /// An SHA384 digest of this object + public var SHA384: Self { return self.digest(.SHA384) } + /// An SHA512 digest of this object + public var SHA512: Self { return self.digest(.SHA512) } +} + +extension NSData : CryptoDigest { + /// + /// Calculates the Message Digest for this data. + /// + /// - parameter algorithm: the digest algorithm to use + /// - returns: an `NSData` object containing the message digest + /// + public func digest(algorithm : Digest.Algorithm) -> Self { + // This force unwrap may look scary but for CommonCrypto this cannot fail. + // The API allows for optionals to support the OpenSSL implementation which can. + let result = (Digest(algorithm: algorithm).update(self)?.final())! + let data = self.dynamicType.init(bytes: result, length: result.count) + return data + } +} + +extension String : CryptoDigest { + /// + /// Calculates the Message Digest for this string. + /// The string is converted to raw data using UTF8. + /// + /// - parameter algorithm: the digest algorithm to use + /// - returns: a hex string of the calculated digest + /// + public func digest(algorithm : Digest.Algorithm) -> String { + // This force unwrap may look scary but for CommonCrypto this cannot fail. + // The API allows for optionals to support the OpenSSL implementation which can. + let result = (Digest(algorithm: algorithm).update(self as String)?.final())! + return hexStringFromArray(result) + + } +} diff --git a/IDZSwiftCommonCrypto/Cryptor.swift b/IDZSwiftCommonCrypto/Cryptor.swift new file mode 100644 index 0000000..6ba261f --- /dev/null +++ b/IDZSwiftCommonCrypto/Cryptor.swift @@ -0,0 +1,60 @@ +// +// Cryptor.swift +// IDZSwiftCommonCrypto +// +// Created by idz on 9/23/14. +// Copyright (c) 2014 iOSDeveloperZone.com. All rights reserved. +// + +import Foundation + +/** + Encrypts or decrypts, accumulating result. + + Useful for small in-memory buffers. + + For large files or network streams use StreamCryptor. + */ +public class Cryptor : StreamCryptor, Updateable +{ + var accumulator : [UInt8] = [] + /** + Retrieves the encrypted or decrypted data. + + - returns: the encrypted or decrypted data or nil if an error occured. + */ + public func final() -> [UInt8]? + { + let byteCount = Int(self.getOutputLength(0, isFinal: true)) + var dataOut = Array(count:byteCount, repeatedValue:0) + var dataOutMoved = 0 + (dataOutMoved, self.status) = final(&dataOut) + if(self.status != Status.Success) { + return nil + } + accumulator += dataOut[0.., _ byteCount: Int) -> Self? + { + let outputLength = self.getOutputLength(byteCount, isFinal: false) + var dataOut = Array(count:outputLength, repeatedValue:0) + var dataOutMoved = 0 + update(buffer, byteCountIn: byteCount, bufferOut: &dataOut, byteCapacityOut: dataOut.count, byteCountOut: &dataOutMoved) + if(self.status != Status.Success) { + return nil + } + accumulator += dataOut[0.., _ byteCount: CC_LONG) -> Digest? - { - engine.update(buffer, byteCount) - return self - } - /** - Updates the message digest with an NSData buffer. - - :param: data the data buffer - :returns: this Digest object (for optional chaining) - */ - public func update(data : NSData) -> Digest? - { - engine.update(data.bytes, CC_LONG(data.length)) - return self - } - /** - Updates the message digest with the contents of a Swift byte array - - :param: byteArray the byteArray - :returns: this Digest object (for optional chaining) - */ - public func update(byteArray : [UInt8]) -> Digest? - { - engine.update(byteArray, CC_LONG(byteArray.count)) - return self - } - - /** - Updates the message digest being calculated with the contents - of a string interpreted as UTF8. - - :param: s the string - :returns: this Digest object (for optional chaining) + - parameter buffer: the buffer + - parameter the: number of bytes in buffer + - returns: this Digest object (for optional chaining) */ - public func update(string : String) -> Digest? + public func update(buffer: UnsafePointer, _ byteCount: size_t) -> Self? { - engine.update(string, CC_LONG(string.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))) + engine.update(buffer, CC_LONG(byteCount)) return self } /** Completes the calculate of the messge digest - :returns: the message digest + - returns: the message digest */ public func final() -> [UInt8] { diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/HMAC.swift b/IDZSwiftCommonCrypto/HMAC.swift similarity index 67% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/HMAC.swift rename to IDZSwiftCommonCrypto/HMAC.swift index 01737f2..0e816c1 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/HMAC.swift +++ b/IDZSwiftCommonCrypto/HMAC.swift @@ -9,11 +9,28 @@ import Foundation import CommonCrypto -public class HMAC +/// +/// Calculates a cryptographic Hash-Based Message Authentication Code (HMAC). +/// +public class HMAC : Updateable { + /// + /// Enumerates available algorithms. + /// public enum Algorithm { - case SHA1, MD5, SHA224, SHA256, SHA384, SHA512 + /// Message Digest 5 + case MD5, + /// Secure Hash Algorithm 1 + SHA1, + /// Secure Hash Algorithm 2 224-bit + SHA224, + /// Secure Hash Algorithm 2 256-bit + SHA256, + /// Secure Hash Algorithm 2 384-bit + SHA384, + /// Secure Hash Algorithm 2 512-bit + SHA512 static let fromNative : [CCHmacAlgorithm: Algorithm] = [ CCHmacAlgorithm(kCCHmacAlgSHA1):.SHA1, @@ -46,6 +63,9 @@ public class HMAC return fromNative[nativeAlg] } + /// + /// Obtains the digest length produced by this algorithm (in bytes). + /// public func digestLength() -> Int { switch self { case .SHA1: @@ -65,6 +85,8 @@ public class HMAC } typealias Context = UnsafeMutablePointer + + /// Status of the calculation public var status : Status = .Success let context = Context.alloc(1) @@ -76,19 +98,37 @@ public class HMAC CCHmacInit(context, algorithm.nativeValue(), keyBuffer, size_t(keyByteCount)) } + /// + /// Creates a new HMAC instance with the specified algorithm and key. + /// + /// - parameter algorithm: selects the algorithm + /// - parameter key: specifies the key + /// public init(algorithm : Algorithm, key : NSData) { self.algorithm = algorithm CCHmacInit(context, algorithm.nativeValue(), key.bytes, size_t(key.length)) } - + /// + /// Creates a new HMAC instance with the specified algorithm and key. + /// + /// - parameter algorithm: selects the algorithm + /// - parameter key: specifies the key + /// public init(algorithm : Algorithm, key : [UInt8]) { self.algorithm = algorithm CCHmacInit(context, algorithm.nativeValue(), key, size_t(key.count)) } + /// + /// Creates a new HMAC instance with the specified algorithm and key string. + /// The key string is converted to bytes using UTF8 encoding. + /// + /// - parameter algorithm: selects the algorithm + /// - parameter key: specifies the key + /// init(algorithm : Algorithm, key : String) { self.algorithm = algorithm @@ -98,30 +138,23 @@ public class HMAC deinit { context.dealloc(1) } - - public func update(buffer : UnsafePointer, _ byteCount : size_t) + + /// + /// Updates the calculation of the HMAC with the contents of a buffer. + /// + /// - returns: the calculated HMAC + /// + public func update(buffer : UnsafePointer, _ byteCount : size_t) -> Self? { CCHmacUpdate(context, buffer, byteCount) - } - - public func update(data: NSData) -> HMAC? - { - update(data.bytes, size_t(data.length)) - return self - } - - public func update(byteArray : [UInt8]) -> HMAC? - { - update(byteArray, size_t(byteArray.count)) - return self - } - - public func update(string: String) -> HMAC? - { - update(string, size_t(string.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))) - return self + return self } + /// + /// Finalizes the HMAC calculation + /// + /// - returns: the calculated HMAC + /// public func final() -> [UInt8] { var hmac = Array(count:algorithm.digestLength(), repeatedValue:0) diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.h b/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.h similarity index 94% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.h rename to IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.h index 2562868..26554bb 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.h +++ b/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.h @@ -6,7 +6,7 @@ // Copyright (c) 2014 iOSDeveloperZone.com. All rights reserved. // -#import +#import //! Project version number for IDZSwiftCommonCrypto. FOUNDATION_EXPORT double IDZSwiftCommonCryptoVersionNumber; diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/project.pbxproj b/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/project.pbxproj deleted file mode 100644 index 2de27f3..0000000 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto.xcodeproj/project.pbxproj +++ /dev/null @@ -1,467 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 0C09D79B19E0D4C900A93684 /* README.md in Sources */ = {isa = PBXBuildFile; fileRef = 0C09D79A19E0D4C900A93684 /* README.md */; }; - 0C67310219D1EB80009828B8 /* Status.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C67310119D1EB80009828B8 /* Status.swift */; }; - 0C9F5B2E19D2948F00E0B5FF /* Cryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0C9F5B2D19D2948F00E0B5FF /* Cryptor.swift */; }; - 0CCB89B119CE05F800068ED6 /* IDZSwiftCommonCrypto.h in Headers */ = {isa = PBXBuildFile; fileRef = 0CCB89B019CE05F800068ED6 /* IDZSwiftCommonCrypto.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0CCB89BB19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */; }; - 0CCB89C919CE071D00068ED6 /* StreamCryptor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C419CE071D00068ED6 /* StreamCryptor.swift */; }; - 0CCB89CA19CE071D00068ED6 /* Digest.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C519CE071D00068ED6 /* Digest.swift */; }; - 0CCB89CB19CE071D00068ED6 /* HMAC.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C619CE071D00068ED6 /* HMAC.swift */; }; - 0CCB89CC19CE071D00068ED6 /* KeyDerivation.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C719CE071D00068ED6 /* KeyDerivation.swift */; }; - 0CCB89CD19CE071D00068ED6 /* Random.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89C819CE071D00068ED6 /* Random.swift */; }; - 0CCB89D219CF416B00068ED6 /* Utilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0CCB89D119CF416B00068ED6 /* Utilities.swift */; }; -/* End PBXBuildFile section */ - -/* Begin PBXContainerItemProxy section */ - 0CCB89CE19CE0EDF00068ED6 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = 0CCB89A219CE05F800068ED6 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 0CCB89AA19CE05F800068ED6; - remoteInfo = IDZSwiftCommonCrypto; - }; -/* End PBXContainerItemProxy section */ - -/* Begin PBXFileReference section */ - 0C09D79919E0CFB500A93684 /* README.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = README.playground; sourceTree = ""; }; - 0C09D79A19E0D4C900A93684 /* README.md */ = {isa = PBXFileReference; explicitFileType = net.daringfireball.markdown; fileEncoding = 4; name = README.md; path = ../README.md; sourceTree = ""; }; - 0C3079D619DD47900018E538 /* GenerateCommonCryptoModule */ = {isa = PBXFileReference; lastKnownFileType = text.script.sh; path = GenerateCommonCryptoModule; sourceTree = ""; }; - 0C67310119D1EB80009828B8 /* Status.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Status.swift; sourceTree = ""; }; - 0C8D2B7419D2832B00552664 /* DemoPlayground.playground */ = {isa = PBXFileReference; lastKnownFileType = file.playground; path = DemoPlayground.playground; sourceTree = ""; }; - 0C9F5B2D19D2948F00E0B5FF /* Cryptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Cryptor.swift; sourceTree = ""; }; - 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = IDZSwiftCommonCrypto.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 0CCB89AF19CE05F800068ED6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0CCB89B019CE05F800068ED6 /* IDZSwiftCommonCrypto.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = IDZSwiftCommonCrypto.h; sourceTree = ""; }; - 0CCB89B619CE05F800068ED6 /* IDZSwiftCommonCryptoTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = IDZSwiftCommonCryptoTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; }; - 0CCB89B919CE05F800068ED6 /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; - 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = IDZSwiftCommonCryptoTests.swift; sourceTree = ""; }; - 0CCB89C419CE071D00068ED6 /* StreamCryptor.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = StreamCryptor.swift; sourceTree = ""; }; - 0CCB89C519CE071D00068ED6 /* Digest.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Digest.swift; sourceTree = ""; }; - 0CCB89C619CE071D00068ED6 /* HMAC.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = HMAC.swift; sourceTree = ""; }; - 0CCB89C719CE071D00068ED6 /* KeyDerivation.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = KeyDerivation.swift; sourceTree = ""; }; - 0CCB89C819CE071D00068ED6 /* Random.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Random.swift; sourceTree = ""; }; - 0CCB89D119CF416B00068ED6 /* Utilities.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Utilities.swift; sourceTree = ""; }; -/* End PBXFileReference section */ - -/* Begin PBXFrameworksBuildPhase section */ - 0CCB89A719CE05F800068ED6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0CCB89B319CE05F800068ED6 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXFrameworksBuildPhase section */ - -/* Begin PBXGroup section */ - 0CCB89A119CE05F800068ED6 = { - isa = PBXGroup; - children = ( - 0C09D79A19E0D4C900A93684 /* README.md */, - 0C09D79919E0CFB500A93684 /* README.playground */, - 0C3079D619DD47900018E538 /* GenerateCommonCryptoModule */, - 0C8D2B7419D2832B00552664 /* DemoPlayground.playground */, - 0CCB89AD19CE05F800068ED6 /* IDZSwiftCommonCrypto */, - 0CCB89B719CE05F800068ED6 /* IDZSwiftCommonCryptoTests */, - 0CCB89AC19CE05F800068ED6 /* Products */, - ); - sourceTree = ""; - }; - 0CCB89AC19CE05F800068ED6 /* Products */ = { - isa = PBXGroup; - children = ( - 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */, - 0CCB89B619CE05F800068ED6 /* IDZSwiftCommonCryptoTests.xctest */, - ); - name = Products; - sourceTree = ""; - }; - 0CCB89AD19CE05F800068ED6 /* IDZSwiftCommonCrypto */ = { - isa = PBXGroup; - children = ( - 0C9F5B2D19D2948F00E0B5FF /* Cryptor.swift */, - 0CCB89C419CE071D00068ED6 /* StreamCryptor.swift */, - 0CCB89C519CE071D00068ED6 /* Digest.swift */, - 0CCB89C619CE071D00068ED6 /* HMAC.swift */, - 0CCB89C719CE071D00068ED6 /* KeyDerivation.swift */, - 0CCB89C819CE071D00068ED6 /* Random.swift */, - 0C67310119D1EB80009828B8 /* Status.swift */, - 0CCB89D119CF416B00068ED6 /* Utilities.swift */, - 0CCB89B019CE05F800068ED6 /* IDZSwiftCommonCrypto.h */, - 0CCB89AE19CE05F800068ED6 /* Supporting Files */, - ); - path = IDZSwiftCommonCrypto; - sourceTree = ""; - }; - 0CCB89AE19CE05F800068ED6 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 0CCB89AF19CE05F800068ED6 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; - 0CCB89B719CE05F800068ED6 /* IDZSwiftCommonCryptoTests */ = { - isa = PBXGroup; - children = ( - 0CCB89BA19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift */, - 0CCB89B819CE05F800068ED6 /* Supporting Files */, - ); - path = IDZSwiftCommonCryptoTests; - sourceTree = ""; - }; - 0CCB89B819CE05F800068ED6 /* Supporting Files */ = { - isa = PBXGroup; - children = ( - 0CCB89B919CE05F800068ED6 /* Info.plist */, - ); - name = "Supporting Files"; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - 0CCB89A819CE05F800068ED6 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 0CCB89B119CE05F800068ED6 /* IDZSwiftCommonCrypto.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0CCB89BE19CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCrypto" */; - buildPhases = ( - 0CCB89A619CE05F800068ED6 /* Sources */, - 0CCB89A719CE05F800068ED6 /* Frameworks */, - 0CCB89A819CE05F800068ED6 /* Headers */, - 0CCB89A919CE05F800068ED6 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = IDZSwiftCommonCrypto; - productName = IDZSwiftCommonCrypto; - productReference = 0CCB89AB19CE05F800068ED6 /* IDZSwiftCommonCrypto.framework */; - productType = "com.apple.product-type.framework"; - }; - 0CCB89B519CE05F800068ED6 /* IDZSwiftCommonCryptoTests */ = { - isa = PBXNativeTarget; - buildConfigurationList = 0CCB89C119CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTests" */; - buildPhases = ( - 0CCB89B219CE05F800068ED6 /* Sources */, - 0CCB89B319CE05F800068ED6 /* Frameworks */, - 0CCB89B419CE05F800068ED6 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 0CCB89CF19CE0EDF00068ED6 /* PBXTargetDependency */, - ); - name = IDZSwiftCommonCryptoTests; - productName = IDZSwiftCommonCryptoTests; - productReference = 0CCB89B619CE05F800068ED6 /* IDZSwiftCommonCryptoTests.xctest */; - productType = "com.apple.product-type.bundle.unit-test"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - 0CCB89A219CE05F800068ED6 /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0600; - ORGANIZATIONNAME = iOSDeveloperZone.com; - TargetAttributes = { - 0CCB89AA19CE05F800068ED6 = { - CreatedOnToolsVersion = 6.0.1; - }; - 0CCB89B519CE05F800068ED6 = { - CreatedOnToolsVersion = 6.0.1; - }; - }; - }; - buildConfigurationList = 0CCB89A519CE05F800068ED6 /* Build configuration list for PBXProject "IDZSwiftCommonCrypto" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = 0CCB89A119CE05F800068ED6; - productRefGroup = 0CCB89AC19CE05F800068ED6 /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */, - 0CCB89B519CE05F800068ED6 /* IDZSwiftCommonCryptoTests */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXResourcesBuildPhase section */ - 0CCB89A919CE05F800068ED6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0CCB89B419CE05F800068ED6 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXResourcesBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - 0CCB89A619CE05F800068ED6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0CCB89D219CF416B00068ED6 /* Utilities.swift in Sources */, - 0CCB89CC19CE071D00068ED6 /* KeyDerivation.swift in Sources */, - 0C67310219D1EB80009828B8 /* Status.swift in Sources */, - 0C9F5B2E19D2948F00E0B5FF /* Cryptor.swift in Sources */, - 0CCB89C919CE071D00068ED6 /* StreamCryptor.swift in Sources */, - 0CCB89CD19CE071D00068ED6 /* Random.swift in Sources */, - 0C09D79B19E0D4C900A93684 /* README.md in Sources */, - 0CCB89CA19CE071D00068ED6 /* Digest.swift in Sources */, - 0CCB89CB19CE071D00068ED6 /* HMAC.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 0CCB89B219CE05F800068ED6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 0CCB89BB19CE05F800068ED6 /* IDZSwiftCommonCryptoTests.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin PBXTargetDependency section */ - 0CCB89CF19CE0EDF00068ED6 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - target = 0CCB89AA19CE05F800068ED6 /* IDZSwiftCommonCrypto */; - targetProxy = 0CCB89CE19CE0EDF00068ED6 /* PBXContainerItemProxy */; - }; -/* End PBXTargetDependency section */ - -/* Begin XCBuildConfiguration section */ - 0CCB89BC19CE05F800068ED6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = NO; - CURRENT_PROJECT_VERSION = 1; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = YES; - ONLY_ACTIVE_ARCH = YES; - SDKROOT = iphoneos; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 0CCB89BD19CE05F800068ED6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_MODULES = YES; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; - COPY_PHASE_STRIP = YES; - CURRENT_PROJECT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - MTL_ENABLE_DEBUG_INFO = NO; - SDKROOT = iphoneos; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; - 0CCB89BF19CE05F800068ED6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); - INFOPLIST_FILE = IDZSwiftCommonCrypto/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = "${SRCROOT}"; - }; - name = Debug; - }; - 0CCB89C019CE05F800068ED6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - FRAMEWORK_SEARCH_PATHS = ( - "$(inherited)", - "$(PROJECT_DIR)", - ); - INFOPLIST_FILE = IDZSwiftCommonCrypto/Info.plist; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SKIP_INSTALL = YES; - SWIFT_INCLUDE_PATHS = "${SRCROOT}"; - }; - name = Release; - }; - 0CCB89C219CE05F800068ED6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - INFOPLIST_FILE = IDZSwiftCommonCryptoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_INCLUDE_PATHS = "${SRCROOT}/CommonCrypto"; - SWIFT_OPTIMIZATION_LEVEL = "-Onone"; - }; - name = Debug; - }; - 0CCB89C319CE05F800068ED6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_ENABLE_MODULES = YES; - FRAMEWORK_SEARCH_PATHS = ( - "$(SDKROOT)/Developer/Library/Frameworks", - "$(inherited)", - ); - INFOPLIST_FILE = IDZSwiftCommonCryptoTests/Info.plist; - LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks @loader_path/Frameworks"; - PRODUCT_NAME = "$(TARGET_NAME)"; - SWIFT_INCLUDE_PATHS = "${SRCROOT}/CommonCrypto"; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - 0CCB89A519CE05F800068ED6 /* Build configuration list for PBXProject "IDZSwiftCommonCrypto" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0CCB89BC19CE05F800068ED6 /* Debug */, - 0CCB89BD19CE05F800068ED6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0CCB89BE19CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCrypto" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0CCB89BF19CE05F800068ED6 /* Debug */, - 0CCB89C019CE05F800068ED6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 0CCB89C119CE05F800068ED6 /* Build configuration list for PBXNativeTarget "IDZSwiftCommonCryptoTests" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 0CCB89C219CE05F800068ED6 /* Debug */, - 0CCB89C319CE05F800068ED6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = 0CCB89A219CE05F800068ED6 /* Project object */; -} diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Cryptor.swift b/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Cryptor.swift deleted file mode 100644 index a89dfab..0000000 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Cryptor.swift +++ /dev/null @@ -1,98 +0,0 @@ -// -// Cryptor.swift -// IDZSwiftCommonCrypto -// -// Created by idz on 9/23/14. -// Copyright (c) 2014 iOSDeveloperZone.com. All rights reserved. -// - -import Foundation - -/** - Encrypts or decrypts, accumulating result. - - Useful for small in-memory buffers. - - For large files or network streams use StreamCryptor. - */ -public class Cryptor : StreamCryptor -{ - var accumulator : [UInt8] = [] - /** - Upates the accumulated encrypted/decrypted data with the contents - of a Objective-C NSData buffer. - - :param: data the data buffer - :returns: this Cryptor object or nil if an error occurs (for optional chaining) - */ - public func update(data: NSData) -> Cryptor? - { - update(data.bytes, byteCount: UInt(data.length)) - return self.status == Status.Success ? self : nil - } - /** - Upates the accumulated encrypted/decrypted data with the contents - of a Swift byte array. - - :param: byteArray the Swift byte array - :returns: this Cryptor object or nil if an error occurs (for optional chaining) - */ - public func update(byteArray: [UInt8]) -> Cryptor? - { - update(byteArray, byteCount: UInt(byteArray.count)) - return self.status == Status.Success ? self : nil - } - /** - Upates the accumulated encrypted/decrypted data with the contents - of a string (interpreted as UTF8). - - This is really only useful for encryption. - - :returns: this Cryptor object or nil if an error occurs (for optional chaining) - */ - public func update(string: String) -> Cryptor? - { - update(string, byteCount: UInt(string.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))) - return self.status == Status.Success ? self : nil - } - /** - Retrieves the encrypted or decrypted data. - - :returns: the encrypted or decrypted data or nil if an error occured. - */ - public func final() -> [UInt8]? - { - var byteCount = Int(self.getOutputLength(0, isFinal: true)) - var dataOut = Array(count:byteCount, repeatedValue:0) - var dataOutAvailable = UInt(dataOut.count) - var dataOutMoved = UInt(0) - (dataOutMoved, self.status) = final(&dataOut) - if(self.status != Status.Success) { - return nil - } - accumulator += dataOut[0.., byteCount: UInt) -> Cryptor? - { - var outputLength = Int(self.getOutputLength(byteCount, isFinal: false)) - var dataOut = Array(count:outputLength, repeatedValue:0) - var dataOutMoved = UInt(0) - update(buffer, byteCountIn: byteCount, bufferOut: &dataOut, byteCapacityOut: UInt(dataOut.count), byteCountOut: &dataOutMoved) - if(self.status != Status.Success) { - return nil - } - accumulator += dataOut[0.. CCPseudoRandomAlgorithm - { - switch self { - case SHA1: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA1) - case SHA224: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA224) - case SHA256: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256) - case SHA384: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA384) - case SHA512: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA512) - - } - } - } - public class func calibrate(passwordLength: UInt, saltLength: UInt, algorithm: PseudoRandomAlgorithm, derivedKeyLength: UInt, msec : UInt32) -> UInt - { - return UInt(CCCalibratePBKDF(CCPBKDFAlgorithm(kCCPBKDF2), passwordLength, saltLength, algorithm.nativeValue(), derivedKeyLength, msec)) - } - - public class func deriveKey(password: UnsafePointer, passwordLen: UInt, salt: UnsafePointer, saltLen: UInt, prf: PseudoRandomAlgorithm, rounds: uint, derivedKey: UnsafeMutablePointer, derivedKeyLen: UInt) - { - var status : Int32 = CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), password, passwordLen, salt, saltLen, prf.nativeValue(), rounds, derivedKey, derivedKeyLen) - if(status != Int32(kCCSuccess)) - { - NSLog("ERROR: CCKeyDerivationPBDK failed with stats \(status).") - fatalError("ERROR: CCKeyDerivationPBDK failed.") - } - } - - public class func deriveKey(password : String, salt : String, prf: PseudoRandomAlgorithm, rounds: uint, derivedKeyLength: UInt) -> [UInt8] - { - var derivedKey = Array(count:Int(derivedKeyLength), repeatedValue: 0) - var status : Int32 = CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), password, UInt(password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)), salt, UInt(salt.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)), prf.nativeValue(), rounds, &derivedKey, UInt(derivedKey.count)) - if(status != Int32(kCCSuccess)) - { - NSLog("ERROR: CCKeyDerivationPBDK failed with stats \(status).") - fatalError("ERROR: CCKeyDerivationPBDK failed.") - } - return derivedKey - } -} \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Random.swift b/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Random.swift deleted file mode 100644 index efc67c0..0000000 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Random.swift +++ /dev/null @@ -1,29 +0,0 @@ -// -// Random.swift -// SwiftCommonCrypto -// -// Created by idz on 9/19/14. -// Copyright (c) 2014 iOS Developer Zone. All rights reserved. -// - -import Foundation -import CommonCrypto - -public class Random -{ - public class func generateBytes(bytes : UnsafeMutablePointer, byteCount : UInt ) - { - CCRandomGenerateBytes(bytes, byteCount) - } - - public class func generateBytes(byteCount : Int ) -> [UInt8] - { - if(byteCount <= 0) - { - fatalError("generateBytes: byteCount must be positve and non-zero") - } - var bytes : [UInt8] = Array(count:byteCount, repeatedValue:UInt8(0)) - CCRandomGenerateBytes(&bytes, UInt(byteCount)) - return bytes - } -} \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoTests.swift b/IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoTests.swift deleted file mode 100644 index 8af946a..0000000 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoTests.swift +++ /dev/null @@ -1,227 +0,0 @@ -// -// IDZSwiftCommonCryptoTests.swift -// IDZSwiftCommonCryptoTests -// -// Created by idz on 9/20/14. -// Copyright (c) 2014 iOSDeveloperZone.com. All rights reserved. -// - -import UIKit -import XCTest -import IDZSwiftCommonCrypto - -class IDZSwiftCommonCryptoTests: XCTestCase { - - override func setUp() { - super.setUp() - // Put setup code here. This method is called before the invocation of each test method in the class. - } - - override func tearDown() { - // Put teardown code here. This method is called after the invocation of each test method in the class. - super.tearDown() - } - - // MARK: - Cryptor tests - var aesKey1Bytes = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var aesPlaintext1Bytes = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") - var aesCipherText1Bytes = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") - - func test_Cryptor_AES_ECB() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") - - var aesEncrypt = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, - key:aesKey1Bytes, iv:Array()) - var dataOut = Array(count:aesCipherText1Bytes.count, repeatedValue:UInt8(0)) - let (c, status) = aesEncrypt.update(aesPlaintext1Bytes, byteArrayOut: &dataOut) - XCTAssert(aesCipherText1Bytes.count == Int(c) , "Counts are as expected") - XCTAssertEqual(dataOut, aesCipherText1Bytes, "Obtained expected cipher text") - } - /** - Tests two blocks of ECB mode AES. Demonstrates weakness in ECB; repeated plaintext block - results in repeated ciphertext block. - */ - func test_Cryptor_AES_ECB_2() { - var key = aesKey1Bytes //arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = aesPlaintext1Bytes + aesPlaintext1Bytes - var expectedCipherText = aesCipherText1Bytes + aesCipherText1Bytes - - var cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()).update(plainText)?.final() - - assert(expectedCipherText.count == cipherText!.count , "Counts are as expected") - assert(expectedCipherText == cipherText!, "Obtained expected cipher text") - } - /** - Demonstrates alignment error when plaintext is not an integral number - of blocks long. - */ - func test_Cryptor_AES_ECB_Short() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e11739317") - var expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") - - var cryptor = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) - var cipherText = cryptor.update(plainText)?.final() - XCTAssert(cipherText == nil, "Expected nil cipherText") - XCTAssertEqual(cryptor.status, Status.AlignmentError, "Expected AlignmentError") - } - /** - Single block CBC mode. Results should be identical to ECB mode. - */ - func test_Cryptor_AES_CBC_1() { - var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") - var plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") - var expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") - - var cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.None, key:key, iv:Array()).update(plainText)?.final() - - assert(expectedCipherText.count == cipherText!.count , "Counts are as expected") - assert(expectedCipherText == cipherText!, "Obtained expected cipher text") - - var decryptedText = Cryptor(operation:.Decrypt, algorithm:.AES, options:.None, key:key, iv:Array()).update(cipherText!)?.final() - XCTAssertEqual(decryptedText!, plainText, "Recovered plaintext.") - } - - - /** - This is UTF8 encoded "The quick brown fox jumps over the lazy dog." - */ - let qbfBytes : [UInt8] = [0x54,0x68,0x65,0x20,0x71,0x75,0x69,0x63,0x6b,0x20,0x62,0x72,0x6f,0x77,0x6e,0x20,0x66,0x6f,0x78,0x20,0x6a,0x75,0x6d,0x70,0x73,0x20,0x6f,0x76,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x6c,0x61,0x7a,0x79,0x20,0x64,0x6f,0x67,0x2e] - let qbfString = "The quick brown fox jumps over the lazy dog." - /** - This is the MD5 for "The quick brown fox jumps over the lazy dog." - */ - let qbfMD5 : [UInt8] = [0xe4,0xd9,0x09,0xc2, - 0x90,0xd0,0xfb,0x1c, - 0xa0,0x68,0xff,0xad, - 0xdf,0x22,0xcb,0xd0] - - // MARK: - Digest tests - func testMD5_1() - { - var md5 : Digest = Digest(algorithm:.MD5) - md5.update(qbfString) - let digest = md5.final() - - XCTAssertEqual(digest, qbfMD5, "PASS") - } - - func test_Digest_MD5_NSData() - { - let qbfData : NSData = dataFromByteArray(self.qbfBytes) - var digest = Digest(algorithm: .MD5).update(qbfData)?.final() - - XCTAssertEqual(digest!, qbfMD5, "PASS") - } - /** - Test MD5 with string input and optional chaining. - */ - func test_Digest_MD5_Composition_String() - { - var digest = Digest(algorithm: .MD5).update(qbfString)?.final() - XCTAssertEqual(digest!, qbfMD5, "PASS") - } - /** - Test MD5 with optional chaining, string input and 2 updates - */ - func test_Digest_MD5_Composition_String_2() - { - let s1 = "The quick brown fox" - let s2 = " jumps over the lazy dog." - var digest = Digest(algorithm: .MD5).update(s1)?.update(s2)?.final() - - XCTAssertEqual(digest!, qbfMD5, "PASS") - } - /** - Test MD5 with optional chaining and byte array input - */ - func test_Digest_MD5_Composition_Bytes() - { - var digest = Digest(algorithm: .MD5).update(qbfBytes)?.final() - - XCTAssertEqual(digest!, qbfMD5, "PASS") - } - - // MARK: - HMAC tests - // See: https://www.ietf.org/rfc/rfc2202.txt - func test_HMAC_SHA1() - { - var key = arrayFromHexString("0102030405060708090a0b0c0d0e0f10111213141516171819") - var data : [UInt8] = Array(count:50, repeatedValue:0xcd) - var expected = arrayFromHexString("4c9007f4026250c6bc8414f9bf50c86c2d7235da") - - var hmac = HMAC(algorithm:.SHA1, key:key).update(data)?.final() - - XCTAssertEqual(hmac!, expected, "PASS") - } - - func test_HMAC_SHA1_NSData() - { - var key = dataFromHexString("0102030405060708090a0b0c0d0e0f10111213141516171819") - var data = dataFromByteArray(Array(count:50, repeatedValue:0xcd)) - var expected = arrayFromHexString("4c9007f4026250c6bc8414f9bf50c86c2d7235da") - - var hmac = HMAC(algorithm:.SHA1, key:key).update(data)?.final() - - XCTAssertEqual(hmac!, expected, "PASS") - } - - - // MARK: - KeyDerivation tests - // See: https://www.ietf.org/rfc/rfc6070.txt - func test_KeyDerivation_deriveKey() - { - let tests = [ ("password", "salt", 1, 20, "0c60c80f961f0e71f3a9b524af6012062fe037a6"), - ("password", "salt", 2, 20, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"), - ("password", "salt", 4096, 20, "4b007901b765489abead49d926f721d065a429c1"), -// ("password", "salt", 16777216, 20, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984"), - ("passwordPASSWORDpassword", "saltSALTsaltSALTsaltSALTsaltSALTsalt", 4096, 25, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"), - ("pass\0word", "sa\0lt", 4096, 16, "56fa6aa75548099dcc37d7f03425e0c3"), - ] - for (password, salt, rounds, dkLen, expected) in tests - { - let key = PBKDF.deriveKey(password, salt: salt, prf: .SHA1, rounds: uint(rounds), derivedKeyLength: UInt(dkLen)) - let keyString = hexStringFromArray(key) - - XCTAssertEqual(key, arrayFromHexString(expected), "Obtained correct key (\(keyString) == \(expected)") - } - - } - - // MARK: - Random tests - func test_Random_generateBytes() - { - let count = 256*256 - var bytes = Random.generateBytes(count) - XCTAssert(bytes.count == count, "Count has expected value") - } - - - // MARK: - Utilities tests - func test_Utilities_arrayFromHexString_lowerCase() - { - var s = "deadface" - var expected : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] - var result = arrayFromHexString(s) - XCTAssertEqual(result, expected, "PASS") - } - - func test_Utilities_arrayFromHexString_upperCase() - { - var s = "DEADFACE" - var expected : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] - var result = arrayFromHexString(s) - XCTAssertEqual(result, expected, "PASS") - } - - func testHexStringFromArray() - { - var v : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] - XCTAssertEqual(hexStringFromArray(v), "deadface", "PASS (lowercase)") - XCTAssertEqual(hexStringFromArray(v, uppercase: true), "DEADFACE", "PASS (lowercase)") - } - - - -} diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Info.plist b/IDZSwiftCommonCrypto/Info.plist similarity index 91% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Info.plist rename to IDZSwiftCommonCrypto/Info.plist index 72b9757..d3de8ee 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Info.plist +++ b/IDZSwiftCommonCrypto/Info.plist @@ -7,7 +7,7 @@ CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.iosdeveloperzone.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/IDZSwiftCommonCrypto/KeyDerivation.swift b/IDZSwiftCommonCrypto/KeyDerivation.swift new file mode 100644 index 0000000..f1be908 --- /dev/null +++ b/IDZSwiftCommonCrypto/KeyDerivation.swift @@ -0,0 +1,106 @@ +// +// KeyDerivation.swift +// SwiftCommonCrypto +// +// Created by idz on 9/19/14. +// Copyright (c) 2014 iOS Developer Zone. All rights reserved. +// + +import Foundation +import CommonCrypto + +/// +/// Derives key material from a password or passphrase. +/// +public class PBKDF +{ + /// Enumerates available pseudo random algorithms + public enum PseudoRandomAlgorithm + { + /// Secure Hash Algorithm 1 + case SHA1 + /// Secure Hash Algorithm 2 224-bit + case SHA224 + /// Secure Hash Algorithm 2 256-bit + case SHA256 + /// Secure Hash Algorithm 2 384-bit + case SHA384 + /// Secure Hash Algorithm 2 512-bit + case SHA512 + + func nativeValue() -> CCPseudoRandomAlgorithm + { + switch self { + case SHA1: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA1) + case SHA224: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA224) + case SHA256: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA256) + case SHA384: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA384) + case SHA512: return CCPseudoRandomAlgorithm(kCCPRFHmacAlgSHA512) + + } + } + } + + /// + /// Determines the (approximate) number of iterations of the key derivation algorithm that need + /// to be run to achieve a particular delay (or calculation time). + /// + /// - parameter passwordLength: password length in bytes + /// - parameter saltLength: salt length in bytes + /// - parameter algorithm: the PseudoRandomAlgorithm to use + /// - parameter derivedKeyLength: the desired key length + /// - parameter msec: the desired calculation time + /// - returns: the number of times the algorithm should be run + /// + public class func calibrate(passwordLength: Int, saltLength: Int, algorithm: PseudoRandomAlgorithm, derivedKeyLength: Int, msec : UInt32) -> UInt + { + return UInt(CCCalibratePBKDF(CCPBKDFAlgorithm(kCCPBKDF2), passwordLength, saltLength, algorithm.nativeValue(), derivedKeyLength, msec)) + } + + + /// + /// Derives key material from a password and salt. + /// + /// -parameter password: the password string, will be converted using UTF8 + /// -parameter salt: the salt string will be converted using UTF8 + /// -parameter prf: the pseudo random function + /// -parameter round: the number of rounds + /// -parameter derivedKeyLength: the length of the desired derived key, in bytes. + /// -returns: the derived key + /// + public class func deriveKey(password : String, salt : String, prf: PseudoRandomAlgorithm, rounds: uint, derivedKeyLength: UInt) -> [UInt8] + { + var derivedKey = Array(count:Int(derivedKeyLength), repeatedValue: 0) + let status : Int32 = CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), password, password.lengthOfBytesUsingEncoding(NSUTF8StringEncoding), salt, salt.lengthOfBytesUsingEncoding(NSUTF8StringEncoding), prf.nativeValue(), rounds, &derivedKey, derivedKey.count) + if(status != Int32(kCCSuccess)) + { + NSLog("ERROR: CCKeyDerivationPBDK failed with stats \(status).") + fatalError("ERROR: CCKeyDerivationPBDK failed.") + } + return derivedKey + } + + //MARK: - Low-level Routines + /// + /// Derives key material from a password buffer. + /// + /// - parameter password: pointer to the password buffer + /// - parameter passwordLength: password length in bytes + /// - parameter salt: pointer to the salt buffer + /// - parameter saltLength: salt length in bytes + /// - parameter prf: the PseudoRandomAlgorithm to use + /// - parameter rounds: the number of rounds of the algorithm to use + /// - parameter derivedKey: pointer to the derived key buffer. + /// - parameter derivedKeyLength: the desired key length + /// - return: the number of times the algorithm should be run + /// + public class func deriveKey(password: UnsafePointer, passwordLen: Int, salt: UnsafePointer, saltLen: Int, prf: PseudoRandomAlgorithm, rounds: uint, derivedKey: UnsafeMutablePointer, derivedKeyLen: Int) + { + let status : Int32 = CCKeyDerivationPBKDF(CCPBKDFAlgorithm(kCCPBKDF2), password, passwordLen, salt, saltLen, prf.nativeValue(), rounds, derivedKey, derivedKeyLen) + if(status != Int32(kCCSuccess)) + { + NSLog("ERROR: CCKeyDerivationPBDK failed with stats \(status).") + fatalError("ERROR: CCKeyDerivationPBDK failed.") + } + } +} \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/Documentation/section-0.html b/IDZSwiftCommonCrypto/README.playground/Documentation/section-0.html index 40b9223..1551d33 100644 --- a/IDZSwiftCommonCrypto/README.playground/Documentation/section-0.html +++ b/IDZSwiftCommonCrypto/README.playground/Documentation/section-0.html @@ -11,18 +11,18 @@
-

IDZSwiftCommonCrypto Build Status

+

IDZSwiftCommonCrypto Carthage compatible Build Status

A Swift wrapper for Apple's CommonCrypto library.

Using IDZSwiftCommonCrypto

-

Since CommonCrypto is not a standalone module, you need to generate a fake module map to convince Xcode into allowing you to import CommonCrypto. The GenerateCommonCryptoModule script provides two methods for doing this. Which method you choosed depends on whether you want to able to use CommonCrypto and, by extension, IDZSwiftCommonCrypto in playgrounds.

+

Since CommonCrypto is not a standalone module, you need to generate a fake module map to convince Xcode into allowing you to import CommonCrypto. The GenerateCommonCryptoModule script provides two methods for doing this. Which method you choose depends on whether you want to able to use CommonCrypto and, by extension, IDZSwiftCommonCrypto in playgrounds.

To make CommonCrypto available to frameworks and playground use the command:

    ./GenerateCommonCryptoModule iphonesimulator8.0
 
-

This command creates a CommonCrypto.framework in the SDK system library directory.

+

This command creates a CommonCrypto.framework in the SDK system library directory. You should now be able to use either CommonCrypto or IDZSwiftCommonCrypto in a playground simply importing them or in your own app project by dragging the IDZSwiftCommonCrypto.xcodeproj into your project.

If you do not want to add any files to your SDK you can use the command

    ./GenerateCommonCryptoModule iphonesimulator8.0 .
 
-

This method creates a CommonCrypto directory within the IDZSwiftCommonCrypto source tree, so the SDK directories are not altered, but the module is not available in playgrounds. Also, the Module Import Path in any project that uses the framework will have to be set to point to this directory. For more about this, see my blog post Using CommonCrypto in Swift

+

This method creates a CommonCrypto directory within the IDZSwiftCommonCrypto source tree, so the SDK directories are not altered, but the module is not available in playgrounds. To use the framework in your own project drag the IDZSwiftCommonCrypto.xcodeproj into your project and set the Module Import Path to the directory containing the CommonCrypto directory created by the script. For more about this, see my blog post Using CommonCrypto in Swift

diff --git a/IDZSwiftCommonCrypto/README.playground/contents.xcplayground b/IDZSwiftCommonCrypto/README.playground/contents.xcplayground index 178d9e6..26af4d1 100644 --- a/IDZSwiftCommonCrypto/README.playground/contents.xcplayground +++ b/IDZSwiftCommonCrypto/README.playground/contents.xcplayground @@ -1,25 +1,43 @@ - + - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-2-original.swift b/IDZSwiftCommonCrypto/README.playground/section-1.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-2-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-1.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-12-original.swift b/IDZSwiftCommonCrypto/README.playground/section-11.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-12-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-11.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-14-original.swift b/IDZSwiftCommonCrypto/README.playground/section-13.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-14-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-13.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-16-original.swift b/IDZSwiftCommonCrypto/README.playground/section-15.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-16-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-15.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-18-original.swift b/IDZSwiftCommonCrypto/README.playground/section-17.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-18-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-17.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-2.swift b/IDZSwiftCommonCrypto/README.playground/section-2.swift deleted file mode 100644 index fa22d5d..0000000 --- a/IDZSwiftCommonCrypto/README.playground/section-2.swift +++ /dev/null @@ -1 +0,0 @@ -import IDZSwiftCommonCrypto diff --git a/IDZSwiftCommonCrypto/README.playground/section-4-original.swift b/IDZSwiftCommonCrypto/README.playground/section-3.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-4-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-3.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-6-original.swift b/IDZSwiftCommonCrypto/README.playground/section-5.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-6-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-5.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-8-original.swift b/IDZSwiftCommonCrypto/README.playground/section-7.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-8-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-7.swift diff --git a/IDZSwiftCommonCrypto/README.playground/section-10-original.swift b/IDZSwiftCommonCrypto/README.playground/section-9.swift similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/section-10-original.swift rename to IDZSwiftCommonCrypto/README.playground/section-9.swift diff --git a/IDZSwiftCommonCrypto/README.playground/timeline.xctimeline b/IDZSwiftCommonCrypto/README.playground/timeline.xctimeline deleted file mode 100644 index bf468af..0000000 --- a/IDZSwiftCommonCrypto/README.playground/timeline.xctimeline +++ /dev/null @@ -1,6 +0,0 @@ - - - - - diff --git a/IDZSwiftCommonCrypto/Random.swift b/IDZSwiftCommonCrypto/Random.swift new file mode 100644 index 0000000..789daf6 --- /dev/null +++ b/IDZSwiftCommonCrypto/Random.swift @@ -0,0 +1,74 @@ +// +// Random.swift +// SwiftCommonCrypto +// +// Created by idz on 9/19/14. +// Copyright (c) 2014 iOS Developer Zone. All rights reserved. +// +// https://opensource.apple.com/source/CommonCrypto/CommonCrypto-60061/lib/CommonRandom.c + +import Foundation +import CommonCrypto + +public typealias RNGStatus = Status + +/// +/// Generates buffers of random bytes. +/// +public class Random +{ + /** + Wraps native CCRandomeGenerateBytes call. + + :note: CCRNGStatus is typealiased to CCStatus but this routine can only return kCCSuccess or kCCRNGFailure + + - parameter bytes: a pointer to the buffer that will receive the bytes + - return: .Success or .RNGFailure as appropriate. + + */ + public class func generateBytes(bytes : UnsafeMutablePointer, byteCount : Int ) -> RNGStatus + { + let statusCode = CCRandomGenerateBytes(bytes, byteCount) + guard let status = Status(rawValue: statusCode) else { + fatalError("CCRandomGenerateBytes returned unexpected status code: \(statusCode)") + } + return status + } + /** + Generates an array of random bytes. + + - parameter bytesCount: number of random bytes to generate + - return: an array of random bytes + - throws: an `RNGStatus` on failure + */ + public class func generateBytes(byteCount : Int ) throws -> [UInt8] + { + guard byteCount > 0 else { throw RNGStatus.ParamError } + + var bytes : [UInt8] = Array(count:byteCount, repeatedValue:UInt8(0)) + let status = generateBytes(&bytes, byteCount: byteCount) + + guard status == .Success else { throw status } + return bytes + } + + /** + A version of generateBytes that always throws an error. + + Use it to test that code handles this. + + - parameter bytesCount: number of random bytes to generate + - return: an array of random bytes + */ + public class func generateBytesThrow(byteCount : Int ) throws -> [UInt8] + { + if(byteCount <= 0) + { + fatalError("generateBytes: byteCount must be positve and non-zero") + } + var bytes : [UInt8] = Array(count:byteCount, repeatedValue:UInt8(0)) + let status = generateBytes(&bytes, byteCount: byteCount) + throw status + //return bytes + } +} \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Status.swift b/IDZSwiftCommonCrypto/Status.swift similarity index 75% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Status.swift rename to IDZSwiftCommonCrypto/Status.swift index 66d794b..2c0d189 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Status.swift +++ b/IDZSwiftCommonCrypto/Status.swift @@ -9,18 +9,33 @@ import Foundation import CommonCrypto -public enum Status : CCCryptorStatus, Printable +/// +/// Links the native CommonCryptoStatus enumeration to Swiftier versions. +/// +public enum Status : CCCryptorStatus, CustomStringConvertible, ErrorType { + /// Successful case Success, + /// Parameter Error ParamError, + /// Buffer too Small BufferTooSmall, + /// Memory Failure MemoryFailure, + /// Alignment Error AlignmentError, + /// Decode Error DecodeError, + /// Unimplemented Unimplemented, + /// Overflow Overflow, + /// Random Number Generator Err RNGFailure + /// + /// Converts this value to a native `CCCryptorStatus` value. + /// public func toRaw() -> CCCryptorStatus { switch self { @@ -36,19 +51,25 @@ public enum Status : CCCryptorStatus, Printable } } + /// + /// Human readable descriptions of the values. (Not needed in Swift 2.0?) + /// static let descriptions = [ Success: "Success", ParamError: "ParamError", BufferTooSmall: "BufferTooSmall", MemoryFailure: "MemoryFailure", AlignmentError: "AlignmentError", DecodeError: "DecodeError", Unimplemented: "Unimplemented", Overflow: "Overflow", RNGFailure: "RNGFailure"] + + /// + /// Obtain human-readable string from enum value. + /// public var description : String { return (Status.descriptions[self] != nil) ? Status.descriptions[self]! : "" } - - - - + /// + /// Create enum value from raw `CCCryptorStatus` value. + /// public static func fromRaw(status : CCCryptorStatus) -> Status? { var from = [ kCCSuccess: Success, kCCParamError: ParamError, @@ -56,18 +77,6 @@ public enum Status : CCCryptorStatus, Printable kCCAlignmentError: AlignmentError, kCCDecodeError: DecodeError, kCCUnimplemented: Unimplemented, kCCOverflow: Overflow, kCCRNGFailure: RNGFailure] return from[Int(status)] - - -// switch status { -// case kCCSuccess: return Success -// case kCCParamError: return ParamError -// case kCCBufferTooSmall: return BufferTooSmall -// case kCCMemoryFailure: return MemoryFailure -// case kCCAlignmentError: return AlignmentError -// case kCCDecodeError: return DecodeError -// case kCCUnimplemented: return Unimplemented -// case kCCOverflow: return Overflow -// case kCCRNGFailure: return RNGFailure -// } + } } diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/StreamCryptor.swift b/IDZSwiftCommonCrypto/StreamCryptor.swift similarity index 57% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/StreamCryptor.swift rename to IDZSwiftCommonCrypto/StreamCryptor.swift index 98db580..cc036b0 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/StreamCryptor.swift +++ b/IDZSwiftCommonCrypto/StreamCryptor.swift @@ -12,7 +12,7 @@ import CommonCrypto /** Encrypts or decrypts return results as they become available. - :note: The underlying cipher may be a block or a stream cipher. + - note: The underlying cipher may be a block or a stream cipher. Use for large files or network streams. @@ -20,10 +20,17 @@ import CommonCrypto */ public class StreamCryptor { + /// + /// Enumerates Cryptor operations + /// public enum Operation { - case Encrypt, Decrypt + /// Encrypting + case Encrypt, + /// Decrypting + Decrypt + /// Convert to native `CCOperation` func nativeValue() -> CCOperation { switch self { case Encrypt : return CCOperation(kCCEncrypt) @@ -32,10 +39,25 @@ public class StreamCryptor } } + /// + /// Enumerates available algorithms + /// public enum Algorithm { - case AES, DES, TripleDES, CAST, RC2, Blowfish + /// Advanced Encryption Standard + case AES, + /// Data Encryption Standard + DES, + /// Triple DES + TripleDES, + /// CAST + CAST, + /// RC2 + RC2, + /// Blowfish + Blowfish + /// Blocksize, in bytes, of algorithm. public func blockSize() -> Int { switch self { case AES : return kCCBlockSizeAES128 @@ -46,7 +68,7 @@ public class StreamCryptor case Blowfish : return kCCBlockSizeBlowfish } } - + /// Native, CommonCrypto constant for algorithm. func nativeValue() -> CCAlgorithm { switch self { @@ -68,55 +90,75 @@ public class StreamCryptor * NSHipster * From: http://nshipster.com/rawoptionsettype/ */ - public struct Options : RawOptionSetType, BooleanType { + /// + /// Maps CommonCryptoOptions onto a Swift struct. + /// + public struct Options : OptionSetType, BooleanType { private var value: UInt = 0 - typealias RawValue = UInt + public typealias RawValue = UInt + + // Needed by 2.0 RawRepresentable + /// Convert to native raw value public var rawValue : UInt { return self.value } + + /// Initialize from a raw value public init(_ rawValue: UInt) { self.value = rawValue } // Needed for 1.1 RawRepresentable + // Needed for 2.0 OptionSetType + /// Convert from a native value (i.e. `0`, `kCCOptionPKCS7Padding`, `kCCOptionECBMode`) public init(rawValue: UInt) { self.value = rawValue } // Needed for 1.1 NilLiteralConverable + /// Initialize from a nil literal public init(nilLiteral: ()) { } // Needed for 1.0 _RawOptionSet + /// Create from a mask public static func fromMask(raw: UInt) -> Options { - return self(raw) + return self.init(raw) } + /// Convert from native raw value. public static func fromRaw(raw: UInt) -> Options? { - return self(raw) + return self.init(raw) } + /// Convert to native raw value. public func toRaw() -> UInt { return value } + /// Convert to boolean value. public var boolValue: Bool { return value != 0 } + /// Initialize to value appropriate for "all zeros" of a mask. public static var allZeros: Options { - return self(0) + return self.init(0) } + /// nil is consider the same a zero or None. public static func convertFromNilLiteral() -> Options { - return self(0) + return self.init(0) } - public static var None: Options { return self(0) } - public static var PKCS7Padding: Options { return self(UInt(kCCOptionPKCS7Padding)) } - public static var ECBMode: Options { return self(UInt(kCCOptionECBMode)) } + /// No options + public static var None: Options { return self.init(0) } + /// Use padding. Needed unless the input is a integral number of blocks long. + public static var PKCS7Padding: Options { return self.init(UInt(kCCOptionPKCS7Padding)) } + /// Electronic Code Book Mode. Don't use this. + public static var ECBMode: Options { return self.init(UInt(kCCOptionECBMode)) } } @@ -131,69 +173,69 @@ public class StreamCryptor /** Creates a new StreamCryptor - :param: operation the operation to perform see Operation (Encrypt, Decrypt) - :param: algorithm the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish) - :param: key a byte array containing key data - :param: iv a byte array containing initialization vector + - parameter operation: the operation to perform see Operation (Encrypt, Decrypt) + - parameter algorithm: the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish) + - parameter key: a byte array containing key data + - parameter iv: a byte array containing initialization vector */ public convenience init(operation: Operation, algorithm: Algorithm, options: Options, key: [UInt8], iv : [UInt8]) { - self.init(operation:operation, algorithm:algorithm, options:options, keyBuffer:key, keyByteCount:UInt(key.count), ivBuffer:iv) + self.init(operation:operation, algorithm:algorithm, options:options, keyBuffer:key, keyByteCount:key.count, ivBuffer:iv) } /** Creates a new StreamCryptor - :param: operation the operation to perform see Operation (Encrypt, Decrypt) - :param: algorithm the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish) - :param: key a string containing key data (will be interpreted as UTF8) - :param: iv a string containing initialization vector data (will be interpreted as UTF8) + - parameter operation: the operation to perform see Operation (Encrypt, Decrypt) + - parameter algorithm: the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish) + - parameter key: a string containing key data (will be interpreted as UTF8) + - parameter iv: a string containing initialization vector data (will be interpreted as UTF8) */ public convenience init(operation: Operation, algorithm: Algorithm, options: Options, key: String, iv : String) { - self.init(operation:operation, algorithm:algorithm, options:options, keyBuffer:key, keyByteCount:UInt(key.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)), ivBuffer:iv) + self.init(operation:operation, algorithm:algorithm, options:options, keyBuffer:key, keyByteCount:key.lengthOfBytesUsingEncoding(NSUTF8StringEncoding), ivBuffer:iv) } /** Add the contents of an Objective-C NSData buffer to the current encryption/decryption operation. - :param: dataIn the input data - :param: byteArrayOut output data - :returns: a tuple containing the number of output bytes produced and the status (see Status) + - parameter dataIn: the input data + - parameter byteArrayOut: output data + - returns: a tuple containing the number of output bytes produced and the status (see Status) */ - public func update(dataIn: NSData, inout byteArrayOut: [UInt8]) -> (UInt, Status) + public func update(dataIn: NSData, inout byteArrayOut: [UInt8]) -> (Int, Status) { - var dataOutAvailable = UInt(byteArrayOut.count) - var dataOutMoved = UInt(0) - update(dataIn.bytes, byteCountIn: UInt(dataIn.length), bufferOut: &byteArrayOut, byteCapacityOut: UInt(byteArrayOut.count), byteCountOut: &dataOutMoved) + let dataOutAvailable = byteArrayOut.count + var dataOutMoved = 0 + update(dataIn.bytes, byteCountIn: dataIn.length, bufferOut: &byteArrayOut, byteCapacityOut: dataOutAvailable, byteCountOut: &dataOutMoved) return (dataOutMoved, self.status) } /** Add the contents of a Swift byte array to the current encryption/decryption operation. - :param: byteArrayIn the input data - :param: byteArrayOut output data - :returns: a tuple containing the number of output bytes produced and the status (see Status) + - parameter byteArrayIn: the input data + - parameter byteArrayOut: output data + - returns: a tuple containing the number of output bytes produced and the status (see Status) */ - public func update(byteArrayIn: [UInt8], inout byteArrayOut: [UInt8]) -> (UInt, Status) + public func update(byteArrayIn: [UInt8], inout byteArrayOut: [UInt8]) -> (Int, Status) { - var dataOutAvailable = UInt(byteArrayOut.count) - var dataOutMoved = UInt(0) - update(byteArrayIn, byteCountIn: UInt(byteArrayIn.count), bufferOut: &byteArrayOut, byteCapacityOut: UInt(byteArrayOut.count), byteCountOut: &dataOutMoved) + let dataOutAvailable = byteArrayOut.count + var dataOutMoved = 0 + update(byteArrayIn, byteCountIn: byteArrayIn.count, bufferOut: &byteArrayOut, byteCapacityOut: dataOutAvailable, byteCountOut: &dataOutMoved) return (dataOutMoved, self.status) } /** Add the contents of a string (interpreted as UTF8) to the current encryption/decryption operation. - :param: byteArrayIn the input data - :param: byteArrayOut output data - :returns: a tuple containing the number of output bytes produced and the status (see Status) + - parameter byteArrayIn: the input data + - parameter byteArrayOut: output data + - returns: a tuple containing the number of output bytes produced and the status (see Status) */ - public func update(stringIn: String, inout byteArrayOut: [UInt8]) -> (UInt, Status) + public func update(stringIn: String, inout byteArrayOut: [UInt8]) -> (Int, Status) { - var dataOutAvailable = UInt(byteArrayOut.count) - var dataOutMoved = UInt(0) - update(stringIn, byteCountIn: UInt(stringIn.lengthOfBytesUsingEncoding(NSUTF8StringEncoding)), bufferOut: &byteArrayOut, byteCapacityOut: UInt(byteArrayOut.count), byteCountOut: &dataOutMoved) + let dataOutAvailable = byteArrayOut.count + var dataOutMoved = 0 + update(stringIn, byteCountIn: stringIn.lengthOfBytesUsingEncoding(NSUTF8StringEncoding), bufferOut: &byteArrayOut, byteCapacityOut: dataOutAvailable, byteCountOut: &dataOutMoved) return (dataOutMoved, self.status) } /** @@ -205,27 +247,27 @@ public class StreamCryptor :note: This method updates the status property - :param: byteArrayOut the output bffer - :returns: a tuple containing the number of output bytes produced and the status (see Status) + - parameter byteArrayOut: the output bffer + - returns: a tuple containing the number of output bytes produced and the status (see Status) */ - public func final(inout byteArrayOut: [UInt8]) -> (UInt, Status) + public func final(inout byteArrayOut: [UInt8]) -> (Int, Status) { - var dataOutAvailable = UInt(byteArrayOut.count) - var dataOutMoved = UInt(0) - final(&byteArrayOut, byteCapacityOut: UInt(byteArrayOut.count), byteCountOut: &dataOutMoved) + let dataOutAvailable = byteArrayOut.count + var dataOutMoved = 0 + final(&byteArrayOut, byteCapacityOut: dataOutAvailable, byteCountOut: &dataOutMoved) return (dataOutMoved, self.status) } // MARK: - Low-level interface /** - :param: operation the operation to perform see Operation (Encrypt, Decrypt) - :param: algorithm the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish) - :param: keyBuffer pointer to key buffer - :param: keyByteCount number of bytes in the key - :param: ivBuffer initialization vector buffer + - parameter operation: the operation to perform see Operation (Encrypt, Decrypt) + - parameter algorithm: the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish) + - parameter keyBuffer: pointer to key buffer + - parameter keyByteCount: number of bytes in the key + - parameter ivBuffer: initialization vector buffer */ public init(operation: Operation, algorithm: Algorithm, options: Options, keyBuffer: UnsafePointer, - keyByteCount: UInt, ivBuffer: UnsafePointer) + keyByteCount: Int, ivBuffer: UnsafePointer) { let rawStatus = CCCryptorCreate(operation.nativeValue(), algorithm.nativeValue(), CCOptions(options.toRaw()), keyBuffer, keyByteCount, ivBuffer, context) if let status = Status.fromRaw(rawStatus) @@ -239,14 +281,14 @@ public class StreamCryptor } } /** - :param: bufferIn pointer to input buffer - :param: inByteCount number of bytes contained in input buffer - :param: bufferOut pointer to output buffer - :param: outByteCapacity capacity of the output buffer in bytes - :param: outByteCount on successful completion, the number of bytes written to the output buffer - :returns: + - parameter bufferIn: pointer to input buffer + - parameter inByteCount: number of bytes contained in input buffer + - parameter bufferOut: pointer to output buffer + - parameter outByteCapacity: capacity of the output buffer in bytes + - parameter outByteCount: on successful completion, the number of bytes written to the output buffer + - returns: */ - public func update(bufferIn: UnsafePointer, byteCountIn: UInt, bufferOut: UnsafeMutablePointer, byteCapacityOut : UInt, inout byteCountOut : UInt) -> Status + public func update(bufferIn: UnsafePointer, byteCountIn: Int, bufferOut: UnsafeMutablePointer, byteCapacityOut : Int, inout byteCountOut : Int) -> Status { if(self.status == Status.Success) { @@ -273,11 +315,11 @@ public class StreamCryptor :note: This method updates the status property - :param: bufferOut pointer to output buffer - :param: outByteCapacity capacity of the output buffer in bytes - :param: outByteCount on successful completion, the number of bytes written to the output buffer + - parameter bufferOut: pointer to output buffer + - parameter outByteCapacity: capacity of the output buffer in bytes + - parameter outByteCount: on successful completion, the number of bytes written to the output buffer */ - public func final(bufferOut: UnsafeMutablePointer, byteCapacityOut : UInt, inout byteCountOut : UInt) -> Status + public func final(bufferOut: UnsafeMutablePointer, byteCapacityOut : Int, inout byteCountOut : Int) -> Status { if(self.status == Status.Success) { @@ -298,10 +340,10 @@ public class StreamCryptor Determines the number of bytes that wil be output by this Cryptor if inputBytes of additional data is input. - :param: inputByteCount number of bytes that will be input. - :param: isFinal true if buffer to be input will be the last input buffer, false otherwise. + - parameter inputByteCount: number of bytes that will be input. + - parameter isFinal: true if buffer to be input will be the last input buffer, false otherwise. */ - public func getOutputLength(inputByteCount : UInt, isFinal : Bool = false) -> UInt + public func getOutputLength(inputByteCount : Int, isFinal : Bool = false) -> Int { return CCCryptorGetOutputLength(context.memory, inputByteCount, isFinal) } diff --git a/IDZSwiftCommonCrypto/Updateable.swift b/IDZSwiftCommonCrypto/Updateable.swift new file mode 100644 index 0000000..521cf22 --- /dev/null +++ b/IDZSwiftCommonCrypto/Updateable.swift @@ -0,0 +1,60 @@ +// +// Updateable.swift +// IDZSwiftCommonCrypto +// +// Created by idz on 9/16/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +import Foundation + +/// +/// A protocol for calculations that can be updated with incremental data buffers. +/// +public protocol Updateable { + /// Status of the calculation. + var status : Status { get } + /// Low-level update routine. + /// Updates the calculation with the contents of a data buffer. + /// - parameter buffer: pointer to the data buffer + /// - parameter byteCount: length of the buffer in bytes + /// - returns: self if no error for optional chaining, null otherwise + func update(buffer : UnsafePointer, _ byteCount : size_t) -> Self? +} + +/// +/// Factors out common update code from Digest, HMAC and Cryptor. +/// +extension Updateable { + /// + /// Updates the current calculation with data contained in an `NSData` object. + /// + /// - parameters data: the data buffer + /// + public func update(data: NSData) -> Self? + { + update(data.bytes, size_t(data.length)) + return self.status == Status.Success ? self : nil + } + /// + /// Updates the current calculation with data contained in a Swift array. + /// + /// - parameters byteArray: the Swift array + /// + public func update(byteArray : [UInt8]) -> Self? + { + update(byteArray, size_t(byteArray.count)) + return self.status == Status.Success ? self : nil + } + /// + /// Updates the current calculation with data contained in a Swift string. + /// The corresponding data will be generated using UTF8 encoding. + /// + /// - parameters string: the Swift string + /// + public func update(string: String) -> Self? + { + update(string, size_t(string.lengthOfBytesUsingEncoding(NSUTF8StringEncoding))) + return self.status == Status.Success ? self : nil + } +} \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Utilities.swift b/IDZSwiftCommonCrypto/Utilities.swift similarity index 50% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Utilities.swift rename to IDZSwiftCommonCrypto/Utilities.swift index ff5b249..804234d 100644 --- a/IDZSwiftCommonCrypto/IDZSwiftCommonCrypto/Utilities.swift +++ b/IDZSwiftCommonCrypto/Utilities.swift @@ -8,6 +8,12 @@ import Foundation +/// +/// Converts a single hexadecimal digit encoded as a Unicode Scalar to it's corresponding value. +/// +/// - parameter c: A Unicode scalar in the set 0..9a..fA..F +/// - returns: the hexadecimal value of the digit +/// func convertHexDigit(c : UnicodeScalar) -> UInt8 { switch c { @@ -18,7 +24,12 @@ func convertHexDigit(c : UnicodeScalar) -> UInt8 } } - +/// +/// Converts a string of hexadecimal digits to a Swift array. +/// +/// - parameter s: the hex string (must contain an even number of digits) +/// - returns: a Swift array +/// public func arrayFromHexString(s : String) -> [UInt8] { var g = s.unicodeScalars.generate() @@ -37,23 +48,61 @@ public func arrayFromHexString(s : String) -> [UInt8] return a } +/// +/// Converts a string of hexadecimal digits to an `NSData` object. +/// +/// - parameter s: the hex string (must contain an even number of digits) +/// - returns: an NSData object +/// public func dataFromHexString(s : String) -> NSData { let a = arrayFromHexString(s) return NSData(bytes:a, length:a.count) } +/// +/// Converts a Swift array to an `NSData` object. +/// +/// - parameter a: the Swift array +/// - returns: an NSData object +/// public func dataFromByteArray(a : [UInt8]) -> NSData { return NSData(bytes:a, length:a.count) } +/// +/// Converts a Swift array to a string of hexadecimal digits. +/// +/// - parameter a: the Swift array +/// - parameter uppercase: if true use uppercase for letter digits, lowercase otherwise +/// - returns: a Swift string +/// public func hexStringFromArray(a : [UInt8], uppercase : Bool = false) -> String { - return a.map() { String(format:uppercase ? "%02X" : "%02x", $0) }.reduce("", +) + return a.map() { String(format:uppercase ? "%02X" : "%02x", $0) }.reduce("", combine: +) } +/// +/// Converts a Swift array to an `NSString` object. +/// +/// - parameter a: the Swift array +/// - parameter uppercase: if true use uppercase for letter digits, lowercase otherwise +/// - returns: an `NSString` object +/// public func hexNSStringFromArray(a : [UInt8], uppercase : Bool = false) -> NSString { - return a.map() { String(format:uppercase ? "%02X" : "%02x", $0) }.reduce("", +) + return a.map() { String(format:uppercase ? "%02X" : "%02x", $0) }.reduce("", combine: +) +} + +/// +/// Converts a Swift array to a Swift `String` containing a comma separated list of bytes. +/// This is used to generate test data programmatically. +/// +/// - parameter a: the Swift array +/// - returns: a Swift string +/// +public func hexListFromArray(a : [UInt8]) -> String +{ + return a.map() { String(format:"0x%02x, ", $0) }.reduce("", combine: +) } \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/log.out b/IDZSwiftCommonCrypto/log.out deleted file mode 100644 index 6643f36..0000000 --- a/IDZSwiftCommonCrypto/log.out +++ /dev/null @@ -1,58 +0,0 @@ -2014-10-06 11:15:23.917 xcodebuild[34659:1007] [MT] DVTAssertions: Warning in /SourceCache/IDEFrameworks/IDEFrameworks-6539/IDEFoundation/SourceControl/Model/IDESourceControlManager.m:423 -Details: Error Domain=com.apple.dt.IDESourceControlErrorDomain Code=-1 "Missing extension: public.vcs.subversion" UserInfo=0x7ff244bd5f70 {NSLocalizedDescription=Missing extension: public.vcs.subversion} -Object: -Method: -loadRepositories -Thread: {name = (null), num = 1} -Please file a bug at http://bugreport.apple.com with this warning message and any useful information you can provide. -=== BUILD TARGET IDZSwiftCommonCrypto OF PROJECT IDZSwiftCommonCrypto WITH CONFIGURATION Debug === - -Check dependencies -warning: no rule to process file '/Users/idz/Documents/src/IDZSwiftCommonCrypto/README.md' of type net.daringfireball.markdown for architecture x86_64 - -=== BUILD TARGET IDZSwiftCommonCryptoTests OF PROJECT IDZSwiftCommonCrypto WITH CONFIGURATION Debug === - -Check dependencies - -Test Suite 'All tests' started at 2014-10-06 18:15:47 +0000 -Test Suite 'IDZSwiftCommonCryptoTests.xctest' started at 2014-10-06 18:15:47 +0000 -Test Suite 'IDZSwiftCommonCryptoTests' started at 2014-10-06 18:15:47 +0000 -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_CBC_1]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_CBC_1]' passed (0.149 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_ECB]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_ECB]' passed (0.032 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_ECB_2]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_ECB_2]' passed (0.033 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_ECB_Short]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Cryptor_AES_ECB_Short]' passed (0.008 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_Composition_Bytes]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_Composition_Bytes]' passed (0.001 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_Composition_String]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_Composition_String]' passed (0.085 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_Composition_String_2]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_Composition_String_2]' passed (0.003 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_NSData]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Digest_MD5_NSData]' passed (0.008 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_HMAC_SHA1]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_HMAC_SHA1]' passed (0.068 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_HMAC_SHA1_NSData]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_HMAC_SHA1_NSData]' passed (0.006 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_KeyDerivation_deriveKey]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_KeyDerivation_deriveKey]' passed (0.088 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Random_generateBytes]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Random_generateBytes]' passed (0.014 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Utilities_arrayFromHexString_lowerCase]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Utilities_arrayFromHexString_lowerCase]' passed (0.004 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Utilities_arrayFromHexString_upperCase]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests test_Utilities_arrayFromHexString_upperCase]' passed (0.006 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests testHexStringFromArray]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests testHexStringFromArray]' passed (0.002 seconds). -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests testMD5_1]' started. -Test Case '-[IDZSwiftCommonCryptoTests.IDZSwiftCommonCryptoTests testMD5_1]' passed (0.002 seconds). -Test Suite 'IDZSwiftCommonCryptoTests' passed at 2014-10-06 18:15:47 +0000. - Executed 16 tests, with 0 failures (0 unexpected) in 0.510 (0.538) seconds -Test Suite 'IDZSwiftCommonCryptoTests.xctest' passed at 2014-10-06 18:15:47 +0000. - Executed 16 tests, with 0 failures (0 unexpected) in 0.510 (0.540) seconds -Test Suite 'All test** TEST SUCCEEDED ** - -s' passed at 2014-10-06 18:15:47 +0000. - Executed 16 tests, with 0 failures (0 unexpected) in 0.510 (0.544) seconds diff --git a/IDZSwiftCommonCryptoTestApp/AppDelegate.swift b/IDZSwiftCommonCryptoTestApp/AppDelegate.swift new file mode 100644 index 0000000..f923d57 --- /dev/null +++ b/IDZSwiftCommonCryptoTestApp/AppDelegate.swift @@ -0,0 +1,68 @@ +// +// AppDelegate.swift +// IDZSwiftCommonCryptoTestApp +// +// Created by idz on 9/14/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +import UIKit +import IDZSwiftCommonCrypto + +// MARK: - Crypto Demo +func test_StreamCryptor_AES_ECB() { + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") + let expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") + + let aesEncrypt = StreamCryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) + var cipherText : [UInt8] = [] + var dataOut = Array(count:plainText.count, repeatedValue:UInt8(0)) + let (byteCount, status) = aesEncrypt.update(plainText, byteArrayOut: &dataOut) + + + cipherText += dataOut[0.. Bool { + // Override point for customization after application launch. + test_StreamCryptor_AES_ECB() + + return true + } + + func applicationWillResignActive(application: UIApplication) { + // 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. + // 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. + } + + func applicationDidEnterBackground(application: UIApplication) { + // 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. + // If your application supports background execution, this method is called instead of applicationWillTerminate: when the user quits. + } + + func applicationWillEnterForeground(application: UIApplication) { + // 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. + } + + func applicationDidBecomeActive(application: UIApplication) { + // 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. + } + + func applicationWillTerminate(application: UIApplication) { + // Called when the application is about to terminate. Save data if appropriate. See also applicationDidEnterBackground:. + } + + +} + diff --git a/IDZSwiftCommonCryptoTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json b/IDZSwiftCommonCryptoTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json new file mode 100644 index 0000000..36d2c80 --- /dev/null +++ b/IDZSwiftCommonCryptoTestApp/Assets.xcassets/AppIcon.appiconset/Contents.json @@ -0,0 +1,68 @@ +{ + "images" : [ + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "29x29", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "40x40", + "scale" : "3x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "2x" + }, + { + "idiom" : "iphone", + "size" : "60x60", + "scale" : "3x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "29x29", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "40x40", + "scale" : "2x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "1x" + }, + { + "idiom" : "ipad", + "size" : "76x76", + "scale" : "2x" + } + ], + "info" : { + "version" : 1, + "author" : "xcode" + } +} \ No newline at end of file diff --git a/IDZSwiftCommonCryptoTestApp/Base.lproj/LaunchScreen.storyboard b/IDZSwiftCommonCryptoTestApp/Base.lproj/LaunchScreen.storyboard new file mode 100644 index 0000000..2e721e1 --- /dev/null +++ b/IDZSwiftCommonCryptoTestApp/Base.lproj/LaunchScreen.storyboard @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDZSwiftCommonCryptoTestApp/Base.lproj/Main.storyboard b/IDZSwiftCommonCryptoTestApp/Base.lproj/Main.storyboard new file mode 100644 index 0000000..3a2a49b --- /dev/null +++ b/IDZSwiftCommonCryptoTestApp/Base.lproj/Main.storyboard @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/IDZSwiftCommonCryptoTestApp/Info.plist b/IDZSwiftCommonCryptoTestApp/Info.plist new file mode 100644 index 0000000..40c6215 --- /dev/null +++ b/IDZSwiftCommonCryptoTestApp/Info.plist @@ -0,0 +1,47 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + APPL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + LSRequiresIPhoneOS + + UILaunchStoryboardName + LaunchScreen + UIMainStoryboardFile + Main + UIRequiredDeviceCapabilities + + armv7 + + UISupportedInterfaceOrientations + + UIInterfaceOrientationPortrait + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + UISupportedInterfaceOrientations~ipad + + UIInterfaceOrientationPortrait + UIInterfaceOrientationPortraitUpsideDown + UIInterfaceOrientationLandscapeLeft + UIInterfaceOrientationLandscapeRight + + + diff --git a/IDZSwiftCommonCryptoTestApp/ViewController.swift b/IDZSwiftCommonCryptoTestApp/ViewController.swift new file mode 100644 index 0000000..daecd13 --- /dev/null +++ b/IDZSwiftCommonCryptoTestApp/ViewController.swift @@ -0,0 +1,25 @@ +// +// ViewController.swift +// IDZSwiftCommonCryptoTestApp +// +// Created by idz on 9/14/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +import UIKit + +class ViewController: UIViewController { + + override func viewDidLoad() { + super.viewDidLoad() + // Do any additional setup after loading the view, typically from a nib. + } + + override func didReceiveMemoryWarning() { + super.didReceiveMemoryWarning() + // Dispose of any resources that can be recreated. + } + + +} + diff --git a/IDZSwiftCommonCryptoTestAppTests/IDZSwiftCommonCryptoTestAppTests.swift b/IDZSwiftCommonCryptoTestAppTests/IDZSwiftCommonCryptoTestAppTests.swift new file mode 100644 index 0000000..19f02bd --- /dev/null +++ b/IDZSwiftCommonCryptoTestAppTests/IDZSwiftCommonCryptoTestAppTests.swift @@ -0,0 +1,56 @@ +// +// IDZSwiftCommonCryptoTestAppTests.swift +// IDZSwiftCommonCryptoTestAppTests +// +// Created by idz on 9/14/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +import XCTest +import IDZSwiftCommonCrypto +@testable import IDZSwiftCommonCryptoTestApp + +class IDZSwiftCommonCryptoTestAppTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // This is an example of a functional test case. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + + func testPerformanceExample() { + // This is an example of a performance test case. + self.measureBlock { + // Put the code you want to measure the time of here. + } + } + + // MARK: - Crypto Demo + func test_StreamCryptor_AES_ECB() { + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") + let expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") + + let aesEncrypt = StreamCryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) + var cipherText : [UInt8] = [] + var dataOut = Array(count:plainText.count, repeatedValue:UInt8(0)) + let (byteCount, status) = aesEncrypt.update(plainText, byteArrayOut: &dataOut) + + + cipherText += dataOut[0..CFBundleExecutable $(EXECUTABLE_NAME) CFBundleIdentifier - com.iosdeveloperzone.$(PRODUCT_NAME:rfc1034identifier) + $(PRODUCT_BUNDLE_IDENTIFIER) CFBundleInfoDictionaryVersion 6.0 CFBundleName diff --git a/IDZSwiftCommonCryptoTestAppUITests/IDZSwiftCommonCryptoTestAppUITests.swift b/IDZSwiftCommonCryptoTestAppUITests/IDZSwiftCommonCryptoTestAppUITests.swift new file mode 100644 index 0000000..fe4bba1 --- /dev/null +++ b/IDZSwiftCommonCryptoTestAppUITests/IDZSwiftCommonCryptoTestAppUITests.swift @@ -0,0 +1,36 @@ +// +// IDZSwiftCommonCryptoTestAppUITests.swift +// IDZSwiftCommonCryptoTestAppUITests +// +// Created by idz on 9/14/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +import XCTest + +class IDZSwiftCommonCryptoTestAppUITests: XCTestCase { + + override func setUp() { + super.setUp() + + // Put setup code here. This method is called before the invocation of each test method in the class. + + // In UI tests it is usually best to stop immediately when a failure occurs. + continueAfterFailure = false + // UI tests must launch the application that they test. Doing this in setup will make sure it happens for each test method. + XCUIApplication().launch() + + // In UI tests it’s important to set the initial state - such as interface orientation - required for your tests before they run. The setUp method is a good place to do this. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + func testExample() { + // Use recording to get started writing UI tests. + // Use XCTAssert and related functions to verify your tests produce the correct results. + } + +} diff --git a/IDZSwiftCommonCryptoTestAppUITests/Info.plist b/IDZSwiftCommonCryptoTestAppUITests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/IDZSwiftCommonCryptoTestAppUITests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/IDZSwiftCommonCryptoTests/CommonCryptoAPITests.m b/IDZSwiftCommonCryptoTests/CommonCryptoAPITests.m new file mode 100644 index 0000000..3b47590 --- /dev/null +++ b/IDZSwiftCommonCryptoTests/CommonCryptoAPITests.m @@ -0,0 +1,71 @@ +// +// CommonCryptoAPITests.m +// IDZSwiftCommonCrypto +// +// Created by idz on 9/14/15. +// Copyright © 2015 iOSDeveloperZone.com. All rights reserved. +// + +#import +#import + +@interface CommonCryptoAPITests : XCTestCase + +@end + +void LogHexArray(const char* pMessage, uint8_t* pBuffer, size_t nBytesInBuffer) +{ + NSMutableString *s = [NSMutableString stringWithFormat:@"%s: ", pMessage]; + for(size_t i = 0; i < nBytesInBuffer; ++i) + { + [s appendFormat:@"%02x ", pBuffer[i]]; + } + NSLog(@"%@", s); +} + +@implementation CommonCryptoAPITests + +- (void)setUp { + [super setUp]; + // Put setup code here. This method is called before the invocation of each test method in the class. +} + +- (void)tearDown { + // Put teardown code here. This method is called after the invocation of each test method in the class. + [super tearDown]; +} + +#define LENGTH(_a) sizeof((_a))/sizeof((_a)[0]) + +/** + * Here to track down differences between iOS 8 and iOS 9 + */ +- (void)testExample { + uint8_t key[] = { 0x2b, 0x7e, 0x15, 0x16, 0x28, 0xae, 0xd2, 0xa6, 0xab, 0xf7, 0x15, 0x88, 0x09, 0xcf, 0x4f, 0x3c }; + uint8_t plainText[] = { 0x6b, 0xc1, 0xbe, 0xe2, 0x2e, 0x40, 0x9f, 0x96, 0xe9, 0x3d, 0x7e, 0x11, 0x73, 0x93, 0x17, 0x2a }; + uint8_t expectedCipherText[] = {0x3a, 0xd7, 0x7b, 0xb4, 0x0d, 0x7a, 0x36, 0x60, 0xa8, 0x9e, 0xca, 0xf3, 0x24, 0x66, 0xef, 0x97 }; + uint8_t cipherText[LENGTH(expectedCipherText)]; + CCCryptorRef cryptor; + + CCCryptorStatus status = CCCryptorCreate(kCCEncrypt, kCCAlgorithmAES, 0, key, LENGTH(key), nil, &cryptor); + XCTAssert(status == kCCSuccess); + size_t bytesOut = 0; + status = CCCryptorUpdate(cryptor, plainText, LENGTH(plainText), cipherText, LENGTH(cipherText), &bytesOut); + LogHexArray("cipherText", cipherText, bytesOut); + XCTAssert(status == kCCSuccess); + XCTAssert(bytesOut == LENGTH(expectedCipherText)); + XCTAssert(memcmp(cipherText, expectedCipherText, LENGTH(expectedCipherText)) == 0); + // This should produce no output + status = CCCryptorFinal(cryptor, cipherText, LENGTH(cipherText), &bytesOut); + XCTAssert(status == kCCSuccess); + if(bytesOut != 0) { + LogHexArray("cipherText", cipherText, bytesOut); + } + XCTAssert(bytesOut == 0); + + + +} + + +@end diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/Dummy.m b/IDZSwiftCommonCryptoTests/Dummy.m similarity index 100% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/Dummy.m rename to IDZSwiftCommonCryptoTests/Dummy.m diff --git a/IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoObjCTest.m b/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoObjCTest.m similarity index 100% rename from IDZSwiftCommonCrypto/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoObjCTest.m rename to IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoObjCTest.m diff --git a/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoTests.swift b/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoTests.swift new file mode 100644 index 0000000..5e620dd --- /dev/null +++ b/IDZSwiftCommonCryptoTests/IDZSwiftCommonCryptoTests.swift @@ -0,0 +1,581 @@ +// +// IDZSwiftCommonCryptoTests.swift +// IDZSwiftCommonCryptoTests +// +// Created by idz on 9/20/14. +// Copyright (c) 2014 iOSDeveloperZone.com. All rights reserved. +// + +import UIKit +import XCTest +import IDZSwiftCommonCrypto +import CommonCrypto + +class IDZSwiftCommonCryptoTests: XCTestCase { + + override func setUp() { + super.setUp() + // Put setup code here. This method is called before the invocation of each test method in the class. + } + + override func tearDown() { + // Put teardown code here. This method is called after the invocation of each test method in the class. + super.tearDown() + } + + // MARK: - Cryptor tests + var aesKey1Bytes = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + var aesPlaintext1Bytes = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") + var aesCipherText1Bytes = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") + + func test_Cryptor_AES_ECB() { + let aesEncrypt = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, + key:aesKey1Bytes, iv:Array()) + var dataOut = Array(count:aesCipherText1Bytes.count, repeatedValue:UInt8(0)) + let (c, status) = aesEncrypt.update(aesPlaintext1Bytes, byteArrayOut: &dataOut) + XCTAssert(status == .Success); + XCTAssert(aesCipherText1Bytes.count == Int(c) , "Counts are as expected") + XCTAssertEqual(dataOut, aesCipherText1Bytes, "Obtained expected cipher text") + } + /** + Tests two blocks of ECB mode AES. Demonstrates weakness in ECB; repeated plaintext block + results in repeated ciphertext block. + */ + func test_Cryptor_AES_ECB_2() { + let key = aesKey1Bytes + let plainText = aesPlaintext1Bytes + aesPlaintext1Bytes + let expectedCipherText = aesCipherText1Bytes + aesCipherText1Bytes + + let cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()).update(plainText)?.final() + + assert(expectedCipherText.count == cipherText!.count , "Counts are as expected") + assert(expectedCipherText == cipherText!, "Obtained expected cipher text") + } + /** + Demonstrates alignment error when plaintext is not an integral number + of blocks long. + */ + func test_Cryptor_AES_ECB_Short() { + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e11739317") + let cryptor = Cryptor(operation:.Encrypt, algorithm:.AES, options:.ECBMode, key:key, iv:Array()) + let cipherText = cryptor.update(plainText)?.final() + XCTAssert(cipherText == nil, "Expected nil cipherText") + XCTAssertEqual(cryptor.status, Status.AlignmentError, "Expected AlignmentError") + } + /** + Single block CBC mode. Results should be identical to ECB mode. + */ + func test_Cryptor_AES_CBC_1() { + let key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c") + let iv = arrayFromHexString("00000000000000000000000000000000") + let plainText = arrayFromHexString("6bc1bee22e409f96e93d7e117393172a") + let expectedCipherText = arrayFromHexString("3ad77bb40d7a3660a89ecaf32466ef97") + + //var cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.None, key:key, iv:Array()).update(plainText)?.final() + let cipherText = Cryptor(operation:.Encrypt, algorithm:.AES, options:.None, key:key, iv:iv).update(plainText)?.final() + + XCTAssert(expectedCipherText.count == cipherText!.count , "Counts are as expected") + XCTAssert(expectedCipherText == cipherText!, "Obtained expected cipher text") + + print(hexStringFromArray(cipherText!)) + + let decryptedText = Cryptor(operation:.Decrypt, algorithm:.AES, options:.None, key:key, iv:iv).update(cipherText!)?.final() + XCTAssertEqual(decryptedText!, plainText, "Recovered plaintext.") + } + + + func test_Cryptor_DES_EBC_1() { + // Data from table A.1 http://csrc.nist.gov/publications/nistpubs/800-20/800-20.pdf + let ivs = [ + "8000000000000000", + "4000000000000000", + "2000000000000000", + "1000000000000000", + "0800000000000000", + "0400000000000000", + "0200000000000000", + "0100000000000000", + + "0080000000000000", + "0040000000000000", + "0020000000000000", + "0010000000000000", + "0008000000000000", + "0004000000000000", + "0002000000000000", + "0001000000000000", + + "0000800000000000", + "0000400000000000", + "0000200000000000", + "0000100000000000", + "0000080000000000", + "0000040000000000", + "0000020000000000", + "0000010000000000", + + "0000008000000000", + "0000004000000000", + "0000002000000000", + "0000001000000000", + "0000000800000000", + "0000000400000000", + "0000000200000000", + "0000000100000000", + + "0000000080000000", + "0000000040000000", + "0000000020000000", + "0000000010000000", + "0000000008000000", + "0000000004000000", + "0000000002000000", + "0000000001000000", + + "0000000000800000", + "0000000000400000", + "0000000000200000", + "0000000000100000", + "0000000000080000", + "0000000000040000", + "0000000000020000", + "0000000000010000", + + "0000000000008000", + "0000000000004000", + "0000000000002000", + "0000000000001000", + "0000000000000800", + "0000000000000400", + "0000000000000200", + "0000000000000100", + + + "0000000000000080", + "0000000000000040", + "0000000000000020", + "0000000000000010", + "0000000000000008", + "0000000000000004", + "0000000000000002", + "0000000000000001", + ] + + let ects = [ + "95f8a5e5dd31d900", // [0] + "dd7f121ca5015619", // [1] + "2e8653104f3834ea", // [2] + "4bd388ff6cd81d4f", // [3] + "20b9e767b2fb1456", // [4] + "55579380d77138ef", // [5] + "6cc5defaaf04512f", // [6] + "0d9f279ba5d87260", // [7] + "d9031b0271bd5a0a", // [8] + "424250b37c3dd951", // [9] + "b8061b7ecd9a21e5", // [10] + "f15d0f286b65bd28", // [11] + "add0cc8d6e5deba1", // [12] + "e6d5f82752ad63d1", // [13] + "ecbfe3bd3f591a5e", // [14] + "f356834379d165cd", // [15] + "2b9f982f20037fa9", // [16] + "889de068a16f0be6", // [17] + "e19e275d846a1298", // [18] + "329a8ed523d71aec", // [19] + "e7fce22557d23c97", // [20] + "12a9f5817ff2d65d", // [21] + "a484c3ad38dc9c19", // [22] + "fbe00a8a1ef8ad72", // [23] + "750d079407521363", // [24] + "64feed9c724c2faf", // [25] + "f02b263b328e2b60", // [26] + "9d64555a9a10b852", // [27] + "d106ff0bed5255d7", // [28] + "e1652c6b138c64a5", // [29] + "e428581186ec8f46", // [30] + "aeb5f5ede22d1a36", // [31] + "e943d7568aec0c5c", // [32] + "df98c8276f54b04b", // [33] + "b160e4680f6c696f", // [34] + "fa0752b07d9c4ab8", // [35] + "ca3a2b036dbc8502", // [36] + "5e0905517bb59bcf", // [37] + "814eeb3b91d90726", // [38] + "4d49db1532919c9f", // [39] + "25eb5fc3f8cf0621", // [40] + "ab6a20c0620d1c6f", // [41] + "79e90dbc98f92cca", // [42] + "866ecedd8072bb0e", // [43] + "8b54536f2f3e64a8", // [44] + "ea51d3975595b86b", // [45] + "caffc6ac4542de31", // [46] + "8dd45a2ddf90796c", // [47] + "1029d55e880ec2d0", // [48] + "5d86cb23639dbea9", // [49] + "1d1ca853ae7c0c5f", // [50] + "ce332329248f3228", // [51] + "8405d1abe24fb942", // [52] + "e643d78090ca4207", // [53] + "48221b9937748a23", // [54] + "dd7c0bbd61fafd54", // [55] + "2fbc291a570db5c4", // [56] + "e07c30d7e4e26e12", // [57] + "0953e2258e8e90a1", // [58] + "5b711bc4ceebf2ee", // [59] + "cc083f1e6d9e85f6", // [60] + "d2fd8867d50d2dfe", // [61] + "06e7ea22ce92708f", // [62] + "166b40b44aba4bd6" // [63] + + ] + + let key = arrayFromHexString("0101010101010101") + + for var i = 0; i < ivs.count; ++i { + let iv = arrayFromHexString(ivs[i]) + let cipherText = Cryptor(operation:.Encrypt, algorithm:.DES, options:.ECBMode, key:key, iv:Array()).update(arrayFromHexString(ivs[i]))?.final() + print("\"\(hexStringFromArray(cipherText!))\", // [\(i)]") + XCTAssertEqual(arrayFromHexString(ects[i]), cipherText!, "Obtained expected cipher text") + let decryptor = Cryptor(operation:.Decrypt, algorithm:.DES, options:.ECBMode, key:key, iv:iv) + let decryptedText = decryptor.update(cipherText!)?.final() + XCTAssertEqual(decryptedText!, iv, "Recovered plaintext.") + + } + } + + + /** + This is UTF8 encoded "The quick brown fox jumps over the lazy dog." + */ + let qbfBytes : [UInt8] = [0x54,0x68,0x65,0x20,0x71,0x75,0x69,0x63,0x6b,0x20,0x62,0x72,0x6f,0x77,0x6e,0x20,0x66,0x6f,0x78,0x20,0x6a,0x75,0x6d,0x70,0x73,0x20,0x6f,0x76,0x65,0x72,0x20,0x74,0x68,0x65,0x20,0x6c,0x61,0x7a,0x79,0x20,0x64,0x6f,0x67,0x2e] + let qbfString = "The quick brown fox jumps over the lazy dog." + /** + This is the MD5 for "The quick brown fox jumps over the lazy dog." + */ + let qbfMD5 : [UInt8] = [0xe4,0xd9,0x09,0xc2, + 0x90,0xd0,0xfb,0x1c, + 0xa0,0x68,0xff,0xad, + 0xdf,0x22,0xcb,0xd0] + + // MARK: - Digest tests + // MARK: MD2 (RFC1319) + let md2inputs = ["", "a", "abc", "message digest", "abcdefghijklmnopqrstuvwxyz", "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789", "12345678901234567890123456789012345678901234567890123456789012345678901234567890"] + let md2outputs = ["8350e5a3e24c153df2275c9f80692773", "32ec01ec4a6dac72c0ab96fb34c0b5d1", + "da853b0d3f88d99b30283a69e6ded6bb", "ab4f496bfb2a530b219ff33031fe06b0", "4e8ddff3650292ab5a4108c3aa47940b", "da33def2a42df13975352846c30338cd", "d5976f79d83d3a0dc9806c3c66f3efd8"] + + func testMD2() { + for i in 0..(count:50, repeatedValue:0xcd)) + let expected = self.hmacDefaultResultSHA1 + + let hmac = HMAC(algorithm:.SHA1, key:key).update(data)?.final() + + XCTAssertEqual(hmac!, expected, "PASS") + } + // For HMAC-SHA1-{224,256,384,512} + // See: http://tools.ietf.org/html/rfc4231 + let rfc4231key1 = "0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b0b" // should be 20 bytes + let rfc4231string1 = "Hi There" + let rfc4231data1 = "4869205468657265" + let rfc4231SHA224Output1 = "896fb1128abbdf196832107cd49df33f47b4b1169912ba4f53684b22" + let rfc4231SHA256Output1 = "b0344c61d8db38535ca8afceaf0bf12b881dc200c9833da726e9376c2e32cff7" + let rfc4231SHA384Output1 = "afd03944d84895626b0825f4ab46907f15f9dadbe4101ec682aa034c7cebc59cfaea9ea9076ede7f4af152e8b2fa9cb6" + let rfc4231SHA512Output1 = "87aa7cdea5ef619d4ff0b4241a1d6cb02379f4e2ce4ec2787ad0b30545e17cdedaa833b7d6b8a702038b274eaea3f4e4be9d914eeb61f1702e696c203a126854" + + func test_HMAC_SHA224() + { + let key = arrayFromHexString(self.rfc4231key1) + let data : [UInt8] = arrayFromHexString(rfc4231data1) + let expected = arrayFromHexString(self.rfc4231SHA224Output1) + + let hmac = HMAC(algorithm: HMAC.Algorithm.SHA224, key:key).update(data)?.final() + + XCTAssertEqual(hmac!, expected, "PASS") + } + + func test_HMAC_SHA256() + { + let key = arrayFromHexString(self.rfc4231key1) + let data : [UInt8] = arrayFromHexString(rfc4231data1) + let expected = arrayFromHexString(self.rfc4231SHA256Output1) + + let hmac = HMAC(algorithm: HMAC.Algorithm.SHA256, key:key).update(data)?.final() + + XCTAssertEqual(hmac!, expected, "PASS") + } + + func test_HMAC_SHA384() + { + let key = arrayFromHexString(self.rfc4231key1) + let data : [UInt8] = arrayFromHexString(rfc4231data1) + let expected = arrayFromHexString(self.rfc4231SHA384Output1) + + let hmac = HMAC(algorithm: HMAC.Algorithm.SHA384, key:key).update(data)?.final() + + XCTAssertEqual(hmac!, expected, "PASS") + } + + func test_HMAC_SHA512() + { + let key = arrayFromHexString(self.rfc4231key1) + let data : [UInt8] = arrayFromHexString(rfc4231data1) + let expected = arrayFromHexString(self.rfc4231SHA512Output1) + + let hmac = HMAC(algorithm: HMAC.Algorithm.SHA512, key:key).update(data)?.final() + + XCTAssertEqual(hmac!, expected, "PASS") + } + + // MARK: - KeyDerivation tests + // See: https://www.ietf.org/rfc/rfc6070.txt + func test_KeyDerivation_deriveKey() + { + let tests = [ ("password", "salt", 1, 20, "0c60c80f961f0e71f3a9b524af6012062fe037a6"), + ("password", "salt", 2, 20, "ea6c014dc72d6f8ccd1ed92ace1d41f0d8de8957"), + ("password", "salt", 4096, 20, "4b007901b765489abead49d926f721d065a429c1"), +// ("password", "salt", 16777216, 20, "eefe3d61cd4da4e4e9945b3d6ba2158c2634e984"), + ("passwordPASSWORDpassword", "saltSALTsaltSALTsaltSALTsaltSALTsalt", 4096, 25, "3d2eec4fe41c849b80c8d83662c0e44a8b291a964cf2f07038"), + ("pass\0word", "sa\0lt", 4096, 16, "56fa6aa75548099dcc37d7f03425e0c3"), + ] + for (password, salt, rounds, dkLen, expected) in tests + { + let key = PBKDF.deriveKey(password, salt: salt, prf: .SHA1, rounds: uint(rounds), derivedKeyLength: UInt(dkLen)) + let keyString = hexStringFromArray(key) + + XCTAssertEqual(key, arrayFromHexString(expected), "Obtained correct key (\(keyString) == \(expected)") + } + + } + + // MARK: - Random tests + func test_Random_generateBytes() + { + let count = 256*256 + do { + let bytes = try Random.generateBytes(count) + XCTAssert(bytes.count == count, "Count has expected value") + } + catch { + XCTAssert(false, "Should never happen.") + } + } + + func test_Random_generateBytesThrow() + { + let count = 256*256 + do { + let bytes = try Random.generateBytesThrow(count) + XCTAssert(bytes.count == count, "Count has expected value") + } + catch let error { + print("Caught error \(error)") + } + } + + // MARK: - Status + func test_Status() { + XCTAssertEqual(Status.Success.toRaw(), CCCryptorStatus(kCCSuccess)) + XCTAssertEqual(Status.ParamError.toRaw(), CCCryptorStatus(kCCParamError)) + XCTAssertEqual(Status.BufferTooSmall.toRaw(), CCCryptorStatus(kCCBufferTooSmall)) + XCTAssertEqual(Status.MemoryFailure.toRaw(), CCCryptorStatus(kCCMemoryFailure)) + XCTAssertEqual(Status.AlignmentError.toRaw(), CCCryptorStatus(kCCAlignmentError)) + XCTAssertEqual(Status.DecodeError.toRaw(), CCCryptorStatus(kCCDecodeError)) + XCTAssertEqual(Status.Unimplemented.toRaw(), CCCryptorStatus(kCCUnimplemented)) + XCTAssertEqual(Status.Overflow.toRaw(), CCCryptorStatus(kCCOverflow)) + XCTAssertEqual(Status.RNGFailure.toRaw(), CCCryptorStatus(kCCRNGFailure)) + + XCTAssertEqual(Status.Success.description, "Success") + XCTAssertEqual(Status.ParamError.description, "ParamError") + XCTAssertEqual(Status.BufferTooSmall.description, "BufferTooSmall") + XCTAssertEqual(Status.MemoryFailure.description, "MemoryFailure") + XCTAssertEqual(Status.AlignmentError.description, "AlignmentError") + XCTAssertEqual(Status.DecodeError.description, "DecodeError") + XCTAssertEqual(Status.Unimplemented.description, "Unimplemented") + XCTAssertEqual(Status.Overflow.description, "Overflow") + XCTAssertEqual(Status.RNGFailure.description, "RNGFailure") + + } + + + // MARK: - Utilities tests + func test_Utilities_arrayFromHexString_lowerCase() + { + let s = "deadface" + let expected : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] + let result = arrayFromHexString(s) + XCTAssertEqual(result, expected, "PASS") + } + + func test_Utilities_arrayFromHexString_upperCase() + { + let s = "DEADFACE" + let expected : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] + let result = arrayFromHexString(s) + XCTAssertEqual(result, expected, "PASS") + } + + func testHexStringFromArray() + { + let v : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] + XCTAssertEqual(hexStringFromArray(v), "deadface", "PASS (lowercase)") + XCTAssertEqual(hexStringFromArray(v, uppercase: true), "DEADFACE", "PASS (lowercase)") + } + + func testHexNSStringFromArray() + { + let v : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] + XCTAssertEqual(hexNSStringFromArray(v), "deadface", "PASS (lowercase)") + XCTAssertEqual(hexNSStringFromArray(v, uppercase: true), "DEADFACE", "PASS (lowercase)") + } + + func testHexListFromArray() + { + let v : [UInt8] = [ 0xde, 0xad, 0xfa, 0xce ] + let list = hexListFromArray(v) + XCTAssertEqual(list, "0xde, 0xad, 0xfa, 0xce, ") + + } + + +} diff --git a/IDZSwiftCommonCryptoTests/Info.plist b/IDZSwiftCommonCryptoTests/Info.plist new file mode 100644 index 0000000..ba72822 --- /dev/null +++ b/IDZSwiftCommonCryptoTests/Info.plist @@ -0,0 +1,24 @@ + + + + + CFBundleDevelopmentRegion + en + CFBundleExecutable + $(EXECUTABLE_NAME) + CFBundleIdentifier + $(PRODUCT_BUNDLE_IDENTIFIER) + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + $(PRODUCT_NAME) + CFBundlePackageType + BNDL + CFBundleShortVersionString + 1.0 + CFBundleSignature + ???? + CFBundleVersion + 1 + + diff --git a/Makefile b/Makefile index ce4039c..37b1c30 100644 --- a/Makefile +++ b/Makefile @@ -1,11 +1,35 @@ -PG=IDZSwiftCommonCrypto/README.playground +REPO=IDZPodspecs +NAME=IDZSwiftCommonCrypto + +OS=9.1 + +PG=README.playground RSRC_DIR=$(PG)/Resources $(PG): README.md - playground README.md -p ios -d IDZSwiftCommonCrypto + playground README.md -p ios mkdir -p ${RSRC_DIR} - cp IDZSwiftCommonCrypto/Riscal.jpg ${RSRC_DIR} - - + cp Riscal.jpg ${RSRC_DIR} + git config --global push.default simple + git diff-files --exit-code; if [[ "$?" == "1" ]]; then git commit -a -m "Playground update from Travis [ci skip]"; git push; fi +# +# Build +# +build: + xcodebuild build -scheme IDZSwiftCommonCrypto -destination 'platform=iOS Simulator,name=iPhone 6,OS=${OS}' +test: + xcodebuild test -scheme IDZSwiftCommonCrypto -destination 'platform=iOS Simulator,name=iPhone 6,OS=${OS}' | xcpretty clean: rm -rf $(PG) + +# push tags to GitHub +push_tags: + git push origin --tags + +# Lint the podspec +lint_pod: + pod spec lint --verbose ${NAME}.podspec --sources=https://github.com/iosdevzone/IDZPodspecs.git + +# Push pod to private spec repository +push_pod: + pod repo push ${REPO} ${NAME}.podspec diff --git a/README.md b/README.md index 2f327b1..cdab9ce 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,38 @@ -# IDZSwiftCommonCrypto [![Build Status](https://travis-ci.org/iosdevzone/IDZSwiftCommonCrypto.svg?branch=master)](https://travis-ci.org/iosdevzone/IDZSwiftCommonCrypto) +# IDZSwiftCommonCrypto +[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) [![Build Status](https://travis-ci.org/iosdevzone/IDZSwiftCommonCrypto.svg?branch=swift2.0)](https://travis-ci.org/iosdevzone/IDZSwiftCommonCrypto) [![Coverage Status](https://coveralls.io/repos/iosdevzone/IDZSwiftCommonCrypto/badge.svg?branch=swift2.0&service=github)](https://coveralls.io/github/iosdevzone/IDZSwiftCommonCrypto?branch=swift2.0) A Swift wrapper for Apple's `CommonCrypto` library. -If you're using Swift 2.0 please use the `swift2.0` branch. +# Using `IDZSwiftCommonCrypto` -Using `IDZSwiftCommonCrypto` ----------------------------- +There are three ways to add IDZCommonCrypto to your project: +* Use CocoaPods +* Use Carthage +* Manually + +## CocoaPods + +If you are using CocoaPods, add the following to your Podfile: +```bash +pod 'IDZSwiftCommonCrypto` +``` + +Then, run the following command to install the IDZSwiftCommonCrypto pod: +```bash +pod install +``` +## Carthage + +If you are using Carthage, add the following to your Cartfile: + +```bash +github "iosdevzone/IDZCommonCrypto" +``` + +Run `carthage` to build the framework and drag the built 'IDZCommonCrypto.framework' into your project or workspace. + +## Manually Since `CommonCrypto` is not a standalone module, you need to generate a fake module map to convince Xcode into allowing you to `import CommonCrypto`. The `GenerateCommonCryptoModule` script provides two methods for doing this. Which method you choose depends on whether you want to able to use `CommonCrypto` and, by extension, `IDZSwiftCommonCrypto` in playgrounds. @@ -199,3 +225,4 @@ assert(keys6 == expectedRFC6070) * `.SHA384` * `.SHA512` + diff --git a/README.playground/Documentation/section-0.html b/README.playground/Documentation/section-0.html new file mode 100644 index 0000000..1551d33 --- /dev/null +++ b/README.playground/Documentation/section-0.html @@ -0,0 +1,30 @@ + + + + + Section 1 + + + + + + +
+
+

IDZSwiftCommonCrypto Carthage compatible Build Status

+

A Swift wrapper for Apple's CommonCrypto library.

+

Using IDZSwiftCommonCrypto

+

Since CommonCrypto is not a standalone module, you need to generate a fake module map to convince Xcode into allowing you to import CommonCrypto. The GenerateCommonCryptoModule script provides two methods for doing this. Which method you choose depends on whether you want to able to use CommonCrypto and, by extension, IDZSwiftCommonCrypto in playgrounds.

+

To make CommonCrypto available to frameworks and playground use the command:

+
    ./GenerateCommonCryptoModule iphonesimulator8.0
+
+

This command creates a CommonCrypto.framework in the SDK system library directory. You should now be able to use either CommonCrypto or IDZSwiftCommonCrypto in a playground simply importing them or in your own app project by dragging the IDZSwiftCommonCrypto.xcodeproj into your project.

+

If you do not want to add any files to your SDK you can use the command

+
    ./GenerateCommonCryptoModule iphonesimulator8.0 .
+
+

This method creates a CommonCrypto directory within the IDZSwiftCommonCrypto source tree, so the SDK directories are not altered, but the module is not available in playgrounds. To use the framework in your own project drag the IDZSwiftCommonCrypto.xcodeproj into your project and set the Module Import Path to the directory containing the CommonCrypto directory created by the script. For more about this, see my blog post Using CommonCrypto in Swift

+ +
+
+ + diff --git a/README.playground/Documentation/section-10.html b/README.playground/Documentation/section-10.html new file mode 100644 index 0000000..e0aa509 --- /dev/null +++ b/README.playground/Documentation/section-10.html @@ -0,0 +1,32 @@ + + + + + Section 11 + + + + + + +
+
+

Supported Algorithms

+

The Digest class supports the following algorithms:

+
    +
  • .MD2
  • +
  • .MD4
  • +
  • .MD5
  • +
  • .SHA1
  • +
  • .SHA224
  • +
  • .SHA256
  • +
  • .SHA384
  • +
  • .SHA512
  • +
+

Using HMAC

+

Calculating a keyed-Hash Message Authentication Code (HMAC) is very similar to calculating a message digest, except that the initialization routine now takes a key as well as an algorithm parameter.

+ +
+
+ + diff --git a/README.playground/Documentation/section-12.html b/README.playground/Documentation/section-12.html new file mode 100644 index 0000000..e928d20 --- /dev/null +++ b/README.playground/Documentation/section-12.html @@ -0,0 +1,28 @@ + + + + + Section 13 + + + + + + +
+
+

Supported Algorithms

+
    +
  • SHA1
  • +
  • MD5
  • +
  • SHA224
  • +
  • SHA256
  • +
  • SHA384
  • +
  • SHA512
  • +
+

Using Cryptor

+ +
+
+ + diff --git a/README.playground/Documentation/section-14.html b/README.playground/Documentation/section-14.html new file mode 100644 index 0000000..2ef210e --- /dev/null +++ b/README.playground/Documentation/section-14.html @@ -0,0 +1,30 @@ + + + + + Section 15 + + + + + + +
+
+

Supported Algorithms

+
    +
  • .AES
  • +
  • .DES
  • +
  • .TripleDES
  • +
  • .CAST
  • +
  • .RC2
  • +
  • .Blowfish
  • +
+

Using StreamCryptor

+

To encrypt a large file or a network stream use StreamCryptor. The StreamCryptor class does not accumulate the encrypted or decrypted data, instead each call to update produces an output buffer.

+

The example below shows how to use StreamCryptor to encrypt and decrypt an image file.

+ +
+
+ + diff --git a/README.playground/Documentation/section-16.html b/README.playground/Documentation/section-16.html new file mode 100644 index 0000000..00ac741 --- /dev/null +++ b/README.playground/Documentation/section-16.html @@ -0,0 +1,21 @@ + + + + + Section 17 + + + + + + +
+
+

Using PBKDF

+

The PBKDF class provides a method of deriving keys from a user password. +The following example derives a 20-byte key:

+ +
+
+ + diff --git a/README.playground/Documentation/section-18.html b/README.playground/Documentation/section-18.html new file mode 100644 index 0000000..f8da5e2 --- /dev/null +++ b/README.playground/Documentation/section-18.html @@ -0,0 +1,26 @@ + + + + + Section 19 + + + + + + +
+
+

Supported Pseudo-Random Functions

+
    +
  • .SHA1
  • +
  • .SHA224
  • +
  • .SHA256
  • +
  • .SHA384
  • +
  • .SHA512
  • +
+ +
+
+ + diff --git a/README.playground/Documentation/section-2.html b/README.playground/Documentation/section-2.html new file mode 100644 index 0000000..cf6e89a --- /dev/null +++ b/README.playground/Documentation/section-2.html @@ -0,0 +1,21 @@ + + + + + Section 3 + + + + + + +
+
+

Using Digest

+

To calculate a message digest you create an instance of Digest, call update one or more times with the data over which the digest is being calculated and finally call final to obtain the digest itself.

+

The update method can take a String

+ +
+
+ + diff --git a/README.playground/Documentation/section-4.html b/README.playground/Documentation/section-4.html new file mode 100644 index 0000000..0a9ae5f --- /dev/null +++ b/README.playground/Documentation/section-4.html @@ -0,0 +1,19 @@ + + + + + Section 5 + + + + + + +
+
+

or an array of UInt8 elements:

+ +
+
+ + diff --git a/README.playground/Documentation/section-6.html b/README.playground/Documentation/section-6.html new file mode 100644 index 0000000..0aa6ef9 --- /dev/null +++ b/README.playground/Documentation/section-6.html @@ -0,0 +1,19 @@ + + + + + Section 7 + + + + + + +
+
+

If you only have a single buffer you can simply write

+ +
+
+ + diff --git a/README.playground/Documentation/section-8.html b/README.playground/Documentation/section-8.html new file mode 100644 index 0000000..210bc7f --- /dev/null +++ b/README.playground/Documentation/section-8.html @@ -0,0 +1,19 @@ + + + + + Section 9 + + + + + + +
+
+

or

+ +
+
+ + diff --git a/README.playground/Documentation/stylesheet.css b/README.playground/Documentation/stylesheet.css new file mode 100644 index 0000000..c2d5bce --- /dev/null +++ b/README.playground/Documentation/stylesheet.css @@ -0,0 +1,16 @@ +html { + font-size: 62.5%; +} + +body { + background-color: #fff; + font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; + font-size: 1.3rem; + padding-left: 20px; +} + +section { + padding-top: 10px; + padding-bottom: 20px; + -webkit-overflow-scrolling: touch; +} diff --git a/IDZSwiftCommonCrypto/README.playground/Resources/Riscal.jpg b/README.playground/Resources/Riscal.jpg similarity index 100% rename from IDZSwiftCommonCrypto/README.playground/Resources/Riscal.jpg rename to README.playground/Resources/Riscal.jpg diff --git a/README.playground/contents.xcplayground b/README.playground/contents.xcplayground new file mode 100644 index 0000000..26af4d1 --- /dev/null +++ b/README.playground/contents.xcplayground @@ -0,0 +1,43 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/README.playground/section-1.swift b/README.playground/section-1.swift new file mode 100644 index 0000000..2f80be0 --- /dev/null +++ b/README.playground/section-1.swift @@ -0,0 +1 @@ +import IDZSwiftCommonCrypto \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-12.swift b/README.playground/section-11.swift similarity index 92% rename from IDZSwiftCommonCrypto/README.playground/section-12.swift rename to README.playground/section-11.swift index 3adfedc..34df412 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-12.swift +++ b/README.playground/section-11.swift @@ -5,4 +5,4 @@ var hmacs5 = HMAC(algorithm:.SHA1, key:keys5).update(datas5)?.final() // RFC2202 says this should be 4c9007f4026250c6bc8414f9bf50c86c2d7235da let expectedRFC2202 = arrayFromHexString("4c9007f4026250c6bc8414f9bf50c86c2d7235da") -assert(hmacs5! == expectedRFC2202) +assert(hmacs5! == expectedRFC2202) \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-14.swift b/README.playground/section-13.swift similarity index 94% rename from IDZSwiftCommonCrypto/README.playground/section-14.swift rename to README.playground/section-13.swift index 262f79e..ddef305 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-14.swift +++ b/README.playground/section-13.swift @@ -8,4 +8,4 @@ cryptor = Cryptor(operation:.Decrypt, algorithm:.AES, options:.PKCS7Padding, key var decryptedPlainText = cryptor.update(cipherText!)?.final() var decryptedString = decryptedPlainText!.reduce("") { $0 + String(UnicodeScalar($1)) } decryptedString -assert(decryptedString == plainText) +assert(decryptedString == plainText) \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-16.swift b/README.playground/section-15.swift similarity index 97% rename from IDZSwiftCommonCrypto/README.playground/section-16.swift rename to README.playground/section-15.swift index 3b2f33d..3d902aa 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-16.swift +++ b/README.playground/section-15.swift @@ -48,4 +48,4 @@ sc = StreamCryptor(operation:.Decrypt, algorithm:.AES, options:.PKCS7Padding, ke crypt(sc, encryptedFileInputStream, decryptedFileOutputStream, 1024) var image = UIImage(named:"Riscal.jpg") -var decryptedImage = UIImage(contentsOfFile:decryptedFilePath) +var decryptedImage = UIImage(contentsOfFile:decryptedFilePath) \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-18.swift b/README.playground/section-17.swift similarity index 88% rename from IDZSwiftCommonCrypto/README.playground/section-18.swift rename to README.playground/section-17.swift index b3fd482..f4b9508 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-18.swift +++ b/README.playground/section-17.swift @@ -1,4 +1,4 @@ let keys6 = PBKDF.deriveKey("password", salt: "salt", prf: .SHA1, rounds: 1, derivedKeyLength: 20) // RFC 6070 - Should derive 0c60c80f961f0e71f3a9b524af6012062fe037a6 let expectedRFC6070 = arrayFromHexString("0c60c80f961f0e71f3a9b524af6012062fe037a6") -assert(keys6 == expectedRFC6070) +assert(keys6 == expectedRFC6070) \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-4.swift b/README.playground/section-3.swift similarity index 96% rename from IDZSwiftCommonCrypto/README.playground/section-4.swift rename to README.playground/section-3.swift index fd7ea9c..4173357 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-4.swift +++ b/README.playground/section-3.swift @@ -6,4 +6,4 @@ let digests2 = md5s2.final() // According to Wikipedia this should be // e4d909c290d0fb1ca068ffaddf22cbd0 hexStringFromArray(digests2) -assert(digests2 == arrayFromHexString("e4d909c290d0fb1ca068ffaddf22cbd0")) +assert(digests2 == arrayFromHexString("e4d909c290d0fb1ca068ffaddf22cbd0")) \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-6.swift b/README.playground/section-5.swift similarity index 86% rename from IDZSwiftCommonCrypto/README.playground/section-6.swift rename to README.playground/section-5.swift index 71e1911..bd1ccc2 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-6.swift +++ b/README.playground/section-5.swift @@ -4,4 +4,4 @@ let b : [UInt8] = 0x66,0x6f,0x78,0x2e] var md5s1 : Digest = Digest(algorithm:.MD5) md5s1.update(b) -let digests1 = md5s1.final() +let digests1 = md5s1.final() \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-8.swift b/README.playground/section-7.swift similarity index 71% rename from IDZSwiftCommonCrypto/README.playground/section-8.swift rename to README.playground/section-7.swift index 095b039..b86f095 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-8.swift +++ b/README.playground/section-7.swift @@ -1 +1 @@ - var digests3 = Digest(algorithm: .MD5).update(b)?.final() // digest is of type [UInt8]? + var digests3 = Digest(algorithm: .MD5).update(b)?.final() // digest is of type [UInt8]? \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/README.playground/section-10.swift b/README.playground/section-9.swift similarity index 71% rename from IDZSwiftCommonCrypto/README.playground/section-10.swift rename to README.playground/section-9.swift index 80987e3..4ce6b9b 100644 --- a/IDZSwiftCommonCrypto/README.playground/section-10.swift +++ b/README.playground/section-9.swift @@ -1 +1 @@ - var digests4 = Digest(algorithm: .MD5).update(s)?.final() // digest is of type [UInt8]? + var digests4 = Digest(algorithm: .MD5).update(s)?.final() // digest is of type [UInt8]? \ No newline at end of file diff --git a/IDZSwiftCommonCrypto/Riscal.jpg b/Riscal.jpg similarity index 100% rename from IDZSwiftCommonCrypto/Riscal.jpg rename to Riscal.jpg diff --git a/apple_wwdr.cer b/apple_wwdr.cer new file mode 100644 index 0000000..0de099b Binary files /dev/null and b/apple_wwdr.cer differ diff --git a/delete_keychain.bash b/delete_keychain.bash new file mode 100755 index 0000000..d1a8315 --- /dev/null +++ b/delete_keychain.bash @@ -0,0 +1,11 @@ +#!/bin/bash +KEYCHAIN=IDZSwiftCommonCrypto.keychain + + # If this environment variable is missing, we must not be running on Travis. + if [ -z "$KEY_PASSWORD" ] + then + return 0 + fi + + security delete-keychain "$KEYCHAIN" + echo "Deleted keycain." diff --git a/developer.p12 b/developer.p12 new file mode 100644 index 0000000..3e04fd6 Binary files /dev/null and b/developer.p12 differ diff --git a/docs/Classes.html b/docs/Classes.html new file mode 100644 index 0000000..fa96258 --- /dev/null +++ b/docs/Classes.html @@ -0,0 +1,345 @@ + + + + Classes Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + PBKDF + +
    +
    +
    +
    +
    +
    +

    Derives key material from a password or passphrase.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class PBKDF
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Cryptor + +
    +
    +
    +
    +
    +
    +

    Encrypts or decrypts, accumulating result.

    + +

    Useful for small in-memory buffers.

    + +

    For large files or network streams use StreamCryptor.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Cryptor : StreamCryptor, Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + StreamCryptor + +
    +
    +
    +
    +
    +
    +

    Encrypts or decrypts return results as they become available.

    + +

    Use for large files or network streams.

    + +

    For small, in-memory buffers Cryptor may be easier to use.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class StreamCryptor
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Random + +
    +
    +
    +
    +
    +
    +

    Generates buffers of random bytes.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Random
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + Digest + +
    +
    +
    +
    +
    +
    +

    Public API for message digests.

    + +

    Usage is straightforward

    + +
      let  s = "The quick brown fox jumps over the lazy dog."
    +  var md5 : Digest = Digest(algorithm:.MD5)
    +  md5.update(s)
    +  let digest = md5.final()
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Digest : Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + HMAC + +
    +
    +
    +
    +
    +
    +

    Calculates a cryptographic Hash-Based Message Authentication Code (HMAC).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class HMAC : Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/Cryptor.html b/docs/Classes/Cryptor.html new file mode 100644 index 0000000..cddcda3 --- /dev/null +++ b/docs/Classes/Cryptor.html @@ -0,0 +1,223 @@ + + + + Cryptor Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Cryptor

+
+
+
public class Cryptor : StreamCryptor, Updateable
+ +
+
+

Encrypts or decrypts, accumulating result.

+ +

Useful for small in-memory buffers.

+ +

For large files or network streams use StreamCryptor.

+ +
+
+
+
    +
  • +
    + + + + final() + +
    +
    +
    +
    +
    +
    +

    Retrieves the encrypted or decrypted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final() -> [UInt8]?
    + +
    +
    +
    +

    Return Value

    +

    the encrypted or decrypted data or nil if an error occured.

    + +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Upates the accumulated encrypted/decrypted data with the contents +of a raw byte buffer.

    + +

    It is not envisaged the users of the framework will need to call this directly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(buffer: UnsafePointer<Void>, _ byteCount: Int) -> Self?
    + +
    +
    +
    +

    Return Value

    +

    this Cryptor object or nil if an error occurs (for optional chaining)

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/Digest.html b/docs/Classes/Digest.html new file mode 100644 index 0000000..4d62c99 --- /dev/null +++ b/docs/Classes/Digest.html @@ -0,0 +1,353 @@ + + + + Digest Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Digest

+
+
+
public class Digest : Updateable
+ +
+
+

Public API for message digests.

+ +

Usage is straightforward

+ +
  let  s = "The quick brown fox jumps over the lazy dog."
+  var md5 : Digest = Digest(algorithm:.MD5)
+  md5.update(s)
+  let digest = md5.final()
+
+ +
+
+
+
    +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The status of the Digest. +For CommonCrypto this will always be .Success. +It is here to provide for engines which can fail.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status = Status.Success
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Algorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available Digest algorithms

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Algorithm
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(algorithm:) + +
    +
    +
    +
    +
    +
    +

    Create an algorithm-specific digest calculator +- parameter alrgorithm: the desired message digest algorithm

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(algorithm: Algorithm)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + alrgorithm + + +
    +

    the desired message digest algorithm

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Low-level update routine. Updates the message digest calculation with +the contents of a byte buffer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(buffer: UnsafePointer<Void>, _ byteCount: size_t) -> Self?
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + buffer + + +
    +

    the buffer

    + +
    +
    + + the + + +
    +

    number of bytes in buffer

    + +
    +
    +
    +
    +

    Return Value

    +

    this Digest object (for optional chaining)

    + +
    +
    +
    +
  • +
  • +
    + + + + final() + +
    +
    +
    +
    +
    +
    +

    Completes the calculate of the messge digest +- returns: the message digest

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final() -> [UInt8]
    + +
    +
    +
    +

    Return Value

    +

    the message digest

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/Digest/Algorithm.html b/docs/Classes/Digest/Algorithm.html new file mode 100644 index 0000000..da42599 --- /dev/null +++ b/docs/Classes/Digest/Algorithm.html @@ -0,0 +1,357 @@ + + + + Algorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Algorithm

+
+
+
public enum Algorithm
+ +
+
+

Enumerates available Digest algorithms

+ +
+
+
+
    +
  • +
    + + + + MD2 + +
    +
    +
    +
    +
    + +
    +

    Declaration

    +
    +

    Swift

    +
    case MD2,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD4 + +
    +
    +
    +
    +
    +
    +

    Message Digest 4

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    MD4,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD5 + +
    +
    +
    +
    +
    +
    +

    Message Digest 5

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    MD5,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 1

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA1,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 224-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA224,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 256-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA256,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 384-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA384,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 512-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA512
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/HMAC.html b/docs/Classes/HMAC.html new file mode 100644 index 0000000..2ab9ad4 --- /dev/null +++ b/docs/Classes/HMAC.html @@ -0,0 +1,380 @@ + + + + HMAC Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

HMAC

+
+
+
public class HMAC : Updateable
+ +
+
+

Calculates a cryptographic Hash-Based Message Authentication Code (HMAC).

+ +
+
+
+
    +
  • +
    + + + + Algorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available algorithms.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Algorithm
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    Status of the calculation

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status : Status = .Success
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(algorithm:key:) + +
    +
    +
    +
    +
    +
    +

    Creates a new HMAC instance with the specified algorithm and key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(algorithm : Algorithm, key : NSData)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + algorithm + + +
    +

    selects the algorithm

    + +
    +
    + + key + + +
    +

    specifies the key

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + init(algorithm:key:) + +
    +
    +
    +
    +
    +
    +

    Creates a new HMAC instance with the specified algorithm and key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(algorithm : Algorithm, key : [UInt8])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + algorithm + + +
    +

    selects the algorithm

    + +
    +
    + + key + + +
    +

    specifies the key

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Updates the calculation of the HMAC with the contents of a buffer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(buffer : UnsafePointer<Void>, _ byteCount : size_t) -> Self?
    + +
    +
    +
    +

    Return Value

    +

    the calculated HMAC

    + +
    +
    +
    +
  • +
  • +
    + + + + final() + +
    +
    +
    +
    +
    +
    +

    Finalizes the HMAC calculation

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final() -> [UInt8]
    + +
    +
    +
    +

    Return Value

    +

    the calculated HMAC

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/HMAC/Algorithm.html b/docs/Classes/HMAC/Algorithm.html new file mode 100644 index 0000000..1aed3fd --- /dev/null +++ b/docs/Classes/HMAC/Algorithm.html @@ -0,0 +1,334 @@ + + + + Algorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Algorithm

+
+
+
public enum Algorithm
+ +
+
+

Enumerates available algorithms.

+ +
+
+
+
    +
  • +
    + + + + MD5 + +
    +
    +
    +
    +
    +
    +

    Message Digest 5

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case MD5,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 1

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA1,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 224-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA224,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 256-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA256,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 384-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA384,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 512-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA512
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + digestLength() + +
    +
    +
    +
    +
    +
    +

    Obtains the digest length produced by this algorithm (in bytes).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func digestLength() -> Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/PBKDF.html b/docs/Classes/PBKDF.html new file mode 100644 index 0000000..bd8f14e --- /dev/null +++ b/docs/Classes/PBKDF.html @@ -0,0 +1,461 @@ + + + + PBKDF Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

PBKDF

+
+
+
public class PBKDF
+ +
+
+

Derives key material from a password or passphrase.

+ +
+
+
+
    +
  • +
    + + + + PseudoRandomAlgorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available pseudo random algorithms

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum PseudoRandomAlgorithm
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines the (approximate) number of iterations of the key derivation algorithm that need +to be run to achieve a particular delay (or calculation time).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func calibrate(passwordLength: Int, saltLength: Int, algorithm: PseudoRandomAlgorithm, derivedKeyLength: Int, msec : UInt32) -> UInt
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + passwordLength + + +
    +

    password length in bytes

    + +
    +
    + + saltLength + + +
    +

    salt length in bytes

    + +
    +
    + + algorithm + + +
    +

    the PseudoRandomAlgorithm to use

    + +
    +
    + + derivedKeyLength + + +
    +

    the desired key length

    + +
    +
    + + msec + + +
    +

    the desired calculation time

    + +
    +
    +
    +
    +

    Return Value

    +

    the number of times the algorithm should be run

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Derives key material from a password and salt.

    + +

    -parameter password: the password string, will be converted using UTF8 +-parameter salt: the salt string will be converted using UTF8 +-parameter prf: the pseudo random function +-parameter round: the number of rounds +-parameter derivedKeyLength: the length of the desired derived key, in bytes. +-returns: the derived key

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func deriveKey(password : String, salt : String, prf: PseudoRandomAlgorithm, rounds: uint, derivedKeyLength: UInt) -> [UInt8]
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Derives key material from a password buffer.

    + +
      +
    • return: the number of times the algorithm should be run
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func deriveKey(password: UnsafePointer<Int8>, passwordLen: Int, salt: UnsafePointer<UInt8>, saltLen: Int, prf: PseudoRandomAlgorithm, rounds: uint, derivedKey: UnsafeMutablePointer<UInt8>, derivedKeyLen: Int)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + password + + +
    +

    pointer to the password buffer

    + +
    +
    + + passwordLength + + +
    +

    password length in bytes

    + +
    +
    + + salt + + +
    +

    pointer to the salt buffer

    + +
    +
    + + saltLength + + +
    +

    salt length in bytes

    + +
    +
    + + prf + + +
    +

    the PseudoRandomAlgorithm to use

    + +
    +
    + + rounds + + +
    +

    the number of rounds of the algorithm to use

    + +
    +
    + + derivedKey + + +
    +

    pointer to the derived key buffer.

    + +
    +
    + + derivedKeyLength + + +
    +

    the desired key length

    + +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/PBKDF/PseudoRandomAlgorithm.html b/docs/Classes/PBKDF/PseudoRandomAlgorithm.html new file mode 100644 index 0000000..a928c14 --- /dev/null +++ b/docs/Classes/PBKDF/PseudoRandomAlgorithm.html @@ -0,0 +1,292 @@ + + + + PseudoRandomAlgorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

PseudoRandomAlgorithm

+
+
+
public enum PseudoRandomAlgorithm
+ +
+
+

Enumerates available pseudo random algorithms

+ +
+
+
+
    +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 1

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA1
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 224-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA224
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 256-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA256
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 384-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA384
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 512-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA512
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/Random.html b/docs/Classes/Random.html new file mode 100644 index 0000000..50920c1 --- /dev/null +++ b/docs/Classes/Random.html @@ -0,0 +1,298 @@ + + + + Random Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Random

+
+
+
public class Random
+ +
+
+

Generates buffers of random bytes.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Wraps native CCRandomeGenerateBytes call.

    + +

    :note: CCRNGStatus is typealiased to CCStatus but this routine can only return kCCSuccess or kCCRNGFailure

    + +
      +
    • return: .Success or .RNGFailure as appropriate.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func generateBytes(bytes : UnsafeMutablePointer<Void>, byteCount : Int ) -> RNGStatus
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bytes + + +
    +

    a pointer to the buffer that will receive the bytes

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + generateBytes(_:) + +
    +
    +
    +
    +
    +
    +

    Generates an array of random bytes.

    + +
      +
    • return: an array of random bytes
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func generateBytes(byteCount : Int ) throws -> [UInt8]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bytesCount + + +
    +

    number of random bytes to generate

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A version of generateBytes that always throws an error.

    + +

    Use it to test that code handles this.

    + +
      +
    • return: an array of random bytes
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func generateBytesThrow(byteCount : Int ) throws -> [UInt8]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bytesCount + + +
    +

    number of random bytes to generate

    + +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/StreamCryptor.html b/docs/Classes/StreamCryptor.html new file mode 100644 index 0000000..8a36c0a --- /dev/null +++ b/docs/Classes/StreamCryptor.html @@ -0,0 +1,1047 @@ + + + + StreamCryptor Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

StreamCryptor

+
+
+
public class StreamCryptor
+ +
+
+

Encrypts or decrypts return results as they become available.

+ +

Use for large files or network streams.

+ +

For small, in-memory buffers Cryptor may be easier to use.

+ +
+
+
+
    +
  • +
    + + + + Operation + +
    +
    +
    +
    +
    +
    +

    Enumerates Cryptor operations

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Operation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Algorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available algorithms

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Algorithm
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Options + +
    +
    +
    +
    +
    +
    +

    Maps CommonCryptoOptions onto a Swift struct.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Options : OptionSetType, BooleanType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The status code resulting from the last method call to this Cryptor. +Used to get additional information when optional chaining collapes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status : Status = .Success
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Creates a new StreamCryptor

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(operation: Operation, algorithm: Algorithm, options: Options, key: [UInt8],
    +        iv : [UInt8])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + operation + + +
    +

    the operation to perform see Operation (Encrypt, Decrypt)

    + +
    +
    + + algorithm + + +
    +

    the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish)

    + +
    +
    + + key + + +
    +

    a byte array containing key data

    + +
    +
    + + iv + + +
    +

    a byte array containing initialization vector

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a new StreamCryptor

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(operation: Operation, algorithm: Algorithm, options: Options, key: String,
    +        iv : String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + operation + + +
    +

    the operation to perform see Operation (Encrypt, Decrypt)

    + +
    +
    + + algorithm + + +
    +

    the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish)

    + +
    +
    + + key + + +
    +

    a string containing key data (will be interpreted as UTF8)

    + +
    +
    + + iv + + +
    +

    a string containing initialization vector data (will be interpreted as UTF8)

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add the contents of an Objective-C NSData buffer to the current encryption/decryption operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(dataIn: NSData, inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + dataIn + + +
    +

    the input data

    + +
    +
    + + byteArrayOut + + +
    +

    output data

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add the contents of a Swift byte array to the current encryption/decryption operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(byteArrayIn: [UInt8], inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + byteArrayIn + + +
    +

    the input data

    + +
    +
    + + byteArrayOut + + +
    +

    output data

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add the contents of a string (interpreted as UTF8) to the current encryption/decryption operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(stringIn: String, inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + byteArrayIn + + +
    +

    the input data

    + +
    +
    + + byteArrayOut + + +
    +

    output data

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
  • +
    + + + + final(_:) + +
    +
    +
    +
    +
    +
    +

    Retrieves all remaining encrypted or decrypted data from this cryptor.

    + +

    :note: If the underlying algorithm is an block cipher and the padding option has +not been specified and the cumulative input to the cryptor has not been an integral +multiple of the block length this will fail with an alignment error.

    + +

    :note: This method updates the status property

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final(inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + byteArrayOut + + +
    +

    the output bffer

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
+
+
+ +
    +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(operation: Operation, algorithm: Algorithm, options: Options, keyBuffer: UnsafePointer<Void>,
    +        keyByteCount: Int, ivBuffer: UnsafePointer<Void>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + operation + + +
    +

    the operation to perform see Operation (Encrypt, Decrypt)

    + +
    +
    + + algorithm + + +
    +

    the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish)

    + +
    +
    + + keyBuffer + + +
    +

    pointer to key buffer

    + +
    +
    + + keyByteCount + + +
    +

    number of bytes in the key

    + +
    +
    + + ivBuffer + + +
    +

    initialization vector buffer

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(bufferIn: UnsafePointer<Void>, byteCountIn: Int, bufferOut: UnsafeMutablePointer<Void>, byteCapacityOut : Int, inout byteCountOut : Int) -> Status
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + bufferIn + + +
    +

    pointer to input buffer

    + +
    +
    + + inByteCount + + +
    +

    number of bytes contained in input buffer

    + +
    +
    + + bufferOut + + +
    +

    pointer to output buffer

    + +
    +
    + + outByteCapacity + + +
    +

    capacity of the output buffer in bytes

    + +
    +
    + + outByteCount + + +
    +

    on successful completion, the number of bytes written to the output buffer

    + +
    +
    +
    +
    +

    Return Value

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Retrieves all remaining encrypted or decrypted data from this cryptor.

    + +

    :note: If the underlying algorithm is an block cipher and the padding option has +not been specified and the cumulative input to the cryptor has not been an integral +multiple of the block length this will fail with an alignment error.

    + +

    :note: This method updates the status property

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final(bufferOut: UnsafeMutablePointer<Void>, byteCapacityOut : Int, inout byteCountOut : Int) -> Status
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + bufferOut + + +
    +

    pointer to output buffer

    + +
    +
    + + outByteCapacity + + +
    +

    capacity of the output buffer in bytes

    + +
    +
    + + outByteCount + + +
    +

    on successful completion, the number of bytes written to the output buffer

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines the number of bytes that wil be output by this Cryptor if inputBytes of additional +data is input.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getOutputLength(inputByteCount : Int, isFinal : Bool = false) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + inputByteCount + + +
    +

    number of bytes that will be input.

    + +
    +
    + + isFinal + + +
    +

    true if buffer to be input will be the last input buffer, false otherwise.

    + +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/StreamCryptor/Algorithm.html b/docs/Classes/StreamCryptor/Algorithm.html new file mode 100644 index 0000000..97b9cdb --- /dev/null +++ b/docs/Classes/StreamCryptor/Algorithm.html @@ -0,0 +1,334 @@ + + + + Algorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Algorithm

+
+
+
public enum Algorithm
+ +
+
+

Enumerates available algorithms

+ +
+
+
+
    +
  • +
    + + + + AES + +
    +
    +
    +
    +
    +
    +

    Advanced Encryption Standard

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case AES,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DES + +
    +
    +
    +
    +
    +
    +

    Data Encryption Standard

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    DES,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TripleDES + +
    +
    +
    +
    +
    +
    +

    Triple DES

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    TripleDES,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CAST + +
    +
    +
    +
    +
    +
    +

    CAST

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    CAST,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RC2 + +
    +
    +
    +
    +
    +
    +

    RC2

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    RC2,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Blowfish + +
    +
    +
    +
    +
    +
    +

    Blowfish

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Blowfish
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + blockSize() + +
    +
    +
    +
    +
    +
    +

    Blocksize, in bytes, of algorithm.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func blockSize() -> Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/StreamCryptor/Operation.html b/docs/Classes/StreamCryptor/Operation.html new file mode 100644 index 0000000..9e5a071 --- /dev/null +++ b/docs/Classes/StreamCryptor/Operation.html @@ -0,0 +1,195 @@ + + + + Operation Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Operation

+
+
+
public enum Operation
+ +
+
+

Enumerates Cryptor operations

+ +
+
+
+
    +
  • +
    + + + + Encrypt + +
    +
    +
    +
    +
    +
    +

    Encrypting

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case Encrypt,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Decrypt + +
    +
    +
    +
    +
    +
    +

    Decrypting

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Decrypt
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Classes/StreamCryptor/Options.html b/docs/Classes/StreamCryptor/Options.html new file mode 100644 index 0000000..ff11677 --- /dev/null +++ b/docs/Classes/StreamCryptor/Options.html @@ -0,0 +1,492 @@ + + + + Options Struct Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Options

+
+
+
public struct Options : OptionSetType, BooleanType
+ +
+
+

Maps CommonCryptoOptions onto a Swift struct.

+ +
+
+
+
    +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    +

    Convert to native raw value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var rawValue : UInt { return self.value }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize from a raw value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ rawValue: UInt)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    +

    Convert from a native value (i.e. 0, kCCOptionPKCS7Padding, kCCOptionECBMode)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: UInt)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(nilLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize from a nil literal

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(nilLiteral: ())
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromMask(_:) + +
    +
    +
    +
    +
    +
    +

    Create from a mask

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromMask(raw: UInt) -> Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromRaw(_:) + +
    +
    +
    +
    +
    +
    +

    Convert from native raw value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromRaw(raw: UInt) -> Options?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toRaw() + +
    +
    +
    +
    +
    +
    +

    Convert to native raw value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toRaw() -> UInt
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolValue + +
    +
    +
    +
    +
    +
    +

    Convert to boolean value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var boolValue: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allZeros + +
    +
    +
    +
    +
    +
    +

    Initialize to value appropriate for all zeros of a mask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var allZeros: Options
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    nil is consider the same a zero or None.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func convertFromNilLiteral() -> Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + None + +
    +
    +
    +
    +
    +
    +

    No options

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var None: Options           { return self.init(0) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PKCS7Padding + +
    +
    +
    +
    +
    +
    +

    Use padding. Needed unless the input is a integral number of blocks long.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var PKCS7Padding: Options    { return self.init(UInt(kCCOptionPKCS7Padding)) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ECBMode + +
    +
    +
    +
    +
    +
    +

    Electronic Code Book Mode. Don’t use this.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var ECBMode: Options      { return self.init(UInt(kCCOptionECBMode)) }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Enums.html b/docs/Enums.html new file mode 100644 index 0000000..fdb43a6 --- /dev/null +++ b/docs/Enums.html @@ -0,0 +1,162 @@ + + + + Enums Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Enums

+

The following enums are available globally.

+ +
+
+
+
    +
  • +
    + + + + Status + +
    +
    +
    +
    +
    +
    +

    Links the native CommonCryptoStatus enumeration to Swiftier versions.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Status : CCCryptorStatus, CustomStringConvertible, ErrorType
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Enums/Status.html b/docs/Enums/Status.html new file mode 100644 index 0000000..eff99bf --- /dev/null +++ b/docs/Enums/Status.html @@ -0,0 +1,469 @@ + + + + Status Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Status

+
+
+
public enum Status : CCCryptorStatus, CustomStringConvertible, ErrorType
+ +
+
+

Links the native CommonCryptoStatus enumeration to Swiftier versions.

+ +
+
+
+
    +
  • +
    + + + + Success + +
    +
    +
    +
    +
    +
    +

    Successful

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case Success,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ParamError + +
    +
    +
    +
    +
    +
    +

    Parameter Error

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    ParamError,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BufferTooSmall + +
    +
    +
    +
    +
    +
    +

    Buffer too Small

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    BufferTooSmall,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MemoryFailure + +
    +
    +
    +
    +
    +
    +

    Memory Failure

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    MemoryFailure,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AlignmentError + +
    +
    +
    +
    +
    +
    +

    Alignment Error

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    AlignmentError,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DecodeError + +
    +
    +
    +
    +
    +
    +

    Decode Error

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    DecodeError,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Unimplemented + +
    +
    +
    +
    +
    +
    +

    Unimplemented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Unimplemented,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Overflow + +
    +
    +
    +
    +
    +
    +

    Overflow

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Overflow,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RNGFailure + +
    +
    +
    +
    +
    +
    +

    Random Number Generator Err

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    RNGFailure
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + toRaw() + +
    +
    +
    +
    +
    +
    +

    Converts this value to a native CCCryptorStatus value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toRaw() -> CCCryptorStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Obtain human-readable string from enum value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description : String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromRaw(_:) + +
    +
    +
    +
    +
    +
    +

    Create enum value from raw CCCryptorStatus value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromRaw(status : CCCryptorStatus) -> Status?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Extensions.html b/docs/Extensions.html new file mode 100644 index 0000000..8ece998 --- /dev/null +++ b/docs/Extensions.html @@ -0,0 +1,249 @@ + + + + Extensions Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + CryptoDigest + +
    +
    +
    +
    +
    +
    +

    Implements a simplified API for calculating digests over single buffers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol CryptoDigest
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NSData + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
    +@end
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + String + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    struct String
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Updateable + +
    +
    +
    +
    +
    +
    +

    A protocol for calculations that can be updated with incremental data buffers.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Extensions/CryptoDigest.html b/docs/Extensions/CryptoDigest.html new file mode 100644 index 0000000..37a0c79 --- /dev/null +++ b/docs/Extensions/CryptoDigest.html @@ -0,0 +1,357 @@ + + + + CryptoDigest Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

CryptoDigest

+
+
+
public protocol CryptoDigest
+ +
+
+

Implements a simplified API for calculating digests over single buffers

+ +
+
+
+
    +
  • +
    + + + + MD2 + +
    +
    +
    +
    +
    +
    +

    An MD2 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var MD2: Self { return self.digest(.MD2) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD4 + +
    +
    +
    +
    +
    +
    +

    An MD4 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var MD4: Self { return self.digest(.MD4) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD5 + +
    +
    +
    +
    +
    +
    +

    An MD5 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var MD5: Self { return self.digest(.MD5) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    An SHA1 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA1: Self { return self.digest(.SHA1) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    An SHA224 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA224: Self { return self.digest(.SHA224) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    An SHA256 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA256: Self { return self.digest(.SHA256) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    An SHA384 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA384: Self { return self.digest(.SHA384) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    An SHA512 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA512: Self { return self.digest(.SHA512) }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Extensions/NSData.html b/docs/Extensions/NSData.html new file mode 100644 index 0000000..60d887d --- /dev/null +++ b/docs/Extensions/NSData.html @@ -0,0 +1,193 @@ + + + + NSData Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

NSData

+
+
+
@interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
+@end
+ +
+
+ +
+
+
+
    +
  • +
    + + + + digest(_:) + +
    +
    +
    +
    +
    +
    +

    Calculates the Message Digest for this data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func digest(algorithm : Digest.Algorithm) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + algorithm + + +
    +

    the digest algorithm to use

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSData object containing the message digest

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Extensions/String.html b/docs/Extensions/String.html new file mode 100644 index 0000000..458f2fb --- /dev/null +++ b/docs/Extensions/String.html @@ -0,0 +1,193 @@ + + + + String Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

String

+
+
+
struct String
+ +
+
+ +
+
+
+
    +
  • +
    + + + + digest(_:) + +
    +
    +
    +
    +
    +
    +

    Calculates the Message Digest for this string. +The string is converted to raw data using UTF8.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func digest(algorithm : Digest.Algorithm) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + algorithm + + +
    +

    the digest algorithm to use

    + +
    +
    +
    +
    +

    Return Value

    +

    a hex string of the calculated digest

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Extensions/Updateable.html b/docs/Extensions/Updateable.html new file mode 100644 index 0000000..547433e --- /dev/null +++ b/docs/Extensions/Updateable.html @@ -0,0 +1,235 @@ + + + + Updateable Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Updateable

+
+
+
public protocol Updateable
+ +
+
+

A protocol for calculations that can be updated with incremental data buffers.

+ +
+
+
+
    +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Updates the current calculation with data contained in an NSData object.

    + +
      +
    • parameters data: the data buffer
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(data: NSData) -> Self?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Updates the current calculation with data contained in a Swift array.

    + +
      +
    • parameters byteArray: the Swift array
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(byteArray : [UInt8]) -> Self?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Updates the current calculation with data contained in a Swift string. +The corresponding data will be generated using UTF8 encoding.

    + +
      +
    • parameters string: the Swift string
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(string: String) -> Self?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Functions.html b/docs/Functions.html new file mode 100644 index 0000000..b806b6e --- /dev/null +++ b/docs/Functions.html @@ -0,0 +1,473 @@ + + + + Functions Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Functions

+

The following functions are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Converts a string of hexadecimal digits to a Swift array.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func arrayFromHexString(s : String) -> [UInt8]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + s + + +
    +

    the hex string (must contain an even number of digits)

    + +
    +
    +
    +
    +

    Return Value

    +

    a Swift array

    + +
    +
    +
    +
  • +
  • +
    + + + + dataFromHexString(_:) + +
    +
    +
    +
    +
    +
    +

    Converts a string of hexadecimal digits to an NSData object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func dataFromHexString(s : String) -> NSData
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + s + + +
    +

    the hex string (must contain an even number of digits)

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSData object

    + +
    +
    +
    +
  • +
  • +
    + + + + dataFromByteArray(_:) + +
    +
    +
    +
    +
    +
    +

    Converts a Swift array to an NSData object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func dataFromByteArray(a : [UInt8]) -> NSData
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSData object

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts a Swift array to a string of hexadecimal digits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hexStringFromArray(a : [UInt8], uppercase : Bool = false) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    + + uppercase + + +
    +

    if true use uppercase for letter digits, lowercase otherwise

    + +
    +
    +
    +
    +

    Return Value

    +

    a Swift string

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts a Swift array to an NSString object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hexNSStringFromArray(a : [UInt8], uppercase : Bool = false) -> NSString
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    + + uppercase + + +
    +

    if true use uppercase for letter digits, lowercase otherwise

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSString object

    + +
    +
    +
    +
  • +
  • +
    + + + + hexListFromArray(_:) + +
    +
    +
    +
    +
    +
    +

    Converts a Swift array to a Swift String containing a comma separated list of bytes. +This is used to generate test data programmatically.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hexListFromArray(a : [UInt8]) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    +
    +
    +

    Return Value

    +

    a Swift string

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Protocols.html b/docs/Protocols.html new file mode 100644 index 0000000..5af568c --- /dev/null +++ b/docs/Protocols.html @@ -0,0 +1,194 @@ + + + + Protocols Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + CryptoDigest + +
    +
    +
    +
    +
    +
    +

    Implements a simplified API for calculating digests over single buffers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol CryptoDigest
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Updateable + +
    +
    +
    +
    +
    +
    +

    A protocol for calculations that can be updated with incremental data buffers.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Protocols/CryptoDigest.html b/docs/Protocols/CryptoDigest.html new file mode 100644 index 0000000..7932894 --- /dev/null +++ b/docs/Protocols/CryptoDigest.html @@ -0,0 +1,168 @@ + + + + CryptoDigest Protocol Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

CryptoDigest

+
+
+
public protocol CryptoDigest
+ +
+
+

Implements a simplified API for calculating digests over single buffers

+ +
+
+
+
    +
  • +
    + + + + digest(_:) + +
    +
    +
    +
    +
    +
    +

    Calculates a message digest

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func digest(algorithm : Digest.Algorithm) -> Self
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/Protocols/Updateable.html b/docs/Protocols/Updateable.html new file mode 100644 index 0000000..41ab0e9 --- /dev/null +++ b/docs/Protocols/Updateable.html @@ -0,0 +1,237 @@ + + + + Updateable Protocol Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Updateable

+
+
+
public protocol Updateable
+ +
+
+

A protocol for calculations that can be updated with incremental data buffers.

+ +
+
+
+
    +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    Status of the calculation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var status : Status { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Low-level update routine. +Updates the calculation with the contents of a data buffer. +- parameter buffer: pointer to the data buffer +- parameter byteCount: length of the buffer in bytes +- returns: self if no error for optional chaining, null otherwise

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func update(buffer : UnsafePointer<Void>, _ byteCount : size_t) -> Self?
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + buffer + + +
    +

    pointer to the data buffer

    + +
    +
    + + byteCount + + +
    +

    length of the buffer in bytes

    + +
    +
    +
    +
    +

    Return Value

    +

    self if no error for optional chaining, null otherwise

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/css/highlight.css b/docs/css/highlight.css new file mode 100644 index 0000000..18c292e --- /dev/null +++ b/docs/css/highlight.css @@ -0,0 +1,202 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; + font-weight: bold; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; + font-weight: bold; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/docs/css/jazzy.css b/docs/css/jazzy.css new file mode 100644 index 0000000..a42da72 --- /dev/null +++ b/docs/css/jazzy.css @@ -0,0 +1,302 @@ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3, h4, h5, h6 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h3 { + font-size: 1.5em; } + +h4 { + font-size: 1.25em; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +a { + color: #0088cc; + text-decoration: none; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 26px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 1; } + header img { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 27px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 1; + margin-top: 26px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 60px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token { + padding-left: 3px; + margin-left: 15px; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +div.Swift { + padding: 4px 0 2px 10px; + margin-bottom: 1em; + border-left: 5px solid #cde9f4; + overflow-y: hidden; } + div.Swift .aside-title { + color: #4b8afb; + -webkit-user-select: none; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: absolute; + bottom: 10px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } +html.dash .height-container { + display: block; } +html.dash .item .token { + margin-left: 0; } +html.dash .content-wrapper { + width: auto; } +html.dash #footer { + position: static; } diff --git a/docs/docsets/.docset/Contents/Info.plist b/docs/docsets/.docset/Contents/Info.plist new file mode 100644 index 0000000..4fcbfbd --- /dev/null +++ b/docs/docsets/.docset/Contents/Info.plist @@ -0,0 +1,20 @@ + + + + + CFBundleIdentifier + com.jazzy. + CFBundleName + + DocSetPlatformFamily + jazzy + isDashDocset + + dashIndexFilePath + index.html + isJavaScriptEnabled + + DashDocSetFamily + dashtoc + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html new file mode 100644 index 0000000..fa96258 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes.html @@ -0,0 +1,345 @@ + + + + Classes Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Classes

+

The following classes are available globally.

+ +
+
+
+
    +
  • +
    + + + + PBKDF + +
    +
    +
    +
    +
    +
    +

    Derives key material from a password or passphrase.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class PBKDF
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Cryptor + +
    +
    +
    +
    +
    +
    +

    Encrypts or decrypts, accumulating result.

    + +

    Useful for small in-memory buffers.

    + +

    For large files or network streams use StreamCryptor.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Cryptor : StreamCryptor, Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + StreamCryptor + +
    +
    +
    +
    +
    +
    +

    Encrypts or decrypts return results as they become available.

    + +

    Use for large files or network streams.

    + +

    For small, in-memory buffers Cryptor may be easier to use.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class StreamCryptor
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Random + +
    +
    +
    +
    +
    +
    +

    Generates buffers of random bytes.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Random
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + Digest + +
    +
    +
    +
    +
    +
    +

    Public API for message digests.

    + +

    Usage is straightforward

    + +
      let  s = "The quick brown fox jumps over the lazy dog."
    +  var md5 : Digest = Digest(algorithm:.MD5)
    +  md5.update(s)
    +  let digest = md5.final()
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class Digest : Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + HMAC + +
    +
    +
    +
    +
    +
    +

    Calculates a cryptographic Hash-Based Message Authentication Code (HMAC).

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class HMAC : Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Cryptor.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Cryptor.html new file mode 100644 index 0000000..cddcda3 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Cryptor.html @@ -0,0 +1,223 @@ + + + + Cryptor Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Cryptor

+
+
+
public class Cryptor : StreamCryptor, Updateable
+ +
+
+

Encrypts or decrypts, accumulating result.

+ +

Useful for small in-memory buffers.

+ +

For large files or network streams use StreamCryptor.

+ +
+
+
+
    +
  • +
    + + + + final() + +
    +
    +
    +
    +
    +
    +

    Retrieves the encrypted or decrypted data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final() -> [UInt8]?
    + +
    +
    +
    +

    Return Value

    +

    the encrypted or decrypted data or nil if an error occured.

    + +
    +
    +
    +
  • +
+
+
+ +
    +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Upates the accumulated encrypted/decrypted data with the contents +of a raw byte buffer.

    + +

    It is not envisaged the users of the framework will need to call this directly.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(buffer: UnsafePointer<Void>, _ byteCount: Int) -> Self?
    + +
    +
    +
    +

    Return Value

    +

    this Cryptor object or nil if an error occurs (for optional chaining)

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Digest.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Digest.html new file mode 100644 index 0000000..4d62c99 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Digest.html @@ -0,0 +1,353 @@ + + + + Digest Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Digest

+
+
+
public class Digest : Updateable
+ +
+
+

Public API for message digests.

+ +

Usage is straightforward

+ +
  let  s = "The quick brown fox jumps over the lazy dog."
+  var md5 : Digest = Digest(algorithm:.MD5)
+  md5.update(s)
+  let digest = md5.final()
+
+ +
+
+
+
    +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The status of the Digest. +For CommonCrypto this will always be .Success. +It is here to provide for engines which can fail.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status = Status.Success
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Algorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available Digest algorithms

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Algorithm
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(algorithm:) + +
    +
    +
    +
    +
    +
    +

    Create an algorithm-specific digest calculator +- parameter alrgorithm: the desired message digest algorithm

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(algorithm: Algorithm)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + alrgorithm + + +
    +

    the desired message digest algorithm

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Low-level update routine. Updates the message digest calculation with +the contents of a byte buffer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(buffer: UnsafePointer<Void>, _ byteCount: size_t) -> Self?
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + buffer + + +
    +

    the buffer

    + +
    +
    + + the + + +
    +

    number of bytes in buffer

    + +
    +
    +
    +
    +

    Return Value

    +

    this Digest object (for optional chaining)

    + +
    +
    +
    +
  • +
  • +
    + + + + final() + +
    +
    +
    +
    +
    +
    +

    Completes the calculate of the messge digest +- returns: the message digest

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final() -> [UInt8]
    + +
    +
    +
    +

    Return Value

    +

    the message digest

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Digest/Algorithm.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Digest/Algorithm.html new file mode 100644 index 0000000..da42599 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Digest/Algorithm.html @@ -0,0 +1,357 @@ + + + + Algorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Algorithm

+
+
+
public enum Algorithm
+ +
+
+

Enumerates available Digest algorithms

+ +
+
+
+
    +
  • +
    + + + + MD2 + +
    +
    +
    +
    +
    + +
    +

    Declaration

    +
    +

    Swift

    +
    case MD2,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD4 + +
    +
    +
    +
    +
    +
    +

    Message Digest 4

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    MD4,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD5 + +
    +
    +
    +
    +
    +
    +

    Message Digest 5

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    MD5,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 1

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA1,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 224-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA224,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 256-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA256,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 384-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA384,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 512-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA512
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/HMAC.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/HMAC.html new file mode 100644 index 0000000..2ab9ad4 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/HMAC.html @@ -0,0 +1,380 @@ + + + + HMAC Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

HMAC

+
+
+
public class HMAC : Updateable
+ +
+
+

Calculates a cryptographic Hash-Based Message Authentication Code (HMAC).

+ +
+
+
+
    +
  • +
    + + + + Algorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available algorithms.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Algorithm
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    Status of the calculation

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status : Status = .Success
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(algorithm:key:) + +
    +
    +
    +
    +
    +
    +

    Creates a new HMAC instance with the specified algorithm and key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(algorithm : Algorithm, key : NSData)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + algorithm + + +
    +

    selects the algorithm

    + +
    +
    + + key + + +
    +

    specifies the key

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + init(algorithm:key:) + +
    +
    +
    +
    +
    +
    +

    Creates a new HMAC instance with the specified algorithm and key.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(algorithm : Algorithm, key : [UInt8])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + algorithm + + +
    +

    selects the algorithm

    + +
    +
    + + key + + +
    +

    specifies the key

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Updates the calculation of the HMAC with the contents of a buffer.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(buffer : UnsafePointer<Void>, _ byteCount : size_t) -> Self?
    + +
    +
    +
    +

    Return Value

    +

    the calculated HMAC

    + +
    +
    +
    +
  • +
  • +
    + + + + final() + +
    +
    +
    +
    +
    +
    +

    Finalizes the HMAC calculation

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final() -> [UInt8]
    + +
    +
    +
    +

    Return Value

    +

    the calculated HMAC

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/HMAC/Algorithm.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/HMAC/Algorithm.html new file mode 100644 index 0000000..1aed3fd --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/HMAC/Algorithm.html @@ -0,0 +1,334 @@ + + + + Algorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Algorithm

+
+
+
public enum Algorithm
+ +
+
+

Enumerates available algorithms.

+ +
+
+
+
    +
  • +
    + + + + MD5 + +
    +
    +
    +
    +
    +
    +

    Message Digest 5

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case MD5,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 1

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA1,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 224-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA224,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 256-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA256,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 384-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA384,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 512-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    SHA512
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + digestLength() + +
    +
    +
    +
    +
    +
    +

    Obtains the digest length produced by this algorithm (in bytes).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func digestLength() -> Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/PBKDF.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/PBKDF.html new file mode 100644 index 0000000..bd8f14e --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/PBKDF.html @@ -0,0 +1,461 @@ + + + + PBKDF Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

PBKDF

+
+
+
public class PBKDF
+ +
+
+

Derives key material from a password or passphrase.

+ +
+
+
+
    +
  • +
    + + + + PseudoRandomAlgorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available pseudo random algorithms

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum PseudoRandomAlgorithm
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines the (approximate) number of iterations of the key derivation algorithm that need +to be run to achieve a particular delay (or calculation time).

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func calibrate(passwordLength: Int, saltLength: Int, algorithm: PseudoRandomAlgorithm, derivedKeyLength: Int, msec : UInt32) -> UInt
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + passwordLength + + +
    +

    password length in bytes

    + +
    +
    + + saltLength + + +
    +

    salt length in bytes

    + +
    +
    + + algorithm + + +
    +

    the PseudoRandomAlgorithm to use

    + +
    +
    + + derivedKeyLength + + +
    +

    the desired key length

    + +
    +
    + + msec + + +
    +

    the desired calculation time

    + +
    +
    +
    +
    +

    Return Value

    +

    the number of times the algorithm should be run

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Derives key material from a password and salt.

    + +

    -parameter password: the password string, will be converted using UTF8 +-parameter salt: the salt string will be converted using UTF8 +-parameter prf: the pseudo random function +-parameter round: the number of rounds +-parameter derivedKeyLength: the length of the desired derived key, in bytes. +-returns: the derived key

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func deriveKey(password : String, salt : String, prf: PseudoRandomAlgorithm, rounds: uint, derivedKeyLength: UInt) -> [UInt8]
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Derives key material from a password buffer.

    + +
      +
    • return: the number of times the algorithm should be run
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func deriveKey(password: UnsafePointer<Int8>, passwordLen: Int, salt: UnsafePointer<UInt8>, saltLen: Int, prf: PseudoRandomAlgorithm, rounds: uint, derivedKey: UnsafeMutablePointer<UInt8>, derivedKeyLen: Int)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    + + password + + +
    +

    pointer to the password buffer

    + +
    +
    + + passwordLength + + +
    +

    password length in bytes

    + +
    +
    + + salt + + +
    +

    pointer to the salt buffer

    + +
    +
    + + saltLength + + +
    +

    salt length in bytes

    + +
    +
    + + prf + + +
    +

    the PseudoRandomAlgorithm to use

    + +
    +
    + + rounds + + +
    +

    the number of rounds of the algorithm to use

    + +
    +
    + + derivedKey + + +
    +

    pointer to the derived key buffer.

    + +
    +
    + + derivedKeyLength + + +
    +

    the desired key length

    + +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/PBKDF/PseudoRandomAlgorithm.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/PBKDF/PseudoRandomAlgorithm.html new file mode 100644 index 0000000..a928c14 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/PBKDF/PseudoRandomAlgorithm.html @@ -0,0 +1,292 @@ + + + + PseudoRandomAlgorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

PseudoRandomAlgorithm

+
+
+
public enum PseudoRandomAlgorithm
+ +
+
+

Enumerates available pseudo random algorithms

+ +
+
+
+
    +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 1

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA1
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 224-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA224
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 256-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA256
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 384-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA384
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    Secure Hash Algorithm 2 512-bit

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case SHA512
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/Random.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Random.html new file mode 100644 index 0000000..50920c1 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/Random.html @@ -0,0 +1,298 @@ + + + + Random Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Random

+
+
+
public class Random
+ +
+
+

Generates buffers of random bytes.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Wraps native CCRandomeGenerateBytes call.

    + +

    :note: CCRNGStatus is typealiased to CCStatus but this routine can only return kCCSuccess or kCCRNGFailure

    + +
      +
    • return: .Success or .RNGFailure as appropriate.
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func generateBytes(bytes : UnsafeMutablePointer<Void>, byteCount : Int ) -> RNGStatus
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bytes + + +
    +

    a pointer to the buffer that will receive the bytes

    + +
    +
    +
    +
    +
    +
  • +
  • +
    + + + + generateBytes(_:) + +
    +
    +
    +
    +
    +
    +

    Generates an array of random bytes.

    + +
      +
    • return: an array of random bytes
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func generateBytes(byteCount : Int ) throws -> [UInt8]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bytesCount + + +
    +

    number of random bytes to generate

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    A version of generateBytes that always throws an error.

    + +

    Use it to test that code handles this.

    + +
      +
    • return: an array of random bytes
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public class func generateBytesThrow(byteCount : Int ) throws -> [UInt8]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + bytesCount + + +
    +

    number of random bytes to generate

    + +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor.html new file mode 100644 index 0000000..8a36c0a --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor.html @@ -0,0 +1,1047 @@ + + + + StreamCryptor Class Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

StreamCryptor

+
+
+
public class StreamCryptor
+ +
+
+

Encrypts or decrypts return results as they become available.

+ +

Use for large files or network streams.

+ +

For small, in-memory buffers Cryptor may be easier to use.

+ +
+
+
+
    +
  • +
    + + + + Operation + +
    +
    +
    +
    +
    +
    +

    Enumerates Cryptor operations

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Operation
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Algorithm + +
    +
    +
    +
    +
    +
    +

    Enumerates available algorithms

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Algorithm
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Options + +
    +
    +
    +
    +
    +
    +

    Maps CommonCryptoOptions onto a Swift struct.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public struct Options : OptionSetType, BooleanType
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    The status code resulting from the last method call to this Cryptor. +Used to get additional information when optional chaining collapes.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var status : Status = .Success
    + +
    +
    +
    +
    +
  • +
+
+
+ +
    +
  • + +
    +
    +
    +
    +
    +

    Creates a new StreamCryptor

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(operation: Operation, algorithm: Algorithm, options: Options, key: [UInt8],
    +        iv : [UInt8])
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + operation + + +
    +

    the operation to perform see Operation (Encrypt, Decrypt)

    + +
    +
    + + algorithm + + +
    +

    the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish)

    + +
    +
    + + key + + +
    +

    a byte array containing key data

    + +
    +
    + + iv + + +
    +

    a byte array containing initialization vector

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Creates a new StreamCryptor

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public convenience init(operation: Operation, algorithm: Algorithm, options: Options, key: String,
    +        iv : String)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + +
    + + operation + + +
    +

    the operation to perform see Operation (Encrypt, Decrypt)

    + +
    +
    + + algorithm + + +
    +

    the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish)

    + +
    +
    + + key + + +
    +

    a string containing key data (will be interpreted as UTF8)

    + +
    +
    + + iv + + +
    +

    a string containing initialization vector data (will be interpreted as UTF8)

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add the contents of an Objective-C NSData buffer to the current encryption/decryption operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(dataIn: NSData, inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + dataIn + + +
    +

    the input data

    + +
    +
    + + byteArrayOut + + +
    +

    output data

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add the contents of a Swift byte array to the current encryption/decryption operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(byteArrayIn: [UInt8], inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + byteArrayIn + + +
    +

    the input data

    + +
    +
    + + byteArrayOut + + +
    +

    output data

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Add the contents of a string (interpreted as UTF8) to the current encryption/decryption operation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(stringIn: String, inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + byteArrayIn + + +
    +

    the input data

    + +
    +
    + + byteArrayOut + + +
    +

    output data

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
  • +
    + + + + final(_:) + +
    +
    +
    +
    +
    +
    +

    Retrieves all remaining encrypted or decrypted data from this cryptor.

    + +

    :note: If the underlying algorithm is an block cipher and the padding option has +not been specified and the cumulative input to the cryptor has not been an integral +multiple of the block length this will fail with an alignment error.

    + +

    :note: This method updates the status property

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final(inout byteArrayOut: [UInt8]) -> (Int, Status)
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + byteArrayOut + + +
    +

    the output bffer

    + +
    +
    +
    +
    +

    Return Value

    +

    a tuple containing the number of output bytes produced and the status (see Status)

    + +
    +
    +
    +
  • +
+
+
+ +
    +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(operation: Operation, algorithm: Algorithm, options: Options, keyBuffer: UnsafePointer<Void>,
    +        keyByteCount: Int, ivBuffer: UnsafePointer<Void>)
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + operation + + +
    +

    the operation to perform see Operation (Encrypt, Decrypt)

    + +
    +
    + + algorithm + + +
    +

    the algorithm to use see Algorithm (AES, DES, TripleDES, CAST, RC2, Blowfish)

    + +
    +
    + + keyBuffer + + +
    +

    pointer to key buffer

    + +
    +
    + + keyByteCount + + +
    +

    number of bytes in the key

    + +
    +
    + + ivBuffer + + +
    +

    initialization vector buffer

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(bufferIn: UnsafePointer<Void>, byteCountIn: Int, bufferOut: UnsafeMutablePointer<Void>, byteCapacityOut : Int, inout byteCountOut : Int) -> Status
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + + + + + + + + + +
    + + bufferIn + + +
    +

    pointer to input buffer

    + +
    +
    + + inByteCount + + +
    +

    number of bytes contained in input buffer

    + +
    +
    + + bufferOut + + +
    +

    pointer to output buffer

    + +
    +
    + + outByteCapacity + + +
    +

    capacity of the output buffer in bytes

    + +
    +
    + + outByteCount + + +
    +

    on successful completion, the number of bytes written to the output buffer

    + +
    +
    +
    +
    +

    Return Value

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Retrieves all remaining encrypted or decrypted data from this cryptor.

    + +

    :note: If the underlying algorithm is an block cipher and the padding option has +not been specified and the cumulative input to the cryptor has not been an integral +multiple of the block length this will fail with an alignment error.

    + +

    :note: This method updates the status property

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func final(bufferOut: UnsafeMutablePointer<Void>, byteCapacityOut : Int, inout byteCountOut : Int) -> Status
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + + + + + +
    + + bufferOut + + +
    +

    pointer to output buffer

    + +
    +
    + + outByteCapacity + + +
    +

    capacity of the output buffer in bytes

    + +
    +
    + + outByteCount + + +
    +

    on successful completion, the number of bytes written to the output buffer

    + +
    +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Determines the number of bytes that wil be output by this Cryptor if inputBytes of additional +data is input.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func getOutputLength(inputByteCount : Int, isFinal : Bool = false) -> Int
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + inputByteCount + + +
    +

    number of bytes that will be input.

    + +
    +
    + + isFinal + + +
    +

    true if buffer to be input will be the last input buffer, false otherwise.

    + +
    +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Algorithm.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Algorithm.html new file mode 100644 index 0000000..97b9cdb --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Algorithm.html @@ -0,0 +1,334 @@ + + + + Algorithm Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Algorithm

+
+
+
public enum Algorithm
+ +
+
+

Enumerates available algorithms

+ +
+
+
+
    +
  • +
    + + + + AES + +
    +
    +
    +
    +
    +
    +

    Advanced Encryption Standard

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case AES,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DES + +
    +
    +
    +
    +
    +
    +

    Data Encryption Standard

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    DES,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + TripleDES + +
    +
    +
    +
    +
    +
    +

    Triple DES

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    TripleDES,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + CAST + +
    +
    +
    +
    +
    +
    +

    CAST

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    CAST,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RC2 + +
    +
    +
    +
    +
    +
    +

    RC2

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    RC2,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Blowfish + +
    +
    +
    +
    +
    +
    +

    Blowfish

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Blowfish
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + blockSize() + +
    +
    +
    +
    +
    +
    +

    Blocksize, in bytes, of algorithm.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func blockSize() -> Int
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Operation.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Operation.html new file mode 100644 index 0000000..9e5a071 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Operation.html @@ -0,0 +1,195 @@ + + + + Operation Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Operation

+
+
+
public enum Operation
+ +
+
+

Enumerates Cryptor operations

+ +
+
+
+
    +
  • +
    + + + + Encrypt + +
    +
    +
    +
    +
    +
    +

    Encrypting

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case Encrypt,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Decrypt + +
    +
    +
    +
    +
    +
    +

    Decrypting

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Decrypt
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Options.html b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Options.html new file mode 100644 index 0000000..ff11677 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Classes/StreamCryptor/Options.html @@ -0,0 +1,492 @@ + + + + Options Struct Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Options

+
+
+
public struct Options : OptionSetType, BooleanType
+ +
+
+

Maps CommonCryptoOptions onto a Swift struct.

+ +
+
+
+
    +
  • +
    + + + + rawValue + +
    +
    +
    +
    +
    +
    +

    Convert to native raw value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var rawValue : UInt { return self.value }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(_:) + +
    +
    +
    +
    +
    +
    +

    Initialize from a raw value

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(_ rawValue: UInt)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(rawValue:) + +
    +
    +
    +
    +
    +
    +

    Convert from a native value (i.e. 0, kCCOptionPKCS7Padding, kCCOptionECBMode)

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(rawValue: UInt)
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + init(nilLiteral:) + +
    +
    +
    +
    +
    +
    +

    Initialize from a nil literal

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public init(nilLiteral: ())
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromMask(_:) + +
    +
    +
    +
    +
    +
    +

    Create from a mask

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromMask(raw: UInt) -> Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromRaw(_:) + +
    +
    +
    +
    +
    +
    +

    Convert from native raw value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromRaw(raw: UInt) -> Options?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + toRaw() + +
    +
    +
    +
    +
    +
    +

    Convert to native raw value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toRaw() -> UInt
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + boolValue + +
    +
    +
    +
    +
    +
    +

    Convert to boolean value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var boolValue: Bool
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + allZeros + +
    +
    +
    +
    +
    +
    +

    Initialize to value appropriate for all zeros of a mask.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var allZeros: Options
    + +
    +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    nil is consider the same a zero or None.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func convertFromNilLiteral() -> Options
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + None + +
    +
    +
    +
    +
    +
    +

    No options

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var None: Options           { return self.init(0) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + PKCS7Padding + +
    +
    +
    +
    +
    +
    +

    Use padding. Needed unless the input is a integral number of blocks long.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var PKCS7Padding: Options    { return self.init(UInt(kCCOptionPKCS7Padding)) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ECBMode + +
    +
    +
    +
    +
    +
    +

    Electronic Code Book Mode. Don’t use this.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static var ECBMode: Options      { return self.init(UInt(kCCOptionECBMode)) }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums.html new file mode 100644 index 0000000..fdb43a6 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Enums.html @@ -0,0 +1,162 @@ + + + + Enums Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Enums

+

The following enums are available globally.

+ +
+
+
+
    +
  • +
    + + + + Status + +
    +
    +
    +
    +
    +
    +

    Links the native CommonCryptoStatus enumeration to Swiftier versions.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public enum Status : CCCryptorStatus, CustomStringConvertible, ErrorType
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Enums/Status.html b/docs/docsets/.docset/Contents/Resources/Documents/Enums/Status.html new file mode 100644 index 0000000..eff99bf --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Enums/Status.html @@ -0,0 +1,469 @@ + + + + Status Enum Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Status

+
+
+
public enum Status : CCCryptorStatus, CustomStringConvertible, ErrorType
+ +
+
+

Links the native CommonCryptoStatus enumeration to Swiftier versions.

+ +
+
+
+
    +
  • +
    + + + + Success + +
    +
    +
    +
    +
    +
    +

    Successful

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    case Success,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + ParamError + +
    +
    +
    +
    +
    +
    +

    Parameter Error

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    ParamError,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + BufferTooSmall + +
    +
    +
    +
    +
    +
    +

    Buffer too Small

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    BufferTooSmall,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MemoryFailure + +
    +
    +
    +
    +
    +
    +

    Memory Failure

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    MemoryFailure,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + AlignmentError + +
    +
    +
    +
    +
    +
    +

    Alignment Error

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    AlignmentError,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + DecodeError + +
    +
    +
    +
    +
    +
    +

    Decode Error

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    DecodeError,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Unimplemented + +
    +
    +
    +
    +
    +
    +

    Unimplemented

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Unimplemented,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + Overflow + +
    +
    +
    +
    +
    +
    +

    Overflow

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    Overflow,
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + RNGFailure + +
    +
    +
    +
    +
    +
    +

    Random Number Generator Err

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    RNGFailure
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + toRaw() + +
    +
    +
    +
    +
    +
    +

    Converts this value to a native CCCryptorStatus value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func toRaw() -> CCCryptorStatus
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + description + +
    +
    +
    +
    +
    +
    +

    Obtain human-readable string from enum value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var description : String
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + fromRaw(_:) + +
    +
    +
    +
    +
    +
    +

    Create enum value from raw CCCryptorStatus value.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public static func fromRaw(status : CCCryptorStatus) -> Status?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html new file mode 100644 index 0000000..8ece998 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Extensions.html @@ -0,0 +1,249 @@ + + + + Extensions Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Extensions

+

The following extensions are available globally.

+ +
+
+
+
    +
  • +
    + + + + CryptoDigest + +
    +
    +
    +
    +
    +
    +

    Implements a simplified API for calculating digests over single buffers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol CryptoDigest
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + NSData + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    @interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
    +@end
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + String + +
    +
    +
    +
    +
    +
    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    struct String
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Updateable + +
    +
    +
    +
    +
    +
    +

    A protocol for calculations that can be updated with incremental data buffers.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/CryptoDigest.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/CryptoDigest.html new file mode 100644 index 0000000..37a0c79 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/CryptoDigest.html @@ -0,0 +1,357 @@ + + + + CryptoDigest Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

CryptoDigest

+
+
+
public protocol CryptoDigest
+ +
+
+

Implements a simplified API for calculating digests over single buffers

+ +
+
+
+
    +
  • +
    + + + + MD2 + +
    +
    +
    +
    +
    +
    +

    An MD2 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var MD2: Self { return self.digest(.MD2) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD4 + +
    +
    +
    +
    +
    +
    +

    An MD4 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var MD4: Self { return self.digest(.MD4) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + MD5 + +
    +
    +
    +
    +
    +
    +

    An MD5 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var MD5: Self { return self.digest(.MD5) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA1 + +
    +
    +
    +
    +
    +
    +

    An SHA1 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA1: Self { return self.digest(.SHA1) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA224 + +
    +
    +
    +
    +
    +
    +

    An SHA224 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA224: Self { return self.digest(.SHA224) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA256 + +
    +
    +
    +
    +
    +
    +

    An SHA256 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA256: Self { return self.digest(.SHA256) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA384 + +
    +
    +
    +
    +
    +
    +

    An SHA384 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA384: Self { return self.digest(.SHA384) }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + SHA512 + +
    +
    +
    +
    +
    +
    +

    An SHA512 digest of this object

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public var SHA512: Self { return self.digest(.SHA512) }
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/NSData.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/NSData.html new file mode 100644 index 0000000..60d887d --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/NSData.html @@ -0,0 +1,193 @@ + + + + NSData Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

NSData

+
+
+
@interface NSData : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
+@end
+ +
+
+ +
+
+
+
    +
  • +
    + + + + digest(_:) + +
    +
    +
    +
    +
    +
    +

    Calculates the Message Digest for this data.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func digest(algorithm : Digest.Algorithm) -> Self
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + algorithm + + +
    +

    the digest algorithm to use

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSData object containing the message digest

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/String.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/String.html new file mode 100644 index 0000000..458f2fb --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/String.html @@ -0,0 +1,193 @@ + + + + String Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

String

+
+
+
struct String
+ +
+
+ +
+
+
+
    +
  • +
    + + + + digest(_:) + +
    +
    +
    +
    +
    +
    +

    Calculates the Message Digest for this string. +The string is converted to raw data using UTF8.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func digest(algorithm : Digest.Algorithm) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + algorithm + + +
    +

    the digest algorithm to use

    + +
    +
    +
    +
    +

    Return Value

    +

    a hex string of the calculated digest

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Updateable.html b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Updateable.html new file mode 100644 index 0000000..547433e --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Extensions/Updateable.html @@ -0,0 +1,235 @@ + + + + Updateable Extension Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Updateable

+
+
+
public protocol Updateable
+ +
+
+

A protocol for calculations that can be updated with incremental data buffers.

+ +
+
+
+
    +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Updates the current calculation with data contained in an NSData object.

    + +
      +
    • parameters data: the data buffer
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(data: NSData) -> Self?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Updates the current calculation with data contained in a Swift array.

    + +
      +
    • parameters byteArray: the Swift array
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(byteArray : [UInt8]) -> Self?
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:) + +
    +
    +
    +
    +
    +
    +

    Updates the current calculation with data contained in a Swift string. +The corresponding data will be generated using UTF8 encoding.

    + +
      +
    • parameters string: the Swift string
    • +
    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func update(string: String) -> Self?
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Functions.html b/docs/docsets/.docset/Contents/Resources/Documents/Functions.html new file mode 100644 index 0000000..b806b6e --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Functions.html @@ -0,0 +1,473 @@ + + + + Functions Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Functions

+

The following functions are available globally.

+ +
+
+
+
    +
  • + +
    +
    +
    +
    +
    +

    Converts a string of hexadecimal digits to a Swift array.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func arrayFromHexString(s : String) -> [UInt8]
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + s + + +
    +

    the hex string (must contain an even number of digits)

    + +
    +
    +
    +
    +

    Return Value

    +

    a Swift array

    + +
    +
    +
    +
  • +
  • +
    + + + + dataFromHexString(_:) + +
    +
    +
    +
    +
    +
    +

    Converts a string of hexadecimal digits to an NSData object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func dataFromHexString(s : String) -> NSData
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + s + + +
    +

    the hex string (must contain an even number of digits)

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSData object

    + +
    +
    +
    +
  • +
  • +
    + + + + dataFromByteArray(_:) + +
    +
    +
    +
    +
    +
    +

    Converts a Swift array to an NSData object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func dataFromByteArray(a : [UInt8]) -> NSData
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSData object

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts a Swift array to a string of hexadecimal digits.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hexStringFromArray(a : [UInt8], uppercase : Bool = false) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    + + uppercase + + +
    +

    if true use uppercase for letter digits, lowercase otherwise

    + +
    +
    +
    +
    +

    Return Value

    +

    a Swift string

    + +
    +
    +
    +
  • +
  • + +
    +
    +
    +
    +
    +

    Converts a Swift array to an NSString object.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hexNSStringFromArray(a : [UInt8], uppercase : Bool = false) -> NSString
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    + + uppercase + + +
    +

    if true use uppercase for letter digits, lowercase otherwise

    + +
    +
    +
    +
    +

    Return Value

    +

    an NSString object

    + +
    +
    +
    +
  • +
  • +
    + + + + hexListFromArray(_:) + +
    +
    +
    +
    +
    +
    +

    Converts a Swift array to a Swift String containing a comma separated list of bytes. +This is used to generate test data programmatically.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public func hexListFromArray(a : [UInt8]) -> String
    + +
    +
    +
    +

    Parameters

    + + + + + + + +
    + + a + + +
    +

    the Swift array

    + +
    +
    +
    +
    +

    Return Value

    +

    a Swift string

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html new file mode 100644 index 0000000..5af568c --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Protocols.html @@ -0,0 +1,194 @@ + + + + Protocols Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Protocols

+

The following protocols are available globally.

+ +
+
+
+
    +
  • +
    + + + + CryptoDigest + +
    +
    +
    +
    +
    +
    +

    Implements a simplified API for calculating digests over single buffers

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol CryptoDigest
    + +
    +
    +
    +
    +
  • +
+
+
+
    +
  • +
    + + + + Updateable + +
    +
    +
    +
    +
    +
    +

    A protocol for calculations that can be updated with incremental data buffers.

    + + See more +
    +
    +

    Declaration

    +
    +

    Swift

    +
    public protocol Updateable
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/CryptoDigest.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/CryptoDigest.html new file mode 100644 index 0000000..7932894 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/CryptoDigest.html @@ -0,0 +1,168 @@ + + + + CryptoDigest Protocol Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

CryptoDigest

+
+
+
public protocol CryptoDigest
+ +
+
+

Implements a simplified API for calculating digests over single buffers

+ +
+
+
+
    +
  • +
    + + + + digest(_:) + +
    +
    +
    +
    +
    +
    +

    Calculates a message digest

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func digest(algorithm : Digest.Algorithm) -> Self
    + +
    +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/Protocols/Updateable.html b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/Updateable.html new file mode 100644 index 0000000..41ab0e9 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/Protocols/Updateable.html @@ -0,0 +1,237 @@ + + + + Updateable Protocol Reference + + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+

Updateable

+
+
+
public protocol Updateable
+ +
+
+

A protocol for calculations that can be updated with incremental data buffers.

+ +
+
+
+
    +
  • +
    + + + + status + +
    +
    +
    +
    +
    +
    +

    Status of the calculation.

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    var status : Status { get }
    + +
    +
    +
    +
    +
  • +
  • +
    + + + + update(_:_:) + +
    +
    +
    +
    +
    +
    +

    Low-level update routine. +Updates the calculation with the contents of a data buffer. +- parameter buffer: pointer to the data buffer +- parameter byteCount: length of the buffer in bytes +- returns: self if no error for optional chaining, null otherwise

    + +
    +
    +

    Declaration

    +
    +

    Swift

    +
    func update(buffer : UnsafePointer<Void>, _ byteCount : size_t) -> Self?
    + +
    +
    +
    +

    Parameters

    + + + + + + + + + + + +
    + + buffer + + +
    +

    pointer to the data buffer

    + +
    +
    + + byteCount + + +
    +

    length of the buffer in bytes

    + +
    +
    +
    +
    +

    Return Value

    +

    self if no error for optional chaining, null otherwise

    + +
    +
    +
    +
  • +
+
+
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css new file mode 100644 index 0000000..18c292e --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/css/highlight.css @@ -0,0 +1,202 @@ +/* Credit to https://gist.github.com/wataru420/2048287 */ +.highlight { + /* Comment */ + /* Error */ + /* Keyword */ + /* Operator */ + /* Comment.Multiline */ + /* Comment.Preproc */ + /* Comment.Single */ + /* Comment.Special */ + /* Generic.Deleted */ + /* Generic.Deleted.Specific */ + /* Generic.Emph */ + /* Generic.Error */ + /* Generic.Heading */ + /* Generic.Inserted */ + /* Generic.Inserted.Specific */ + /* Generic.Output */ + /* Generic.Prompt */ + /* Generic.Strong */ + /* Generic.Subheading */ + /* Generic.Traceback */ + /* Keyword.Constant */ + /* Keyword.Declaration */ + /* Keyword.Pseudo */ + /* Keyword.Reserved */ + /* Keyword.Type */ + /* Literal.Number */ + /* Literal.String */ + /* Name.Attribute */ + /* Name.Builtin */ + /* Name.Class */ + /* Name.Constant */ + /* Name.Entity */ + /* Name.Exception */ + /* Name.Function */ + /* Name.Namespace */ + /* Name.Tag */ + /* Name.Variable */ + /* Operator.Word */ + /* Text.Whitespace */ + /* Literal.Number.Float */ + /* Literal.Number.Hex */ + /* Literal.Number.Integer */ + /* Literal.Number.Oct */ + /* Literal.String.Backtick */ + /* Literal.String.Char */ + /* Literal.String.Doc */ + /* Literal.String.Double */ + /* Literal.String.Escape */ + /* Literal.String.Heredoc */ + /* Literal.String.Interpol */ + /* Literal.String.Other */ + /* Literal.String.Regex */ + /* Literal.String.Single */ + /* Literal.String.Symbol */ + /* Name.Builtin.Pseudo */ + /* Name.Variable.Class */ + /* Name.Variable.Global */ + /* Name.Variable.Instance */ + /* Literal.Number.Integer.Long */ } + .highlight .c { + color: #999988; + font-style: italic; } + .highlight .err { + color: #a61717; + background-color: #e3d2d2; } + .highlight .k { + color: #000000; + font-weight: bold; } + .highlight .o { + color: #000000; + font-weight: bold; } + .highlight .cm { + color: #999988; + font-style: italic; } + .highlight .cp { + color: #999999; + font-weight: bold; } + .highlight .c1 { + color: #999988; + font-style: italic; } + .highlight .cs { + color: #999999; + font-weight: bold; + font-style: italic; } + .highlight .gd { + color: #000000; + background-color: #ffdddd; } + .highlight .gd .x { + color: #000000; + background-color: #ffaaaa; } + .highlight .ge { + color: #000000; + font-style: italic; } + .highlight .gr { + color: #aa0000; } + .highlight .gh { + color: #999999; } + .highlight .gi { + color: #000000; + background-color: #ddffdd; } + .highlight .gi .x { + color: #000000; + background-color: #aaffaa; } + .highlight .go { + color: #888888; } + .highlight .gp { + color: #555555; } + .highlight .gs { + font-weight: bold; } + .highlight .gu { + color: #aaaaaa; } + .highlight .gt { + color: #aa0000; } + .highlight .kc { + color: #000000; + font-weight: bold; } + .highlight .kd { + color: #000000; + font-weight: bold; } + .highlight .kp { + color: #000000; + font-weight: bold; } + .highlight .kr { + color: #000000; + font-weight: bold; } + .highlight .kt { + color: #445588; + font-weight: bold; } + .highlight .m { + color: #009999; } + .highlight .s { + color: #d14; } + .highlight .na { + color: #008080; } + .highlight .nb { + color: #0086B3; } + .highlight .nc { + color: #445588; + font-weight: bold; } + .highlight .no { + color: #008080; } + .highlight .ni { + color: #800080; } + .highlight .ne { + color: #990000; + font-weight: bold; } + .highlight .nf { + color: #990000; + font-weight: bold; } + .highlight .nn { + color: #555555; } + .highlight .nt { + color: #000080; } + .highlight .nv { + color: #008080; } + .highlight .ow { + color: #000000; + font-weight: bold; } + .highlight .w { + color: #bbbbbb; } + .highlight .mf { + color: #009999; } + .highlight .mh { + color: #009999; } + .highlight .mi { + color: #009999; } + .highlight .mo { + color: #009999; } + .highlight .sb { + color: #d14; } + .highlight .sc { + color: #d14; } + .highlight .sd { + color: #d14; } + .highlight .s2 { + color: #d14; } + .highlight .se { + color: #d14; } + .highlight .sh { + color: #d14; } + .highlight .si { + color: #d14; } + .highlight .sx { + color: #d14; } + .highlight .sr { + color: #009926; } + .highlight .s1 { + color: #d14; } + .highlight .ss { + color: #990073; } + .highlight .bp { + color: #999999; } + .highlight .vc { + color: #008080; } + .highlight .vg { + color: #008080; } + .highlight .vi { + color: #008080; } + .highlight .il { + color: #009999; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css new file mode 100644 index 0000000..a42da72 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/css/jazzy.css @@ -0,0 +1,302 @@ +html, body, div, span, h1, h3, h4, p, a, code, em, img, ul, li, table, tbody, tr, td { + background: transparent; + border: 0; + margin: 0; + outline: 0; + padding: 0; + vertical-align: baseline; } + +body { + background-color: #f2f2f2; + font-family: Helvetica, freesans, Arial, sans-serif; + font-size: 14px; + -webkit-font-smoothing: subpixel-antialiased; + word-wrap: break-word; } + +h1, h2, h3, h4, h5, h6 { + margin-top: 0.8em; + margin-bottom: 0.3em; + font-weight: 100; + color: black; } + +h1 { + font-size: 2.5em; } + +h2 { + font-size: 2em; + border-bottom: 1px solid #e2e2e2; } + +h3 { + font-size: 1.5em; } + +h4 { + font-size: 1.25em; } + +h5 { + font-size: 1.1em; } + +h6 { + font-size: 1.1em; + color: #777; } + +pre, code { + font: 0.95em Menlo, monospace; + color: #777; + word-wrap: normal; } + +p code, li code { + background-color: #eee; + padding: 2px 4px; + border-radius: 4px; } + +a { + color: #0088cc; + text-decoration: none; } + +ul { + padding-left: 15px; } + +li { + line-height: 1.8em; } + +img { + max-width: 100%; } + +blockquote { + margin-left: 0; + padding: 0 10px; + border-left: 4px solid #ccc; } + +.content-wrapper { + margin: 0 auto; + width: 980px; } + +header { + font-size: 0.85em; + line-height: 26px; + background-color: #414141; + position: fixed; + width: 100%; + z-index: 1; } + header img { + padding-right: 6px; + vertical-align: -4px; + height: 16px; } + header a { + color: #fff; } + header p { + float: left; + color: #999; } + header .header-right { + float: right; + margin-left: 16px; } + +#breadcrumbs { + background-color: #f2f2f2; + height: 27px; + padding-top: 17px; + position: fixed; + width: 100%; + z-index: 1; + margin-top: 26px; } + #breadcrumbs #carat { + height: 10px; + margin: 0 5px; } + +.sidebar { + background-color: #f9f9f9; + border: 1px solid #e2e2e2; + overflow-y: auto; + overflow-x: hidden; + position: fixed; + top: 70px; + bottom: 0; + width: 230px; + word-wrap: normal; } + +.nav-groups { + list-style-type: none; + background: #fff; + padding-left: 0; } + +.nav-group-name { + border-bottom: 1px solid #e2e2e2; + font-size: 1.1em; + font-weight: 100; + padding: 15px 0 15px 20px; } + .nav-group-name > a { + color: #333; } + +.nav-group-tasks { + margin-top: 5px; } + +.nav-group-task { + font-size: 0.9em; + list-style-type: none; } + .nav-group-task a { + color: #888; } + +.main-content { + background-color: #fff; + border: 1px solid #e2e2e2; + margin-left: 246px; + position: absolute; + overflow: hidden; + padding-bottom: 60px; + top: 70px; + width: 734px; } + .main-content p, .main-content a, .main-content code, .main-content em, .main-content ul, .main-content table, .main-content blockquote { + margin-bottom: 1em; } + .main-content p { + line-height: 1.8em; } + .main-content section .section:first-child { + margin-top: 0; + padding-top: 0; } + .main-content section .task-group-section .task-group:first-of-type { + padding-top: 10px; } + .main-content section .task-group-section .task-group:first-of-type .section-name { + padding-top: 15px; } + +.section { + padding: 0 25px; } + +.highlight { + background-color: #eee; + padding: 10px 12px; + border: 1px solid #e2e2e2; + border-radius: 4px; + overflow-x: auto; } + +.aside-title { + font-size: 9px; + letter-spacing: 2px; + text-transform: uppercase; + padding-bottom: 0; } + +.declaration .highlight { + overflow-x: initial; + padding: 0 40px 40px 0; + margin-bottom: -25px; + background-color: transparent; + border: none; } + +.section-name { + margin: 0; + margin-left: 18px; } + +.task-group-section { + padding-left: 6px; + border-top: 1px solid #e2e2e2; } + +.task-group { + padding-top: 0px; } + +.item { + padding-top: 8px; + width: 100%; + list-style-type: none; } + .item a[name]:before { + content: ""; + display: block; + padding-top: 70px; + margin: -70px 0 0; } + .item code { + background-color: transparent; + padding: 0; } + .item .token { + padding-left: 3px; + margin-left: 15px; } + +.pointer-container { + border-bottom: 1px solid #e2e2e2; + left: -23px; + padding-bottom: 13px; + position: relative; + width: 110%; } + +.pointer { + background: #f9f9f9; + border-left: 1px solid #e2e2e2; + border-top: 1px solid #e2e2e2; + height: 12px; + left: 21px; + top: -7px; + -webkit-transform: rotate(45deg); + -moz-transform: rotate(45deg); + -o-transform: rotate(45deg); + transform: rotate(45deg); + position: absolute; + width: 12px; } + +.height-container { + display: none; + left: -25px; + padding: 0 25px; + position: relative; + width: 100%; + overflow: hidden; } + .height-container .section { + background: #f9f9f9; + border-bottom: 1px solid #e2e2e2; + left: -25px; + position: relative; + width: 100%; + padding-top: 10px; + padding-bottom: 5px; } + +div.Swift { + padding: 4px 0 2px 10px; + margin-bottom: 1em; + border-left: 5px solid #cde9f4; + overflow-y: hidden; } + div.Swift .aside-title { + color: #4b8afb; + -webkit-user-select: none; } + +.graybox { + border-collapse: collapse; + width: 100%; } + .graybox p { + margin: 0; + word-break: break-word; + min-width: 50px; } + .graybox td { + border: 1px solid #e2e2e2; + padding: 5px 25px 5px 10px; + vertical-align: middle; } + .graybox tr td:first-of-type { + text-align: right; + padding: 7px; + vertical-align: top; + word-break: normal; + width: 40px; } + +.slightly-smaller { + font-size: 0.9em; } + +#footer { + position: absolute; + bottom: 10px; + margin-left: 25px; } + #footer p { + margin: 0; + color: #aaa; + font-size: 0.8em; } + +html.dash header, html.dash #breadcrumbs, html.dash .sidebar { + display: none; } +html.dash .main-content { + width: 980px; + margin-left: 0; + border: none; + width: 100%; + top: 0; + padding-bottom: 0; } +html.dash .height-container { + display: block; } +html.dash .item .token { + margin-left: 0; } +html.dash .content-wrapper { + width: auto; } +html.dash #footer { + position: static; } diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png new file mode 100755 index 0000000..29d2f7f Binary files /dev/null and b/docs/docsets/.docset/Contents/Resources/Documents/img/carat.png differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png new file mode 100755 index 0000000..6f694c7 Binary files /dev/null and b/docs/docsets/.docset/Contents/Resources/Documents/img/dash.png differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png new file mode 100755 index 0000000..628da97 Binary files /dev/null and b/docs/docsets/.docset/Contents/Resources/Documents/img/gh.png differ diff --git a/docs/docsets/.docset/Contents/Resources/Documents/index.html b/docs/docsets/.docset/Contents/Resources/Documents/index.html new file mode 100644 index 0000000..34357ba --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/index.html @@ -0,0 +1,343 @@ + + + + Reference + + + + + + + + +
+
+

Docs (100% documented)

+
+
+
+ +
+
+ +
+
+
+ +

IDZSwiftCommonCrypto Carthage compatible Build Status

+ +

A Swift wrapper for Apple’s CommonCrypto library.

+

Using IDZSwiftCommonCrypto

+ +

There are three ways to add IDZCommonCrypto to your project: +* Use CocoaPods +* Use Carthage +* Manually

+

CocoaPods

+ +

If you are using CocoaPods, add the following to your Podfile: +bash +pod 'IDZSwiftCommonCrypto` +

+ +

Then, run the following command to install the IDZSwiftCommonCrypto pod: +bash +pod install +

+

Carthage

+ +

If you are using Carthage, add the following to your Cartfile:

+
github "iosdevzone/IDZCommonCrypto"
+
+ +

Run carthage to build the framework and drag the built ‘IDZCommonCrypto.framework’ into your project or workspace.

+

Manually

+ +

Since CommonCrypto is not a standalone module, you need to generate a fake module map to convince Xcode into allowing you to import CommonCrypto. The GenerateCommonCryptoModule script provides two methods for doing this. Which method you choose depends on whether you want to able to use CommonCrypto and, by extension, IDZSwiftCommonCrypto in playgrounds.

+ +

To make CommonCrypto available to frameworks and playground use the command: +bash + ./GenerateCommonCryptoModule iphonesimulator8.0 +

+ +

This command creates a CommonCrypto.framework in the SDK system library directory. You should now be able to use either CommonCrypto or IDZSwiftCommonCrypto in a playground simply importing them or in your own app project by dragging the IDZSwiftCommonCrypto.xcodeproj into your project.

+ +

If you do not want to add any files to your SDK you can use the command +bash + ./GenerateCommonCryptoModule iphonesimulator8.0 . + +This method creates a CommonCrypto directory within the IDZSwiftCommonCrypto source tree, so the SDK directories are not altered, but the module is not available in playgrounds. To use the framework in your own project drag the IDZSwiftCommonCrypto.xcodeproj into your project and set the Module Import Path to the directory containing the CommonCrypto directory created by the script. For more about this, see my blog post Using CommonCrypto in Swift

+
import IDZSwiftCommonCrypto
+
+

Using Digest

+ +

To calculate a message digest you create an instance of Digest, call update one or more times with the data over which the digest is being calculated and finally call final to obtain the digest itself.

+ +

The update method can take a String +“`swift +let s = The quick brown fox jumps over the lazy dog. +var md5s2 : Digest = Digest(algorithm:.MD5) +md5s2.update(s) +let digests2 = md5s2.final()

+ +

// According to Wikipedia this should be +// e4d909c290d0fb1ca068ffaddf22cbd0 +hexStringFromArray(digests2) +assert(digests2 == arrayFromHexString(e4d909c290d0fb1ca068ffaddf22cbd0)) + +or an array of `UInt8` elements: +swift +let b : [UInt8] = +[0x54,0x68,0x65,0x20,0x71,0x75,0x69,0x63, +0x6b,0x20,0x62,0x72,0x6f,0x77,0x6e,0x20, +0x66,0x6f,0x78,0x2e] +var md5s1 : Digest = Digest(algorithm:.MD5) +md5s1.update(b) +let digests1 = md5s1.final() +”`

+ +

If you only have a single buffer you can simply write +swift + var digests3 = Digest(algorithm: .MD5).update(b)?.final() // digest is of type [UInt8]? + +or +swift + var digests4 = Digest(algorithm: .MD5).update(s)?.final() // digest is of type [UInt8]? +

+

Supported Algorithms

+ +

The Digest class supports the following algorithms:

+ +
    +
  • .MD2
  • +
  • .MD4
  • +
  • .MD5
  • +
  • .SHA1
  • +
  • .SHA224
  • +
  • .SHA256
  • +
  • .SHA384
  • +
  • .SHA512
  • +
+

Using HMAC

+ +

Calculating a keyed-Hash Message Authentication Code (HMAC) is very similar to calculating a message digest, except that the initialization routine now takes a key as well as an algorithm parameter.

+
var keys5 = arrayFromHexString("0102030405060708090a0b0c0d0e0f10111213141516171819")
+var datas5 : [UInt8] = Array(count:50, repeatedValue:0xcd)
+var expecteds5 = arrayFromHexString("4c9007f4026250c6bc8414f9bf50c86c2d7235da")
+var hmacs5 = HMAC(algorithm:.SHA1, key:keys5).update(datas5)?.final()
+
+// RFC2202 says this should be 4c9007f4026250c6bc8414f9bf50c86c2d7235da
+let expectedRFC2202 = arrayFromHexString("4c9007f4026250c6bc8414f9bf50c86c2d7235da")
+assert(hmacs5! == expectedRFC2202)
+
+

Supported Algorithms

+ +
    +
  • SHA1
  • +
  • MD5
  • +
  • SHA224
  • +
  • SHA256
  • +
  • SHA384
  • +
  • SHA512
  • +
+

Using Cryptor

+
var key = arrayFromHexString("2b7e151628aed2a6abf7158809cf4f3c")
+var plainText = "The quick brown fox jumps over the lazy dog. The fox has more or less had it at this point."
+
+var cryptor = Cryptor(operation:.Encrypt, algorithm:.AES, options:.PKCS7Padding, key:key, iv:Array<UInt8>())
+var cipherText = cryptor.update(plainText)?.final()
+
+cryptor = Cryptor(operation:.Decrypt, algorithm:.AES, options:.PKCS7Padding, key:key, iv:Array<UInt8>())
+var decryptedPlainText = cryptor.update(cipherText!)?.final()
+var decryptedString = decryptedPlainText!.reduce("") { $0 + String(UnicodeScalar($1)) }
+decryptedString
+assert(decryptedString == plainText)
+
+

Supported Algorithms

+ +
    +
  • .AES
  • +
  • .DES
  • +
  • .TripleDES
  • +
  • .CAST
  • +
  • .RC2
  • +
  • .Blowfish
  • +
+

Using StreamCryptor

+ +

To encrypt a large file or a network stream use StreamCryptor. The StreamCryptor class does not accumulate the encrypted or decrypted data, instead each call to update produces an output buffer.

+ +

The example below shows how to use StreamCryptor to encrypt and decrypt an image file. +“`swift +func crypt(sc : StreamCryptor, inputStream: NSInputStream, outputStream: NSOutputStream, bufferSize: Int) +{ + var inputBuffer = Array(count:1024, repeatedValue:0) + var outputBuffer = Array(count:1024, repeatedValue:0) + inputStream.open() + outputStream.open()

+
var cryptedBytes : UInt = 0    
+while inputStream.hasBytesAvailable
+{
+    let bytesRead = inputStream.read(&inputBuffer, maxLength: inputBuffer.count)
+    let status = sc.update(inputBuffer, byteCountIn: UInt(bytesRead), bufferOut: &outputBuffer, byteCapacityOut: UInt(outputBuffer.count), byteCountOut: &cryptedBytes)
+    assert(status == Status.Success)
+    if(cryptedBytes > 0)
+    {
+        let bytesWritten = outputStream.write(outputBuffer, maxLength: Int(cryptedBytes))
+        assert(bytesWritten == Int(cryptedBytes))
+    }
+}
+let status = sc.final(&outputBuffer, byteCapacityOut: UInt(outputBuffer.count), byteCountOut: &cryptedBytes)    
+assert(status == Status.Success)
+if(cryptedBytes > 0)
+{
+    let bytesWritten = outputStream.write(outputBuffer, maxLength: Int(cryptedBytes))
+    assert(bytesWritten == Int(cryptedBytes))
+}
+inputStream.close()
+outputStream.close()
+
+ +

}

+ +

let imagePath = NSBundle.mainBundle().pathForResource(Riscal, ofType:jpg)! +let tmp = NSTemporaryDirectory() +let encryptedFilePath = tmp.stringByAppendingPathComponent(Riscal.xjpgx) +var decryptedFilePath = tmp.stringByAppendingPathComponent(RiscalDecrypted.jpg)

+ +

var imageInputStream = NSInputStream(fileAtPath: imagePath) +var encryptedFileOutputStream = NSOutputStream(toFileAtPath: encryptedFilePath, append:false) +var encryptedFileInputStream = NSInputStream(fileAtPath: encryptedFilePath) +var decryptedFileOutputStream = NSOutputStream(toFileAtPath: decryptedFilePath, append:false)

+ +

var sc = StreamCryptor(operation:.Encrypt, algorithm:.AES, options:.PKCS7Padding, key:key, iv:Array()) +crypt(sc, imageInputStream, encryptedFileOutputStream, 1024)

+ +

// Uncomment this line to verify that the file is encrypted +//var encryptedImage = UIImage(contentsOfFile:encryptedFile)

+ +

sc = StreamCryptor(operation:.Decrypt, algorithm:.AES, options:.PKCS7Padding, key:key, iv:Array()) +crypt(sc, encryptedFileInputStream, decryptedFileOutputStream, 1024)

+ +

var image = UIImage(named:Riscal.jpg) +var decryptedImage = UIImage(contentsOfFile:decryptedFilePath) +”`

+

Using PBKDF

+ +

The PBKDF class provides a method of deriving keys from a user password. +The following example derives a 20-byte key:

+
let keys6 = PBKDF.deriveKey("password", salt: "salt", prf: .SHA1, rounds: 1, derivedKeyLength: 20)
+// RFC 6070 - Should derive 0c60c80f961f0e71f3a9b524af6012062fe037a6
+let expectedRFC6070 = arrayFromHexString("0c60c80f961f0e71f3a9b524af6012062fe037a6")
+assert(keys6 == expectedRFC6070)
+
+

Supported Pseudo-Random Functions

+ +
    +
  • .SHA1
  • +
  • .SHA224
  • +
  • .SHA256
  • +
  • .SHA384
  • +
  • .SHA512
  • +
+ +
+
+ +
+
+ + + diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js new file mode 100755 index 0000000..a32d400 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/js/jazzy.js @@ -0,0 +1,31 @@ +window.jazzy = {'docset': false} +if (typeof window.dash != 'undefined') { + document.documentElement.className += ' dash' + window.jazzy.docset = true +} +if (navigator.userAgent.match(/xcode/i)) { + document.documentElement.className += ' xcode' + window.jazzy.docset = true +} + +// On doc load, toggle the URL hash discussion if present +$(document).ready(function() { + if (!window.jazzy.docset) { + var linkToHash = $('a[href="' + window.location.hash +'"]'); + linkToHash.trigger("click"); + } +}); + +// On token click, toggle its discussion and animate token.marginLeft +$(".token").click(function() { + if (window.jazzy.docset) { + return; + } + var link = $(this); + var animationDuration = 300; + var tokenOffset = "15px"; + var original = link.css('marginLeft') == tokenOffset; + link.animate({'margin-left':original ? "0px" : tokenOffset}, animationDuration); + $content = link.parent().parent().next(); + $content.slideToggle(animationDuration); +}); diff --git a/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js new file mode 100755 index 0000000..ab28a24 --- /dev/null +++ b/docs/docsets/.docset/Contents/Resources/Documents/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.1 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k={},l="1.11.1",m=function(a,b){return new m.fn.init(a,b)},n=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,o=/^-ms-/,p=/-([\da-z])/gi,q=function(a,b){return b.toUpperCase()};m.fn=m.prototype={jquery:l,constructor:m,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=m.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return m.each(this,a,b)},map:function(a){return this.pushStack(m.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},m.extend=m.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||m.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(m.isPlainObject(c)||(b=m.isArray(c)))?(b?(b=!1,f=a&&m.isArray(a)?a:[]):f=a&&m.isPlainObject(a)?a:{},g[d]=m.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},m.extend({expando:"jQuery"+(l+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===m.type(a)},isArray:Array.isArray||function(a){return"array"===m.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return!m.isArray(a)&&a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==m.type(a)||a.nodeType||m.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(k.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&m.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(o,"ms-").replace(p,q)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=r(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(n,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(r(Object(a))?m.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=r(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),m.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||m.guid++,e):void 0},now:function(){return+new Date},support:k}),m.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function r(a){var b=a.length,c=m.type(a);return"function"===c||m.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var s=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+-new Date,v=a.document,w=0,x=0,y=gb(),z=gb(),A=gb(),B=function(a,b){return a===b&&(l=!0),0},C="undefined",D=1<<31,E={}.hasOwnProperty,F=[],G=F.pop,H=F.push,I=F.push,J=F.slice,K=F.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},L="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",M="[\\x20\\t\\r\\n\\f]",N="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",O=N.replace("w","w#"),P="\\["+M+"*("+N+")(?:"+M+"*([*^$|!~]?=)"+M+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+O+"))|)"+M+"*\\]",Q=":("+N+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+P+")*)|.*)\\)|)",R=new RegExp("^"+M+"+|((?:^|[^\\\\])(?:\\\\.)*)"+M+"+$","g"),S=new RegExp("^"+M+"*,"+M+"*"),T=new RegExp("^"+M+"*([>+~]|"+M+")"+M+"*"),U=new RegExp("="+M+"*([^\\]'\"]*?)"+M+"*\\]","g"),V=new RegExp(Q),W=new RegExp("^"+O+"$"),X={ID:new RegExp("^#("+N+")"),CLASS:new RegExp("^\\.("+N+")"),TAG:new RegExp("^("+N.replace("w","w*")+")"),ATTR:new RegExp("^"+P),PSEUDO:new RegExp("^"+Q),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+L+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/^(?:input|select|textarea|button)$/i,Z=/^h\d$/i,$=/^[^{]+\{\s*\[native \w/,_=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ab=/[+~]/,bb=/'|\\/g,cb=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),db=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{I.apply(F=J.call(v.childNodes),v.childNodes),F[v.childNodes.length].nodeType}catch(eb){I={apply:F.length?function(a,b){H.apply(a,J.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fb(a,b,d,e){var f,h,j,k,l,o,r,s,w,x;if((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,d=d||[],!a||"string"!=typeof a)return d;if(1!==(k=b.nodeType)&&9!==k)return[];if(p&&!e){if(f=_.exec(a))if(j=f[1]){if(9===k){if(h=b.getElementById(j),!h||!h.parentNode)return d;if(h.id===j)return d.push(h),d}else if(b.ownerDocument&&(h=b.ownerDocument.getElementById(j))&&t(b,h)&&h.id===j)return d.push(h),d}else{if(f[2])return I.apply(d,b.getElementsByTagName(a)),d;if((j=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return I.apply(d,b.getElementsByClassName(j)),d}if(c.qsa&&(!q||!q.test(a))){if(s=r=u,w=b,x=9===k&&a,1===k&&"object"!==b.nodeName.toLowerCase()){o=g(a),(r=b.getAttribute("id"))?s=r.replace(bb,"\\$&"):b.setAttribute("id",s),s="[id='"+s+"'] ",l=o.length;while(l--)o[l]=s+qb(o[l]);w=ab.test(a)&&ob(b.parentNode)||b,x=o.join(",")}if(x)try{return I.apply(d,w.querySelectorAll(x)),d}catch(y){}finally{r||b.removeAttribute("id")}}}return i(a.replace(R,"$1"),b,d,e)}function gb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function hb(a){return a[u]=!0,a}function ib(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function jb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function kb(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||D)-(~a.sourceIndex||D);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function lb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function mb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function nb(a){return hb(function(b){return b=+b,hb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function ob(a){return a&&typeof a.getElementsByTagName!==C&&a}c=fb.support={},f=fb.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fb.setDocument=function(a){var b,e=a?a.ownerDocument||a:v,g=e.defaultView;return e!==n&&9===e.nodeType&&e.documentElement?(n=e,o=e.documentElement,p=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){m()},!1):g.attachEvent&&g.attachEvent("onunload",function(){m()})),c.attributes=ib(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ib(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=$.test(e.getElementsByClassName)&&ib(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=ib(function(a){return o.appendChild(a).id=u,!e.getElementsByName||!e.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==C&&p){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(cb,db);return function(a){var c=typeof a.getAttributeNode!==C&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==C?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==C&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=$.test(e.querySelectorAll))&&(ib(function(a){a.innerHTML="",a.querySelectorAll("[msallowclip^='']").length&&q.push("[*^$]="+M+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+M+"*(?:value|"+L+")"),a.querySelectorAll(":checked").length||q.push(":checked")}),ib(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+M+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=$.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ib(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",Q)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=$.test(o.compareDocumentPosition),t=b||$.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===v&&t(v,a)?-1:b===e||b.ownerDocument===v&&t(v,b)?1:k?K.call(k,a)-K.call(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],i=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:k?K.call(k,a)-K.call(k,b):0;if(f===g)return kb(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)i.unshift(c);while(h[d]===i[d])d++;return d?kb(h[d],i[d]):h[d]===v?-1:i[d]===v?1:0},e):n},fb.matches=function(a,b){return fb(a,null,null,b)},fb.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(U,"='$1']"),!(!c.matchesSelector||!p||r&&r.test(b)||q&&q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fb(b,n,null,[a]).length>0},fb.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fb.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&E.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fb.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fb.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fb.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fb.selectors={cacheLength:50,createPseudo:hb,match:X,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(cb,db),a[3]=(a[3]||a[4]||a[5]||"").replace(cb,db),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fb.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fb.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return X.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&V.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(cb,db).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+M+")"+a+"("+M+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==C&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fb.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){k=q[u]||(q[u]={}),j=k[a]||[],n=j[0]===w&&j[1],m=j[0]===w&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[w,n,m];break}}else if(s&&(j=(b[u]||(b[u]={}))[a])&&j[0]===w)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(s&&((l[u]||(l[u]={}))[a]=[w,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fb.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?hb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=K.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:hb(function(a){var b=[],c=[],d=h(a.replace(R,"$1"));return d[u]?hb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:hb(function(a){return function(b){return fb(a,b).length>0}}),contains:hb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:hb(function(a){return W.test(a||"")||fb.error("unsupported lang: "+a),a=a.replace(cb,db).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Z.test(a.nodeName)},input:function(a){return Y.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:nb(function(){return[0]}),last:nb(function(a,b){return[b-1]}),eq:nb(function(a,b,c){return[0>c?c+b:c]}),even:nb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:nb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:nb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:nb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function rb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[u]||(b[u]={}),(h=i[d])&&h[0]===w&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function sb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function tb(a,b,c){for(var d=0,e=b.length;e>d;d++)fb(a,b[d],c);return c}function ub(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function vb(a,b,c,d,e,f){return d&&!d[u]&&(d=vb(d)),e&&!e[u]&&(e=vb(e,f)),hb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||tb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ub(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ub(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?K.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ub(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):I.apply(g,r)})}function wb(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=rb(function(a){return a===b},h,!0),l=rb(function(a){return K.call(b,a)>-1},h,!0),m=[function(a,c,d){return!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>i;i++)if(c=d.relative[a[i].type])m=[rb(sb(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return vb(i>1&&sb(m),i>1&&qb(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(R,"$1"),c,e>i&&wb(a.slice(i,e)),f>e&&wb(a=a.slice(e)),f>e&&qb(a))}m.push(c)}return sb(m)}function xb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,m,o,p=0,q="0",r=f&&[],s=[],t=j,u=f||e&&d.find.TAG("*",k),v=w+=null==t?1:Math.random()||.1,x=u.length;for(k&&(j=g!==n&&g);q!==x&&null!=(l=u[q]);q++){if(e&&l){m=0;while(o=a[m++])if(o(l,g,h)){i.push(l);break}k&&(w=v)}c&&((l=!o&&l)&&p--,f&&r.push(l))}if(p+=q,c&&q!==p){m=0;while(o=b[m++])o(r,s,g,h);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=G.call(i));s=ub(s)}I.apply(i,s),k&&!f&&s.length>0&&p+b.length>1&&fb.uniqueSort(i)}return k&&(w=v,j=t),r};return c?hb(f):f}return h=fb.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wb(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xb(e,d)),f.selector=a}return f},i=fb.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(cb,db),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=X.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(cb,db),ab.test(j[0].type)&&ob(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qb(j),!a)return I.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,ab.test(a)&&ob(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ib(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ib(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||jb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ib(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||jb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ib(function(a){return null==a.getAttribute("disabled")})||jb(L,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fb}(a);m.find=s,m.expr=s.selectors,m.expr[":"]=m.expr.pseudos,m.unique=s.uniqueSort,m.text=s.getText,m.isXMLDoc=s.isXML,m.contains=s.contains;var t=m.expr.match.needsContext,u=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,v=/^.[^:#\[\.,]*$/;function w(a,b,c){if(m.isFunction(b))return m.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return m.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(v.test(b))return m.filter(b,a,c);b=m.filter(b,a)}return m.grep(a,function(a){return m.inArray(a,b)>=0!==c})}m.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?m.find.matchesSelector(d,a)?[d]:[]:m.find.matches(a,m.grep(b,function(a){return 1===a.nodeType}))},m.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(m(a).filter(function(){for(b=0;e>b;b++)if(m.contains(d[b],this))return!0}));for(b=0;e>b;b++)m.find(a,d[b],c);return c=this.pushStack(e>1?m.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(w(this,a||[],!1))},not:function(a){return this.pushStack(w(this,a||[],!0))},is:function(a){return!!w(this,"string"==typeof a&&t.test(a)?m(a):a||[],!1).length}});var x,y=a.document,z=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,A=m.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:z.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||x).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof m?b[0]:b,m.merge(this,m.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:y,!0)),u.test(c[1])&&m.isPlainObject(b))for(c in b)m.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=y.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return x.find(a);this.length=1,this[0]=d}return this.context=y,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):m.isFunction(a)?"undefined"!=typeof x.ready?x.ready(a):a(m):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),m.makeArray(a,this))};A.prototype=m.fn,x=m(y);var B=/^(?:parents|prev(?:Until|All))/,C={children:!0,contents:!0,next:!0,prev:!0};m.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!m(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),m.fn.extend({has:function(a){var b,c=m(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(m.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=t.test(a)||"string"!=typeof a?m(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&m.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?m.unique(f):f)},index:function(a){return a?"string"==typeof a?m.inArray(this[0],m(a)):m.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(m.unique(m.merge(this.get(),m(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function D(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}m.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return m.dir(a,"parentNode")},parentsUntil:function(a,b,c){return m.dir(a,"parentNode",c)},next:function(a){return D(a,"nextSibling")},prev:function(a){return D(a,"previousSibling")},nextAll:function(a){return m.dir(a,"nextSibling")},prevAll:function(a){return m.dir(a,"previousSibling")},nextUntil:function(a,b,c){return m.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return m.dir(a,"previousSibling",c)},siblings:function(a){return m.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return m.sibling(a.firstChild)},contents:function(a){return m.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:m.merge([],a.childNodes)}},function(a,b){m.fn[a]=function(c,d){var e=m.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=m.filter(d,e)),this.length>1&&(C[a]||(e=m.unique(e)),B.test(a)&&(e=e.reverse())),this.pushStack(e)}});var E=/\S+/g,F={};function G(a){var b=F[a]={};return m.each(a.match(E)||[],function(a,c){b[c]=!0}),b}m.Callbacks=function(a){a="string"==typeof a?F[a]||G(a):m.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){m.each(b,function(b,c){var d=m.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&m.each(arguments,function(a,c){var d;while((d=m.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?m.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},m.extend({Deferred:function(a){var b=[["resolve","done",m.Callbacks("once memory"),"resolved"],["reject","fail",m.Callbacks("once memory"),"rejected"],["notify","progress",m.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return m.Deferred(function(c){m.each(b,function(b,f){var g=m.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&m.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?m.extend(a,d):d}},e={};return d.pipe=d.then,m.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&m.isFunction(a.promise)?e:0,g=1===f?a:m.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&m.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var H;m.fn.ready=function(a){return m.ready.promise().done(a),this},m.extend({isReady:!1,readyWait:1,holdReady:function(a){a?m.readyWait++:m.ready(!0)},ready:function(a){if(a===!0?!--m.readyWait:!m.isReady){if(!y.body)return setTimeout(m.ready);m.isReady=!0,a!==!0&&--m.readyWait>0||(H.resolveWith(y,[m]),m.fn.triggerHandler&&(m(y).triggerHandler("ready"),m(y).off("ready")))}}});function I(){y.addEventListener?(y.removeEventListener("DOMContentLoaded",J,!1),a.removeEventListener("load",J,!1)):(y.detachEvent("onreadystatechange",J),a.detachEvent("onload",J))}function J(){(y.addEventListener||"load"===event.type||"complete"===y.readyState)&&(I(),m.ready())}m.ready.promise=function(b){if(!H)if(H=m.Deferred(),"complete"===y.readyState)setTimeout(m.ready);else if(y.addEventListener)y.addEventListener("DOMContentLoaded",J,!1),a.addEventListener("load",J,!1);else{y.attachEvent("onreadystatechange",J),a.attachEvent("onload",J);var c=!1;try{c=null==a.frameElement&&y.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!m.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}I(),m.ready()}}()}return H.promise(b)};var K="undefined",L;for(L in m(k))break;k.ownLast="0"!==L,k.inlineBlockNeedsLayout=!1,m(function(){var a,b,c,d;c=y.getElementsByTagName("body")[0],c&&c.style&&(b=y.createElement("div"),d=y.createElement("div"),d.style.cssText="position:absolute;border:0;width:0;height:0;top:0;left:-9999px",c.appendChild(d).appendChild(b),typeof b.style.zoom!==K&&(b.style.cssText="display:inline;margin:0;border:0;padding:1px;width:1px;zoom:1",k.inlineBlockNeedsLayout=a=3===b.offsetWidth,a&&(c.style.zoom=1)),c.removeChild(d))}),function(){var a=y.createElement("div");if(null==k.deleteExpando){k.deleteExpando=!0;try{delete a.test}catch(b){k.deleteExpando=!1}}a=null}(),m.acceptData=function(a){var b=m.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var M=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,N=/([A-Z])/g;function O(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(N,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:M.test(c)?m.parseJSON(c):c}catch(e){}m.data(a,b,c)}else c=void 0}return c}function P(a){var b;for(b in a)if(("data"!==b||!m.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function Q(a,b,d,e){if(m.acceptData(a)){var f,g,h=m.expando,i=a.nodeType,j=i?m.cache:a,k=i?a[h]:a[h]&&h; +if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||m.guid++:h),j[k]||(j[k]=i?{}:{toJSON:m.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=m.extend(j[k],b):j[k].data=m.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[m.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[m.camelCase(b)])):f=g,f}}function R(a,b,c){if(m.acceptData(a)){var d,e,f=a.nodeType,g=f?m.cache:a,h=f?a[m.expando]:m.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){m.isArray(b)?b=b.concat(m.map(b,m.camelCase)):b in d?b=[b]:(b=m.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!P(d):!m.isEmptyObject(d))return}(c||(delete g[h].data,P(g[h])))&&(f?m.cleanData([a],!0):k.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}m.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?m.cache[a[m.expando]]:a[m.expando],!!a&&!P(a)},data:function(a,b,c){return Q(a,b,c)},removeData:function(a,b){return R(a,b)},_data:function(a,b,c){return Q(a,b,c,!0)},_removeData:function(a,b){return R(a,b,!0)}}),m.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=m.data(f),1===f.nodeType&&!m._data(f,"parsedAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=m.camelCase(d.slice(5)),O(f,d,e[d])));m._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){m.data(this,a)}):arguments.length>1?this.each(function(){m.data(this,a,b)}):f?O(f,a,m.data(f,a)):void 0},removeData:function(a){return this.each(function(){m.removeData(this,a)})}}),m.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=m._data(a,b),c&&(!d||m.isArray(c)?d=m._data(a,b,m.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=m.queue(a,b),d=c.length,e=c.shift(),f=m._queueHooks(a,b),g=function(){m.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return m._data(a,c)||m._data(a,c,{empty:m.Callbacks("once memory").add(function(){m._removeData(a,b+"queue"),m._removeData(a,c)})})}}),m.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},W=/^(?:checkbox|radio)$/i;!function(){var a=y.createElement("input"),b=y.createElement("div"),c=y.createDocumentFragment();if(b.innerHTML="
a",k.leadingWhitespace=3===b.firstChild.nodeType,k.tbody=!b.getElementsByTagName("tbody").length,k.htmlSerialize=!!b.getElementsByTagName("link").length,k.html5Clone="<:nav>"!==y.createElement("nav").cloneNode(!0).outerHTML,a.type="checkbox",a.checked=!0,c.appendChild(a),k.appendChecked=a.checked,b.innerHTML="",k.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,c.appendChild(b),b.innerHTML="",k.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,k.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){k.noCloneEvent=!1}),b.cloneNode(!0).click()),null==k.deleteExpando){k.deleteExpando=!0;try{delete b.test}catch(d){k.deleteExpando=!1}}}(),function(){var b,c,d=y.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(k[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),k[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var X=/^(?:input|select|textarea)$/i,Y=/^key/,Z=/^(?:mouse|pointer|contextmenu)|click/,$=/^(?:focusinfocus|focusoutblur)$/,_=/^([^.]*)(?:\.(.+)|)$/;function ab(){return!0}function bb(){return!1}function cb(){try{return y.activeElement}catch(a){}}m.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=m.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof m===K||a&&m.event.triggered===a.type?void 0:m.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(E)||[""],h=b.length;while(h--)f=_.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=m.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=m.event.special[o]||{},l=m.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&m.expr.match.needsContext.test(e),namespace:p.join(".")},i),(n=g[o])||(n=g[o]=[],n.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?n.splice(n.delegateCount++,0,l):n.push(l),m.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,n,o,p,q,r=m.hasData(a)&&m._data(a);if(r&&(k=r.events)){b=(b||"").match(E)||[""],j=b.length;while(j--)if(h=_.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=m.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,n=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=n.length;while(f--)g=n[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(n.splice(f,1),g.selector&&n.delegateCount--,l.remove&&l.remove.call(a,g));i&&!n.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||m.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)m.event.remove(a,o+b[j],c,d,!0);m.isEmptyObject(k)&&(delete r.handle,m._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,n,o=[d||y],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||y,3!==d.nodeType&&8!==d.nodeType&&!$.test(p+m.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[m.expando]?b:new m.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:m.makeArray(c,[b]),k=m.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!m.isWindow(d)){for(i=k.delegateType||p,$.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||y)&&o.push(l.defaultView||l.parentWindow||a)}n=0;while((h=o[n++])&&!b.isPropagationStopped())b.type=n>1?i:k.bindType||p,f=(m._data(h,"events")||{})[b.type]&&m._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&m.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&m.acceptData(d)&&g&&d[p]&&!m.isWindow(d)){l=d[g],l&&(d[g]=null),m.event.triggered=p;try{d[p]()}catch(r){}m.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=m.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(m._data(this,"events")||{})[a.type]||[],k=m.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=m.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((m.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?m(c,this).index(i)>=0:m.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),hb=/^\s+/,ib=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,jb=/<([\w:]+)/,kb=/\s*$/g,rb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:k.htmlSerialize?[0,"",""]:[1,"X
","
"]},sb=db(y),tb=sb.appendChild(y.createElement("div"));rb.optgroup=rb.option,rb.tbody=rb.tfoot=rb.colgroup=rb.caption=rb.thead,rb.th=rb.td;function ub(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==K?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==K?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||m.nodeName(d,b)?f.push(d):m.merge(f,ub(d,b));return void 0===b||b&&m.nodeName(a,b)?m.merge([a],f):f}function vb(a){W.test(a.type)&&(a.defaultChecked=a.checked)}function wb(a,b){return m.nodeName(a,"table")&&m.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function xb(a){return a.type=(null!==m.find.attr(a,"type"))+"/"+a.type,a}function yb(a){var b=pb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function zb(a,b){for(var c,d=0;null!=(c=a[d]);d++)m._data(c,"globalEval",!b||m._data(b[d],"globalEval"))}function Ab(a,b){if(1===b.nodeType&&m.hasData(a)){var c,d,e,f=m._data(a),g=m._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)m.event.add(b,c,h[c][d])}g.data&&(g.data=m.extend({},g.data))}}function Bb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!k.noCloneEvent&&b[m.expando]){e=m._data(b);for(d in e.events)m.removeEvent(b,d,e.handle);b.removeAttribute(m.expando)}"script"===c&&b.text!==a.text?(xb(b).text=a.text,yb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),k.html5Clone&&a.innerHTML&&!m.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&W.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}m.extend({clone:function(a,b,c){var d,e,f,g,h,i=m.contains(a.ownerDocument,a);if(k.html5Clone||m.isXMLDoc(a)||!gb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(tb.innerHTML=a.outerHTML,tb.removeChild(f=tb.firstChild)),!(k.noCloneEvent&&k.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||m.isXMLDoc(a)))for(d=ub(f),h=ub(a),g=0;null!=(e=h[g]);++g)d[g]&&Bb(e,d[g]);if(b)if(c)for(h=h||ub(a),d=d||ub(f),g=0;null!=(e=h[g]);g++)Ab(e,d[g]);else Ab(a,f);return d=ub(f,"script"),d.length>0&&zb(d,!i&&ub(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,l,n=a.length,o=db(b),p=[],q=0;n>q;q++)if(f=a[q],f||0===f)if("object"===m.type(f))m.merge(p,f.nodeType?[f]:f);else if(lb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(jb.exec(f)||["",""])[1].toLowerCase(),l=rb[i]||rb._default,h.innerHTML=l[1]+f.replace(ib,"<$1>")+l[2],e=l[0];while(e--)h=h.lastChild;if(!k.leadingWhitespace&&hb.test(f)&&p.push(b.createTextNode(hb.exec(f)[0])),!k.tbody){f="table"!==i||kb.test(f)?""!==l[1]||kb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)m.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}m.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),k.appendChecked||m.grep(ub(p,"input"),vb),q=0;while(f=p[q++])if((!d||-1===m.inArray(f,d))&&(g=m.contains(f.ownerDocument,f),h=ub(o.appendChild(f),"script"),g&&zb(h),c)){e=0;while(f=h[e++])ob.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=m.expando,j=m.cache,l=k.deleteExpando,n=m.event.special;null!=(d=a[h]);h++)if((b||m.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)n[e]?m.event.remove(d,e):m.removeEvent(d,e,g.handle);j[f]&&(delete j[f],l?delete d[i]:typeof d.removeAttribute!==K?d.removeAttribute(i):d[i]=null,c.push(f))}}}),m.fn.extend({text:function(a){return V(this,function(a){return void 0===a?m.text(this):this.empty().append((this[0]&&this[0].ownerDocument||y).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=wb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?m.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||m.cleanData(ub(c)),c.parentNode&&(b&&m.contains(c.ownerDocument,c)&&zb(ub(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&m.cleanData(ub(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&m.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return m.clone(this,a,b)})},html:function(a){return V(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(fb,""):void 0;if(!("string"!=typeof a||mb.test(a)||!k.htmlSerialize&&gb.test(a)||!k.leadingWhitespace&&hb.test(a)||rb[(jb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(ib,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(m.cleanData(ub(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,m.cleanData(ub(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,l=this.length,n=this,o=l-1,p=a[0],q=m.isFunction(p);if(q||l>1&&"string"==typeof p&&!k.checkClone&&nb.test(p))return this.each(function(c){var d=n.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(l&&(i=m.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=m.map(ub(i,"script"),xb),f=g.length;l>j;j++)d=i,j!==o&&(d=m.clone(d,!0,!0),f&&m.merge(g,ub(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,m.map(g,yb),j=0;f>j;j++)d=g[j],ob.test(d.type||"")&&!m._data(d,"globalEval")&&m.contains(h,d)&&(d.src?m._evalUrl&&m._evalUrl(d.src):m.globalEval((d.text||d.textContent||d.innerHTML||"").replace(qb,"")));i=c=null}return this}}),m.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){m.fn[a]=function(a){for(var c,d=0,e=[],g=m(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),m(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Cb,Db={};function Eb(b,c){var d,e=m(c.createElement(b)).appendTo(c.body),f=a.getDefaultComputedStyle&&(d=a.getDefaultComputedStyle(e[0]))?d.display:m.css(e[0],"display");return e.detach(),f}function Fb(a){var b=y,c=Db[a];return c||(c=Eb(a,b),"none"!==c&&c||(Cb=(Cb||m("