├── Sources
└── Keychain.swift
├── Screenshots
├── 01.png
├── 02.png
├── 03.png
└── Installation.png
├── Lib
├── Gemfile
├── Certificates
│ ├── apple.cer
│ ├── developer_id_app.p12.enc
│ ├── ios_developer.p12.enc
│ ├── KeychainAccess_Tests.provisionprofile.enc
│ ├── tvOS_Development.mobileprovision.enc
│ └── iOS_Development.mobileprovision.enc
├── KeychainAccess.xcodeproj
│ ├── project.xcworkspace
│ │ └── contents.xcworkspacedata
│ ├── xcshareddata
│ │ └── xcschemes
│ │ │ ├── TestHost.xcscheme
│ │ │ └── KeychainAccess.xcscheme
│ └── project.pbxproj
├── Gemfile.lock
├── Configurations
│ ├── Release.xcconfig
│ ├── Debug.xcconfig
│ ├── KeychainAccess.xcconfig
│ ├── Tests.xcconfig
│ ├── TestHost.xcconfig
│ └── Base.xcconfig
├── Scripts
│ ├── decode_cert.sh
│ └── add_key.sh
├── TestHost
│ ├── TestHost.entitlements
│ ├── Info.plist
│ ├── Assets.xcassets
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ └── AppDelegate.swift
├── KeychainAccessTests
│ ├── Info.plist
│ ├── SharedCredentialTests.swift
│ └── EnumTests.swift
├── KeychainAccess
│ ├── Info.plist
│ └── KeychainAccess.h
└── Rakefile
├── Package.swift
├── KeychainAccess.xcworkspace
├── xcshareddata
│ └── IDEWorkspaceChecks.plist
└── contents.xcworkspacedata
├── Examples
└── Example-iOS
│ ├── Example-iOS
│ ├── Example-iOS.entitlements
│ ├── Images.xcassets
│ │ └── AppIcon.appiconset
│ │ │ └── Contents.json
│ ├── Info.plist
│ ├── Base.lproj
│ │ ├── LaunchScreen.xib
│ │ └── Main.storyboard
│ ├── AppDelegate.swift
│ ├── InputViewController.swift
│ └── AccountsViewController.swift
│ └── Example-iOS.xcodeproj
│ ├── xcshareddata
│ └── xcschemes
│ │ └── Example-iOS.xcscheme
│ └── project.pbxproj
├── .gitignore
├── LICENSE
├── KeychainAccess.podspec
├── .travis.yml
└── README.md
/Sources/Keychain.swift:
--------------------------------------------------------------------------------
1 | ../Lib/KeychainAccess/Keychain.swift
--------------------------------------------------------------------------------
/Screenshots/01.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/feedbin/KeychainAccess/master/Screenshots/01.png
--------------------------------------------------------------------------------
/Screenshots/02.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/feedbin/KeychainAccess/master/Screenshots/02.png
--------------------------------------------------------------------------------
/Screenshots/03.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/feedbin/KeychainAccess/master/Screenshots/03.png
--------------------------------------------------------------------------------
/Lib/Gemfile:
--------------------------------------------------------------------------------
1 | source 'https://rubygems.org'
2 |
3 | gem 'rake'
4 | gem 'xcpretty'
5 | gem 'xcjobs'
6 |
--------------------------------------------------------------------------------
/Lib/Certificates/apple.cer:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/feedbin/KeychainAccess/master/Lib/Certificates/apple.cer
--------------------------------------------------------------------------------
/Screenshots/Installation.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/feedbin/KeychainAccess/master/Screenshots/Installation.png
--------------------------------------------------------------------------------
/Lib/KeychainAccess.xcodeproj/project.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
8 |
--------------------------------------------------------------------------------
/Package.swift:
--------------------------------------------------------------------------------
1 | //
2 | // Package.swift
3 | // KeychainAccess
4 | //
5 | // Created by kishikawa katsumi on 2015/12/4.
6 | // Copyright (c) 2015 kishikawa katsumi. All rights reserved.
7 | //
8 |
9 | import PackageDescription
10 |
11 | let package = Package(
12 | name: "KeychainAccess"
13 | )
14 |
--------------------------------------------------------------------------------
/KeychainAccess.xcworkspace/xcshareddata/IDEWorkspaceChecks.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | IDEDidComputeMac32BitWarning
6 |
7 |
8 |
9 |
--------------------------------------------------------------------------------
/Lib/Gemfile.lock:
--------------------------------------------------------------------------------
1 | GEM
2 | remote: https://rubygems.org/
3 | specs:
4 | rake (12.1.0)
5 | rouge (2.0.7)
6 | xcjobs (0.10.0)
7 | xcpretty (0.2.8)
8 | rouge (~> 2.0.7)
9 |
10 | PLATFORMS
11 | ruby
12 |
13 | DEPENDENCIES
14 | rake
15 | xcjobs
16 | xcpretty
17 |
18 | BUNDLED WITH
19 | 1.15.4
20 |
--------------------------------------------------------------------------------
/Lib/Configurations/Release.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Base.xcconfig"
2 |
3 | BITCODE_GENERATION_MODE = bitcode;
4 | DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym";
5 | ENABLE_NS_ASSERTIONS = NO;
6 | MTL_ENABLE_DEBUG_INFO = NO;
7 | VALIDATE_PRODUCT = YES;
8 | SWIFT_COMPILATION_MODE = wholemodule;
9 | SWIFT_OPTIMIZATION_LEVEL = -Owholemodule;
10 |
--------------------------------------------------------------------------------
/KeychainAccess.xcworkspace/contents.xcworkspacedata:
--------------------------------------------------------------------------------
1 |
2 |
4 |
6 |
7 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/Lib/Configurations/Debug.xcconfig:
--------------------------------------------------------------------------------
1 | #include "Base.xcconfig"
2 |
3 | BITCODE_GENERATION_MODE = marker;
4 | MTL_ENABLE_DEBUG_INFO = YES;
5 | COPY_PHASE_STRIP = NO;
6 | ENABLE_TESTABILITY = YES;
7 | GCC_OPTIMIZATION_LEVEL = 0;
8 | ONLY_ACTIVE_ARCH = YES;
9 | SWIFT_OPTIMIZATION_LEVEL = -Onone;
10 |
11 | GCC_PREPROCESSOR_DEFINITIONS = $(inherited) DEBUG=1;
12 |
--------------------------------------------------------------------------------
/Lib/Scripts/decode_cert.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | CERT_DIR="./Lib/Certificates"
4 | FILES=('ios_developer.p12' 'developer_id_app.p12' 'iOS_Development.mobileprovision'\
5 | 'tvOS_Development.mobileprovision' 'KeychainAccess_Tests.provisionprofile')
6 |
7 | for file in ${FILES[@]}; do
8 | openssl aes-256-cbc -k "$ENCRYPTION_SECRET" -in "$CERT_DIR"/"$file".enc -d -a -out "$CERT_DIR"/"$file"
9 | done
10 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/Example-iOS.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | keychain-access-groups
6 |
7 | $(AppIdentifierPrefix)com.kishikawakatsumi.Example-iOS
8 |
9 |
10 |
11 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | # OS X
2 | .DS_Store
3 |
4 | # Xcode
5 | build/
6 | *.pbxuser
7 | !default.pbxuser
8 | *.mode1v3
9 | !default.mode1v3
10 | *.mode2v3
11 | !default.mode2v3
12 | *.perspectivev3
13 | !default.perspectivev3
14 | xcuserdata
15 | *.xccheckout
16 | profile
17 | *.moved-aside
18 | DerivedData
19 | *.hmap
20 | *.ipa
21 | *.xcuserstate
22 |
23 | # Bundler
24 | .bundle
25 | vendor/
26 |
27 | # Carthage
28 | Carthage/Build
29 |
--------------------------------------------------------------------------------
/Lib/TestHost/TestHost.entitlements:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | keychain-access-groups
6 |
7 | $(AppIdentifierPrefix)com.kishikawakatsumi.KeychainAccess.TestHost
8 | $(AppIdentifierPrefix)shared
9 |
10 |
11 |
12 |
--------------------------------------------------------------------------------
/Lib/KeychainAccessTests/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | BNDL
17 | CFBundleShortVersionString
18 | 1.0.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 |
24 |
25 |
--------------------------------------------------------------------------------
/Lib/KeychainAccess/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | FMWK
17 | CFBundleShortVersionString
18 | 3.1.1
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | $(CURRENT_PROJECT_VERSION)
23 | NSPrincipalClass
24 |
25 |
26 |
27 |
--------------------------------------------------------------------------------
/Lib/Scripts/add_key.sh:
--------------------------------------------------------------------------------
1 | #!/bin/sh
2 |
3 | security create-keychain -p travis build.keychain
4 | security default-keychain -s build.keychain
5 | security unlock-keychain -p travis build.keychain
6 | security set-keychain-settings -t 3600 -l ~/Library/Keychains/build.keychain
7 |
8 | security import ./Lib/Certificates/apple.cer -k ~/Library/Keychains/build.keychain -T /usr/bin/codesign
9 | security import ./Lib/Certificates/ios_developer.p12 -k ~/Library/Keychains/build.keychain -P $PASSPHRASE -T /usr/bin/codesign
10 | security import ./Lib/Certificates/developer_id_app.p12 -k ~/Library/Keychains/build.keychain -P $PASSPHRASE -T /usr/bin/codesign
11 |
12 | security set-key-partition-list -S apple-tool:,apple:,codesign: -s -k travis build.keychain
13 |
14 | mkdir -p ~/Library/MobileDevice/Provisioning\ Profiles
15 | cp ./Lib/Certificates/*.mobileprovision ~/Library/MobileDevice/Provisioning\ Profiles/
16 | cp ./Lib/Certificates/*.provisionprofile ~/Library/MobileDevice/Provisioning\ Profiles/
17 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/Images.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | }
43 | ],
44 | "info" : {
45 | "version" : 1,
46 | "author" : "xcode"
47 | }
48 | }
--------------------------------------------------------------------------------
/Lib/Configurations/KeychainAccess.xcconfig:
--------------------------------------------------------------------------------
1 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator watchos watchsimulator appletvos appletvsimulator;
2 | TARGETED_DEVICE_FAMILY = 1,2,3,4;
3 |
4 | COMBINE_HIDPI_IMAGES = YES;
5 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier);
6 | PRODUCT_NAME = $(PROJECT_NAME);
7 | APPLICATION_EXTENSION_API_ONLY = YES;
8 | INFOPLIST_FILE = KeychainAccess/Info.plist;
9 | SKIP_INSTALL = YES;
10 |
11 | DEFINES_MODULE = YES;
12 | DYLIB_COMPATIBILITY_VERSION = 1;
13 | DYLIB_CURRENT_VERSION = 1;
14 | DYLIB_INSTALL_NAME_BASE = @rpath;
15 |
16 | ENABLE_BITCODE[sdk=iphone*] = YES;
17 | ENABLE_BITCODE[sdk=watch*] = YES;
18 | ENABLE_BITCODE[sdk=appletv*] = YES;
19 |
20 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
21 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
22 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
23 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks;
24 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | The MIT License (MIT)
2 |
3 | Copyright (c) 2014 kishikawa katsumi
4 |
5 | Permission is hereby granted, free of charge, to any person obtaining a copy
6 | of this software and associated documentation files (the "Software"), to deal
7 | in the Software without restriction, including without limitation the rights
8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9 | copies of the Software, and to permit persons to whom the Software is
10 | furnished to do so, subject to the following conditions:
11 |
12 | The above copyright notice and this permission notice shall be included in all
13 | copies or substantial portions of the Software.
14 |
15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
21 | SOFTWARE.
22 |
23 |
--------------------------------------------------------------------------------
/Lib/Configurations/Tests.xcconfig:
--------------------------------------------------------------------------------
1 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator;
2 |
3 | COMBINE_HIDPI_IMAGES = YES;
4 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier);
5 | PRODUCT_NAME = $(TARGET_NAME);
6 | APPLICATION_EXTENSION_API_ONLY = NO;
7 | INFOPLIST_FILE = KeychainAccessTests/Info.plist;
8 |
9 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
10 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
11 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
12 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks;
13 |
14 | TEST_HOST[sdk=iphone*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/TestHost;
15 | TEST_HOST[sdk=appletv*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/TestHost;
16 | TEST_HOST[sdk=macosx*] = $(BUILT_PRODUCTS_DIR)/TestHost.app/Contents/MacOS/TestHost;
17 |
18 | EXCLUDED_SOURCE_FILE_NAMES[sdk=watch*] = *;
19 | EXCLUDED_SOURCE_FILE_NAMES[sdk=appletv*] = SharedCredentialTests.swift;
20 | EXCLUDED_SOURCE_FILE_NAMES[sdk=macosx*] = SharedCredentialTests.swift;
21 |
22 | DEVELOPMENT_TEAM = 27AEDK3C9F;
23 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UILaunchStoryboardName
26 | LaunchScreen
27 | UIMainStoryboardFile
28 | Main
29 | UIRequiredDeviceCapabilities
30 |
31 | armv7
32 |
33 | UISupportedInterfaceOrientations
34 |
35 | UIInterfaceOrientationPortrait
36 | UIInterfaceOrientationLandscapeLeft
37 | UIInterfaceOrientationLandscapeRight
38 |
39 |
40 |
41 |
--------------------------------------------------------------------------------
/Lib/Configurations/TestHost.xcconfig:
--------------------------------------------------------------------------------
1 | SUPPORTED_PLATFORMS = macosx iphoneos iphonesimulator appletvos appletvsimulator;
2 | TARGETED_DEVICE_FAMILY = 1,2,3;
3 |
4 | COMBINE_HIDPI_IMAGES = YES;
5 | COPY_PHASE_STRIP = NO;
6 | INFOPLIST_FILE = TestHost/Info.plist;
7 | PRODUCT_NAME = $(TARGET_NAME);
8 | CLANG_MODULES_AUTOLINK = NO;
9 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
10 | ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES;
11 | EMBEDDED_CONTENT_CONTAINS_SWIFT = YES;
12 |
13 | PRODUCT_BUNDLE_IDENTIFIER = com.kishikawakatsumi.KeychainAccess.TestHost;
14 |
15 | CODE_SIGN_ENTITLEMENTS = TestHost/TestHost.entitlements;
16 | PROVISIONING_PROFILE_SPECIFIER[sdk=iphone*] = iOS Development;
17 |
18 | CODE_SIGN_IDENTITY[sdk=macosx*] = Developer ID Application;
19 | PROVISIONING_PROFILE_SPECIFIER[sdk=macosx*] = KeychainAccess Tests;
20 |
21 | DEVELOPMENT_TEAM = 27AEDK3C9F;
22 |
23 | PRINCIPAL_CLASS[sdk=iphone*] = UIApplication;
24 | PRINCIPAL_CLASS[sdk=appletv*] = UIApplication;
25 | PRINCIPAL_CLASS[sdk=macosx*] = NSApplication;
26 |
27 | LD_RUNPATH_SEARCH_PATHS[sdk=iphone*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
28 | LD_RUNPATH_SEARCH_PATHS[sdk=watch*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
29 | LD_RUNPATH_SEARCH_PATHS[sdk=appletv*] = $(inherited) @executable_path/Frameworks @loader_path/Frameworks;
30 | LD_RUNPATH_SEARCH_PATHS[sdk=macosx*] = $(inherited) @executable_path/../Frameworks @loader_path/../Frameworks;
31 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/Base.lproj/LaunchScreen.xib:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
--------------------------------------------------------------------------------
/Lib/KeychainAccess/KeychainAccess.h:
--------------------------------------------------------------------------------
1 | //
2 | // KeychainAccess.h
3 | // KeychainAccess
4 | //
5 | // Created by kishikawa katsumi on 2014/12/24.
6 | // Copyright (c) 2014 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | #import
27 |
28 | FOUNDATION_EXPORT double KeychainAccessVersionNumber;
29 | FOUNDATION_EXPORT const unsigned char KeychainAccessVersionString[];
30 |
--------------------------------------------------------------------------------
/Lib/TestHost/Info.plist:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 | CFBundleDevelopmentRegion
6 | en
7 | CFBundleExecutable
8 | $(EXECUTABLE_NAME)
9 | CFBundleIdentifier
10 | $(PRODUCT_BUNDLE_IDENTIFIER)
11 | CFBundleInfoDictionaryVersion
12 | 6.0
13 | CFBundleName
14 | $(PRODUCT_NAME)
15 | CFBundlePackageType
16 | APPL
17 | CFBundleShortVersionString
18 | 1.0
19 | CFBundleSignature
20 | ????
21 | CFBundleVersion
22 | 1
23 | LSRequiresIPhoneOS
24 |
25 | UIRequiredDeviceCapabilities
26 |
27 | armv7
28 |
29 | UISupportedInterfaceOrientations
30 |
31 | UIInterfaceOrientationPortrait
32 | UIInterfaceOrientationLandscapeLeft
33 | UIInterfaceOrientationLandscapeRight
34 |
35 | UISupportedInterfaceOrientations~ipad
36 |
37 | UIInterfaceOrientationPortrait
38 | UIInterfaceOrientationPortraitUpsideDown
39 | UIInterfaceOrientationLandscapeLeft
40 | UIInterfaceOrientationLandscapeRight
41 |
42 | UIRequiresFullScreen
43 |
44 | NSPrincipalClass
45 | $(PRINCIPAL_CLASS)
46 |
47 |
48 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // Example
4 | //
5 | // Created by kishikawa katsumi on 2014/12/25.
6 | // Copyright (c) 2014 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | import UIKit
27 |
28 | @UIApplicationMain
29 | class AppDelegate: UIResponder, UIApplicationDelegate {
30 | var window: UIWindow?
31 |
32 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
33 | return true
34 | }
35 |
36 | }
37 |
--------------------------------------------------------------------------------
/Lib/Configurations/Base.xcconfig:
--------------------------------------------------------------------------------
1 | ALWAYS_SEARCH_USER_PATHS = NO;
2 | CLANG_ANALYZER_NONNULL = YES
3 | CLANG_CXX_LANGUAGE_STANDARD = gnu++0x;
4 | CLANG_CXX_LIBRARY = libc++;
5 | CLANG_ENABLE_MODULES = YES;
6 | CLANG_ENABLE_OBJC_ARC = YES;
7 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
8 | CLANG_WARN_BOOL_CONVERSION = YES;
9 | CLANG_WARN_COMMA = YES;
10 | CLANG_WARN_CONSTANT_CONVERSION = YES;
11 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
12 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
13 | CLANG_WARN_EMPTY_BODY = YES;
14 | CLANG_WARN_ENUM_CONVERSION = YES;
15 | CLANG_WARN_INFINITE_RECURSION = YES;
16 | CLANG_WARN_INT_CONVERSION = YES;
17 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
18 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
19 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
20 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
21 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
22 | CLANG_WARN_STRICT_PROTOTYPES = YES;
23 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
24 | CLANG_WARN_UNREACHABLE_CODE = YES;
25 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
26 | CURRENT_PROJECT_VERSION = 1;
27 | ENABLE_STRICT_OBJC_MSGSEND = YES;
28 | GCC_C_LANGUAGE_STANDARD = gnu99;
29 | GCC_NO_COMMON_BLOCKS = YES;
30 | GCC_DYNAMIC_NO_PIC = NO;
31 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
32 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
33 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
34 | GCC_WARN_UNDECLARED_SELECTOR = YES;
35 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
36 | GCC_WARN_UNUSED_FUNCTION = YES;
37 | GCC_WARN_UNUSED_VARIABLE = YES;
38 | VERSIONING_SYSTEM = "apple-generic";
39 | VERSION_INFO_PREFIX = "";
40 |
41 | CODE_SIGN_IDENTITY[sdk=iphoneos*] = iPhone Developer;
42 | DEVELOPMENT_TEAM = ;
43 |
44 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
45 | WATCHOS_DEPLOYMENT_TARGET = 3.0;
46 | TVOS_DEPLOYMENT_TARGET = 9.0;
47 | MACOSX_DEPLOYMENT_TARGET = 10.9;
48 |
49 | SWIFT_VERSION = 4.1;
50 |
--------------------------------------------------------------------------------
/KeychainAccess.podspec:
--------------------------------------------------------------------------------
1 | Pod::Spec.new do |s|
2 | s.name = 'KeychainAccess'
3 | s.version = '3.1.1'
4 | s.summary = 'KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X.'
5 | s.description = <<-DESC
6 | KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X.
7 | Makes using Keychain APIs exremely easy and much more palatable to use in Swift.
8 |
9 | Features
10 | - Simple interface
11 | - Support access group
12 | - Support accessibility
13 | - Support iCloud sharing
14 | - **Support TouchID and Keychain integration (iOS 8+)**
15 | - **Support Shared Web Credentials (iOS 8+)**
16 | - Works on both iOS & OS X
17 | - watchOS and tvOS are also supported
18 | DESC
19 | s.homepage = 'https://github.com/kishikawakatsumi/KeychainAccess'
20 | s.screenshots = 'https://raw.githubusercontent.com/kishikawakatsumi/KeychainAccess/master/Screenshots/01.png'
21 | s.license = 'MIT'
22 | s.author = { 'kishikawa katsumi' => 'kishikawakatsumi@mac.com' }
23 | s.source = { :git => 'https://github.com/kishikawakatsumi/KeychainAccess.git', :tag => "v#{s.version}" }
24 | s.social_media_url = 'https://twitter.com/k_katsumi'
25 |
26 | s.requires_arc = true
27 | s.source_files = 'Lib/KeychainAccess/*.swift'
28 |
29 | s.pod_target_xcconfig = { 'SWIFT_VERSION' => '4.1' }
30 |
31 | s.ios.deployment_target = '8.0'
32 | s.osx.deployment_target = '10.9'
33 | s.watchos.deployment_target = '3.0'
34 | s.tvos.deployment_target = '9.0'
35 | end
36 |
--------------------------------------------------------------------------------
/Lib/TestHost/Assets.xcassets/AppIcon.appiconset/Contents.json:
--------------------------------------------------------------------------------
1 | {
2 | "images" : [
3 | {
4 | "idiom" : "iphone",
5 | "size" : "20x20",
6 | "scale" : "2x"
7 | },
8 | {
9 | "idiom" : "iphone",
10 | "size" : "20x20",
11 | "scale" : "3x"
12 | },
13 | {
14 | "idiom" : "iphone",
15 | "size" : "29x29",
16 | "scale" : "2x"
17 | },
18 | {
19 | "idiom" : "iphone",
20 | "size" : "29x29",
21 | "scale" : "3x"
22 | },
23 | {
24 | "idiom" : "iphone",
25 | "size" : "40x40",
26 | "scale" : "2x"
27 | },
28 | {
29 | "idiom" : "iphone",
30 | "size" : "40x40",
31 | "scale" : "3x"
32 | },
33 | {
34 | "idiom" : "iphone",
35 | "size" : "60x60",
36 | "scale" : "2x"
37 | },
38 | {
39 | "idiom" : "iphone",
40 | "size" : "60x60",
41 | "scale" : "3x"
42 | },
43 | {
44 | "idiom" : "ipad",
45 | "size" : "20x20",
46 | "scale" : "1x"
47 | },
48 | {
49 | "idiom" : "ipad",
50 | "size" : "20x20",
51 | "scale" : "2x"
52 | },
53 | {
54 | "idiom" : "ipad",
55 | "size" : "29x29",
56 | "scale" : "1x"
57 | },
58 | {
59 | "idiom" : "ipad",
60 | "size" : "29x29",
61 | "scale" : "2x"
62 | },
63 | {
64 | "idiom" : "ipad",
65 | "size" : "40x40",
66 | "scale" : "1x"
67 | },
68 | {
69 | "idiom" : "ipad",
70 | "size" : "40x40",
71 | "scale" : "2x"
72 | },
73 | {
74 | "idiom" : "ipad",
75 | "size" : "76x76",
76 | "scale" : "1x"
77 | },
78 | {
79 | "idiom" : "ipad",
80 | "size" : "76x76",
81 | "scale" : "2x"
82 | },
83 | {
84 | "idiom" : "ipad",
85 | "size" : "83.5x83.5",
86 | "scale" : "2x"
87 | }
88 | ],
89 | "info" : {
90 | "version" : 1,
91 | "author" : "xcode"
92 | }
93 | }
--------------------------------------------------------------------------------
/Lib/TestHost/AppDelegate.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AppDelegate.swift
3 | // TestHost
4 | //
5 | // Created by kishikawa katsumi on 7/10/16.
6 | // Copyright © 2016 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | #if os(OSX)
27 | import Cocoa
28 |
29 | @NSApplicationMain
30 | class AppDelegate: NSObject, NSApplicationDelegate {
31 |
32 | @IBOutlet weak var window: NSWindow!
33 |
34 | func applicationDidFinishLaunching(aNotification: NSNotification) {}
35 |
36 | }
37 | #else
38 | import UIKit
39 |
40 | @UIApplicationMain
41 | class AppDelegate: UIResponder, UIApplicationDelegate {
42 |
43 | var window: UIWindow?
44 |
45 | func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) -> Bool {
46 | return true
47 | }
48 | }
49 | #endif
50 |
--------------------------------------------------------------------------------
/.travis.yml:
--------------------------------------------------------------------------------
1 | language: objective-c
2 | cache:
3 | directories:
4 | - Lib/vendor
5 | before_install:
6 | - brew update
7 | - brew outdated carthage || brew upgrade carthage
8 | install:
9 | - "(cd Lib && bundle install --path=vendor/bundle --binstubs=vendor/bin)"
10 | before_script:
11 | - ./Lib/Scripts/decode_cert.sh || true
12 | - ./Lib/Scripts/add_key.sh || true
13 | script:
14 | - "(cd Lib && travis_retry bundle exec rake $ACTION)"
15 | matrix:
16 | include:
17 | - osx_image: xcode9.3
18 | env: ACTION=build
19 | - osx_image: xcode9.3
20 | env: ACTION='build:carthage'
21 | - osx_image: xcode9.3
22 | env: ACTION='test:iphonesimulator'
23 | - osx_image: xcode9.3
24 | env: ACTION='test:appletvsimulator'
25 | - osx_image: xcode9.3
26 | env: ACTION='test:macosx'
27 |
28 | - osx_image: xcode9.2
29 | env: ACTION=build
30 | - osx_image: xcode9.2
31 | env: ACTION='build:carthage'
32 | - osx_image: xcode9.2
33 | env: ACTION='test:iphonesimulator'
34 | - osx_image: xcode9.2
35 | env: ACTION='test:appletvsimulator'
36 | - osx_image: xcode9.2
37 | env: ACTION='test:macosx'
38 |
39 | - osx_image: xcode9.1
40 | env: ACTION=build
41 | - osx_image: xcode9.1
42 | env: ACTION='build:carthage'
43 | - osx_image: xcode9.1
44 | env: ACTION='test:iphonesimulator'
45 | - osx_image: xcode9.1
46 | env: ACTION='test:appletvsimulator'
47 | - osx_image: xcode9.1
48 | env: ACTION='test:macosx'
49 |
50 | - osx_image: xcode9
51 | env: ACTION=build
52 | - osx_image: xcode9
53 | env: ACTION='build:carthage'
54 | - osx_image: xcode9
55 | env: ACTION='test:iphonesimulator'
56 | - osx_image: xcode9
57 | env: ACTION='test:appletvsimulator'
58 | - osx_image: xcode9
59 | env: ACTION='test:macosx'
60 |
61 | - osx_image: xcode8.3
62 | env: ACTION=build
63 | - osx_image: xcode8.3
64 | env: ACTION='build:carthage'
65 | - osx_image: xcode8.3
66 | env: ACTION='test:iphonesimulator'
67 | - osx_image: xcode8.3
68 | env: ACTION='test:appletvsimulator'
69 | - osx_image: xcode8.3
70 | env: ACTION='test:macosx'
71 | env:
72 | global:
73 | - LANG=en_US.UTF-8
74 | - LC_ALL=en_US.UTF-8
75 | - secure: KL59HA2XSRa215qVXXnFpx48Tb/k+vNfFAbzyc+0M4mXl1VhSJv3bkTslqDrX822t3iFDFYhXbJ6aUo7szSdcbnCXU7VIhNPRK5QM00eS1AI4V0UwDQZ06g2f4Dmt+cQxACg+0CB0OaPnUCA4rkQQKeBMAWa67Tp2hNgQHwsnio=
76 | - secure: B8zXiyX1zEq6uWaCxap5iW1joQBoOjNjSUlcs1t+QKdaFCFtjOI8C1JCClzk7rTnGNDDrhahFlE8yskSNKoBsaW2UJ8TzPIkD4F2pkxTHkaFQl/GBsdbHdOUFL4h0/zGQ6wY1Qhw7C+8+3U+1c9QbnNw6jOQwXTF6gs/XTNzG9Y=
77 | branches:
78 | only:
79 | - master
80 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/InputViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // InputViewController.swift
3 | // Example
4 | //
5 | // Created by kishikawa katsumi on 2014/12/26.
6 | // Copyright (c) 2014 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | import UIKit
27 | import KeychainAccess
28 |
29 | class InputViewController: UITableViewController {
30 |
31 | @IBOutlet weak var saveButton: UIBarButtonItem!
32 | @IBOutlet weak var cancelButton: UIBarButtonItem!
33 |
34 | @IBOutlet weak var usernameField: UITextField!
35 | @IBOutlet weak var passwordField: UITextField!
36 | @IBOutlet weak var serviceField: UITextField!
37 |
38 | override func viewDidLoad() {
39 | super.viewDidLoad()
40 |
41 | tableView.rowHeight = 44.0
42 | tableView.estimatedRowHeight = 44.0
43 | }
44 |
45 | override func didReceiveMemoryWarning() {
46 | super.didReceiveMemoryWarning()
47 | }
48 |
49 | // MARK:
50 |
51 | @IBAction func cancelAction(sender: UIBarButtonItem) {
52 | dismiss(animated: true, completion: nil)
53 | }
54 |
55 | @IBAction func saveAction(sender: UIBarButtonItem) {
56 | let keychain: Keychain
57 | if let service = serviceField.text, !service.isEmpty {
58 | keychain = Keychain(service: service)
59 | } else {
60 | keychain = Keychain()
61 | }
62 | keychain[usernameField.text!] = passwordField.text
63 |
64 | dismiss(animated: true, completion: nil)
65 | }
66 |
67 | @IBAction func editingChanged(sender: UITextField) {
68 | switch (usernameField.text, passwordField.text) {
69 | case let (username?, password?):
70 | saveButton.isEnabled = !username.isEmpty && !password.isEmpty
71 | case (_?, nil):
72 | saveButton.isEnabled = false
73 | case (nil, _?):
74 | saveButton.isEnabled = false
75 | case (nil, nil):
76 | saveButton.isEnabled = false
77 | }
78 | }
79 |
80 | }
81 |
--------------------------------------------------------------------------------
/Lib/KeychainAccessTests/SharedCredentialTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // SharedCredentialTests.swift
3 | // KeychainAccessTests
4 | //
5 | // Created by kishikawa katsumi on 10/12/15.
6 | // Copyright © 2015 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | import XCTest
27 | import KeychainAccess
28 |
29 | class SharedCredentialTests: XCTestCase {
30 |
31 | override func setUp() {
32 | super.setUp()
33 | }
34 |
35 | override func tearDown() {
36 | super.tearDown()
37 | }
38 |
39 | func testGetSharedPassword() {
40 | do {
41 | let expectation = self.expectation(description: "getSharedPassword")
42 |
43 | let keychain = Keychain(server: "https://kishikawakatsumi.com", protocolType: .https)
44 |
45 | keychain.getSharedPassword("kishikawakatsumi") { (password, error) -> () in
46 | XCTAssertNil(password)
47 | XCTAssertNotNil(error)
48 | expectation.fulfill()
49 | }
50 |
51 | waitForExpectations(timeout: 10.0, handler: nil)
52 | }
53 | do {
54 | let expectation = self.expectation(description: "getSharedPassword")
55 |
56 | let keychain = Keychain(server: "https://kishikawakatsumi.com", protocolType: .https)
57 |
58 | keychain.getSharedPassword { (account, password, error) -> () in
59 | XCTAssertNil(account)
60 | XCTAssertNil(password)
61 | XCTAssertNotNil(error)
62 | expectation.fulfill()
63 | }
64 |
65 | waitForExpectations(timeout: 10.0, handler: nil)
66 | }
67 |
68 | }
69 |
70 | func testGeneratePassword() {
71 | do {
72 | var passwords = Set()
73 | for _ in 0...100_000 {
74 | let password = Keychain.generatePassword()
75 |
76 | XCTAssertEqual(password.characters.count, "xxx-xxx-xxx-xxx".characters.count)
77 | XCTAssertFalse(passwords.contains(password))
78 |
79 | passwords.insert(password)
80 | }
81 | }
82 | }
83 |
84 | }
85 |
--------------------------------------------------------------------------------
/Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/TestHost.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
24 |
25 |
30 |
31 |
32 |
33 |
39 |
40 |
41 |
42 |
43 |
44 |
54 |
56 |
62 |
63 |
64 |
65 |
66 |
67 |
73 |
75 |
81 |
82 |
83 |
84 |
86 |
87 |
90 |
91 |
92 |
--------------------------------------------------------------------------------
/Lib/Certificates/developer_id_app.p12.enc:
--------------------------------------------------------------------------------
1 | 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
68 |
--------------------------------------------------------------------------------
/Lib/KeychainAccess.xcodeproj/xcshareddata/xcschemes/KeychainAccess.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
67 |
68 |
78 |
79 |
85 |
86 |
87 |
88 |
89 |
90 |
96 |
97 |
103 |
104 |
105 |
106 |
108 |
109 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/AccountsViewController.swift:
--------------------------------------------------------------------------------
1 | //
2 | // AccountsViewController.swift
3 | // Example
4 | //
5 | // Created by kishikawa katsumi on 2014/12/25.
6 | // Copyright (c) 2014 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | import UIKit
27 | import KeychainAccess
28 |
29 | class AccountsViewController: UITableViewController {
30 | var itemsGroupedByService: [String: [[String: Any]]]?
31 |
32 | override func viewDidLoad() {
33 | super.viewDidLoad()
34 | }
35 |
36 | override func viewWillAppear(_ animated: Bool) {
37 | super.viewWillAppear(animated)
38 |
39 | reloadData()
40 | tableView.reloadData()
41 | }
42 |
43 | override func didReceiveMemoryWarning() {
44 | super.didReceiveMemoryWarning()
45 | }
46 |
47 | // MARK:
48 |
49 | override func numberOfSections(in tableView: UITableView) -> Int {
50 | if itemsGroupedByService != nil {
51 | let services = Array(itemsGroupedByService!.keys)
52 | return services.count
53 | }
54 | return 0
55 | }
56 |
57 | override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
58 | let services = Array(itemsGroupedByService!.keys)
59 | let service = services[section]
60 |
61 | let items = Keychain(service: service).allItems()
62 | return items.count
63 | }
64 |
65 | override func tableView(_ tableView: UITableView, titleForHeaderInSection section: Int) -> String? {
66 | let services = Array(itemsGroupedByService!.keys)
67 | return services[section]
68 | }
69 |
70 | override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
71 | let cell = tableView.dequeueReusableCell(withIdentifier: "Cell", for: indexPath)
72 |
73 | let services = Array(itemsGroupedByService!.keys)
74 | let service = services[indexPath.section]
75 |
76 | let items = Keychain(service: service).allItems()
77 | let item = items[indexPath.row]
78 |
79 | cell.textLabel?.text = item["key"] as? String
80 | cell.detailTextLabel?.text = item["value"] as? String
81 |
82 | return cell
83 | }
84 |
85 | override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
86 | let services = Array(itemsGroupedByService!.keys)
87 | let service = services[indexPath.section]
88 |
89 | let keychain = Keychain(service: service)
90 | let items = keychain.allItems()
91 |
92 | let item = items[indexPath.row]
93 | let key = item["key"] as! String
94 |
95 | keychain[key] = nil
96 |
97 | if items.count == 1 {
98 | reloadData()
99 | tableView.deleteSections(IndexSet(integer: indexPath.section), with: .automatic)
100 | } else {
101 | tableView.deleteRows(at: [indexPath], with: .automatic)
102 | }
103 | }
104 |
105 | // MARK:
106 |
107 | func reloadData() {
108 | let items = Keychain.allItems(.genericPassword)
109 | itemsGroupedByService = groupBy(items) { item -> String in
110 | if let service = item["service"] as? String {
111 | return service
112 | }
113 | return ""
114 | }
115 | }
116 | }
117 |
118 | private func groupBy(_ xs: C, key: (C.Iterator.Element) -> K) -> [K:[C.Iterator.Element]] {
119 | var gs: [K:[C.Iterator.Element]] = [:]
120 | for x in xs {
121 | let k = key(x)
122 | var ys = gs[k] ?? []
123 | ys.append(x)
124 | gs.updateValue(ys, forKey: k)
125 | }
126 | return gs
127 | }
128 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS.xcodeproj/xcshareddata/xcschemes/Example-iOS.xcscheme:
--------------------------------------------------------------------------------
1 |
2 |
5 |
8 |
9 |
15 |
21 |
22 |
23 |
29 |
35 |
36 |
37 |
38 |
39 |
44 |
45 |
47 |
53 |
54 |
55 |
56 |
57 |
63 |
64 |
65 |
66 |
67 |
68 |
78 |
80 |
86 |
87 |
88 |
89 |
90 |
91 |
97 |
99 |
105 |
106 |
107 |
108 |
110 |
111 |
114 |
115 |
116 |
--------------------------------------------------------------------------------
/Lib/Certificates/ios_developer.p12.enc:
--------------------------------------------------------------------------------
1 | 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
131 | hfJJH1uvIO2vkPfr+fxvTQ==
132 |
--------------------------------------------------------------------------------
/Lib/Rakefile:
--------------------------------------------------------------------------------
1 | require 'xcjobs'
2 | require 'json'
3 |
4 | def xcode_version
5 | `xcodebuild -version`.split("\n").first.scan(/\d+/).join('.')
6 | end
7 |
8 | def destinations(platform: 'iphonesimulator')
9 | if platform == 'iphonesimulator'
10 | if xcode_version.start_with?('8')
11 | [ 'name=iPhone 5,OS=10.0',
12 | 'name=iPhone 5s,OS=10.0',
13 | 'name=iPhone 6,OS=10.0',
14 | 'name=iPhone 6s Plus,OS=10.3.1',
15 | 'name=iPhone SE,OS=10.3.1',
16 | 'name=iPad Air 2,OS=10.0',
17 | 'name=iPad Pro (9.7-inch),OS=10.0',
18 | 'name=iPad Pro (12.9-inch),OS=10.0'
19 | ]
20 | elsif xcode_version.start_with?('9.3')
21 | [ 'name=iPhone 5s,OS=11.0.1',
22 | 'name=iPhone 5s,OS=11.1',
23 | 'name=iPhone 6,OS=11.2',
24 | 'name=iPhone 6s Plus,OS=11.3',
25 | 'name=iPhone SE,OS=11.0.1',
26 | 'name=iPad Air 2,OS=11.1',
27 | 'name=iPad Pro (9.7-inch),OS=11.2',
28 | 'name=iPad Pro (12.9-inch),OS=11.3'
29 | ]
30 | elsif xcode_version.start_with?('9.2')
31 | [ 'name=iPhone 5s,OS=11.2',
32 | 'name=iPhone 5s,OS=11.2',
33 | 'name=iPhone 6,OS=11.2',
34 | 'name=iPhone 6s Plus,OS=11.2',
35 | 'name=iPhone SE,OS=11.2',
36 | 'name=iPad Air 2,OS=11.2',
37 | 'name=iPad Pro (9.7-inch),OS=11.2',
38 | 'name=iPad Pro (12.9-inch),OS=11.2'
39 | ]
40 | elsif xcode_version.start_with?('9.1')
41 | [ 'name=iPhone 5s,OS=11.1',
42 | 'name=iPhone 5s,OS=11.1',
43 | 'name=iPhone 6,OS=11.1',
44 | 'name=iPhone 6s Plus,OS=11.1',
45 | 'name=iPhone SE,OS=11.1',
46 | 'name=iPad Air 2,OS=11.1',
47 | 'name=iPad Pro (9.7-inch),OS=11.1',
48 | 'name=iPad Pro (12.9-inch),OS=11.1'
49 | ]
50 | else
51 | [ 'name=iPhone 5,OS=10.0',
52 | 'name=iPhone 5s,OS=10.0',
53 | 'name=iPhone 6,OS=10.0',
54 | 'name=iPhone 6s Plus,OS=10.3.1',
55 | 'name=iPhone SE,OS=10.3.1',
56 | 'name=iPhone 7,OS=11.0',
57 | 'name=iPad Air 2,OS=10.0',
58 | 'name=iPad Pro (9.7-inch),OS=10.0',
59 | 'name=iPad Pro (12.9-inch),OS=10.0',
60 | 'name=iPad Pro (10.5-inch),OS=11.0'
61 | ]
62 | end
63 | elsif platform == 'watchsimulator'
64 | if xcode_version.start_with?('8')
65 | [ 'name=Apple Watch - 38mm,OS=3.2',
66 | 'name=Apple Watch Series 2 - 42mm,OS=3.2'
67 | ]
68 | elsif xcode_version.start_with?('9.3')
69 | [ 'name=Apple Watch - 38mm,OS=4.3',
70 | 'name=Apple Watch - 42mm,OS=4.3',
71 | 'name=Apple Watch Series 2 - 42mm,OS=4.3'
72 | ]
73 | elsif xcode_version.start_with?('9.2')
74 | [ 'name=Apple Watch - 38mm,OS=4.2',
75 | 'name=Apple Watch - 42mm,OS=4.2',
76 | 'name=Apple Watch Series 2 - 42mm,OS=4.2'
77 | ]
78 | elsif xcode_version.start_with?('9.1')
79 | [ 'name=Apple Watch - 38mm,OS=4.1',
80 | 'name=Apple Watch - 42mm,OS=4.1',
81 | 'name=Apple Watch Series 2 - 42mm,OS=4.1'
82 | ]
83 | else
84 | [ 'name=Apple Watch - 38mm,OS=3.2',
85 | 'name=Apple Watch - 42mm,OS=4.0',
86 | 'name=Apple Watch Series 2 - 42mm,OS=4.0'
87 | ]
88 | end
89 | elsif platform == 'appletvsimulator'
90 | if xcode_version.start_with?('8')
91 | [ 'name=Apple TV 1080p,OS=10.2'
92 | ]
93 | elsif xcode_version.start_with?('9.3')
94 | [ 'name=Apple TV 4K,OS=11.3'
95 | ]
96 | elsif xcode_version.start_with?('9.2')
97 | [ 'name=Apple TV 4K,OS=11.2'
98 | ]
99 | elsif xcode_version.start_with?('9.1')
100 | [ 'name=Apple TV 4K,OS=11.1'
101 | ]
102 | else
103 | [ 'name=Apple TV 1080p,OS=10.2',
104 | 'name=Apple TV 1080p,OS=11.0'
105 | ]
106 | end
107 | else
108 | [
109 | 'platform=OS X,arch=x86_64'
110 | ]
111 | end
112 | end
113 |
114 | def supportedPlatforms
115 | ['macosx', 'iphoneos', 'iphonesimulator', 'watchos', 'watchsimulator', 'appletvos', 'appletvsimulator']
116 | end
117 |
118 | def configurations
119 | ['Debug', 'Release']
120 | end
121 |
122 | desc "build for all platforms"
123 | task :build do |t|
124 | supportedPlatforms
125 | .product(configurations)
126 | .map { |platform, configuration| Rake::Task["build:#{platform}:#{configuration.downcase}"] }
127 | .map(&:invoke)
128 | end
129 |
130 | namespace :build do
131 | supportedPlatforms.product(configurations).each do |platform, configuration|
132 | XCJobs::Build.new("#{platform}:#{configuration.downcase}") do |t|
133 | t.project = 'KeychainAccess'
134 | t.scheme = 'KeychainAccess'
135 | t.sdk = platform
136 | t.configuration = configuration
137 | t.build_dir = 'build'
138 | t.hide_shell_script_environment = true
139 | t.formatter = 'xcpretty -c'
140 | if ENV['CI']
141 | t.add_build_setting('CODE_SIGN_IDENTITY', '')
142 | t.add_build_setting('CODE_SIGNING_REQUIRED', 'NO')
143 | end
144 | if xcode_version.start_with?('8')
145 | t.add_build_setting('SWIFT_VERSION', '3.0')
146 | if platform == 'iphonesimulator'
147 | t.add_destination('name=iPhone 7,OS=10.3.1')
148 | elsif platform == 'watchsimulator'
149 | t.add_destination('name=Apple Watch - 42mm,OS=3.2')
150 | elsif platform == 'appletvsimulator'
151 | t.add_destination('name=Apple TV 1080p,OS=10.0')
152 | end
153 | elsif xcode_version.start_with?('9.3')
154 | t.add_build_setting('SWIFT_VERSION', '4.1')
155 | if platform == 'iphonesimulator'
156 | t.add_destination('name=iPhone 7,OS=11.3')
157 | elsif platform == 'watchsimulator'
158 | t.add_destination('name=Apple Watch - 42mm,OS=4.3')
159 | elsif platform == 'appletvsimulator'
160 | t.add_destination('name=Apple TV 4K,OS=11.3')
161 | end
162 | elsif xcode_version.start_with?('9.2')
163 | t.add_build_setting('SWIFT_VERSION', '4.0')
164 | if platform == 'iphonesimulator'
165 | t.add_destination('name=iPhone 7,OS=11.2')
166 | elsif platform == 'watchsimulator'
167 | t.add_destination('name=Apple Watch - 42mm,OS=4.2')
168 | elsif platform == 'appletvsimulator'
169 | t.add_destination('name=Apple TV 4K,OS=11.2')
170 | end
171 | elsif xcode_version.start_with?('9.1')
172 | t.add_build_setting('SWIFT_VERSION', '4.0')
173 | if platform == 'iphonesimulator'
174 | t.add_destination('name=iPhone 7,OS=11.1')
175 | elsif platform == 'watchsimulator'
176 | t.add_destination('name=Apple Watch - 42mm,OS=4.1')
177 | elsif platform == 'appletvsimulator'
178 | t.add_destination('name=Apple TV 4K,OS=11.1')
179 | end
180 | else
181 | t.add_build_setting('SWIFT_VERSION', '4.0')
182 | if platform == 'iphonesimulator'
183 | t.add_destination('name=iPhone 7,OS=11.0')
184 | elsif platform == 'watchsimulator'
185 | t.add_destination('name=Apple Watch - 42mm,OS=4.0')
186 | elsif platform == 'appletvsimulator'
187 | t.add_destination('name=Apple TV 1080p,OS=11.0')
188 | end
189 | end
190 | end
191 | end
192 |
193 | task :carthage do
194 | sh %[echo 'github \"kishikawakatsumi/KeychainAccess\"' > Cartfile]
195 | if xcode_version.start_with?('8')
196 | sh %[echo SWIFT_VERSION=\"3.0\" > swift3.xcconfig]
197 | sh %[XCODE_XCCONFIG_FILE=`pwd`/swift3.xcconfig carthage update --no-use-binaries]
198 | else
199 | sh %[carthage update --no-use-binaries]
200 | end
201 | end
202 | end
203 |
204 | namespace :test do
205 | supportedPlatforms
206 | .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
207 | .each do |platform|
208 | task platform do |t|
209 | configurations.each do |configuration|
210 | destinations(platform: platform)
211 | .map { |destination| Rake::Task["test:#{platform}:#{configuration.downcase}:#{destination}"] }
212 | .map(&:invoke)
213 | end
214 | end
215 | end
216 | end
217 |
218 | namespace :test do
219 | supportedPlatforms
220 | .select { |platform| platform == 'macosx' || platform == 'iphonesimulator' || platform == 'appletvsimulator' }
221 | .product(configurations)
222 | .each do |platform, configuration|
223 | destinations(platform: platform).each do |destination|
224 | XCJobs::Test.new("#{platform}:#{configuration.downcase}:#{destination}") do |t|
225 | t.project = 'KeychainAccess'
226 | t.scheme = 'KeychainAccess'
227 | t.sdk = platform
228 | t.configuration = configuration
229 | t.add_destination(destination)
230 | t.coverage = true
231 | t.build_dir = 'build'
232 | t.hide_shell_script_environment = true
233 | if xcode_version.start_with?('8')
234 | t.add_build_setting('SWIFT_VERSION', '3.0')
235 | elsif xcode_version.start_with?('9.3')
236 | t.add_build_setting('SWIFT_VERSION', '4.1')
237 | else
238 | t.add_build_setting('SWIFT_VERSION', '4.0')
239 | end
240 | t.after_action do
241 | build_coverage_reports()
242 | puts `curl -L https://codecov.io/bash | bash -s -- -f 'coverage.txt'`
243 | end
244 | end
245 | end
246 | end
247 | end
248 |
249 | def build_coverage_reports()
250 | project_name = 'KeychainAccess'
251 | profdata = Dir.glob(File.join('build', '/**/Coverage.profdata')).first
252 | Dir.glob(File.join('build', "/**/#{project_name}")) do |target|
253 | output = `xcrun llvm-cov report -instr-profile "#{profdata}" "#{target}" -arch=x86_64`
254 | if $?.success?
255 | puts output
256 | `xcrun llvm-cov show -instr-profile "#{profdata}" "#{target}" -arch=x86_64 -use-color=0 > coverage.txt`
257 | break
258 | end
259 | end
260 | end
261 |
--------------------------------------------------------------------------------
/Lib/Certificates/KeychainAccess_Tests.provisionprofile.enc:
--------------------------------------------------------------------------------
1 | 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
158 | m1nn1kcLs46WQmS7a7XSHQ==
159 |
--------------------------------------------------------------------------------
/Lib/Certificates/tvOS_Development.mobileprovision.enc:
--------------------------------------------------------------------------------
1 | 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
159 |
--------------------------------------------------------------------------------
/Lib/Certificates/iOS_Development.mobileprovision.enc:
--------------------------------------------------------------------------------
1 | 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
189 |
--------------------------------------------------------------------------------
/Lib/KeychainAccessTests/EnumTests.swift:
--------------------------------------------------------------------------------
1 | //
2 | // EnumTests.swift
3 | // KeychainAccessTests
4 | //
5 | // Created by kishikawa katsumi on 10/12/15.
6 | // Copyright © 2015 kishikawa katsumi. All rights reserved.
7 | //
8 | // Permission is hereby granted, free of charge, to any person obtaining a copy
9 | // of this software and associated documentation files (the "Software"), to deal
10 | // in the Software without restriction, including without limitation the rights
11 | // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
12 | // copies of the Software, and to permit persons to whom the Software is
13 | // furnished to do so, subject to the following conditions:
14 | //
15 | // The above copyright notice and this permission notice shall be included in
16 | // all copies or substantial portions of the Software.
17 | //
18 | // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19 | // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20 | // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
21 | // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
22 | // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
23 | // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
24 | // THE SOFTWARE.
25 |
26 | import XCTest
27 | import KeychainAccess
28 |
29 | class EnumTests: XCTestCase {
30 |
31 | override func setUp() {
32 | super.setUp()
33 | }
34 |
35 | override func tearDown() {
36 | super.tearDown()
37 | }
38 |
39 | func testItemClass() {
40 | do {
41 | let itemClass = ItemClass(rawValue: kSecClassGenericPassword as String)
42 | XCTAssertEqual(itemClass, .genericPassword)
43 | XCTAssertEqual(itemClass?.description, "GenericPassword")
44 | }
45 | do {
46 | let itemClass = ItemClass(rawValue: kSecClassInternetPassword as String)
47 | XCTAssertEqual(itemClass, .internetPassword)
48 | XCTAssertEqual(itemClass?.description, "InternetPassword")
49 | }
50 | do {
51 | let itemClass = ItemClass(rawValue: kSecClassCertificate as String)
52 | XCTAssertNil(itemClass)
53 | }
54 | do {
55 | let itemClass = ItemClass(rawValue: kSecClassKey as String)
56 | XCTAssertNil(itemClass)
57 | }
58 | do {
59 | let itemClass = ItemClass(rawValue: kSecClassIdentity as String)
60 | XCTAssertNil(itemClass)
61 | }
62 | }
63 |
64 | func testProtocolType() {
65 | do {
66 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTP as String)
67 | XCTAssertEqual(protocolType, .ftp)
68 | XCTAssertEqual(protocolType?.description, "FTP")
69 | }
70 | do {
71 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPAccount as String)
72 | XCTAssertEqual(protocolType, .ftpAccount)
73 | XCTAssertEqual(protocolType?.description, "FTPAccount")
74 | }
75 | do {
76 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTP as String)
77 | XCTAssertEqual(protocolType, .http)
78 | XCTAssertEqual(protocolType?.description, "HTTP")
79 | }
80 | do {
81 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolIRC as String)
82 | XCTAssertEqual(protocolType, .irc)
83 | XCTAssertEqual(protocolType?.description, "IRC")
84 | }
85 | do {
86 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolNNTP as String)
87 | XCTAssertEqual(protocolType, .nntp)
88 | XCTAssertEqual(protocolType?.description, "NNTP")
89 | }
90 | do {
91 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolPOP3 as String)
92 | XCTAssertEqual(protocolType, .pop3)
93 | XCTAssertEqual(protocolType?.description, "POP3")
94 | }
95 | do {
96 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolSMTP as String)
97 | XCTAssertEqual(protocolType, .smtp)
98 | XCTAssertEqual(protocolType?.description, "SMTP")
99 | }
100 | do {
101 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolSOCKS as String)
102 | XCTAssertEqual(protocolType, .socks)
103 | XCTAssertEqual(protocolType?.description, "SOCKS")
104 | }
105 | do {
106 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolIMAP as String)
107 | XCTAssertEqual(protocolType, .imap)
108 | XCTAssertEqual(protocolType?.description, "IMAP")
109 | }
110 | do {
111 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolLDAP as String)
112 | XCTAssertEqual(protocolType, .ldap)
113 | XCTAssertEqual(protocolType?.description, "LDAP")
114 | }
115 | do {
116 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolAppleTalk as String)
117 | XCTAssertEqual(protocolType, .appleTalk)
118 | XCTAssertEqual(protocolType?.description, "AppleTalk")
119 | }
120 | do {
121 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolAFP as String)
122 | XCTAssertEqual(protocolType, .afp)
123 | XCTAssertEqual(protocolType?.description, "AFP")
124 | }
125 | do {
126 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolTelnet as String)
127 | XCTAssertEqual(protocolType, .telnet)
128 | XCTAssertEqual(protocolType?.description, "Telnet")
129 | }
130 | do {
131 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolSSH as String)
132 | XCTAssertEqual(protocolType, .ssh)
133 | XCTAssertEqual(protocolType?.description, "SSH")
134 | }
135 | do {
136 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPS as String)
137 | XCTAssertEqual(protocolType, .ftps)
138 | XCTAssertEqual(protocolType?.description, "FTPS")
139 | }
140 | do {
141 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPS as String)
142 | XCTAssertEqual(protocolType, .https)
143 | XCTAssertEqual(protocolType?.description, "HTTPS")
144 | }
145 | do {
146 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPProxy as String)
147 | XCTAssertEqual(protocolType, .httpProxy)
148 | XCTAssertEqual(protocolType?.description, "HTTPProxy")
149 | }
150 | do {
151 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolHTTPSProxy as String)
152 | XCTAssertEqual(protocolType, .httpsProxy)
153 | XCTAssertEqual(protocolType?.description, "HTTPSProxy")
154 | }
155 | do {
156 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolFTPProxy as String)
157 | XCTAssertEqual(protocolType, .ftpProxy)
158 | XCTAssertEqual(protocolType?.description, "FTPProxy")
159 | }
160 | do {
161 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolSMB as String)
162 | XCTAssertEqual(protocolType, .smb)
163 | XCTAssertEqual(protocolType?.description, "SMB")
164 | }
165 | do {
166 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolRTSP as String)
167 | XCTAssertEqual(protocolType, .rtsp)
168 | XCTAssertEqual(protocolType?.description, "RTSP")
169 | }
170 | do {
171 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolRTSPProxy as String)
172 | XCTAssertEqual(protocolType, .rtspProxy)
173 | XCTAssertEqual(protocolType?.description, "RTSPProxy")
174 | }
175 | do {
176 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolDAAP as String)
177 | XCTAssertEqual(protocolType, .daap)
178 | XCTAssertEqual(protocolType?.description, "DAAP")
179 | }
180 | do {
181 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolEPPC as String)
182 | XCTAssertEqual(protocolType, .eppc)
183 | XCTAssertEqual(protocolType?.description, "EPPC")
184 | }
185 | do {
186 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolIPP as String)
187 | XCTAssertEqual(protocolType, .ipp)
188 | XCTAssertEqual(protocolType?.description, "IPP")
189 | }
190 | do {
191 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolNNTPS as String)
192 | XCTAssertEqual(protocolType, .nntps)
193 | XCTAssertEqual(protocolType?.description, "NNTPS")
194 | }
195 | do {
196 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolLDAPS as String)
197 | XCTAssertEqual(protocolType, .ldaps)
198 | XCTAssertEqual(protocolType?.description, "LDAPS")
199 | }
200 | do {
201 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolTelnetS as String)
202 | XCTAssertEqual(protocolType, .telnetS)
203 | XCTAssertEqual(protocolType?.description, "TelnetS")
204 | }
205 | do {
206 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolIMAPS as String)
207 | XCTAssertEqual(protocolType, .imaps)
208 | XCTAssertEqual(protocolType?.description, "IMAPS")
209 | }
210 | do {
211 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolIRCS as String)
212 | XCTAssertEqual(protocolType, .ircs)
213 | XCTAssertEqual(protocolType?.description, "IRCS")
214 | }
215 | do {
216 | let protocolType = ProtocolType(rawValue: kSecAttrProtocolPOP3S as String)
217 | XCTAssertEqual(protocolType, .pop3S)
218 | XCTAssertEqual(protocolType?.description, "POP3S")
219 | }
220 | }
221 |
222 | func testAuthenticationType() {
223 | do {
224 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeNTLM as String)
225 | XCTAssertEqual(authenticationType, .ntlm)
226 | XCTAssertEqual(authenticationType?.description, "NTLM")
227 | }
228 | do {
229 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeMSN as String)
230 | XCTAssertEqual(authenticationType, .msn)
231 | XCTAssertEqual(authenticationType?.description, "MSN")
232 | }
233 | do {
234 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeDPA as String)
235 | XCTAssertEqual(authenticationType, .dpa)
236 | XCTAssertEqual(authenticationType?.description, "DPA")
237 | }
238 | do {
239 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeRPA as String)
240 | XCTAssertEqual(authenticationType, .rpa)
241 | XCTAssertEqual(authenticationType?.description, "RPA")
242 | }
243 | do {
244 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTTPBasic as String)
245 | XCTAssertEqual(authenticationType, .httpBasic)
246 | XCTAssertEqual(authenticationType?.description, "HTTPBasic")
247 | }
248 | do {
249 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTTPDigest as String)
250 | XCTAssertEqual(authenticationType, .httpDigest)
251 | XCTAssertEqual(authenticationType?.description, "HTTPDigest")
252 | }
253 | do {
254 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeHTMLForm as String)
255 | XCTAssertEqual(authenticationType, .htmlForm)
256 | XCTAssertEqual(authenticationType?.description, "HTMLForm")
257 | }
258 | do {
259 | let authenticationType = AuthenticationType(rawValue: kSecAttrAuthenticationTypeDefault as String)
260 | XCTAssertEqual(authenticationType, .default)
261 | XCTAssertEqual(authenticationType?.description, "Default")
262 | }
263 | }
264 |
265 | func testAccessibility() {
266 | guard #available(OSX 10.10, *) else {
267 | return
268 | }
269 | do {
270 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenUnlocked as String)
271 | XCTAssertEqual(accessibility, .whenUnlocked)
272 | XCTAssertEqual(accessibility?.description, "WhenUnlocked")
273 | }
274 | do {
275 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleAfterFirstUnlock as String)
276 | XCTAssertEqual(accessibility, .afterFirstUnlock)
277 | XCTAssertEqual(accessibility?.description, "AfterFirstUnlock")
278 | }
279 | do {
280 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleAlways as String)
281 | XCTAssertEqual(accessibility, .always)
282 | XCTAssertEqual(accessibility?.description, "Always")
283 | }
284 | do {
285 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly as String)
286 | XCTAssertEqual(accessibility, .whenPasscodeSetThisDeviceOnly)
287 | XCTAssertEqual(accessibility?.description, "WhenPasscodeSetThisDeviceOnly")
288 | }
289 | do {
290 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleWhenUnlockedThisDeviceOnly as String)
291 | XCTAssertEqual(accessibility, .whenUnlockedThisDeviceOnly)
292 | XCTAssertEqual(accessibility?.description, "WhenUnlockedThisDeviceOnly")
293 | }
294 | do {
295 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly as String)
296 | XCTAssertEqual(accessibility, .afterFirstUnlockThisDeviceOnly)
297 | XCTAssertEqual(accessibility?.description, "AfterFirstUnlockThisDeviceOnly")
298 | }
299 | do {
300 | let accessibility = Accessibility(rawValue: kSecAttrAccessibleAlwaysThisDeviceOnly as String)
301 | XCTAssertEqual(accessibility, .alwaysThisDeviceOnly)
302 | XCTAssertEqual(accessibility?.description, "AlwaysThisDeviceOnly")
303 | }
304 | }
305 | }
306 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 14DAEE961A51E1BE0070B77E /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEE951A51E1BE0070B77E /* AppDelegate.swift */; };
11 | 14DAEE9B1A51E1BE0070B77E /* Main.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE991A51E1BE0070B77E /* Main.storyboard */; };
12 | 14DAEE9D1A51E1BE0070B77E /* Images.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE9C1A51E1BE0070B77E /* Images.xcassets */; };
13 | 14DAEEA01A51E1BE0070B77E /* LaunchScreen.xib in Resources */ = {isa = PBXBuildFile; fileRef = 14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */; };
14 | 14DAEEB71A51E2690070B77E /* AccountsViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEEB51A51E2690070B77E /* AccountsViewController.swift */; };
15 | 14DAEEB81A51E2690070B77E /* InputViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14DAEEB61A51E2690070B77E /* InputViewController.swift */; };
16 | 14DAEEC91A51E2D00070B77E /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */; };
17 | 14DAEECB1A51E2E10070B77E /* KeychainAccess.framework in CopyFiles */ = {isa = PBXBuildFile; fileRef = 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
18 | /* End PBXBuildFile section */
19 |
20 | /* Begin PBXContainerItemProxy section */
21 | 1470425D1D6FFA97005A4C6E /* PBXContainerItemProxy */ = {
22 | isa = PBXContainerItemProxy;
23 | containerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
24 | proxyType = 2;
25 | remoteGlobalIDString = 14A630151D3293C700809B3F;
26 | remoteInfo = TestHost;
27 | };
28 | 14DAEEC01A51E2A60070B77E /* PBXContainerItemProxy */ = {
29 | isa = PBXContainerItemProxy;
30 | containerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
31 | proxyType = 2;
32 | remoteGlobalIDString = 140F195C1A49D79400B0016A;
33 | remoteInfo = "KeychainAccess-iOS";
34 | };
35 | 14DAEEC21A51E2A60070B77E /* PBXContainerItemProxy */ = {
36 | isa = PBXContainerItemProxy;
37 | containerPortal = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
38 | proxyType = 2;
39 | remoteGlobalIDString = 140F19671A49D79500B0016A;
40 | remoteInfo = "KeychainAccess-iOSTests";
41 | };
42 | /* End PBXContainerItemProxy section */
43 |
44 | /* Begin PBXCopyFilesBuildPhase section */
45 | 14DAEECA1A51E2D70070B77E /* CopyFiles */ = {
46 | isa = PBXCopyFilesBuildPhase;
47 | buildActionMask = 2147483647;
48 | dstPath = "";
49 | dstSubfolderSpec = 10;
50 | files = (
51 | 14DAEECB1A51E2E10070B77E /* KeychainAccess.framework in CopyFiles */,
52 | );
53 | runOnlyForDeploymentPostprocessing = 0;
54 | };
55 | /* End PBXCopyFilesBuildPhase section */
56 |
57 | /* Begin PBXFileReference section */
58 | 145652E11D898BB9006E8D0E /* Example-iOS.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; path = "Example-iOS.entitlements"; sourceTree = ""; };
59 | 14DAEE901A51E1BE0070B77E /* Example-iOS.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = "Example-iOS.app"; sourceTree = BUILT_PRODUCTS_DIR; };
60 | 14DAEE941A51E1BE0070B77E /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
61 | 14DAEE951A51E1BE0070B77E /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
62 | 14DAEE9A1A51E1BE0070B77E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.storyboard; name = Base; path = Base.lproj/Main.storyboard; sourceTree = ""; };
63 | 14DAEE9C1A51E1BE0070B77E /* Images.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Images.xcassets; sourceTree = ""; };
64 | 14DAEE9F1A51E1BE0070B77E /* Base */ = {isa = PBXFileReference; lastKnownFileType = file.xib; name = Base; path = Base.lproj/LaunchScreen.xib; sourceTree = ""; };
65 | 14DAEEB51A51E2690070B77E /* AccountsViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = AccountsViewController.swift; sourceTree = ""; };
66 | 14DAEEB61A51E2690070B77E /* InputViewController.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = InputViewController.swift; sourceTree = ""; };
67 | 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */ = {isa = PBXFileReference; lastKnownFileType = "wrapper.pb-project"; name = KeychainAccess.xcodeproj; path = ../../Lib/KeychainAccess.xcodeproj; sourceTree = ""; };
68 | /* End PBXFileReference section */
69 |
70 | /* Begin PBXFrameworksBuildPhase section */
71 | 14DAEE8D1A51E1BE0070B77E /* Frameworks */ = {
72 | isa = PBXFrameworksBuildPhase;
73 | buildActionMask = 2147483647;
74 | files = (
75 | 14DAEEC91A51E2D00070B77E /* KeychainAccess.framework in Frameworks */,
76 | );
77 | runOnlyForDeploymentPostprocessing = 0;
78 | };
79 | /* End PBXFrameworksBuildPhase section */
80 |
81 | /* Begin PBXGroup section */
82 | 14DAEE871A51E1BE0070B77E = {
83 | isa = PBXGroup;
84 | children = (
85 | 14DAEE921A51E1BE0070B77E /* Example-iOS */,
86 | 14DAEE911A51E1BE0070B77E /* Products */,
87 | 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */,
88 | );
89 | sourceTree = "";
90 | };
91 | 14DAEE911A51E1BE0070B77E /* Products */ = {
92 | isa = PBXGroup;
93 | children = (
94 | 14DAEE901A51E1BE0070B77E /* Example-iOS.app */,
95 | );
96 | name = Products;
97 | sourceTree = "";
98 | };
99 | 14DAEE921A51E1BE0070B77E /* Example-iOS */ = {
100 | isa = PBXGroup;
101 | children = (
102 | 14DAEE951A51E1BE0070B77E /* AppDelegate.swift */,
103 | 14DAEEB51A51E2690070B77E /* AccountsViewController.swift */,
104 | 14DAEEB61A51E2690070B77E /* InputViewController.swift */,
105 | 14DAEE991A51E1BE0070B77E /* Main.storyboard */,
106 | 14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */,
107 | 14DAEE9C1A51E1BE0070B77E /* Images.xcassets */,
108 | 14DAEE931A51E1BE0070B77E /* Supporting Files */,
109 | );
110 | path = "Example-iOS";
111 | sourceTree = "";
112 | };
113 | 14DAEE931A51E1BE0070B77E /* Supporting Files */ = {
114 | isa = PBXGroup;
115 | children = (
116 | 14DAEE941A51E1BE0070B77E /* Info.plist */,
117 | 145652E11D898BB9006E8D0E /* Example-iOS.entitlements */,
118 | );
119 | name = "Supporting Files";
120 | sourceTree = "";
121 | };
122 | 14DAEEBA1A51E2A60070B77E /* Products */ = {
123 | isa = PBXGroup;
124 | children = (
125 | 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */,
126 | 14DAEEC31A51E2A60070B77E /* KeychainAccessTests.xctest */,
127 | 1470425E1D6FFA97005A4C6E /* TestHost.app */,
128 | );
129 | name = Products;
130 | sourceTree = "";
131 | };
132 | /* End PBXGroup section */
133 |
134 | /* Begin PBXNativeTarget section */
135 | 14DAEE8F1A51E1BE0070B77E /* Example-iOS */ = {
136 | isa = PBXNativeTarget;
137 | buildConfigurationList = 14DAEEAF1A51E1BE0070B77E /* Build configuration list for PBXNativeTarget "Example-iOS" */;
138 | buildPhases = (
139 | 14DAEE8C1A51E1BE0070B77E /* Sources */,
140 | 14DAEE8D1A51E1BE0070B77E /* Frameworks */,
141 | 14DAEE8E1A51E1BE0070B77E /* Resources */,
142 | 14DAEECA1A51E2D70070B77E /* CopyFiles */,
143 | );
144 | buildRules = (
145 | );
146 | dependencies = (
147 | );
148 | name = "Example-iOS";
149 | productName = "Example-iOS";
150 | productReference = 14DAEE901A51E1BE0070B77E /* Example-iOS.app */;
151 | productType = "com.apple.product-type.application";
152 | };
153 | /* End PBXNativeTarget section */
154 |
155 | /* Begin PBXProject section */
156 | 14DAEE881A51E1BE0070B77E /* Project object */ = {
157 | isa = PBXProject;
158 | attributes = {
159 | LastSwiftUpdateCheck = 0700;
160 | LastUpgradeCheck = 0930;
161 | ORGANIZATIONNAME = "kishikawa katsumi";
162 | TargetAttributes = {
163 | 14DAEE8F1A51E1BE0070B77E = {
164 | CreatedOnToolsVersion = 6.2;
165 | DevelopmentTeam = 27AEDK3C9F;
166 | };
167 | };
168 | };
169 | buildConfigurationList = 14DAEE8B1A51E1BE0070B77E /* Build configuration list for PBXProject "Example-iOS" */;
170 | compatibilityVersion = "Xcode 3.2";
171 | developmentRegion = English;
172 | hasScannedForEncodings = 0;
173 | knownRegions = (
174 | en,
175 | Base,
176 | );
177 | mainGroup = 14DAEE871A51E1BE0070B77E;
178 | productRefGroup = 14DAEE911A51E1BE0070B77E /* Products */;
179 | projectDirPath = "";
180 | projectReferences = (
181 | {
182 | ProductGroup = 14DAEEBA1A51E2A60070B77E /* Products */;
183 | ProjectRef = 14DAEEB91A51E2A60070B77E /* KeychainAccess.xcodeproj */;
184 | },
185 | );
186 | projectRoot = "";
187 | targets = (
188 | 14DAEE8F1A51E1BE0070B77E /* Example-iOS */,
189 | );
190 | };
191 | /* End PBXProject section */
192 |
193 | /* Begin PBXReferenceProxy section */
194 | 1470425E1D6FFA97005A4C6E /* TestHost.app */ = {
195 | isa = PBXReferenceProxy;
196 | fileType = wrapper.application;
197 | path = TestHost.app;
198 | remoteRef = 1470425D1D6FFA97005A4C6E /* PBXContainerItemProxy */;
199 | sourceTree = BUILT_PRODUCTS_DIR;
200 | };
201 | 14DAEEC11A51E2A60070B77E /* KeychainAccess.framework */ = {
202 | isa = PBXReferenceProxy;
203 | fileType = wrapper.framework;
204 | path = KeychainAccess.framework;
205 | remoteRef = 14DAEEC01A51E2A60070B77E /* PBXContainerItemProxy */;
206 | sourceTree = BUILT_PRODUCTS_DIR;
207 | };
208 | 14DAEEC31A51E2A60070B77E /* KeychainAccessTests.xctest */ = {
209 | isa = PBXReferenceProxy;
210 | fileType = wrapper.cfbundle;
211 | path = KeychainAccessTests.xctest;
212 | remoteRef = 14DAEEC21A51E2A60070B77E /* PBXContainerItemProxy */;
213 | sourceTree = BUILT_PRODUCTS_DIR;
214 | };
215 | /* End PBXReferenceProxy section */
216 |
217 | /* Begin PBXResourcesBuildPhase section */
218 | 14DAEE8E1A51E1BE0070B77E /* Resources */ = {
219 | isa = PBXResourcesBuildPhase;
220 | buildActionMask = 2147483647;
221 | files = (
222 | 14DAEE9B1A51E1BE0070B77E /* Main.storyboard in Resources */,
223 | 14DAEEA01A51E1BE0070B77E /* LaunchScreen.xib in Resources */,
224 | 14DAEE9D1A51E1BE0070B77E /* Images.xcassets in Resources */,
225 | );
226 | runOnlyForDeploymentPostprocessing = 0;
227 | };
228 | /* End PBXResourcesBuildPhase section */
229 |
230 | /* Begin PBXSourcesBuildPhase section */
231 | 14DAEE8C1A51E1BE0070B77E /* Sources */ = {
232 | isa = PBXSourcesBuildPhase;
233 | buildActionMask = 2147483647;
234 | files = (
235 | 14DAEEB81A51E2690070B77E /* InputViewController.swift in Sources */,
236 | 14DAEEB71A51E2690070B77E /* AccountsViewController.swift in Sources */,
237 | 14DAEE961A51E1BE0070B77E /* AppDelegate.swift in Sources */,
238 | );
239 | runOnlyForDeploymentPostprocessing = 0;
240 | };
241 | /* End PBXSourcesBuildPhase section */
242 |
243 | /* Begin PBXVariantGroup section */
244 | 14DAEE991A51E1BE0070B77E /* Main.storyboard */ = {
245 | isa = PBXVariantGroup;
246 | children = (
247 | 14DAEE9A1A51E1BE0070B77E /* Base */,
248 | );
249 | name = Main.storyboard;
250 | sourceTree = "";
251 | };
252 | 14DAEE9E1A51E1BE0070B77E /* LaunchScreen.xib */ = {
253 | isa = PBXVariantGroup;
254 | children = (
255 | 14DAEE9F1A51E1BE0070B77E /* Base */,
256 | );
257 | name = LaunchScreen.xib;
258 | sourceTree = "";
259 | };
260 | /* End PBXVariantGroup section */
261 |
262 | /* Begin XCBuildConfiguration section */
263 | 14DAEEAD1A51E1BE0070B77E /* Debug */ = {
264 | isa = XCBuildConfiguration;
265 | buildSettings = {
266 | ALWAYS_SEARCH_USER_PATHS = NO;
267 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
268 | CLANG_CXX_LIBRARY = "libc++";
269 | CLANG_ENABLE_MODULES = YES;
270 | CLANG_ENABLE_OBJC_ARC = YES;
271 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
272 | CLANG_WARN_BOOL_CONVERSION = YES;
273 | CLANG_WARN_COMMA = YES;
274 | CLANG_WARN_CONSTANT_CONVERSION = YES;
275 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
276 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
277 | CLANG_WARN_EMPTY_BODY = YES;
278 | CLANG_WARN_ENUM_CONVERSION = YES;
279 | CLANG_WARN_INFINITE_RECURSION = YES;
280 | CLANG_WARN_INT_CONVERSION = YES;
281 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
282 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
283 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
284 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
285 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
286 | CLANG_WARN_STRICT_PROTOTYPES = YES;
287 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
288 | CLANG_WARN_UNREACHABLE_CODE = YES;
289 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
290 | CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements";
291 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
292 | COPY_PHASE_STRIP = NO;
293 | ENABLE_STRICT_OBJC_MSGSEND = YES;
294 | ENABLE_TESTABILITY = YES;
295 | GCC_C_LANGUAGE_STANDARD = gnu99;
296 | GCC_DYNAMIC_NO_PIC = NO;
297 | GCC_NO_COMMON_BLOCKS = YES;
298 | GCC_OPTIMIZATION_LEVEL = 0;
299 | GCC_PREPROCESSOR_DEFINITIONS = (
300 | "DEBUG=1",
301 | "$(inherited)",
302 | );
303 | GCC_SYMBOLS_PRIVATE_EXTERN = NO;
304 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
305 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
306 | GCC_WARN_UNDECLARED_SELECTOR = YES;
307 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
308 | GCC_WARN_UNUSED_FUNCTION = YES;
309 | GCC_WARN_UNUSED_VARIABLE = YES;
310 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
311 | MTL_ENABLE_DEBUG_INFO = YES;
312 | ONLY_ACTIVE_ARCH = YES;
313 | SDKROOT = iphoneos;
314 | SWIFT_OPTIMIZATION_LEVEL = "-Onone";
315 | SWIFT_VERSION = 4.1;
316 | };
317 | name = Debug;
318 | };
319 | 14DAEEAE1A51E1BE0070B77E /* Release */ = {
320 | isa = XCBuildConfiguration;
321 | buildSettings = {
322 | ALWAYS_SEARCH_USER_PATHS = NO;
323 | CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x";
324 | CLANG_CXX_LIBRARY = "libc++";
325 | CLANG_ENABLE_MODULES = YES;
326 | CLANG_ENABLE_OBJC_ARC = YES;
327 | CLANG_WARN_BLOCK_CAPTURE_AUTORELEASING = YES;
328 | CLANG_WARN_BOOL_CONVERSION = YES;
329 | CLANG_WARN_COMMA = YES;
330 | CLANG_WARN_CONSTANT_CONVERSION = YES;
331 | CLANG_WARN_DEPRECATED_OBJC_IMPLEMENTATIONS = YES;
332 | CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR;
333 | CLANG_WARN_EMPTY_BODY = YES;
334 | CLANG_WARN_ENUM_CONVERSION = YES;
335 | CLANG_WARN_INFINITE_RECURSION = YES;
336 | CLANG_WARN_INT_CONVERSION = YES;
337 | CLANG_WARN_NON_LITERAL_NULL_CONVERSION = YES;
338 | CLANG_WARN_OBJC_IMPLICIT_RETAIN_SELF = YES;
339 | CLANG_WARN_OBJC_LITERAL_CONVERSION = YES;
340 | CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR;
341 | CLANG_WARN_RANGE_LOOP_ANALYSIS = YES;
342 | CLANG_WARN_STRICT_PROTOTYPES = YES;
343 | CLANG_WARN_SUSPICIOUS_MOVE = YES;
344 | CLANG_WARN_UNREACHABLE_CODE = YES;
345 | CLANG_WARN__DUPLICATE_METHOD_MATCH = YES;
346 | CODE_SIGN_ENTITLEMENTS = "Example-iOS/Example-iOS.entitlements";
347 | "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer";
348 | COPY_PHASE_STRIP = YES;
349 | ENABLE_NS_ASSERTIONS = NO;
350 | ENABLE_STRICT_OBJC_MSGSEND = YES;
351 | GCC_C_LANGUAGE_STANDARD = gnu99;
352 | GCC_NO_COMMON_BLOCKS = YES;
353 | GCC_WARN_64_TO_32_BIT_CONVERSION = YES;
354 | GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR;
355 | GCC_WARN_UNDECLARED_SELECTOR = YES;
356 | GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE;
357 | GCC_WARN_UNUSED_FUNCTION = YES;
358 | GCC_WARN_UNUSED_VARIABLE = YES;
359 | IPHONEOS_DEPLOYMENT_TARGET = 8.0;
360 | MTL_ENABLE_DEBUG_INFO = NO;
361 | SDKROOT = iphoneos;
362 | SWIFT_OPTIMIZATION_LEVEL = "-Owholemodule";
363 | SWIFT_VERSION = 4.1;
364 | VALIDATE_PRODUCT = YES;
365 | };
366 | name = Release;
367 | };
368 | 14DAEEB01A51E1BE0070B77E /* Debug */ = {
369 | isa = XCBuildConfiguration;
370 | buildSettings = {
371 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
372 | DEVELOPMENT_TEAM = 27AEDK3C9F;
373 | INFOPLIST_FILE = "Example-iOS/Info.plist";
374 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
375 | PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
376 | PRODUCT_NAME = "$(TARGET_NAME)";
377 | };
378 | name = Debug;
379 | };
380 | 14DAEEB11A51E1BE0070B77E /* Release */ = {
381 | isa = XCBuildConfiguration;
382 | buildSettings = {
383 | ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon;
384 | DEVELOPMENT_TEAM = 27AEDK3C9F;
385 | INFOPLIST_FILE = "Example-iOS/Info.plist";
386 | LD_RUNPATH_SEARCH_PATHS = "$(inherited) @executable_path/Frameworks";
387 | PRODUCT_BUNDLE_IDENTIFIER = "com.kishikawakatsumi.$(PRODUCT_NAME:rfc1034identifier)";
388 | PRODUCT_NAME = "$(TARGET_NAME)";
389 | };
390 | name = Release;
391 | };
392 | /* End XCBuildConfiguration section */
393 |
394 | /* Begin XCConfigurationList section */
395 | 14DAEE8B1A51E1BE0070B77E /* Build configuration list for PBXProject "Example-iOS" */ = {
396 | isa = XCConfigurationList;
397 | buildConfigurations = (
398 | 14DAEEAD1A51E1BE0070B77E /* Debug */,
399 | 14DAEEAE1A51E1BE0070B77E /* Release */,
400 | );
401 | defaultConfigurationIsVisible = 0;
402 | defaultConfigurationName = Release;
403 | };
404 | 14DAEEAF1A51E1BE0070B77E /* Build configuration list for PBXNativeTarget "Example-iOS" */ = {
405 | isa = XCConfigurationList;
406 | buildConfigurations = (
407 | 14DAEEB01A51E1BE0070B77E /* Debug */,
408 | 14DAEEB11A51E1BE0070B77E /* Release */,
409 | );
410 | defaultConfigurationIsVisible = 0;
411 | defaultConfigurationName = Release;
412 | };
413 | /* End XCConfigurationList section */
414 | };
415 | rootObject = 14DAEE881A51E1BE0070B77E /* Project object */;
416 | }
417 |
--------------------------------------------------------------------------------
/Examples/Example-iOS/Example-iOS/Base.lproj/Main.storyboard:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
32 |
39 |
40 |
41 |
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
87 |
88 |
89 |
90 |
91 |
92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
115 |
116 |
117 |
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
126 |
127 |
128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
169 |
170 |
171 |
172 |
173 |
174 |
175 |
176 |
177 |
178 |
179 |
180 |
181 |
182 |
183 |
184 |
185 |
186 |
187 |
188 |
189 |
190 |
191 |
192 |
193 |
194 |
195 |
196 |
197 |
198 |
199 |
200 |
201 |
202 |
203 |
204 |
205 |
206 |
207 |
208 |
209 |
210 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # KeychainAccess
2 | [](https://travis-ci.org/kishikawakatsumi/KeychainAccess)
3 | [](https://codecov.io/gh/kishikawakatsumi/KeychainAccess)
4 | [](https://github.com/Carthage/Carthage)
5 | [](http://cocoadocs.org/docsets/KeychainAccess)
6 | [](http://cocoadocs.org/docsets/KeychainAccess)
7 | [](https://swift.org/)
8 | [](https://swift.org/)
9 | [](https://swift.org/)
10 |
11 | KeychainAccess is a simple Swift wrapper for Keychain that works on iOS and OS X. Makes using Keychain APIs extremely easy and much more palatable to use in Swift.
12 |
13 |
14 |
15 |
16 |
17 | ## :bulb: Features
18 |
19 | - Simple interface
20 | - Support access group
21 | - [Support accessibility](#accessibility)
22 | - [Support iCloud sharing](#icloud_sharing)
23 | - **[Support TouchID and Keychain integration (iOS 8+)](#touch_id_integration)**
24 | - **[Support Shared Web Credentials (iOS 8+)](#shared_web_credentials)**
25 | - [Works on both iOS & OS X](#requirements)
26 | - [watchOS and tvOS are supported](#requirements)
27 | - **[Swift 4 & Swift 3 compatible](#requirements)**
28 |
29 | ## :book: Usage
30 |
31 | ##### :eyes: See also:
32 | - [:link: iOS Example Project](https://github.com/kishikawakatsumi/KeychainAccess/tree/master/Examples/Example-iOS)
33 |
34 | ### :key: Basics
35 |
36 | #### Saving Application Password
37 |
38 | ```swift
39 | let keychain = Keychain(service: "com.example.github-token")
40 | keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
41 | ```
42 |
43 | #### Saving Internet Password
44 |
45 | ```swift
46 | let keychain = Keychain(server: "https://github.com", protocolType: .https)
47 | keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
48 | ```
49 |
50 | ### :key: Instantiation
51 |
52 | #### Create Keychain for Application Password
53 |
54 | ```swift
55 | let keychain = Keychain(service: "com.example.github-token")
56 | ```
57 |
58 | ```swift
59 | let keychain = Keychain(service: "com.example.github-token", accessGroup: "12ABCD3E4F.shared")
60 | ```
61 |
62 | #### Create Keychain for Internet Password
63 |
64 | ```swift
65 | let keychain = Keychain(server: "https://github.com", protocolType: .https)
66 | ```
67 |
68 | ```swift
69 | let keychain = Keychain(server: "https://github.com", protocolType: .https, authenticationType: .htmlForm)
70 | ```
71 |
72 | ### :key: Adding an item
73 |
74 | #### subscripting
75 |
76 | ##### for String
77 |
78 | ```swift
79 | keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
80 | ```
81 |
82 | ```swift
83 | keychain[string: "kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
84 | ```
85 |
86 | ##### for NSData
87 |
88 | ```swift
89 | keychain[data: "secret"] = NSData(contentsOfFile: "secret.bin")
90 | ```
91 |
92 | #### set method
93 |
94 | ```swift
95 | keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
96 | ```
97 |
98 | #### error handling
99 |
100 | ```swift
101 | do {
102 | try keychain.set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
103 | }
104 | catch let error {
105 | print(error)
106 | }
107 | ```
108 |
109 | ### :key: Obtaining an item
110 |
111 | #### subscripting
112 |
113 | ##### for String (If the value is NSData, attempt to convert to String)
114 |
115 | ```swift
116 | let token = keychain["kishikawakatsumi"]
117 | ```
118 |
119 | ```swift
120 | let token = keychain[string: "kishikawakatsumi"]
121 | ```
122 |
123 | ##### for NSData
124 |
125 | ```swift
126 | let secretData = keychain[data: "secret"]
127 | ```
128 |
129 | #### get methods
130 |
131 | ##### as String
132 |
133 | ```swift
134 | let token = try? keychain.get("kishikawakatsumi")
135 | ```
136 |
137 | ```swift
138 | let token = try? keychain.getString("kishikawakatsumi")
139 | ```
140 |
141 | ##### as NSData
142 |
143 | ```swift
144 | let data = try? keychain.getData("kishikawakatsumi")
145 | ```
146 |
147 | ### :key: Removing an item
148 |
149 | #### subscripting
150 |
151 | ```swift
152 | keychain["kishikawakatsumi"] = nil
153 | ```
154 |
155 | #### remove method
156 |
157 | ```swift
158 | do {
159 | try keychain.remove("kishikawakatsumi")
160 | } catch let error {
161 | print("error: \(error)")
162 | }
163 | ```
164 |
165 | ### :key: Set Label and Comment
166 |
167 | ```swift
168 | let keychain = Keychain(server: "https://github.com", protocolType: .https)
169 | do {
170 | try keychain
171 | .label("github.com (kishikawakatsumi)")
172 | .comment("github access token")
173 | .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
174 | } catch let error {
175 | print("error: \(error)")
176 | }
177 | ```
178 |
179 | ### :key: Obtaining Other Attributes
180 |
181 | #### PersistentRef
182 |
183 | ```swift
184 | let keychain = Keychain()
185 | let persistentRef = keychain[attributes: "kishikawakatsumi"].persistentRef
186 | ...
187 | ```
188 |
189 | #### Creation Date
190 |
191 | ```swift
192 | let keychain = Keychain()
193 | let creationDate = keychain[attributes: "kishikawakatsumi"].creationDate
194 | ...
195 | ```
196 |
197 | #### All Attributes
198 |
199 | ```swift
200 | let keychain = Keychain()
201 | do {
202 | let attributes = try keychain.get("kishikawakatsumi") { $0 }
203 | print(attributes.comment)
204 | print(attributes.label)
205 | print(attributes.creator)
206 | ...
207 | } catch let error {
208 | print("error: \(error)")
209 | }
210 | ```
211 |
212 | ##### subscripting
213 |
214 | ```swift
215 | let keychain = Keychain()
216 | let attributes = keychain[attributes: "kishikawakatsumi"]
217 | print(attributes.comment)
218 | print(attributes.label)
219 | print(attributes.creator)
220 | ```
221 |
222 | ### :key: Configuration (Accessibility, Sharing, iCloud Sync)
223 |
224 | **Provides fluent interfaces**
225 |
226 | ```swift
227 | let keychain = Keychain(service: "com.example.github-token")
228 | .label("github.com (kishikawakatsumi)")
229 | .synchronizable(true)
230 | .accessibility(.afterFirstUnlock)
231 | ```
232 |
233 | #### Accessibility
234 |
235 | ##### Default accessibility matches background application (=kSecAttrAccessibleAfterFirstUnlock)
236 |
237 | ```swift
238 | let keychain = Keychain(service: "com.example.github-token")
239 | ```
240 |
241 | ##### For background application
242 |
243 | ###### Creating instance
244 |
245 | ```swift
246 | let keychain = Keychain(service: "com.example.github-token")
247 | .accessibility(.afterFirstUnlock)
248 |
249 | keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
250 | ```
251 |
252 | ###### One-shot
253 |
254 | ```swift
255 | let keychain = Keychain(service: "com.example.github-token")
256 |
257 | do {
258 | try keychain
259 | .accessibility(.afterFirstUnlock)
260 | .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
261 | } catch let error {
262 | print("error: \(error)")
263 | }
264 | ```
265 |
266 | ##### For foreground application
267 |
268 | ###### Creating instance
269 |
270 | ```swift
271 | let keychain = Keychain(service: "com.example.github-token")
272 | .accessibility(.whenUnlocked)
273 |
274 | keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
275 | ```
276 |
277 | ###### One-shot
278 |
279 | ```swift
280 | let keychain = Keychain(service: "com.example.github-token")
281 |
282 | do {
283 | try keychain
284 | .accessibility(.whenUnlocked)
285 | .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
286 | } catch let error {
287 | print("error: \(error)")
288 | }
289 | ```
290 |
291 | #### :couple: Sharing Keychain items
292 |
293 | ```swift
294 | let keychain = Keychain(service: "com.example.github-token", accessGroup: "12ABCD3E4F.shared")
295 | ```
296 |
297 | #### :arrows_counterclockwise: Synchronizing Keychain items with iCloud
298 |
299 | ###### Creating instance
300 |
301 | ```swift
302 | let keychain = Keychain(service: "com.example.github-token")
303 | .synchronizable(true)
304 |
305 | keychain["kishikawakatsumi"] = "01234567-89ab-cdef-0123-456789abcdef"
306 | ```
307 |
308 | ###### One-shot
309 |
310 | ```swift
311 | let keychain = Keychain(service: "com.example.github-token")
312 |
313 | do {
314 | try keychain
315 | .synchronizable(true)
316 | .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
317 | } catch let error {
318 | print("error: \(error)")
319 | }
320 | ```
321 |
322 | ### :fu: Touch ID integration
323 |
324 | **Any Operation that require authentication must be run in the background thread.**
325 | **If you run in the main thread, UI thread will lock for the system to try to display the authentication dialog.**
326 |
327 | #### :closed_lock_with_key: Adding a Touch ID protected item
328 |
329 | If you want to store the Touch ID protected Keychain item, specify `accessibility` and `authenticationPolicy` attributes.
330 |
331 | ```swift
332 | let keychain = Keychain(service: "com.example.github-token")
333 |
334 | DispatchQueue.global().async {
335 | do {
336 | // Should be the secret invalidated when passcode is removed? If not then use `.WhenUnlocked`
337 | try keychain
338 | .accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence)
339 | .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
340 | } catch let error {
341 | // Error handling if needed...
342 | }
343 | }
344 | ```
345 |
346 | #### :closed_lock_with_key: Updating a Touch ID protected item
347 |
348 | The same way as when adding.
349 |
350 | **Do not run in the main thread if there is a possibility that the item you are trying to add already exists, and protected.**
351 | **Because updating protected items requires authentication.**
352 |
353 | Additionally, you want to show custom authentication prompt message when updating, specify an `authenticationPrompt` attribute.
354 | If the item not protected, the `authenticationPrompt` parameter just be ignored.
355 |
356 | ```swift
357 | let keychain = Keychain(service: "com.example.github-token")
358 |
359 | DispatchQueue.global().async {
360 | do {
361 | // Should be the secret invalidated when passcode is removed? If not then use `.WhenUnlocked`
362 | try keychain
363 | .accessibility(.whenPasscodeSetThisDeviceOnly, authenticationPolicy: .userPresence)
364 | .authenticationPrompt("Authenticate to update your access token")
365 | .set("01234567-89ab-cdef-0123-456789abcdef", key: "kishikawakatsumi")
366 | } catch let error {
367 | // Error handling if needed...
368 | }
369 | }
370 | ```
371 |
372 | #### :closed_lock_with_key: Obtaining a Touch ID protected item
373 |
374 | The same way as when you get a normal item. It will be displayed automatically Touch ID or passcode authentication If the item you try to get is protected.
375 | If you want to show custom authentication prompt message, specify an `authenticationPrompt` attribute.
376 | If the item not protected, the `authenticationPrompt` parameter just be ignored.
377 |
378 | ```swift
379 | let keychain = Keychain(service: "com.example.github-token")
380 |
381 | DispatchQueue.global().async {
382 | do {
383 | let password = try keychain
384 | .authenticationPrompt("Authenticate to login to server")
385 | .get("kishikawakatsumi")
386 |
387 | print("password: \(password)")
388 | } catch let error {
389 | // Error handling if needed...
390 | }
391 | }
392 | ```
393 |
394 | #### :closed_lock_with_key: Removing a Touch ID protected item
395 |
396 | The same way as when you remove a normal item.
397 | There is no way to show Touch ID or passcode authentication when removing Keychain items.
398 |
399 | ```swift
400 | let keychain = Keychain(service: "com.example.github-token")
401 |
402 | do {
403 | try keychain.remove("kishikawakatsumi")
404 | } catch let error {
405 | // Error handling if needed...
406 | }
407 | ```
408 |
409 | ### :key: Shared Web Credentials
410 |
411 | > Shared web credentials is a programming interface that enables native iOS apps to share credentials with their website counterparts. For example, a user may log in to a website in Safari, entering a user name and password, and save those credentials using the iCloud Keychain. Later, the user may run a native app from the same developer, and instead of the app requiring the user to reenter a user name and password, shared web credentials gives it access to the credentials that were entered earlier in Safari. The user can also create new accounts, update passwords, or delete her account from within the app. These changes are then saved and used by Safari.
412 |
413 |
414 |
415 | ```swift
416 | let keychain = Keychain(server: "https://www.kishikawakatsumi.com", protocolType: .HTTPS)
417 |
418 | let username = "kishikawakatsumi@mac.com"
419 |
420 | // First, check the credential in the app's Keychain
421 | if let password = try? keychain.get(username) {
422 | // If found password in the Keychain,
423 | // then log into the server
424 | } else {
425 | // If not found password in the Keychain,
426 | // try to read from Shared Web Credentials
427 | keychain.getSharedPassword(username) { (password, error) -> () in
428 | if password != nil {
429 | // If found password in the Shared Web Credentials,
430 | // then log into the server
431 | // and save the password to the Keychain
432 |
433 | keychain[username] = password
434 | } else {
435 | // If not found password either in the Keychain also Shared Web Credentials,
436 | // prompt for username and password
437 |
438 | // Log into server
439 |
440 | // If the login is successful,
441 | // save the credentials to both the Keychain and the Shared Web Credentials.
442 |
443 | keychain[username] = inputPassword
444 | keychain.setSharedPassword(inputPassword, account: username)
445 | }
446 | }
447 | }
448 | ```
449 |
450 | #### Request all associated domain's credentials
451 |
452 | ```swift
453 | Keychain.requestSharedWebCredential { (credentials, error) -> () in
454 |
455 | }
456 | ```
457 |
458 | #### Generate strong random password
459 |
460 | Generate strong random password that is in the same format used by Safari autofill (xxx-xxx-xxx-xxx).
461 |
462 | ```swift
463 | let password = Keychain.generatePassword() // => Nhu-GKm-s3n-pMx
464 | ```
465 |
466 | #### How to set up Shared Web Credentials
467 |
468 | > 1. Add a com.apple.developer.associated-domains entitlement to your app. This entitlement must include all the domains with which you want to share credentials.
469 |
470 | > 2. Add an apple-app-site-association file to your website. This file must include application identifiers for all the apps with which the site wants to share credentials, and it must be properly signed.
471 |
472 | > 3. When the app is installed, the system downloads and verifies the site association file for each of its associated domains. If the verification is successful, the app is associated with the domain.
473 |
474 | **More details:**
475 |
476 |
477 | ### :key: Debugging
478 |
479 | #### Display all stored items if print keychain object
480 |
481 | ```swift
482 | let keychain = Keychain(server: "https://github.com", protocolType: .https)
483 | print("\(keychain)")
484 | ```
485 |
486 | ```
487 | =>
488 | [
489 | [authenticationType: default, key: kishikawakatsumi, server: github.com, class: internetPassword, protocol: https]
490 | [authenticationType: default, key: hirohamada, server: github.com, class: internetPassword, protocol: https]
491 | [authenticationType: default, key: honeylemon, server: github.com, class: internetPassword, protocol: https]
492 | ]
493 | ```
494 |
495 | #### Obtaining all stored keys
496 |
497 | ```swift
498 | let keychain = Keychain(server: "https://github.com", protocolType: .https)
499 |
500 | let keys = keychain.allKeys()
501 | for key in keys {
502 | print("key: \(key)")
503 | }
504 | ```
505 |
506 | ```
507 | =>
508 | key: kishikawakatsumi
509 | key: hirohamada
510 | key: honeylemon
511 | ```
512 |
513 | #### Obtaining all stored items
514 |
515 | ```swift
516 | let keychain = Keychain(server: "https://github.com", protocolType: .https)
517 |
518 | let items = keychain.allItems()
519 | for item in items {
520 | print("item: \(item)")
521 | }
522 | ```
523 |
524 | ```
525 | =>
526 | item: [authenticationType: Default, key: kishikawakatsumi, server: github.com, class: InternetPassword, protocol: https]
527 | item: [authenticationType: Default, key: hirohamada, server: github.com, class: InternetPassword, protocol: https]
528 | item: [authenticationType: Default, key: honeylemon, server: github.com, class: InternetPassword, protocol: https]
529 | ```
530 |
531 | ## Requirements
532 |
533 | | | OS | Swift |
534 | |------------|----------------------------------------|---------------|
535 | | **v1.1.x** | iOS 7+, OSX 10.9+ | 1.1 |
536 | | **v1.2.x** | iOS 7+, OSX 10.9+ | 1.2 |
537 | | **v2.0.x** | iOS 7+, OSX 10.9+, watchOS 2+ | 2.0 |
538 | | **v2.1.x** | iOS 7+, OSX 10.9+, watchOS 2+ | 2.0 |
539 | | **v2.2.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 2.0, 2.1 |
540 | | **v2.3.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 2.0, 2.1, 2.2 |
541 | | **v2.4.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 2.2, 2.3 |
542 | | **v3.0.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 3.x |
543 | | **v3.1.x** | iOS 8+, OSX 10.9+, watchOS 2+, tvOS 9+ | 4.0, 4.1 |
544 |
545 | ## Installation
546 |
547 | ### CocoaPods
548 |
549 | KeychainAccess is available through [CocoaPods](http://cocoapods.org). To install
550 | it, simply add the following lines to your Podfile:
551 |
552 | ```ruby
553 | use_frameworks!
554 | pod 'KeychainAccess'
555 | ```
556 |
557 | ### Carthage
558 |
559 | KeychainAccess is available through [Carthage](https://github.com/Carthage/Carthage). To install
560 | it, simply add the following line to your Cartfile:
561 |
562 | `github "kishikawakatsumi/KeychainAccess"`
563 |
564 | ### Swift Package Manager
565 |
566 | KeychainAccess is also available through [Swift Package Manager](https://github.com/apple/swift-package-manager/).
567 | First, create `Package.swift` that its package declaration includes:
568 |
569 | ```swift
570 | import PackageDescription
571 |
572 | let package = Package(
573 | dependencies: [
574 | .Package(url: "https://github.com/kishikawakatsumi/KeychainAccess.git", majorVersion: 2)
575 | ]
576 | )
577 | ```
578 |
579 | Then, type
580 |
581 | ```shell
582 | $ swift build
583 | ```
584 |
585 | ### To manually add to your project
586 |
587 | 1. Add `Lib/KeychainAccess.xcodeproj` to your project
588 | 2. Link `KeychainAccess.framework` with your target
589 | 3. Add `Copy Files Build Phase` to include the framework to your application bundle
590 |
591 | _See [iOS Example Project](https://github.com/kishikawakatsumi/KeychainAccess/tree/master/Examples/Example-iOS) as reference._
592 |
593 |
594 |
595 | ## Author
596 |
597 | kishikawa katsumi, kishikawakatsumi@mac.com
598 |
599 | ## License
600 |
601 | KeychainAccess is available under the MIT license. See the LICENSE file for more info.
602 |
--------------------------------------------------------------------------------
/Lib/KeychainAccess.xcodeproj/project.pbxproj:
--------------------------------------------------------------------------------
1 | // !$*UTF8*$!
2 | {
3 | archiveVersion = 1;
4 | classes = {
5 | };
6 | objectVersion = 46;
7 | objects = {
8 |
9 | /* Begin PBXBuildFile section */
10 | 140F19621A49D79400B0016A /* KeychainAccess.h in Headers */ = {isa = PBXBuildFile; fileRef = 140F19611A49D79400B0016A /* KeychainAccess.h */; settings = {ATTRIBUTES = (Public, ); }; };
11 | 140F196F1A49D79500B0016A /* KeychainAccessTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F196E1A49D79500B0016A /* KeychainAccessTests.swift */; };
12 | 140F197B1A49D89200B0016A /* Keychain.swift in Sources */ = {isa = PBXBuildFile; fileRef = 140F197A1A49D89200B0016A /* Keychain.swift */; };
13 | 142EDA851BCB505F00A32149 /* ErrorTypeTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142EDA841BCB505F00A32149 /* ErrorTypeTests.swift */; };
14 | 142EDB041BCBB0DD00A32149 /* SharedCredentialTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 142EDB031BCBB0DD00A32149 /* SharedCredentialTests.swift */; };
15 | 148F9D4A1BCB4118006EDF48 /* EnumTests.swift in Sources */ = {isa = PBXBuildFile; fileRef = 148F9D491BCB4118006EDF48 /* EnumTests.swift */; };
16 | 14A630181D3293C700809B3F /* AppDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = 14A630171D3293C700809B3F /* AppDelegate.swift */; };
17 | 14A6301F1D3293C700809B3F /* Assets.xcassets in Resources */ = {isa = PBXBuildFile; fileRef = 14A6301E1D3293C700809B3F /* Assets.xcassets */; };
18 | 14C3A6781D32BF9C00349459 /* KeychainAccess.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 140F195C1A49D79400B0016A /* KeychainAccess.framework */; };
19 | 14C3A6791D32BF9C00349459 /* KeychainAccess.framework in Embed Frameworks */ = {isa = PBXBuildFile; fileRef = 140F195C1A49D79400B0016A /* KeychainAccess.framework */; settings = {ATTRIBUTES = (CodeSignOnCopy, RemoveHeadersOnCopy, ); }; };
20 | /* End PBXBuildFile section */
21 |
22 | /* Begin PBXContainerItemProxy section */
23 | 140F19691A49D79500B0016A /* PBXContainerItemProxy */ = {
24 | isa = PBXContainerItemProxy;
25 | containerPortal = 140F19531A49D79400B0016A /* Project object */;
26 | proxyType = 1;
27 | remoteGlobalIDString = 140F195B1A49D79400B0016A;
28 | remoteInfo = KeychainAccess;
29 | };
30 | 14C3A67A1D32BF9C00349459 /* PBXContainerItemProxy */ = {
31 | isa = PBXContainerItemProxy;
32 | containerPortal = 140F19531A49D79400B0016A /* Project object */;
33 | proxyType = 1;
34 | remoteGlobalIDString = 140F195B1A49D79400B0016A;
35 | remoteInfo = KeychainAccess;
36 | };
37 | 14F0C1991D32A160007DCDDB /* PBXContainerItemProxy */ = {
38 | isa = PBXContainerItemProxy;
39 | containerPortal = 140F19531A49D79400B0016A /* Project object */;
40 | proxyType = 1;
41 | remoteGlobalIDString = 14A630141D3293C700809B3F;
42 | remoteInfo = TestHost;
43 | };
44 | /* End PBXContainerItemProxy section */
45 |
46 | /* Begin PBXCopyFilesBuildPhase section */
47 | 14C3A67C1D32BF9D00349459 /* Embed Frameworks */ = {
48 | isa = PBXCopyFilesBuildPhase;
49 | buildActionMask = 2147483647;
50 | dstPath = "";
51 | dstSubfolderSpec = 10;
52 | files = (
53 | 14C3A6791D32BF9C00349459 /* KeychainAccess.framework in Embed Frameworks */,
54 | );
55 | name = "Embed Frameworks";
56 | runOnlyForDeploymentPostprocessing = 0;
57 | };
58 | /* End PBXCopyFilesBuildPhase section */
59 |
60 | /* Begin PBXFileReference section */
61 | 140F195C1A49D79400B0016A /* KeychainAccess.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = KeychainAccess.framework; sourceTree = BUILT_PRODUCTS_DIR; };
62 | 140F19601A49D79400B0016A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
63 | 140F19611A49D79400B0016A /* KeychainAccess.h */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.c.h; path = KeychainAccess.h; sourceTree = ""; };
64 | 140F19671A49D79500B0016A /* KeychainAccessTests.xctest */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; path = KeychainAccessTests.xctest; sourceTree = BUILT_PRODUCTS_DIR; };
65 | 140F196D1A49D79500B0016A /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
66 | 140F196E1A49D79500B0016A /* KeychainAccessTests.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = KeychainAccessTests.swift; sourceTree = ""; };
67 | 140F197A1A49D89200B0016A /* Keychain.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = Keychain.swift; sourceTree = ""; };
68 | 142EDA841BCB505F00A32149 /* ErrorTypeTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = ErrorTypeTests.swift; sourceTree = ""; };
69 | 142EDB031BCBB0DD00A32149 /* SharedCredentialTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = SharedCredentialTests.swift; sourceTree = ""; };
70 | 148E44E51BF9EDCB004FFEC1 /* Base.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Base.xcconfig; path = Configurations/Base.xcconfig; sourceTree = ""; };
71 | 148E44E61BF9EDCB004FFEC1 /* Debug.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Debug.xcconfig; path = Configurations/Debug.xcconfig; sourceTree = ""; };
72 | 148E44E71BF9EDCB004FFEC1 /* Release.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Release.xcconfig; path = Configurations/Release.xcconfig; sourceTree = ""; };
73 | 148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = Tests.xcconfig; path = Configurations/Tests.xcconfig; sourceTree = ""; };
74 | 148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = KeychainAccess.xcconfig; path = Configurations/KeychainAccess.xcconfig; sourceTree = ""; };
75 | 148F9D491BCB4118006EDF48 /* EnumTests.swift */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.swift; path = EnumTests.swift; sourceTree = ""; };
76 | 14A630151D3293C700809B3F /* TestHost.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = TestHost.app; sourceTree = BUILT_PRODUCTS_DIR; };
77 | 14A630171D3293C700809B3F /* AppDelegate.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppDelegate.swift; sourceTree = ""; };
78 | 14A6301E1D3293C700809B3F /* Assets.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; path = Assets.xcassets; sourceTree = ""; };
79 | 14A630231D3293C700809B3F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; };
80 | 14F0C1961D3295C4007DCDDB /* TestHost.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.xml; path = TestHost.entitlements; sourceTree = ""; };
81 | 14F0C1981D329832007DCDDB /* TestHost.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = TestHost.xcconfig; path = Configurations/TestHost.xcconfig; sourceTree = ""; };
82 | /* End PBXFileReference section */
83 |
84 | /* Begin PBXFrameworksBuildPhase section */
85 | 140F19581A49D79400B0016A /* Frameworks */ = {
86 | isa = PBXFrameworksBuildPhase;
87 | buildActionMask = 2147483647;
88 | files = (
89 | );
90 | runOnlyForDeploymentPostprocessing = 0;
91 | };
92 | 140F19641A49D79500B0016A /* Frameworks */ = {
93 | isa = PBXFrameworksBuildPhase;
94 | buildActionMask = 2147483647;
95 | files = (
96 | );
97 | runOnlyForDeploymentPostprocessing = 0;
98 | };
99 | 14A630121D3293C700809B3F /* Frameworks */ = {
100 | isa = PBXFrameworksBuildPhase;
101 | buildActionMask = 2147483647;
102 | files = (
103 | 14C3A6781D32BF9C00349459 /* KeychainAccess.framework in Frameworks */,
104 | );
105 | runOnlyForDeploymentPostprocessing = 0;
106 | };
107 | /* End PBXFrameworksBuildPhase section */
108 |
109 | /* Begin PBXGroup section */
110 | 140F19521A49D79400B0016A = {
111 | isa = PBXGroup;
112 | children = (
113 | 140F195E1A49D79400B0016A /* KeychainAccess */,
114 | 140F196B1A49D79500B0016A /* KeychainAccessTests */,
115 | 148E44E41BF9ED6D004FFEC1 /* Cofigurations */,
116 | 14A630161D3293C700809B3F /* TestHost */,
117 | 140F195D1A49D79400B0016A /* Products */,
118 | );
119 | sourceTree = "";
120 | };
121 | 140F195D1A49D79400B0016A /* Products */ = {
122 | isa = PBXGroup;
123 | children = (
124 | 140F195C1A49D79400B0016A /* KeychainAccess.framework */,
125 | 140F19671A49D79500B0016A /* KeychainAccessTests.xctest */,
126 | 14A630151D3293C700809B3F /* TestHost.app */,
127 | );
128 | name = Products;
129 | sourceTree = "";
130 | };
131 | 140F195E1A49D79400B0016A /* KeychainAccess */ = {
132 | isa = PBXGroup;
133 | children = (
134 | 140F19611A49D79400B0016A /* KeychainAccess.h */,
135 | 140F197A1A49D89200B0016A /* Keychain.swift */,
136 | 140F195F1A49D79400B0016A /* Supporting Files */,
137 | );
138 | path = KeychainAccess;
139 | sourceTree = "";
140 | };
141 | 140F195F1A49D79400B0016A /* Supporting Files */ = {
142 | isa = PBXGroup;
143 | children = (
144 | 140F19601A49D79400B0016A /* Info.plist */,
145 | );
146 | name = "Supporting Files";
147 | sourceTree = "";
148 | };
149 | 140F196B1A49D79500B0016A /* KeychainAccessTests */ = {
150 | isa = PBXGroup;
151 | children = (
152 | 140F196E1A49D79500B0016A /* KeychainAccessTests.swift */,
153 | 148F9D491BCB4118006EDF48 /* EnumTests.swift */,
154 | 142EDA841BCB505F00A32149 /* ErrorTypeTests.swift */,
155 | 142EDB031BCBB0DD00A32149 /* SharedCredentialTests.swift */,
156 | 140F196C1A49D79500B0016A /* Supporting Files */,
157 | );
158 | path = KeychainAccessTests;
159 | sourceTree = "";
160 | };
161 | 140F196C1A49D79500B0016A /* Supporting Files */ = {
162 | isa = PBXGroup;
163 | children = (
164 | 140F196D1A49D79500B0016A /* Info.plist */,
165 | );
166 | name = "Supporting Files";
167 | sourceTree = "";
168 | };
169 | 148E44E41BF9ED6D004FFEC1 /* Cofigurations */ = {
170 | isa = PBXGroup;
171 | children = (
172 | 148E44E51BF9EDCB004FFEC1 /* Base.xcconfig */,
173 | 148E44E61BF9EDCB004FFEC1 /* Debug.xcconfig */,
174 | 148E44E71BF9EDCB004FFEC1 /* Release.xcconfig */,
175 | 148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */,
176 | 148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */,
177 | 14F0C1981D329832007DCDDB /* TestHost.xcconfig */,
178 | );
179 | name = Cofigurations;
180 | sourceTree = "";
181 | };
182 | 14A630161D3293C700809B3F /* TestHost */ = {
183 | isa = PBXGroup;
184 | children = (
185 | 14A630171D3293C700809B3F /* AppDelegate.swift */,
186 | 14A6301E1D3293C700809B3F /* Assets.xcassets */,
187 | 14A630231D3293C700809B3F /* Info.plist */,
188 | 14F0C1961D3295C4007DCDDB /* TestHost.entitlements */,
189 | );
190 | path = TestHost;
191 | sourceTree = "";
192 | };
193 | /* End PBXGroup section */
194 |
195 | /* Begin PBXHeadersBuildPhase section */
196 | 140F19591A49D79400B0016A /* Headers */ = {
197 | isa = PBXHeadersBuildPhase;
198 | buildActionMask = 2147483647;
199 | files = (
200 | 140F19621A49D79400B0016A /* KeychainAccess.h in Headers */,
201 | );
202 | runOnlyForDeploymentPostprocessing = 0;
203 | };
204 | /* End PBXHeadersBuildPhase section */
205 |
206 | /* Begin PBXNativeTarget section */
207 | 140F195B1A49D79400B0016A /* KeychainAccess */ = {
208 | isa = PBXNativeTarget;
209 | buildConfigurationList = 140F19721A49D79500B0016A /* Build configuration list for PBXNativeTarget "KeychainAccess" */;
210 | buildPhases = (
211 | 140F19571A49D79400B0016A /* Sources */,
212 | 140F19581A49D79400B0016A /* Frameworks */,
213 | 140F19591A49D79400B0016A /* Headers */,
214 | 140F195A1A49D79400B0016A /* Resources */,
215 | );
216 | buildRules = (
217 | );
218 | dependencies = (
219 | );
220 | name = KeychainAccess;
221 | productName = KeychainAccess;
222 | productReference = 140F195C1A49D79400B0016A /* KeychainAccess.framework */;
223 | productType = "com.apple.product-type.framework";
224 | };
225 | 140F19661A49D79500B0016A /* KeychainAccessTests */ = {
226 | isa = PBXNativeTarget;
227 | buildConfigurationList = 140F19751A49D79500B0016A /* Build configuration list for PBXNativeTarget "KeychainAccessTests" */;
228 | buildPhases = (
229 | 140F19631A49D79500B0016A /* Sources */,
230 | 140F19641A49D79500B0016A /* Frameworks */,
231 | 140F19651A49D79500B0016A /* Resources */,
232 | );
233 | buildRules = (
234 | );
235 | dependencies = (
236 | 140F196A1A49D79500B0016A /* PBXTargetDependency */,
237 | 14F0C19A1D32A160007DCDDB /* PBXTargetDependency */,
238 | );
239 | name = KeychainAccessTests;
240 | productName = KeychainAccessTests;
241 | productReference = 140F19671A49D79500B0016A /* KeychainAccessTests.xctest */;
242 | productType = "com.apple.product-type.bundle.unit-test";
243 | };
244 | 14A630141D3293C700809B3F /* TestHost */ = {
245 | isa = PBXNativeTarget;
246 | buildConfigurationList = 14A630241D3293C700809B3F /* Build configuration list for PBXNativeTarget "TestHost" */;
247 | buildPhases = (
248 | 14A630111D3293C700809B3F /* Sources */,
249 | 14A630121D3293C700809B3F /* Frameworks */,
250 | 14A630131D3293C700809B3F /* Resources */,
251 | 14C3A67C1D32BF9D00349459 /* Embed Frameworks */,
252 | );
253 | buildRules = (
254 | );
255 | dependencies = (
256 | 14C3A67B1D32BF9C00349459 /* PBXTargetDependency */,
257 | );
258 | name = TestHost;
259 | productName = TestHost;
260 | productReference = 14A630151D3293C700809B3F /* TestHost.app */;
261 | productType = "com.apple.product-type.application";
262 | };
263 | /* End PBXNativeTarget section */
264 |
265 | /* Begin PBXProject section */
266 | 140F19531A49D79400B0016A /* Project object */ = {
267 | isa = PBXProject;
268 | attributes = {
269 | LastSwiftUpdateCheck = 0730;
270 | LastUpgradeCheck = 0930;
271 | ORGANIZATIONNAME = "kishikawa katsumi";
272 | TargetAttributes = {
273 | 140F195B1A49D79400B0016A = {
274 | CreatedOnToolsVersion = 6.1.1;
275 | LastSwiftMigration = 0900;
276 | ProvisioningStyle = Automatic;
277 | };
278 | 140F19661A49D79500B0016A = {
279 | CreatedOnToolsVersion = 6.1.1;
280 | DevelopmentTeam = 27AEDK3C9F;
281 | LastSwiftMigration = 0900;
282 | TestTargetID = 14A62FFC1D32922C00809B3F;
283 | };
284 | 14A630141D3293C700809B3F = {
285 | CreatedOnToolsVersion = 7.3.1;
286 | DevelopmentTeam = 27AEDK3C9F;
287 | LastSwiftMigration = 0900;
288 | SystemCapabilities = {
289 | com.apple.Keychain = {
290 | enabled = 1;
291 | };
292 | };
293 | };
294 | };
295 | };
296 | buildConfigurationList = 140F19561A49D79400B0016A /* Build configuration list for PBXProject "KeychainAccess" */;
297 | compatibilityVersion = "Xcode 3.2";
298 | developmentRegion = English;
299 | hasScannedForEncodings = 0;
300 | knownRegions = (
301 | en,
302 | Base,
303 | );
304 | mainGroup = 140F19521A49D79400B0016A;
305 | productRefGroup = 140F195D1A49D79400B0016A /* Products */;
306 | projectDirPath = "";
307 | projectRoot = "";
308 | targets = (
309 | 140F195B1A49D79400B0016A /* KeychainAccess */,
310 | 140F19661A49D79500B0016A /* KeychainAccessTests */,
311 | 14A630141D3293C700809B3F /* TestHost */,
312 | );
313 | };
314 | /* End PBXProject section */
315 |
316 | /* Begin PBXResourcesBuildPhase section */
317 | 140F195A1A49D79400B0016A /* Resources */ = {
318 | isa = PBXResourcesBuildPhase;
319 | buildActionMask = 2147483647;
320 | files = (
321 | );
322 | runOnlyForDeploymentPostprocessing = 0;
323 | };
324 | 140F19651A49D79500B0016A /* Resources */ = {
325 | isa = PBXResourcesBuildPhase;
326 | buildActionMask = 2147483647;
327 | files = (
328 | );
329 | runOnlyForDeploymentPostprocessing = 0;
330 | };
331 | 14A630131D3293C700809B3F /* Resources */ = {
332 | isa = PBXResourcesBuildPhase;
333 | buildActionMask = 2147483647;
334 | files = (
335 | 14A6301F1D3293C700809B3F /* Assets.xcassets in Resources */,
336 | );
337 | runOnlyForDeploymentPostprocessing = 0;
338 | };
339 | /* End PBXResourcesBuildPhase section */
340 |
341 | /* Begin PBXSourcesBuildPhase section */
342 | 140F19571A49D79400B0016A /* Sources */ = {
343 | isa = PBXSourcesBuildPhase;
344 | buildActionMask = 2147483647;
345 | files = (
346 | 140F197B1A49D89200B0016A /* Keychain.swift in Sources */,
347 | );
348 | runOnlyForDeploymentPostprocessing = 0;
349 | };
350 | 140F19631A49D79500B0016A /* Sources */ = {
351 | isa = PBXSourcesBuildPhase;
352 | buildActionMask = 2147483647;
353 | files = (
354 | 140F196F1A49D79500B0016A /* KeychainAccessTests.swift in Sources */,
355 | 148F9D4A1BCB4118006EDF48 /* EnumTests.swift in Sources */,
356 | 142EDA851BCB505F00A32149 /* ErrorTypeTests.swift in Sources */,
357 | 142EDB041BCBB0DD00A32149 /* SharedCredentialTests.swift in Sources */,
358 | );
359 | runOnlyForDeploymentPostprocessing = 0;
360 | };
361 | 14A630111D3293C700809B3F /* Sources */ = {
362 | isa = PBXSourcesBuildPhase;
363 | buildActionMask = 2147483647;
364 | files = (
365 | 14A630181D3293C700809B3F /* AppDelegate.swift in Sources */,
366 | );
367 | runOnlyForDeploymentPostprocessing = 0;
368 | };
369 | /* End PBXSourcesBuildPhase section */
370 |
371 | /* Begin PBXTargetDependency section */
372 | 140F196A1A49D79500B0016A /* PBXTargetDependency */ = {
373 | isa = PBXTargetDependency;
374 | target = 140F195B1A49D79400B0016A /* KeychainAccess */;
375 | targetProxy = 140F19691A49D79500B0016A /* PBXContainerItemProxy */;
376 | };
377 | 14C3A67B1D32BF9C00349459 /* PBXTargetDependency */ = {
378 | isa = PBXTargetDependency;
379 | target = 140F195B1A49D79400B0016A /* KeychainAccess */;
380 | targetProxy = 14C3A67A1D32BF9C00349459 /* PBXContainerItemProxy */;
381 | };
382 | 14F0C19A1D32A160007DCDDB /* PBXTargetDependency */ = {
383 | isa = PBXTargetDependency;
384 | target = 14A630141D3293C700809B3F /* TestHost */;
385 | targetProxy = 14F0C1991D32A160007DCDDB /* PBXContainerItemProxy */;
386 | };
387 | /* End PBXTargetDependency section */
388 |
389 | /* Begin XCBuildConfiguration section */
390 | 140F19701A49D79500B0016A /* Debug */ = {
391 | isa = XCBuildConfiguration;
392 | baseConfigurationReference = 148E44E61BF9EDCB004FFEC1 /* Debug.xcconfig */;
393 | buildSettings = {
394 | };
395 | name = Debug;
396 | };
397 | 140F19711A49D79500B0016A /* Release */ = {
398 | isa = XCBuildConfiguration;
399 | baseConfigurationReference = 148E44E71BF9EDCB004FFEC1 /* Release.xcconfig */;
400 | buildSettings = {
401 | };
402 | name = Release;
403 | };
404 | 140F19731A49D79500B0016A /* Debug */ = {
405 | isa = XCBuildConfiguration;
406 | baseConfigurationReference = 148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */;
407 | buildSettings = {
408 | };
409 | name = Debug;
410 | };
411 | 140F19741A49D79500B0016A /* Release */ = {
412 | isa = XCBuildConfiguration;
413 | baseConfigurationReference = 148E44EB1BF9EEB3004FFEC1 /* KeychainAccess.xcconfig */;
414 | buildSettings = {
415 | };
416 | name = Release;
417 | };
418 | 140F19761A49D79500B0016A /* Debug */ = {
419 | isa = XCBuildConfiguration;
420 | baseConfigurationReference = 148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */;
421 | buildSettings = {
422 | };
423 | name = Debug;
424 | };
425 | 140F19771A49D79500B0016A /* Release */ = {
426 | isa = XCBuildConfiguration;
427 | baseConfigurationReference = 148E44E91BF9EDE4004FFEC1 /* Tests.xcconfig */;
428 | buildSettings = {
429 | };
430 | name = Release;
431 | };
432 | 14A630251D3293C700809B3F /* Debug */ = {
433 | isa = XCBuildConfiguration;
434 | baseConfigurationReference = 14F0C1981D329832007DCDDB /* TestHost.xcconfig */;
435 | buildSettings = {
436 | };
437 | name = Debug;
438 | };
439 | 14A630261D3293C700809B3F /* Release */ = {
440 | isa = XCBuildConfiguration;
441 | baseConfigurationReference = 14F0C1981D329832007DCDDB /* TestHost.xcconfig */;
442 | buildSettings = {
443 | };
444 | name = Release;
445 | };
446 | /* End XCBuildConfiguration section */
447 |
448 | /* Begin XCConfigurationList section */
449 | 140F19561A49D79400B0016A /* Build configuration list for PBXProject "KeychainAccess" */ = {
450 | isa = XCConfigurationList;
451 | buildConfigurations = (
452 | 140F19701A49D79500B0016A /* Debug */,
453 | 140F19711A49D79500B0016A /* Release */,
454 | );
455 | defaultConfigurationIsVisible = 0;
456 | defaultConfigurationName = Release;
457 | };
458 | 140F19721A49D79500B0016A /* Build configuration list for PBXNativeTarget "KeychainAccess" */ = {
459 | isa = XCConfigurationList;
460 | buildConfigurations = (
461 | 140F19731A49D79500B0016A /* Debug */,
462 | 140F19741A49D79500B0016A /* Release */,
463 | );
464 | defaultConfigurationIsVisible = 0;
465 | defaultConfigurationName = Release;
466 | };
467 | 140F19751A49D79500B0016A /* Build configuration list for PBXNativeTarget "KeychainAccessTests" */ = {
468 | isa = XCConfigurationList;
469 | buildConfigurations = (
470 | 140F19761A49D79500B0016A /* Debug */,
471 | 140F19771A49D79500B0016A /* Release */,
472 | );
473 | defaultConfigurationIsVisible = 0;
474 | defaultConfigurationName = Release;
475 | };
476 | 14A630241D3293C700809B3F /* Build configuration list for PBXNativeTarget "TestHost" */ = {
477 | isa = XCConfigurationList;
478 | buildConfigurations = (
479 | 14A630251D3293C700809B3F /* Debug */,
480 | 14A630261D3293C700809B3F /* Release */,
481 | );
482 | defaultConfigurationIsVisible = 0;
483 | defaultConfigurationName = Release;
484 | };
485 | /* End XCConfigurationList section */
486 | };
487 | rootObject = 140F19531A49D79400B0016A /* Project object */;
488 | }
489 |
--------------------------------------------------------------------------------