]> git.saurik.com Git - apple/security.git/blob - OSX/sec/Security/SecPasswordGenerate.h
Security-58286.70.7.tar.gz
[apple/security.git] / OSX / sec / Security / SecPasswordGenerate.h
1 /*
2 * Copyright (c) 2000-2004,2013-2014 Apple Inc. All Rights Reserved.
3 *
4 * @APPLE_LICENSE_HEADER_START@
5 *
6 * This file contains Original Code and/or Modifications of Original Code
7 * as defined in and that are subject to the Apple Public Source License
8 * Version 2.0 (the 'License'). You may not use this file except in
9 * compliance with the License. Please obtain a copy of the License at
10 * http://www.opensource.apple.com/apsl/ and read it before using this
11 * file.
12 *
13 * The Original Code and all software distributed under the License are
14 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
15 * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
16 * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
18 * Please see the License for the specific language governing rights and
19 * limitations under the License.
20 *
21 * @APPLE_LICENSE_HEADER_END@
22 */
23
24 /*!
25 @header SecPasswordGenerate
26 SecPassword implements logic to use the system facilities for acquiring a password,
27 optionally stored and retrieved from the user's keychain.
28 */
29
30 #ifndef _SECURITY_SECPASSWORDGENERATE_H_
31 #define _SECURITY_SECPASSWORDGENERATE_H_
32
33 #ifdef __cplusplus
34 extern "C" {
35 #endif
36
37 #include <CoreFoundation/CoreFoundation.h>
38 #include <Security/SecBase.h>
39
40 typedef uint32_t SecPasswordType;
41 enum {
42 kSecPasswordTypeSafari = 0,
43 kSecPasswordTypeiCloudRecovery = 1,
44 kSecPasswordTypeWifi = 2,
45 kSecPasswordTypePIN = 3,
46 kSecPasswordTypeiCloudRecoveryKey __OSX_AVAILABLE(10.12.4) __IOS_AVAILABLE(10.4) = 4,
47 } __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
48
49 // Keys for external dictionaries with password generation requirements we read from plist.
50 extern CFStringRef kSecPasswordDefaultForType
51 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
52
53 extern CFStringRef kSecPasswordMinLengthKey
54 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
55 extern CFStringRef kSecPasswordMaxLengthKey
56 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
57 extern CFStringRef kSecPasswordAllowedCharactersKey
58 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
59 extern CFStringRef kSecPasswordRequiredCharactersKey
60 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
61
62 extern CFStringRef kSecPasswordDisallowedCharacters
63 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
64 extern CFStringRef kSecPasswordCantStartWithChars
65 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
66 extern CFStringRef kSecPasswordCantEndWithChars
67 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
68
69 extern CFStringRef kSecPasswordContainsNoMoreThanNSpecificCharacters
70 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
71 extern CFStringRef kSecPasswordContainsAtLeastNSpecificCharacters
72 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
73 extern CFStringRef kSecPasswordContainsNoMoreThanNConsecutiveIdenticalCharacters
74 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
75
76 extern CFStringRef kSecPasswordCharacters
77 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
78 extern CFStringRef kSecPasswordCharacterCount
79 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
80
81 extern CFStringRef kSecPasswordGroupSize
82 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
83 extern CFStringRef kSecPasswordNumberOfGroups
84 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
85 extern CFStringRef kSecPasswordSeparator
86 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
87
88
89 /*
90 @function SecPasswordCopyDefaultPasswordLength
91 @abstract Returns the default length/number of tuples of a defaultly generated password
92 @param type: default password types kSecPasswordTypeSafari, kSecPasswordTypeiCloudRecovery, kSecPasswordTypeWifi, kSecPasswordTypePIN
93 @param error: An error code will be returned if an unrecognized password type is passed to the routine.
94 @result Dictionary consisting of length of tuple and number of tuples or a NULL if the passed type isn't recognized.
95 */
96 CFDictionaryRef SecPasswordCopyDefaultPasswordLength(SecPasswordType type, CFErrorRef *error)
97 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
98
99 /*
100 * Check that password is propery formated (groups, checksum). Make no claim about password quality.
101 */
102 bool
103 SecPasswordValidatePasswordFormat(SecPasswordType type, CFStringRef password, CFErrorRef *error)
104 __OSX_AVAILABLE(10.12.4) __IOS_AVAILABLE(10.4) __WATCHOS_AVAILABLE(3.4) __TVOS_AVAILABLE(10.4);
105
106 /*
107 @function SecPasswordIsPasswordWeak
108 @abstract Evalutes the weakness of a passcode. This function can take any type of passcode. Currently
109 the function evaluates passcodes with only ASCII characters
110 @param passcode a string of any length and type (4 or 6 digit digit PIN, complex passcode)
111 @result True if the password is weak, False if the password is strong.
112 */
113
114 bool SecPasswordIsPasswordWeak(CFStringRef passcode)
115 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
116
117 /*
118 @function SecPasswordIsPasswordWeak2
119 @abstract Evalutes the weakness of a passcode. This function can take any type of passcode. Currently
120 the function evaluates passcodes with only ASCII characters
121 ***conditions in which a passcode will be evaluated as weak***
122 * all repeating characters
123 * repeating 2 digits
124 * is found in the black list of the top 10 most commonly used passcodes
125 * incrementing digits
126 * decrementing digits (including 0987)
127 * low enough levels of entropy (complex passcodes)
128 @param passcode a string of any length and type (4 or 6 digit PIN, complex passcode)
129 @param isSimple is to indicate whether we're evaluating a 4 or 6 digit PIN or a complex passcode
130 @result True if the password is weak, False if the password is strong.
131 */
132
133 bool SecPasswordIsPasswordWeak2(bool isSimple, CFStringRef passcode)
134 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
135
136 /*
137 @function SecPasswordGenerate. Supports generating passwords for Safari, iCloud, Personal
138 Hotspot clients. Will also generate 4 or 6 digit pins.
139 @abstract Returns a generated password based on a set of constraints
140 @param type: type of password to generate. Pass enum types
141 kSecPasswordTypeSafari, kSecPasswordTypeiCloudRecovery, kSecPasswordTypeWifi, or kSecPasswordTypePIN
142 @param error: An error code will be returned if an error is encountered. Check SecBase.h for the list of codes.
143 @param passwordRequirements: a dictionary containing a set of password requirements.
144 ex: password type 'safari' requires at least: minLength, maxLength, string
145 of allowed characters, required characters
146 @return NULL or a CFStringRef password
147
148 *Note: This parameters is not required if kSecPasswordTypeiCloudRecovery or kSecPasswordTypePIN is supplied as the type.
149 If kSecPasswordTypeSafari or kSecPasswordTypeWifi is supplied, you must include these dictionary key/value pairs:
150 kSecPasswordMinLengthKey / CFNumberRef
151 kSecPasswordMaxLengthKey / CFNumberRef
152 kSecPasswordAllowedCharactersKey / CFStringRef
153 kSecPasswordRequiredCharactersKey / CFArrayRef of CFCharacterSetRefs
154
155 *Note: *If you would like a custom password type, file a bug in Sec Utilities requesting
156 a new type along with generation specifications (ex. should contain one upper case, one lower case etc)
157
158 *Note: Be sure to release the returned password when done using it.
159 */
160 CF_RETURNS_RETAINED CFStringRef SecPasswordGenerate(SecPasswordType type, CFErrorRef *error, CFDictionaryRef passwordRequirements)
161 __OSX_AVAILABLE_STARTING(__MAC_10_9, __IPHONE_7_0);
162
163 CFStringRef SecPasswordCreateWithRandomDigits(int n, CFErrorRef *error)
164 __OSX_AVAILABLE_STARTING(__MAC_10_11, __IPHONE_9_0);
165
166 #ifdef __cplusplus
167 }
168 #endif
169
170 #endif /* !_SECURITY_SECPASSWORDGENERATE_H_ */