]> git.saurik.com Git - apple/security.git/blob - OSX/sec/securityd/SecItemSchema.c
Security-58286.41.2.tar.gz
[apple/security.git] / OSX / sec / securityd / SecItemSchema.c
1 /*
2 * Copyright (c) 2006-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 * SecItemSchema.c - CoreFoundation-based constants and functions for
26 access to Security items (certificates, keys, identities, and
27 passwords.)
28 */
29
30 #include "SecItemSchema.h"
31 #include <securityd/SecDbKeychainItem.h>
32 #include <keychain/ckks/CKKS.h>
33
34 // MARK -
35 // MARK Keychain version 6 schema
36
37 #define __FLAGS(ARG, ...) SECDBFLAGS(__VA_ARGS__)
38 #define SECDBFLAGS(ARG, ...) __FLAGS_##ARG | __FLAGS(__VA_ARGS__)
39
40 #define SecDbFlags(P,L,I,S,A,D,R,C,H,B,Z,E,N,U,V,Y) (__FLAGS_##P|__FLAGS_##L|__FLAGS_##I|__FLAGS_##S|__FLAGS_##A|__FLAGS_##D|__FLAGS_##R|__FLAGS_##C|__FLAGS_##H|__FLAGS_##B|__FLAGS_##Z|__FLAGS_##E|__FLAGS_##N|__FLAGS_##U|__FLAGS_##V|__FLAGS_##Y)
41
42 #define __FLAGS_ 0
43 #define __FLAGS_P kSecDbPrimaryKeyFlag
44 #define __FLAGS_L kSecDbInFlag
45 #define __FLAGS_I kSecDbIndexFlag
46 #define __FLAGS_S kSecDbSHA1ValueInFlag
47 #define __FLAGS_A kSecDbReturnAttrFlag
48 #define __FLAGS_D kSecDbReturnDataFlag
49 #define __FLAGS_R kSecDbReturnRefFlag
50 #define __FLAGS_C kSecDbInCryptoDataFlag
51 #define __FLAGS_H kSecDbInHashFlag
52 #define __FLAGS_B kSecDbInBackupFlag
53 #define __FLAGS_Z kSecDbDefault0Flag
54 #define __FLAGS_E kSecDbDefaultEmptyFlag
55 #define __FLAGS_N kSecDbNotNullFlag
56 #define __FLAGS_U kSecDbInAuthenticatedDataFlag
57 #define __FLAGS_V0 kSecDbSyncPrimaryKeyV0
58 #define __FLAGS_V2 (kSecDbSyncPrimaryKeyV0 | kSecDbSyncPrimaryKeyV2)
59 #define __FLAGS_Y kSecDbSyncFlag
60
61 // ,----------------- P : Part of primary key
62 // / ,---------------- L : Stored in local database
63 // / / ,--------------- I : Attribute wants an index in the database
64 // / / / ,-------------- S : SHA1 hashed attribute value in database (implies L)
65 // / / / / ,------------- A : Returned to client as attribute in queries
66 // / / / / / ,------------ D : Returned to client as data in queries
67 // / / / / / / ,----------- R : Returned to client as ref/persistent ref in queries
68 // / / / / / / / ,---------- C : Part of encrypted blob
69 // / / / / / / / / ,--------- H : Attribute is part of item SHA1 hash (Implied by C)
70 // / / / / / / / / / ,-------- B : Attribute is part of iTunes/iCloud backup bag
71 // / / / / / / / / / / ,------- Z : Attribute has a default value of 0
72 // / / / / / / / / / / / ,------ E : Attribute has a default value of "" or empty data
73 // / / / / / / / / / / / / ,----- N : Attribute must have a value
74 // / / / / / / / / / / / / / ,---- U : Attribute is stored in authenticated, but not necessarily encrypted data
75 // / / / / / / / / / / / / / / ,--- V0: Sync primary key version
76 // / / / / / / / / / / / / / / / ,- Y : Attribute should be synced
77 // | | | | | | | | | | | | | | | |
78 // common to all | | | | | | | | | | | | | | | |
79 SECDB_ATTR(v6rowid, "rowid", RowId, SecDbFlags( ,L, , , , ,R, , ,B, , , , , , ), NULL, NULL);
80 SECDB_ATTR(v6cdat, "cdat", CreationDate, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), SecDbKeychainItemCopyCurrentDate, NULL);
81 SECDB_ATTR(v6mdat, "mdat",ModificationDate,SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), SecDbKeychainItemCopyCurrentDate, NULL);
82 SECDB_ATTR(v6labl, "labl", Blob, SecDbFlags( ,L, ,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
83 SECDB_ATTR(v6data, "data", EncryptedData, SecDbFlags( ,L, , , , , , , ,B, , , , , , ), SecDbKeychainItemCopyEncryptedData, NULL);
84 SECDB_ATTR(v6agrp, "agrp", String, SecDbFlags(P,L, , ,A, , , ,H, , , ,N,U,V0,Y), NULL, NULL);
85 SECDB_ATTR(v6pdmn, "pdmn", Access, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
86 SECDB_ATTR(v6sync, "sync", Sync, SecDbFlags(P,L,I, ,A, , , ,H, ,Z, ,N,U,V0, ), NULL, NULL);
87 SECDB_ATTR(v6tomb, "tomb", Tomb, SecDbFlags( ,L, , , , , , ,H, ,Z, ,N,U, ,Y), NULL, NULL);
88 SECDB_ATTR(v6sha1, "sha1", SHA1, SecDbFlags( ,L,I, ,A, ,R, , , , , , , , ,Y), SecDbKeychainItemCopySHA1, NULL);
89 SECDB_ATTR(v6accc, "accc", AccessControl, SecDbFlags( , , , ,A, , , , , , , , , , , ), NULL, NULL);
90 SECDB_ATTR(v6v_Data, "v_Data", Data, SecDbFlags( , , , , ,D, ,C,H, , , , , , ,Y), NULL, NULL);
91 SECDB_ATTR(v6v_pk, "v_pk", PrimaryKey, SecDbFlags( , , , , , , , , , , , , , , , ), SecDbKeychainItemCopyPrimaryKey, NULL);
92 SECDB_ATTR(v7vwht, "vwht", String, SecDbFlags(P,L, , ,A, , , ,H, , , , ,U,V2,Y), NULL, NULL);
93 SECDB_ATTR(v7tkid, "tkid", String, SecDbFlags(P,L, , ,A, , , ,H, , , , ,U,V2,Y), NULL, NULL);
94 SECDB_ATTR(v7utomb, "u_Tomb", UTomb, SecDbFlags( , , , , , , , , , , , , , , , ), NULL, NULL);
95 SECDB_ATTR(v8musr, "musr", UUID, SecDbFlags(P,L,I, , , , , , , , , ,N,U, ,Y), NULL, NULL);
96 // genp and inet and keys | | | | | | | | | | | | | | | |
97 SECDB_ATTR(v6crtr, "crtr", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
98 SECDB_ATTR(v6alis, "alis", Blob, SecDbFlags( ,L, ,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
99 // genp and inet | | | | | | | | | | | | | | | |
100 SECDB_ATTR(v6desc, "desc", Blob, SecDbFlags( ,L, ,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
101 SECDB_ATTR(v6icmt, "icmt", Blob, SecDbFlags( ,L, ,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
102 SECDB_ATTR(v6type, "type", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
103 SECDB_ATTR(v6invi, "invi", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
104 SECDB_ATTR(v6nega, "nega", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
105 SECDB_ATTR(v6cusi, "cusi", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
106 SECDB_ATTR(v6prot, "prot", Blob, SecDbFlags( ,L, ,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
107 SECDB_ATTR(v6scrp, "scrp", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
108 SECDB_ATTR(v6acct, "acct", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
109 // genp only | | | | | | | | | | | | | | | |
110 SECDB_ATTR(v6svce, "svce", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
111 SECDB_ATTR(v6gena, "gena", Blob, SecDbFlags( ,L, ,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
112 // inet only | | | | | | | | | | | | | | | |
113 SECDB_ATTR(v6sdmn, "sdmn", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
114 SECDB_ATTR(v6srvr, "srvr", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
115 SECDB_ATTR(v6ptcl, "ptcl", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
116 SECDB_ATTR(v6atyp, "atyp", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
117 SECDB_ATTR(v6port, "port", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
118 SECDB_ATTR(v6path, "path", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
119 // cert only | | | | | | | | | | | | | | | |
120 SECDB_ATTR(v6ctyp, "ctyp", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
121 SECDB_ATTR(v6cenc, "cenc", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
122 SECDB_ATTR(v6subj, "subj", Data, SecDbFlags( ,L,I,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
123 SECDB_ATTR(v6issr, "issr", Data, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
124 SECDB_ATTR(v6slnr, "slnr", Data, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
125 SECDB_ATTR(v6skid, "skid", Data, SecDbFlags( ,L,I,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
126 SECDB_ATTR(v6pkhh, "pkhh", Data, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
127 // cert attributes that share names with common ones but have different flags
128 SECDB_ATTR(v6certalis, "alis", Blob, SecDbFlags( ,L,I,S,A, , ,C,H, , , , , , ,Y), NULL, NULL);
129 // keys only | | | | | | | | | | | | | | | |
130 SECDB_ATTR(v6kcls, "kcls", Number, SecDbFlags(P,L,I,S,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
131 SECDB_ATTR(v6perm, "perm", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
132 SECDB_ATTR(v6priv, "priv", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
133 SECDB_ATTR(v6modi, "modi", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
134 SECDB_ATTR(v6klbl, "klbl", Data, SecDbFlags(P,L,I, ,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
135 SECDB_ATTR(v6atag, "atag", Blob, SecDbFlags(P,L, ,S,A, , ,C,H, , ,E,N, ,V0,Y), NULL, NULL);
136 SECDB_ATTR(v6bsiz, "bsiz", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
137 SECDB_ATTR(v6esiz, "esiz", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
138 SECDB_ATTR(v6sdat, "sdat", Date, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
139 SECDB_ATTR(v6edat, "edat", Date, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
140 SECDB_ATTR(v6sens, "sens", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
141 SECDB_ATTR(v6asen, "asen", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
142 SECDB_ATTR(v6extr, "extr", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
143 SECDB_ATTR(v6next, "next", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
144 SECDB_ATTR(v6encr, "encr", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
145 SECDB_ATTR(v6decr, "decr", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
146 SECDB_ATTR(v6drve, "drve", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
147 SECDB_ATTR(v6sign, "sign", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
148 SECDB_ATTR(v6vrfy, "vrfy", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
149 SECDB_ATTR(v6snrc, "snrc", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
150 SECDB_ATTR(v6vyrc, "vyrc", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
151 SECDB_ATTR(v6wrap, "wrap", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
152 SECDB_ATTR(v6unwp, "unwp", Number, SecDbFlags( ,L,I, ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
153 // keys attributes that share names with common ones but have different flags
154 SECDB_ATTR(v6keytype, "type", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
155 SECDB_ATTR(v6keycrtr, "crtr", Number, SecDbFlags(P,L, , ,A, , ,C,H, ,Z, ,N, ,V0,Y), NULL, NULL);
156 // | | | | | | | | | | | | | | |
157 SECDB_ATTR(v6version, "version", Number, SecDbFlags(P,L, , , , , , , , , , ,N, , ,Y), NULL, NULL);
158 SECDB_ATTR(v91minor, "minor", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N, , ,Y), NULL, NULL);
159
160 SECDB_ATTR(v10_1pcsservice, "pcss", Number, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
161 SECDB_ATTR(v10_1pcspublickey, "pcsk", Blob, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
162 SECDB_ATTR(v10_1pcspublicidentity,"pcsi", Blob, SecDbFlags( ,L, , ,A, , ,C,H, , , , , , ,Y), NULL, NULL);
163
164 SECDB_ATTR(v10itemuuid, "UUID", String, SecDbFlags( ,L, , , , , , , , , , , ,U, , ), NULL, NULL);
165 SECDB_ATTR(v10syncuuid, "UUID", String, SecDbFlags(P,L, , , , , , , , , , , ,U, , ), NULL, NULL);
166 SECDB_ATTR(v10parentKeyUUID, "parentKeyUUID", String, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
167 SECDB_ATTR(v10currentKeyUUID,"currentKeyUUID",String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
168 SECDB_ATTR(v10wrappedkey, "wrappedkey", Blob, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
169 SECDB_ATTR(v10encrypteditem, "encitem", Blob, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
170 SECDB_ATTR(v10gencount, "gencount", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N, , , ), NULL, NULL);
171 SECDB_ATTR(v10action, "action", String, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
172 SECDB_ATTR(v10state, "state", String, SecDbFlags(P,L, , , , , , , , , , ,N, , , ), NULL, NULL);
173 SECDB_ATTR(v10waituntiltime, "waituntil", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
174 SECDB_ATTR(v10encodedCKRecord, "ckrecord", Blob, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
175 SECDB_ATTR(v10_1wasCurrent, "wascurrent", Number, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
176 SECDB_ATTR(v10accessgroup, "accessgroup", String, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
177 SECDB_ATTR(v10keyclass, "keyclass", String, SecDbFlags(P,L, , , , , , , , , , ,N, , , ), NULL, NULL);
178 SECDB_ATTR(v10currentkey, "currentkey", Number, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
179 SECDB_ATTR(v10ckzone, "ckzone", String, SecDbFlags(P,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
180 SECDB_ATTR(v10ckzonecreated, "ckzonecreated", Number, SecDbFlags( ,L, , , , , , , , ,Z, , ,N, , ), NULL, NULL);
181 SECDB_ATTR(v10ckzonesubscribed,"ckzonesubscribed", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N, , , ), NULL, NULL);
182 SECDB_ATTR(v10ratelimiter, "ratelimiter", Blob, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
183 SECDB_ATTR(v10changetoken, "changetoken", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
184 SECDB_ATTR(v10lastfetchtime, "lastfetch", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
185 SECDB_ATTR(v10itempersistentref,"persistref", UUID, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
186 SECDB_ATTR(v10sysbound, "sysb", Number, SecDbFlags( ,L, , ,A, , ,C,H, ,Z, , , , , ), NULL, NULL);
187 SECDB_ATTR(v10encryptionver, "encver", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N,U, , ), NULL, NULL);
188
189 SECDB_ATTR(v10primaryKey, "primaryKey", String, SecDbFlags(P,L, , ,A, , , , , , , ,N,U, , ), NULL, NULL);
190 SECDB_ATTR(v10publickeyHash, "publickeyHash", Blob, SecDbFlags(P,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
191 SECDB_ATTR(v10publickey, "publickey", Blob, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
192 SECDB_ATTR(v10backupData, "backupData", Blob, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
193
194 SECDB_ATTR(v10_1digest, "digest", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
195 SECDB_ATTR(v10_1signatures, "signatures", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
196 SECDB_ATTR(v10_1signerID, "signerID", String, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
197 SECDB_ATTR(v10_1leafIDs, "leafIDs", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
198 SECDB_ATTR(v10_1peerManIDs, "peerManifests", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
199 SECDB_ATTR(v10_1entryDigests,"entryDigests", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
200 SECDB_ATTR(v10_2currentItems,"currentItems", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
201 SECDB_ATTR(v10_2futureData, "futureData", Blob, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
202 SECDB_ATTR(v10_2schema, "schema", Blob, SecDbFlags( ,L, , , , , , , , , , ,N,U, , ), NULL, NULL);
203 SECDB_ATTR(v10_1encRecord, "ckrecord", Blob, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
204
205 SECDB_ATTR(v10_1keyArchiveHash, "key_archive_hash", String, SecDbFlags(P,L, , , , , , , , , , ,N, , , ), NULL, NULL);
206 SECDB_ATTR(v10_1keyArchive, "key_archive", String, SecDbFlags(P,L, , , , , , , , , , ,N, , , ), NULL, NULL);
207 SECDB_ATTR(v10_1archivedKey, "archived_key", String, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
208 SECDB_ATTR(v10_1keyArchiveName, "keyarchive_name", String, SecDbFlags( ,L, , , , , , , , , , ,N, , , ), NULL, NULL);
209 SECDB_ATTR(v10_1optionalEncodedCKRecord, "ckrecord", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
210 SECDB_ATTR(v10_1archiveEscrowID,"archive_escrowid", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
211
212 SECDB_ATTR(v10_1itempersistentref,"persistref", UUID, SecDbFlags( ,L,I, , , , , , , , , ,N,U, , ), NULL, NULL);
213
214 SECDB_ATTR(v10_1currentItemUUID,"currentItemUUID",String, SecDbFlags(P,L, , , , , , , , , , , , , , ), NULL, NULL);
215 SECDB_ATTR(v10_4currentItemUUID,"currentItemUUID",String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
216 SECDB_ATTR(v10_1currentPtrIdentifier,"identifier",String, SecDbFlags(P,L, , , , , , , , , , , , , , ), NULL, NULL);
217
218 SECDB_ATTR(v10_2device, "device", String, SecDbFlags(P,L, , , , , , , , , , , , , , ), NULL, NULL);
219 SECDB_ATTR(v10_2peerid, "peerid", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
220 SECDB_ATTR(v10_2circleStatus,"circlestatus", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
221 SECDB_ATTR(v10_2keyState, "keystate", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
222 SECDB_ATTR(v10_2currentTLK, "currentTLK", String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
223 SECDB_ATTR(v10_2currentClassA,"currentClassA",String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
224 SECDB_ATTR(v10_2currentClassC,"currentClassC",String, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
225
226 SECDB_ATTR(v10_4lastFixup, "lastfixup", Number, SecDbFlags( ,L, , , , , , , , ,Z, , ,N, , ), NULL, NULL);
227
228 SECDB_ATTR(v10_5senderPeerID,"senderpeerid", String, SecDbFlags(P,L, , , , , , , , , , , , , , ), NULL, NULL);
229 SECDB_ATTR(v10_5recvPeerID, "recvpeerid", String, SecDbFlags(P,L, , , , , , , , , , , , , , ), NULL, NULL);
230 SECDB_ATTR(v10_5recvPubKey, "recvpubenckey", Blob, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
231 SECDB_ATTR(v10_5curve, "curve", Number, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
232 SECDB_ATTR(v10_5poisoned, "poisoned", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N, , , ), NULL, NULL);
233 SECDB_ATTR(v10_5epoch, "epoch", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N, , , ), NULL, NULL);
234 SECDB_ATTR(v10_5signature, "signature", Blob, SecDbFlags( ,L, , , , , , , , , , , , , , ), NULL, NULL);
235 SECDB_ATTR(v10_5version, "version", Number, SecDbFlags( ,L, , , , , , , , ,Z, ,N,U, , ), NULL, NULL);
236
237 const SecDbClass v10_5_tlkshare_class = {
238 .name = CFSTR("tlkshare"),
239 .itemclass = false,
240 .attrs = {
241 &v10ckzone,
242 &v10syncuuid,
243 &v10_5senderPeerID,
244 &v10_5recvPeerID,
245 &v10_5recvPubKey,
246 &v10_5curve,
247 &v10_5poisoned,
248 &v10_5epoch,
249 &v10wrappedkey,
250 &v10_5signature,
251 &v10_1encRecord,
252 &v10_5version,
253 0
254 }
255 };
256
257
258 const SecDbClass v10_4_current_item_class = {
259 .name = CFSTR("currentitems"),
260 .itemclass = false,
261 .attrs = {
262 &v10ckzone,
263 &v10_1currentPtrIdentifier,
264 &v10_4currentItemUUID,
265 &v10state,
266 &v10encodedCKRecord,
267 0
268 }
269 };
270
271 const SecDbClass v10_4_ckstate_class = {
272 .name = CFSTR("ckstate"),
273 .itemclass = false,
274 .attrs = {
275 &v10ckzone,
276 &v10ckzonecreated,
277 &v10ckzonesubscribed,
278 &v10lastfetchtime,
279 &v10changetoken,
280 &v10ratelimiter,
281 &v10_4lastFixup,
282 0
283 }
284 };
285
286 const SecDbClass v10_3_ckdevicestate_class = {
287 .name = CFSTR("ckdevicestate"),
288 .itemclass = false,
289 .attrs = {
290 &v10ckzone,
291 &v10_2device,
292 &v10_2peerid,
293 &v10_2circleStatus,
294 &v10_2keyState,
295 &v10_2currentTLK,
296 &v10_2currentClassA,
297 &v10_2currentClassC,
298 &v10_1encRecord,
299 0
300 }
301 };
302
303 const SecDbClass v10_2_ckmanifest_class = {
304 .name = CFSTR("ckmanifest"),
305 .itemclass = false,
306 .attrs = {
307 &v10ckzone,
308 &v10gencount,
309 &v10_1digest,
310 &v10_1signatures,
311 &v10_1signerID,
312 &v10_1leafIDs,
313 &v10_1peerManIDs,
314 &v10_2currentItems,
315 &v10_2futureData,
316 &v10_2schema,
317 &v10_1encRecord,
318 0
319 }
320 };
321
322 const SecDbClass v10_2_pending_manifest_class = {
323 .name = CFSTR("pending_manifest"),
324 .itemclass = false,
325 .attrs = {
326 &v10ckzone,
327 &v10gencount,
328 &v10_1digest,
329 &v10_1signatures,
330 &v10_1signerID,
331 &v10_1leafIDs,
332 &v10_1peerManIDs,
333 &v10_2currentItems,
334 &v10_2futureData,
335 &v10_2schema,
336 &v10_1encRecord,
337 0
338 }
339 };
340
341 const SecDbClass v10_1_ckmanifest_class = {
342 .name = CFSTR("ckmanifest"),
343 .itemclass = false,
344 .attrs = {
345 &v10ckzone,
346 &v10gencount,
347 &v10_1digest,
348 &v10_1signatures,
349 &v10_1signerID,
350 &v10_1leafIDs,
351 &v10_1peerManIDs,
352 &v10_1encRecord,
353 0
354 }
355 };
356
357 const SecDbClass v10_1_pending_manifest_class = {
358 .name = CFSTR("pending_manifest"),
359 .itemclass = false,
360 .attrs = {
361 &v10ckzone,
362 &v10gencount,
363 &v10_1digest,
364 &v10_1signatures,
365 &v10_1signerID,
366 &v10_1leafIDs,
367 &v10_1peerManIDs,
368 &v10_1encRecord,
369 0
370 }
371 };
372
373 const SecDbClass v10_1_ckmanifest_leaf_class = {
374 .name = CFSTR("ckmanifest_leaf"),
375 .itemclass = false,
376 .attrs = {
377 &v10ckzone,
378 &v10syncuuid,
379 &v10_1digest,
380 &v10_1entryDigests,
381 &v10_1encRecord,
382 0
383 }
384 };
385
386 const SecDbClass v10_1_pending_manifest_leaf_class = {
387 .name = CFSTR("pending_manifest_leaf"),
388 .itemclass = false,
389 .attrs = {
390 &v10ckzone,
391 &v10syncuuid,
392 &v10_1digest,
393 &v10_1entryDigests,
394 &v10_1encRecord,
395 0
396 }
397 };
398
399 const SecDbClass v10_1_genp_class = {
400 .name = CFSTR("genp"),
401 .itemclass = true,
402 .attrs = {
403 &v6rowid,
404 &v6cdat,
405 &v6mdat,
406 &v6desc,
407 &v6icmt,
408 &v6crtr,
409 &v6type,
410 &v6scrp,
411 &v6labl,
412 &v6alis,
413 &v6invi,
414 &v6nega,
415 &v6cusi,
416 &v6prot,
417 &v6acct,
418 &v6svce,
419 &v6gena,
420 &v6data,
421 &v6agrp,
422 &v6pdmn,
423 &v6sync,
424 &v6tomb,
425 &v6sha1,
426 &v7vwht,
427 &v7tkid,
428 &v6v_Data,
429 &v6v_pk,
430 &v6accc,
431 &v7utomb,
432 &v8musr,
433 &v10itemuuid,
434 &v10sysbound,
435 &v10_1pcsservice,
436 &v10_1pcspublickey,
437 &v10_1pcspublicidentity,
438 &v10_1itempersistentref,
439 0
440 },
441 };
442
443 const SecDbClass v10_1_inet_class = {
444 .name = CFSTR("inet"),
445 .itemclass = true,
446 .attrs = {
447 &v6rowid,
448 &v6cdat,
449 &v6mdat,
450 &v6desc,
451 &v6icmt,
452 &v6crtr,
453 &v6type,
454 &v6scrp,
455 &v6labl,
456 &v6alis,
457 &v6invi,
458 &v6nega,
459 &v6cusi,
460 &v6prot,
461 &v6acct,
462 &v6sdmn,
463 &v6srvr,
464 &v6ptcl,
465 &v6atyp,
466 &v6port,
467 &v6path,
468 &v6data,
469 &v6agrp,
470 &v6pdmn,
471 &v6sync,
472 &v6tomb,
473 &v6sha1,
474 &v7vwht,
475 &v7tkid,
476 &v6v_Data,
477 &v6v_pk,
478 &v6accc,
479 &v7utomb,
480 &v8musr,
481 &v10itemuuid,
482 &v10sysbound,
483 &v10_1pcsservice,
484 &v10_1pcspublickey,
485 &v10_1pcspublicidentity,
486 &v10_1itempersistentref,
487 0
488 },
489 };
490
491 const SecDbClass v10_1_cert_class = {
492 .name = CFSTR("cert"),
493 .itemclass = true,
494 .attrs = {
495 &v6rowid,
496 &v6cdat,
497 &v6mdat,
498 &v6ctyp,
499 &v6cenc,
500 &v6labl,
501 &v6certalis,
502 &v6subj,
503 &v6issr,
504 &v6slnr,
505 &v6skid,
506 &v6pkhh,
507 &v6data,
508 &v6agrp,
509 &v6pdmn,
510 &v6sync,
511 &v6tomb,
512 &v6sha1,
513 &v7vwht,
514 &v7tkid,
515 &v6v_Data,
516 &v6v_pk,
517 &v6accc,
518 &v7utomb,
519 &v8musr,
520 &v10itemuuid,
521 &v10sysbound,
522 &v10_1pcsservice,
523 &v10_1pcspublickey,
524 &v10_1pcspublicidentity,
525 &v10_1itempersistentref,
526 0
527 },
528 };
529
530 const SecDbClass v10_1_keys_class = {
531 .name = CFSTR("keys"),
532 .itemclass = true,
533 .attrs = {
534 &v6rowid,
535 &v6cdat,
536 &v6mdat,
537 &v6kcls,
538 &v6labl,
539 &v6alis,
540 &v6perm,
541 &v6priv,
542 &v6modi,
543 &v6klbl,
544 &v6atag,
545 &v6keycrtr,
546 &v6keytype,
547 &v6bsiz,
548 &v6esiz,
549 &v6sdat,
550 &v6edat,
551 &v6sens,
552 &v6asen,
553 &v6extr,
554 &v6next,
555 &v6encr,
556 &v6decr,
557 &v6drve,
558 &v6sign,
559 &v6vrfy,
560 &v6snrc,
561 &v6vyrc,
562 &v6wrap,
563 &v6unwp,
564 &v6data,
565 &v6agrp,
566 &v6pdmn,
567 &v6sync,
568 &v6tomb,
569 &v6sha1,
570 &v7vwht,
571 &v7tkid,
572 &v6v_Data,
573 &v6v_pk,
574 &v6accc,
575 &v7utomb,
576 &v8musr,
577 &v10itemuuid,
578 &v10sysbound,
579 &v10_1pcsservice,
580 &v10_1pcspublickey,
581 &v10_1pcspublicidentity,
582 &v10_1itempersistentref,
583 0
584 }
585 };
586
587 const SecDbClass v10_0_tversion_class = {
588 .name = CFSTR("tversion"),
589 .itemclass = false,
590 .attrs = {
591 &v6rowid,
592 &v6version,
593 &v91minor,
594 0
595 }
596 };
597
598 const SecDbClass v10_2_outgoing_queue_class = {
599 .name = CFSTR("outgoingqueue"),
600 .itemclass = false,
601 .attrs = {
602 &v10ckzone,
603 &v10syncuuid,
604 &v10parentKeyUUID,
605 &v10action,
606 &v10state,
607 &v10waituntiltime,
608 &v10accessgroup,
609 &v10gencount,
610 &v10wrappedkey,
611 &v10encrypteditem,
612 &v10encryptionver,
613 &v10_1optionalEncodedCKRecord,
614 &v10_1pcsservice,
615 &v10_1pcspublickey,
616 &v10_1pcspublicidentity,
617 0
618 }
619 };
620
621 const SecDbClass v10_2_incoming_queue_class = {
622 .name = CFSTR("incomingqueue"),
623 .itemclass = false,
624 .attrs = {
625 &v10ckzone,
626 &v10syncuuid,
627 &v10parentKeyUUID,
628 &v10action,
629 &v10state,
630 &v10gencount,
631 &v10wrappedkey,
632 &v10encrypteditem,
633 &v10encryptionver,
634 &v10_1optionalEncodedCKRecord,
635 &v10_1pcsservice,
636 &v10_1pcspublickey,
637 &v10_1pcspublicidentity,
638 0
639 }
640 };
641
642
643 const SecDbClass v10_1_outgoing_queue_class = {
644 .name = CFSTR("outgoingqueue"),
645 .itemclass = false,
646 .attrs = {
647 &v10ckzone,
648 &v10syncuuid,
649 &v10parentKeyUUID,
650 &v10action,
651 &v10state,
652 &v10waituntiltime,
653 &v10accessgroup,
654 &v10gencount,
655 &v10wrappedkey,
656 &v10encrypteditem,
657 &v10encryptionver,
658 &v10_1pcsservice,
659 &v10_1pcspublickey,
660 &v10_1pcspublicidentity,
661 0
662 }
663 };
664
665 const SecDbClass v10_1_incoming_queue_class = {
666 .name = CFSTR("incomingqueue"),
667 .itemclass = false,
668 .attrs = {
669 &v10ckzone,
670 &v10syncuuid,
671 &v10parentKeyUUID,
672 &v10action,
673 &v10state,
674 &v10gencount,
675 &v10wrappedkey,
676 &v10encrypteditem,
677 &v10encryptionver,
678 &v10_1pcsservice,
679 &v10_1pcspublickey,
680 &v10_1pcspublicidentity,
681 0
682 }
683 };
684
685
686 const SecDbClass v10_0_outgoing_queue_class = {
687 .name = CFSTR("outgoingqueue"),
688 .itemclass = false,
689 .attrs = {
690 &v10ckzone,
691 &v10syncuuid,
692 &v10parentKeyUUID,
693 &v10action,
694 &v10state,
695 &v10waituntiltime,
696 &v10accessgroup,
697 &v10gencount,
698 &v10wrappedkey,
699 &v10encrypteditem,
700 &v10encryptionver,
701 0
702 }
703 };
704
705 const SecDbClass v10_0_incoming_queue_class = {
706 .name = CFSTR("incomingqueue"),
707 .itemclass = false,
708 .attrs = {
709 &v10ckzone,
710 &v10syncuuid,
711 &v10parentKeyUUID,
712 &v10action,
713 &v10state,
714 &v10gencount,
715 &v10wrappedkey,
716 &v10encrypteditem,
717 &v10encryptionver,
718 0
719 }
720 };
721
722 const SecDbClass v10_0_sync_key_class = {
723 .name = CFSTR("synckeys"),
724 .itemclass = false,
725 .attrs = {
726 &v10ckzone,
727 &v10syncuuid,
728 &v10keyclass,
729 &v10currentkey,
730 &v10parentKeyUUID,
731 &v10state,
732 &v10wrappedkey,
733 &v10encodedCKRecord,
734 0
735 }
736 };
737
738 // Stores the "Current Key" records, and parentKeyUUID refers to items in the synckeys table
739 // Wouldn't foreign keys be nice?
740 const SecDbClass v10_0_current_key_class = {
741 .name = CFSTR("currentkeys"),
742 .itemclass = false,
743 .attrs = {
744 &v10ckzone,
745 &v10keyclass,
746 &v10currentKeyUUID,
747 &v10encodedCKRecord,
748 0
749 }
750 };
751
752 const SecDbClass v10_1_current_item_class = {
753 .name = CFSTR("currentitems"),
754 .itemclass = false,
755 .attrs = {
756 &v10ckzone,
757 &v10_1currentPtrIdentifier,
758 &v10_1currentItemUUID,
759 &v10state,
760 &v10encodedCKRecord,
761 0
762 }
763 };
764
765 const SecDbClass v10_1_ckmirror_class = {
766 .name = CFSTR("ckmirror"),
767 .itemclass = false,
768 .attrs = {
769 &v10ckzone,
770 &v10syncuuid,
771 &v10parentKeyUUID,
772 &v10gencount,
773 &v10wrappedkey,
774 &v10encrypteditem,
775 &v10encodedCKRecord,
776 &v10encryptionver,
777 &v10_1wasCurrent,
778 &v10_1pcsservice,
779 &v10_1pcspublickey,
780 &v10_1pcspublicidentity,
781 0
782 }
783 };
784
785 const SecDbClass v10_0_ckmirror_class = {
786 .name = CFSTR("ckmirror"),
787 .itemclass = false,
788 .attrs = {
789 &v10ckzone,
790 &v10syncuuid,
791 &v10parentKeyUUID,
792 &v10gencount,
793 &v10wrappedkey,
794 &v10encrypteditem,
795 &v10encodedCKRecord,
796 &v10encryptionver,
797 0
798 }
799 };
800
801 const SecDbClass v10_0_ckstate_class = {
802 .name = CFSTR("ckstate"),
803 .itemclass = false,
804 .attrs = {
805 &v10ckzone,
806 &v10ckzonecreated,
807 &v10ckzonesubscribed,
808 &v10lastfetchtime,
809 &v10changetoken,
810 &v10ratelimiter,
811 0
812 }
813 };
814
815 /* Backup table */
816 /* Primary keys: v10primaryKey, v8musr */
817 const SecDbClass v10_0_item_backup_class = {
818 .name = CFSTR("item_backup"),
819 .itemclass = false,
820 .attrs = {
821 &v6rowid,
822 &v10primaryKey, // Primary key of the original item, from v6v_pk
823 &v8musr, //
824 &v6sha1, // Hash of the original item
825 &v10backupData, // Data wrapped to backup keybag
826 &v6pkhh, // Hash of the public key of the backup bag [v10publickeyHash]
827 0
828 }
829 };
830
831 /* Backup Keybag table */
832 /* Primary keys: v10publickeyHash, v8musr */
833 const SecDbClass v10_0_backup_keybag_class = {
834 .name = CFSTR("backup_keybag"),
835 .itemclass = false,
836 .attrs = {
837 &v6rowid,
838 &v10publickeyHash, // Hash of the public key of the backup bag
839 &v8musr, //
840 &v10publickey, // Public key for the asymmetric backup bag
841 &v6agrp, // Used for backup agent
842 0
843 }
844 };
845
846 const SecDbClass v10_1_backup_keyarchive_class = {
847 .name = CFSTR("backup_keyarchive"),
848 .itemclass = false,
849 .attrs = {
850 &v10_1keyArchiveHash, // Hash of the key archive
851 &v8musr, //
852 &v10_1keyArchive, // Serialised key archive
853 &v10ckzone,
854 &v10_1optionalEncodedCKRecord,
855 &v10_1archiveEscrowID,
856 0
857 }
858 };
859
860 const SecDbClass v10_1_current_archived_keys_class = {
861 .name = CFSTR("archived_key_backup"),
862 .itemclass = false,
863 .attrs = {
864 &v6pdmn,
865 &v10syncuuid,
866 &v8musr,
867 &v6agrp,
868 &v10_1keyArchiveHash,
869 &v10_1archivedKey,
870 &v10ckzone,
871 &v10_1optionalEncodedCKRecord,
872 &v10_1archiveEscrowID,
873 0
874 }
875 };
876
877 const SecDbClass v10_1_current_keyarchive_class = {
878 .name = CFSTR("currentkeyarchives"),
879 .itemclass = false,
880 .attrs = {
881 &v10_1keyArchiveHash,
882 &v10_1keyArchiveName,
883 0
884 }
885 };
886
887 /* An identity which is really a cert + a key, so all cert and keys attrs are
888 allowed. */
889 const SecDbClass v_identity_class = {
890 .name = CFSTR("idnt"),
891 .itemclass = true,
892 .attrs = {
893 0
894 },
895 };
896
897
898 /*
899 * Version 10.5
900 */
901 const SecDbSchema v10_5_schema = {
902 .majorVersion = 10,
903 .minorVersion = 5,
904 .classes = {
905 &v10_1_genp_class,
906 &v10_1_inet_class,
907 &v10_1_cert_class,
908 &v10_1_keys_class,
909 &v10_0_tversion_class,
910 &v10_2_outgoing_queue_class,
911 &v10_2_incoming_queue_class,
912 &v10_0_sync_key_class,
913 &v10_1_ckmirror_class,
914 &v10_0_current_key_class,
915 &v10_4_ckstate_class,
916 &v10_0_item_backup_class,
917 &v10_0_backup_keybag_class,
918 &v10_2_ckmanifest_class,
919 &v10_2_pending_manifest_class,
920 &v10_1_ckmanifest_leaf_class,
921 &v10_1_backup_keyarchive_class,
922 &v10_1_current_keyarchive_class,
923 &v10_1_current_archived_keys_class,
924 &v10_1_pending_manifest_leaf_class,
925 &v10_4_current_item_class,
926 &v10_3_ckdevicestate_class,
927 &v10_5_tlkshare_class,
928 0
929 }
930 };
931
932
933 /*
934 * Version 10.4
935 */
936 const SecDbSchema v10_4_schema = {
937 .majorVersion = 10,
938 .minorVersion = 4,
939 .classes = {
940 &v10_1_genp_class,
941 &v10_1_inet_class,
942 &v10_1_cert_class,
943 &v10_1_keys_class,
944 &v10_0_tversion_class,
945 &v10_2_outgoing_queue_class,
946 &v10_2_incoming_queue_class,
947 &v10_0_sync_key_class,
948 &v10_1_ckmirror_class,
949 &v10_0_current_key_class,
950 &v10_4_ckstate_class,
951 &v10_0_item_backup_class,
952 &v10_0_backup_keybag_class,
953 &v10_2_ckmanifest_class,
954 &v10_2_pending_manifest_class,
955 &v10_1_ckmanifest_leaf_class,
956 &v10_1_backup_keyarchive_class,
957 &v10_1_current_keyarchive_class,
958 &v10_1_current_archived_keys_class,
959 &v10_1_pending_manifest_leaf_class,
960 &v10_4_current_item_class,
961 &v10_3_ckdevicestate_class,
962 0
963 }
964 };
965
966 /*
967 * Version 10.3
968 */
969 const SecDbSchema v10_3_schema = {
970 .majorVersion = 10,
971 .minorVersion = 3,
972 .classes = {
973 &v10_1_genp_class,
974 &v10_1_inet_class,
975 &v10_1_cert_class,
976 &v10_1_keys_class,
977 &v10_0_tversion_class,
978 &v10_2_outgoing_queue_class,
979 &v10_2_incoming_queue_class,
980 &v10_0_sync_key_class,
981 &v10_1_ckmirror_class,
982 &v10_0_current_key_class,
983 &v10_0_ckstate_class,
984 &v10_0_item_backup_class,
985 &v10_0_backup_keybag_class,
986 &v10_2_ckmanifest_class,
987 &v10_2_pending_manifest_class,
988 &v10_1_ckmanifest_leaf_class,
989 &v10_1_backup_keyarchive_class,
990 &v10_1_current_keyarchive_class,
991 &v10_1_current_archived_keys_class,
992 &v10_1_pending_manifest_leaf_class,
993 &v10_1_current_item_class,
994 &v10_3_ckdevicestate_class,
995 0
996 }
997 };
998
999 /*
1000 * Version 10.2
1001 */
1002 const SecDbSchema v10_2_schema = {
1003 .majorVersion = 10,
1004 .minorVersion = 2,
1005 .classes = {
1006 &v10_1_genp_class,
1007 &v10_1_inet_class,
1008 &v10_1_cert_class,
1009 &v10_1_keys_class,
1010 &v10_0_tversion_class,
1011 &v10_2_outgoing_queue_class,
1012 &v10_2_incoming_queue_class,
1013 &v10_0_sync_key_class,
1014 &v10_1_ckmirror_class,
1015 &v10_0_current_key_class,
1016 &v10_0_ckstate_class,
1017 &v10_0_item_backup_class,
1018 &v10_0_backup_keybag_class,
1019 &v10_2_ckmanifest_class,
1020 &v10_2_pending_manifest_class,
1021 &v10_1_ckmanifest_leaf_class,
1022 &v10_1_backup_keyarchive_class,
1023 &v10_1_current_keyarchive_class,
1024 &v10_1_current_archived_keys_class,
1025 &v10_1_pending_manifest_leaf_class,
1026 &v10_1_current_item_class,
1027 0
1028 }
1029 };
1030
1031 /*
1032 * Version 10.1
1033 */
1034 const SecDbSchema v10_1_schema = {
1035 .majorVersion = 10,
1036 .minorVersion = 1,
1037 .classes = {
1038 &v10_1_genp_class,
1039 &v10_1_inet_class,
1040 &v10_1_cert_class,
1041 &v10_1_keys_class,
1042 &v10_0_tversion_class,
1043 &v10_1_outgoing_queue_class,
1044 &v10_1_incoming_queue_class,
1045 &v10_0_sync_key_class,
1046 &v10_1_ckmirror_class,
1047 &v10_0_current_key_class,
1048 &v10_0_ckstate_class,
1049 &v10_0_item_backup_class,
1050 &v10_0_backup_keybag_class,
1051 &v10_1_ckmanifest_class,
1052 &v10_1_pending_manifest_class,
1053 &v10_1_ckmanifest_leaf_class,
1054 &v10_1_backup_keyarchive_class,
1055 &v10_1_current_keyarchive_class,
1056 &v10_1_current_archived_keys_class,
1057 &v10_1_pending_manifest_leaf_class,
1058 &v10_1_current_item_class,
1059 0
1060 }
1061 };
1062
1063 /*
1064 * Version 10.0
1065 */
1066
1067 const SecDbClass v10_0_genp_class = {
1068 .name = CFSTR("genp"),
1069 .itemclass = true,
1070 .attrs = {
1071 &v6rowid,
1072 &v6cdat,
1073 &v6mdat,
1074 &v6desc,
1075 &v6icmt,
1076 &v6crtr,
1077 &v6type,
1078 &v6scrp,
1079 &v6labl,
1080 &v6alis,
1081 &v6invi,
1082 &v6nega,
1083 &v6cusi,
1084 &v6prot,
1085 &v6acct,
1086 &v6svce,
1087 &v6gena,
1088 &v6data,
1089 &v6agrp,
1090 &v6pdmn,
1091 &v6sync,
1092 &v6tomb,
1093 &v6sha1,
1094 &v7vwht,
1095 &v7tkid,
1096 &v6v_Data,
1097 &v6v_pk,
1098 &v6accc,
1099 &v7utomb,
1100 &v8musr,
1101 &v10itemuuid,
1102 &v10itempersistentref,
1103 &v10sysbound,
1104 0
1105 },
1106 };
1107
1108 const SecDbClass v10_0_inet_class = {
1109 .name = CFSTR("inet"),
1110 .itemclass = true,
1111 .attrs = {
1112 &v6rowid,
1113 &v6cdat,
1114 &v6mdat,
1115 &v6desc,
1116 &v6icmt,
1117 &v6crtr,
1118 &v6type,
1119 &v6scrp,
1120 &v6labl,
1121 &v6alis,
1122 &v6invi,
1123 &v6nega,
1124 &v6cusi,
1125 &v6prot,
1126 &v6acct,
1127 &v6sdmn,
1128 &v6srvr,
1129 &v6ptcl,
1130 &v6atyp,
1131 &v6port,
1132 &v6path,
1133 &v6data,
1134 &v6agrp,
1135 &v6pdmn,
1136 &v6sync,
1137 &v6tomb,
1138 &v6sha1,
1139 &v7vwht,
1140 &v7tkid,
1141 &v6v_Data,
1142 &v6v_pk,
1143 &v6accc,
1144 &v7utomb,
1145 &v8musr,
1146 &v10itemuuid,
1147 &v10itempersistentref,
1148 &v10sysbound,
1149 0
1150 },
1151 };
1152
1153 const SecDbClass v10_0_cert_class = {
1154 .name = CFSTR("cert"),
1155 .itemclass = true,
1156 .attrs = {
1157 &v6rowid,
1158 &v6cdat,
1159 &v6mdat,
1160 &v6ctyp,
1161 &v6cenc,
1162 &v6labl,
1163 &v6certalis,
1164 &v6subj,
1165 &v6issr,
1166 &v6slnr,
1167 &v6skid,
1168 &v6pkhh,
1169 &v6data,
1170 &v6agrp,
1171 &v6pdmn,
1172 &v6sync,
1173 &v6tomb,
1174 &v6sha1,
1175 &v7vwht,
1176 &v7tkid,
1177 &v6v_Data,
1178 &v6v_pk,
1179 &v6accc,
1180 &v7utomb,
1181 &v8musr,
1182 &v10itemuuid,
1183 &v10itempersistentref,
1184 &v10sysbound,
1185 0
1186 },
1187 };
1188
1189 const SecDbClass v10_0_keys_class = {
1190 .name = CFSTR("keys"),
1191 .itemclass = true,
1192 .attrs = {
1193 &v6rowid,
1194 &v6cdat,
1195 &v6mdat,
1196 &v6kcls,
1197 &v6labl,
1198 &v6alis,
1199 &v6perm,
1200 &v6priv,
1201 &v6modi,
1202 &v6klbl,
1203 &v6atag,
1204 &v6keycrtr,
1205 &v6keytype,
1206 &v6bsiz,
1207 &v6esiz,
1208 &v6sdat,
1209 &v6edat,
1210 &v6sens,
1211 &v6asen,
1212 &v6extr,
1213 &v6next,
1214 &v6encr,
1215 &v6decr,
1216 &v6drve,
1217 &v6sign,
1218 &v6vrfy,
1219 &v6snrc,
1220 &v6vyrc,
1221 &v6wrap,
1222 &v6unwp,
1223 &v6data,
1224 &v6agrp,
1225 &v6pdmn,
1226 &v6sync,
1227 &v6tomb,
1228 &v6sha1,
1229 &v7vwht,
1230 &v7tkid,
1231 &v6v_Data,
1232 &v6v_pk,
1233 &v6accc,
1234 &v7utomb,
1235 &v8musr,
1236 &v10itemuuid,
1237 &v10itempersistentref,
1238 &v10sysbound,
1239 0
1240 }
1241 };
1242
1243 const SecDbSchema v10_0_schema = {
1244 .majorVersion = 10,
1245 .minorVersion = 0,
1246 .classes = {
1247 &v10_0_genp_class,
1248 &v10_0_inet_class,
1249 &v10_0_cert_class,
1250 &v10_0_keys_class,
1251 &v10_0_tversion_class,
1252 &v10_0_outgoing_queue_class,
1253 &v10_0_incoming_queue_class,
1254 &v10_0_sync_key_class,
1255 &v10_0_ckmirror_class,
1256 &v10_0_current_key_class,
1257 &v10_0_ckstate_class,
1258 &v10_0_item_backup_class,
1259 &v10_0_backup_keybag_class,
1260 0
1261 }
1262 };
1263
1264 const SecDbClass v9_1_tversion_class = {
1265 .name = CFSTR("tversion91"),
1266 .itemclass = false,
1267 .attrs = {
1268 &v6rowid,
1269 &v6version,
1270 &v91minor,
1271 0
1272 }
1273 };
1274
1275 const SecDbClass v9_1_genp_class = {
1276 .name = CFSTR("genp91"),
1277 .itemclass = true,
1278 .attrs = {
1279 &v6rowid,
1280 &v6cdat,
1281 &v6mdat,
1282 &v6desc,
1283 &v6icmt,
1284 &v6crtr,
1285 &v6type,
1286 &v6scrp,
1287 &v6labl,
1288 &v6alis,
1289 &v6invi,
1290 &v6nega,
1291 &v6cusi,
1292 &v6prot,
1293 &v6acct,
1294 &v6svce,
1295 &v6gena,
1296 &v6data,
1297 &v6agrp,
1298 &v6pdmn,
1299 &v6sync,
1300 &v6tomb,
1301 &v6sha1,
1302 &v7vwht,
1303 &v7tkid,
1304 &v6v_Data,
1305 &v6v_pk,
1306 &v6accc,
1307 &v7utomb,
1308 &v8musr,
1309 0
1310 },
1311 };
1312
1313 const SecDbClass v9_1_inet_class = {
1314 .name = CFSTR("inet91"),
1315 .itemclass = true,
1316 .attrs = {
1317 &v6rowid,
1318 &v6cdat,
1319 &v6mdat,
1320 &v6desc,
1321 &v6icmt,
1322 &v6crtr,
1323 &v6type,
1324 &v6scrp,
1325 &v6labl,
1326 &v6alis,
1327 &v6invi,
1328 &v6nega,
1329 &v6cusi,
1330 &v6prot,
1331 &v6acct,
1332 &v6sdmn,
1333 &v6srvr,
1334 &v6ptcl,
1335 &v6atyp,
1336 &v6port,
1337 &v6path,
1338 &v6data,
1339 &v6agrp,
1340 &v6pdmn,
1341 &v6sync,
1342 &v6tomb,
1343 &v6sha1,
1344 &v7vwht,
1345 &v7tkid,
1346 &v6v_Data,
1347 &v6v_pk,
1348 &v6accc,
1349 &v7utomb,
1350 &v8musr,
1351 0
1352 },
1353 };
1354
1355 const SecDbClass v9_1_cert_class = {
1356 .name = CFSTR("cert91"),
1357 .itemclass = true,
1358 .attrs = {
1359 &v6rowid,
1360 &v6cdat,
1361 &v6mdat,
1362 &v6ctyp,
1363 &v6cenc,
1364 &v6labl,
1365 &v6certalis,
1366 &v6subj,
1367 &v6issr,
1368 &v6slnr,
1369 &v6skid,
1370 &v6pkhh,
1371 &v6data,
1372 &v6agrp,
1373 &v6pdmn,
1374 &v6sync,
1375 &v6tomb,
1376 &v6sha1,
1377 &v7vwht,
1378 &v7tkid,
1379 &v6v_Data,
1380 &v6v_pk,
1381 &v6accc,
1382 &v7utomb,
1383 &v8musr,
1384 0
1385 },
1386 };
1387
1388 const SecDbClass v9_1_keys_class = {
1389 .name = CFSTR("keys91"),
1390 .itemclass = true,
1391 .attrs = {
1392 &v6rowid,
1393 &v6cdat,
1394 &v6mdat,
1395 &v6kcls,
1396 &v6labl,
1397 &v6alis,
1398 &v6perm,
1399 &v6priv,
1400 &v6modi,
1401 &v6klbl,
1402 &v6atag,
1403 &v6keycrtr,
1404 &v6keytype,
1405 &v6bsiz,
1406 &v6esiz,
1407 &v6sdat,
1408 &v6edat,
1409 &v6sens,
1410 &v6asen,
1411 &v6extr,
1412 &v6next,
1413 &v6encr,
1414 &v6decr,
1415 &v6drve,
1416 &v6sign,
1417 &v6vrfy,
1418 &v6snrc,
1419 &v6vyrc,
1420 &v6wrap,
1421 &v6unwp,
1422 &v6data,
1423 &v6agrp,
1424 &v6pdmn,
1425 &v6sync,
1426 &v6tomb,
1427 &v6sha1,
1428 &v7vwht,
1429 &v7tkid,
1430 &v6v_Data,
1431 &v6v_pk,
1432 &v6accc,
1433 &v7utomb,
1434 &v8musr,
1435 0
1436 }
1437 };
1438
1439 /*
1440 * Version 9.1 (iOS 10.0 and OSX 10.11.8/10.12 addded minor version.
1441 */
1442 const SecDbSchema v9_1_schema = {
1443 .majorVersion = 9,
1444 .minorVersion = 1,
1445 .classes = {
1446 &v9_1_genp_class,
1447 &v9_1_inet_class,
1448 &v9_1_cert_class,
1449 &v9_1_keys_class,
1450 &v9_1_tversion_class,
1451 0
1452 }
1453 };
1454
1455 const SecDbClass v9genp_class = {
1456 .name = CFSTR("genp9"),
1457 .itemclass = true,
1458 .attrs = {
1459 &v6rowid,
1460 &v6cdat,
1461 &v6mdat,
1462 &v6desc,
1463 &v6icmt,
1464 &v6crtr,
1465 &v6type,
1466 &v6scrp,
1467 &v6labl,
1468 &v6alis,
1469 &v6invi,
1470 &v6nega,
1471 &v6cusi,
1472 &v6prot,
1473 &v6acct,
1474 &v6svce,
1475 &v6gena,
1476 &v6data,
1477 &v6agrp,
1478 &v6pdmn,
1479 &v6sync,
1480 &v6tomb,
1481 &v6sha1,
1482 &v7vwht,
1483 &v7tkid,
1484 &v6v_Data,
1485 &v6v_pk,
1486 &v6accc,
1487 &v7utomb,
1488 &v8musr,
1489 0
1490 },
1491 };
1492
1493 const SecDbClass v9inet_class = {
1494 .name = CFSTR("inet9"),
1495 .itemclass = true,
1496 .attrs = {
1497 &v6rowid,
1498 &v6cdat,
1499 &v6mdat,
1500 &v6desc,
1501 &v6icmt,
1502 &v6crtr,
1503 &v6type,
1504 &v6scrp,
1505 &v6labl,
1506 &v6alis,
1507 &v6invi,
1508 &v6nega,
1509 &v6cusi,
1510 &v6prot,
1511 &v6acct,
1512 &v6sdmn,
1513 &v6srvr,
1514 &v6ptcl,
1515 &v6atyp,
1516 &v6port,
1517 &v6path,
1518 &v6data,
1519 &v6agrp,
1520 &v6pdmn,
1521 &v6sync,
1522 &v6tomb,
1523 &v6sha1,
1524 &v7vwht,
1525 &v7tkid,
1526 &v6v_Data,
1527 &v6v_pk,
1528 &v6accc,
1529 &v7utomb,
1530 &v8musr,
1531 0
1532 },
1533 };
1534
1535 const SecDbClass v9cert_class = {
1536 .name = CFSTR("cert9"),
1537 .itemclass = true,
1538 .attrs = {
1539 &v6rowid,
1540 &v6cdat,
1541 &v6mdat,
1542 &v6ctyp,
1543 &v6cenc,
1544 &v6labl,
1545 &v6certalis,
1546 &v6subj,
1547 &v6issr,
1548 &v6slnr,
1549 &v6skid,
1550 &v6pkhh,
1551 &v6data,
1552 &v6agrp,
1553 &v6pdmn,
1554 &v6sync,
1555 &v6tomb,
1556 &v6sha1,
1557 &v7vwht,
1558 &v7tkid,
1559 &v6v_Data,
1560 &v6v_pk,
1561 &v6accc,
1562 &v7utomb,
1563 &v8musr,
1564 0
1565 },
1566 };
1567
1568 const SecDbClass v9keys_class = {
1569 .name = CFSTR("keys9"),
1570 .itemclass = true,
1571 .attrs = {
1572 &v6rowid,
1573 &v6cdat,
1574 &v6mdat,
1575 &v6kcls,
1576 &v6labl,
1577 &v6alis,
1578 &v6perm,
1579 &v6priv,
1580 &v6modi,
1581 &v6klbl,
1582 &v6atag,
1583 &v6keycrtr,
1584 &v6keytype,
1585 &v6bsiz,
1586 &v6esiz,
1587 &v6sdat,
1588 &v6edat,
1589 &v6sens,
1590 &v6asen,
1591 &v6extr,
1592 &v6next,
1593 &v6encr,
1594 &v6decr,
1595 &v6drve,
1596 &v6sign,
1597 &v6vrfy,
1598 &v6snrc,
1599 &v6vyrc,
1600 &v6wrap,
1601 &v6unwp,
1602 &v6data,
1603 &v6agrp,
1604 &v6pdmn,
1605 &v6sync,
1606 &v6tomb,
1607 &v6sha1,
1608 &v7vwht,
1609 &v7tkid,
1610 &v6v_Data,
1611 &v6v_pk,
1612 &v6accc,
1613 &v7utomb,
1614 &v8musr,
1615 0
1616 }
1617 };
1618
1619 const SecDbClass v5tversion_class = {
1620 .name = CFSTR("tversion5"),
1621 .itemclass = false,
1622 .attrs = {
1623 &v6version,
1624 0
1625 }
1626 };
1627
1628 /* Version 9 (iOS 9.3 and OSX 10.11.5) database schema
1629 * Same contents as v8 tables; table names changed to force upgrade
1630 * and correct default values in table.
1631 */
1632 const SecDbSchema v9_schema = {
1633 .majorVersion = 9,
1634 .classes = {
1635 &v9genp_class,
1636 &v9inet_class,
1637 &v9cert_class,
1638 &v9keys_class,
1639 &v5tversion_class,
1640 0
1641 }
1642 };
1643
1644 // Version 8 (Internal release iOS 9.3 and OSX 10.11.5) database schema
1645 const SecDbClass v8genp_class = {
1646 .name = CFSTR("genp8"),
1647 .itemclass = true,
1648 .attrs = {
1649 &v6rowid,
1650 &v6cdat,
1651 &v6mdat,
1652 &v6desc,
1653 &v6icmt,
1654 &v6crtr,
1655 &v6type,
1656 &v6scrp,
1657 &v6labl,
1658 &v6alis,
1659 &v6invi,
1660 &v6nega,
1661 &v6cusi,
1662 &v6prot,
1663 &v6acct,
1664 &v6svce,
1665 &v6gena,
1666 &v6data,
1667 &v6agrp,
1668 &v6pdmn,
1669 &v6sync,
1670 &v6tomb,
1671 &v6sha1,
1672 &v7vwht,
1673 &v7tkid,
1674 &v6v_Data,
1675 &v6v_pk,
1676 &v6accc,
1677 &v7utomb,
1678 &v8musr,
1679 0
1680 },
1681 };
1682
1683 const SecDbClass v8inet_class = {
1684 .name = CFSTR("inet8"),
1685 .itemclass = true,
1686 .attrs = {
1687 &v6rowid,
1688 &v6cdat,
1689 &v6mdat,
1690 &v6desc,
1691 &v6icmt,
1692 &v6crtr,
1693 &v6type,
1694 &v6scrp,
1695 &v6labl,
1696 &v6alis,
1697 &v6invi,
1698 &v6nega,
1699 &v6cusi,
1700 &v6prot,
1701 &v6acct,
1702 &v6sdmn,
1703 &v6srvr,
1704 &v6ptcl,
1705 &v6atyp,
1706 &v6port,
1707 &v6path,
1708 &v6data,
1709 &v6agrp,
1710 &v6pdmn,
1711 &v6sync,
1712 &v6tomb,
1713 &v6sha1,
1714 &v7vwht,
1715 &v7tkid,
1716 &v6v_Data,
1717 &v6v_pk,
1718 &v6accc,
1719 &v7utomb,
1720 &v8musr,
1721 0
1722 },
1723 };
1724
1725 const SecDbClass v8cert_class = {
1726 .name = CFSTR("cert8"),
1727 .itemclass = true,
1728 .attrs = {
1729 &v6rowid,
1730 &v6cdat,
1731 &v6mdat,
1732 &v6ctyp,
1733 &v6cenc,
1734 &v6labl,
1735 &v6certalis,
1736 &v6subj,
1737 &v6issr,
1738 &v6slnr,
1739 &v6skid,
1740 &v6pkhh,
1741 &v6data,
1742 &v6agrp,
1743 &v6pdmn,
1744 &v6sync,
1745 &v6tomb,
1746 &v6sha1,
1747 &v7vwht,
1748 &v7tkid,
1749 &v6v_Data,
1750 &v6v_pk,
1751 &v6accc,
1752 &v7utomb,
1753 &v8musr,
1754 0
1755 },
1756 };
1757
1758 const SecDbClass v8keys_class = {
1759 .name = CFSTR("keys8"),
1760 .itemclass = true,
1761 .attrs = {
1762 &v6rowid,
1763 &v6cdat,
1764 &v6mdat,
1765 &v6kcls,
1766 &v6labl,
1767 &v6alis,
1768 &v6perm,
1769 &v6priv,
1770 &v6modi,
1771 &v6klbl,
1772 &v6atag,
1773 &v6keycrtr,
1774 &v6keytype,
1775 &v6bsiz,
1776 &v6esiz,
1777 &v6sdat,
1778 &v6edat,
1779 &v6sens,
1780 &v6asen,
1781 &v6extr,
1782 &v6next,
1783 &v6encr,
1784 &v6decr,
1785 &v6drve,
1786 &v6sign,
1787 &v6vrfy,
1788 &v6snrc,
1789 &v6vyrc,
1790 &v6wrap,
1791 &v6unwp,
1792 &v6data,
1793 &v6agrp,
1794 &v6pdmn,
1795 &v6sync,
1796 &v6tomb,
1797 &v6sha1,
1798 &v7vwht,
1799 &v7tkid,
1800 &v6v_Data,
1801 &v6v_pk,
1802 &v6accc,
1803 &v7utomb,
1804 &v8musr,
1805 0
1806 }
1807 };
1808
1809 const SecDbSchema v8_schema = {
1810 .majorVersion = 8,
1811 .classes = {
1812 &v8genp_class,
1813 &v8inet_class,
1814 &v8cert_class,
1815 &v8keys_class,
1816 &v5tversion_class,
1817 0
1818 }
1819 };
1820
1821 // Version 7 (iOS 9 and OSX 10.11) database schema
1822 const SecDbClass v7genp_class = {
1823 .name = CFSTR("genp7"),
1824 .itemclass = true,
1825 .attrs = {
1826 &v6rowid,
1827 &v6cdat,
1828 &v6mdat,
1829 &v6desc,
1830 &v6icmt,
1831 &v6crtr,
1832 &v6type,
1833 &v6scrp,
1834 &v6labl,
1835 &v6alis,
1836 &v6invi,
1837 &v6nega,
1838 &v6cusi,
1839 &v6prot,
1840 &v6acct,
1841 &v6svce,
1842 &v6gena,
1843 &v6data,
1844 &v6agrp,
1845 &v6pdmn,
1846 &v6sync,
1847 &v6tomb,
1848 &v6sha1,
1849 &v7vwht,
1850 &v7tkid,
1851 &v6v_Data,
1852 &v6v_pk,
1853 &v6accc,
1854 &v7utomb,
1855 0
1856 },
1857 };
1858
1859 const SecDbClass v7inet_class = {
1860 .name = CFSTR("inet7"),
1861 .itemclass = true,
1862 .attrs = {
1863 &v6rowid,
1864 &v6cdat,
1865 &v6mdat,
1866 &v6desc,
1867 &v6icmt,
1868 &v6crtr,
1869 &v6type,
1870 &v6scrp,
1871 &v6labl,
1872 &v6alis,
1873 &v6invi,
1874 &v6nega,
1875 &v6cusi,
1876 &v6prot,
1877 &v6acct,
1878 &v6sdmn,
1879 &v6srvr,
1880 &v6ptcl,
1881 &v6atyp,
1882 &v6port,
1883 &v6path,
1884 &v6data,
1885 &v6agrp,
1886 &v6pdmn,
1887 &v6sync,
1888 &v6tomb,
1889 &v6sha1,
1890 &v7vwht,
1891 &v7tkid,
1892 &v6v_Data,
1893 &v6v_pk,
1894 &v6accc,
1895 &v7utomb,
1896 0
1897 },
1898 };
1899
1900 const SecDbClass v7cert_class = {
1901 .name = CFSTR("cert7"),
1902 .itemclass = true,
1903 .attrs = {
1904 &v6rowid,
1905 &v6cdat,
1906 &v6mdat,
1907 &v6ctyp,
1908 &v6cenc,
1909 &v6labl,
1910 &v6certalis,
1911 &v6subj,
1912 &v6issr,
1913 &v6slnr,
1914 &v6skid,
1915 &v6pkhh,
1916 &v6data,
1917 &v6agrp,
1918 &v6pdmn,
1919 &v6sync,
1920 &v6tomb,
1921 &v6sha1,
1922 &v7vwht,
1923 &v7tkid,
1924 &v6v_Data,
1925 &v6v_pk,
1926 &v6accc,
1927 &v7utomb,
1928 0
1929 },
1930 };
1931
1932 const SecDbClass v7keys_class = {
1933 .name = CFSTR("keys7"),
1934 .itemclass = true,
1935 .attrs = {
1936 &v6rowid,
1937 &v6cdat,
1938 &v6mdat,
1939 &v6kcls,
1940 &v6labl,
1941 &v6alis,
1942 &v6perm,
1943 &v6priv,
1944 &v6modi,
1945 &v6klbl,
1946 &v6atag,
1947 &v6keycrtr,
1948 &v6keytype,
1949 &v6bsiz,
1950 &v6esiz,
1951 &v6sdat,
1952 &v6edat,
1953 &v6sens,
1954 &v6asen,
1955 &v6extr,
1956 &v6next,
1957 &v6encr,
1958 &v6decr,
1959 &v6drve,
1960 &v6sign,
1961 &v6vrfy,
1962 &v6snrc,
1963 &v6vyrc,
1964 &v6wrap,
1965 &v6unwp,
1966 &v6data,
1967 &v6agrp,
1968 &v6pdmn,
1969 &v6sync,
1970 &v6tomb,
1971 &v6sha1,
1972 &v7vwht,
1973 &v7tkid,
1974 &v6v_Data,
1975 &v6v_pk,
1976 &v6accc,
1977 &v7utomb,
1978 0
1979 }
1980 };
1981
1982
1983 const SecDbSchema v7_schema = {
1984 .majorVersion = 7,
1985 .classes = {
1986 &v7genp_class,
1987 &v7inet_class,
1988 &v7cert_class,
1989 &v7keys_class,
1990 &v5tversion_class,
1991 0
1992 }
1993 };
1994
1995
1996 // Version 6 (iOS 7 and OSX 10.9) database schema
1997 static const SecDbClass v6genp_class = {
1998 .name = CFSTR("genp6"),
1999 .itemclass = true,
2000 .attrs = {
2001 &v6rowid,
2002 &v6cdat,
2003 &v6mdat,
2004 &v6desc,
2005 &v6icmt,
2006 &v6crtr,
2007 &v6type,
2008 &v6scrp,
2009 &v6labl,
2010 &v6alis,
2011 &v6invi,
2012 &v6nega,
2013 &v6cusi,
2014 &v6prot,
2015 &v6acct,
2016 &v6svce,
2017 &v6gena,
2018 &v6data,
2019 &v6agrp,
2020 &v6pdmn,
2021 &v6sync,
2022 &v6tomb,
2023 &v6sha1,
2024 &v6v_Data,
2025 &v6v_pk,
2026 &v6accc,
2027 0
2028 },
2029 };
2030
2031 static const SecDbClass v6inet_class = {
2032 .name = CFSTR("inet6"),
2033 .itemclass = true,
2034 .attrs = {
2035 &v6rowid,
2036 &v6cdat,
2037 &v6mdat,
2038 &v6desc,
2039 &v6icmt,
2040 &v6crtr,
2041 &v6type,
2042 &v6scrp,
2043 &v6labl,
2044 &v6alis,
2045 &v6invi,
2046 &v6nega,
2047 &v6cusi,
2048 &v6prot,
2049 &v6acct,
2050 &v6sdmn,
2051 &v6srvr,
2052 &v6ptcl,
2053 &v6atyp,
2054 &v6port,
2055 &v6path,
2056 &v6data,
2057 &v6agrp,
2058 &v6pdmn,
2059 &v6sync,
2060 &v6tomb,
2061 &v6sha1,
2062 &v6v_Data,
2063 &v6v_pk,
2064 &v6accc,
2065 0
2066 },
2067 };
2068
2069 static const SecDbClass v6cert_class = {
2070 .name = CFSTR("cert6"),
2071 .itemclass = true,
2072 .attrs = {
2073 &v6rowid,
2074 &v6cdat,
2075 &v6mdat,
2076 &v6ctyp,
2077 &v6cenc,
2078 &v6labl,
2079 &v6certalis,
2080 &v6subj,
2081 &v6issr,
2082 &v6slnr,
2083 &v6skid,
2084 &v6pkhh,
2085 &v6data,
2086 &v6agrp,
2087 &v6pdmn,
2088 &v6sync,
2089 &v6tomb,
2090 &v6sha1,
2091 &v6v_Data,
2092 &v6v_pk,
2093 &v6accc,
2094 0
2095 },
2096 };
2097
2098 static const SecDbClass v6keys_class = {
2099 .name = CFSTR("keys6"),
2100 .itemclass = true,
2101 .attrs = {
2102 &v6rowid,
2103 &v6cdat,
2104 &v6mdat,
2105 &v6kcls,
2106 &v6labl,
2107 &v6alis,
2108 &v6perm,
2109 &v6priv,
2110 &v6modi,
2111 &v6klbl,
2112 &v6atag,
2113 &v6keycrtr,
2114 &v6keytype,
2115 &v6bsiz,
2116 &v6esiz,
2117 &v6sdat,
2118 &v6edat,
2119 &v6sens,
2120 &v6asen,
2121 &v6extr,
2122 &v6next,
2123 &v6encr,
2124 &v6decr,
2125 &v6drve,
2126 &v6sign,
2127 &v6vrfy,
2128 &v6snrc,
2129 &v6vyrc,
2130 &v6wrap,
2131 &v6unwp,
2132 &v6data,
2133 &v6agrp,
2134 &v6pdmn,
2135 &v6sync,
2136 &v6tomb,
2137 &v6sha1,
2138 &v6v_Data,
2139 &v6v_pk,
2140 &v6accc,
2141 0
2142 }
2143 };
2144
2145 static const SecDbSchema v6_schema = {
2146 .majorVersion = 6,
2147 .classes = {
2148 &v6genp_class,
2149 &v6inet_class,
2150 &v6cert_class,
2151 &v6keys_class,
2152 &v5tversion_class,
2153 0
2154 }
2155 };
2156
2157
2158 // Version 5 (iOS 5 & iOS 6) database schema.
2159 static const SecDbClass v5genp_class = {
2160 .name = CFSTR("genp5"),
2161 .itemclass = true,
2162 .attrs = {
2163 &v6rowid,
2164 &v6cdat,
2165 &v6mdat,
2166 &v6desc,
2167 &v6icmt,
2168 &v6crtr,
2169 &v6type,
2170 &v6scrp,
2171 &v6labl,
2172 &v6alis,
2173 &v6invi,
2174 &v6nega,
2175 &v6cusi,
2176 &v6prot,
2177 &v6acct,
2178 &v6svce,
2179 &v6gena,
2180 &v6data,
2181 &v6agrp,
2182 &v6pdmn,
2183 &v6v_Data,
2184 0
2185 },
2186 };
2187
2188 static const SecDbClass v5inet_class = {
2189 .name = CFSTR("inet5"),
2190 .itemclass = true,
2191 .attrs = {
2192 &v6rowid,
2193 &v6cdat,
2194 &v6mdat,
2195 &v6desc,
2196 &v6icmt,
2197 &v6crtr,
2198 &v6type,
2199 &v6scrp,
2200 &v6labl,
2201 &v6alis,
2202 &v6invi,
2203 &v6nega,
2204 &v6cusi,
2205 &v6prot,
2206 &v6acct,
2207 &v6sdmn,
2208 &v6srvr,
2209 &v6ptcl,
2210 &v6atyp,
2211 &v6port,
2212 &v6path,
2213 &v6data,
2214 &v6agrp,
2215 &v6pdmn,
2216 &v6v_Data,
2217 0
2218 },
2219 };
2220
2221 static const SecDbClass v5cert_class = {
2222 .name = CFSTR("cert5"),
2223 .itemclass = true,
2224 .attrs = {
2225 &v6rowid,
2226 &v6cdat,
2227 &v6mdat,
2228 &v6ctyp,
2229 &v6cenc,
2230 &v6labl,
2231 &v6certalis,
2232 &v6subj,
2233 &v6issr,
2234 &v6slnr,
2235 &v6skid,
2236 &v6pkhh,
2237 &v6data,
2238 &v6agrp,
2239 &v6pdmn,
2240 &v6v_Data,
2241 0
2242 },
2243 };
2244
2245 static const SecDbClass v5keys_class = {
2246 .name = CFSTR("keys5"),
2247 .itemclass = true,
2248 .attrs = {
2249 &v6rowid,
2250 &v6cdat,
2251 &v6mdat,
2252 &v6kcls,
2253 &v6labl,
2254 &v6alis,
2255 &v6perm,
2256 &v6priv,
2257 &v6modi,
2258 &v6klbl,
2259 &v6atag,
2260 &v6keycrtr,
2261 &v6keytype,
2262 &v6bsiz,
2263 &v6esiz,
2264 &v6sdat,
2265 &v6edat,
2266 &v6sens,
2267 &v6asen,
2268 &v6extr,
2269 &v6next,
2270 &v6encr,
2271 &v6decr,
2272 &v6drve,
2273 &v6sign,
2274 &v6vrfy,
2275 &v6snrc,
2276 &v6vyrc,
2277 &v6wrap,
2278 &v6unwp,
2279 &v6data,
2280 &v6agrp,
2281 &v6pdmn,
2282 &v6v_Data,
2283 0
2284 }
2285 };
2286
2287 static const SecDbSchema v5_schema = {
2288 .majorVersion = 5,
2289 .classes = {
2290 &v5genp_class,
2291 &v5inet_class,
2292 &v5cert_class,
2293 &v5keys_class,
2294 &v5tversion_class,
2295 0
2296 }
2297 };
2298
2299 SecDbSchema const * const * kc_schemas = NULL;
2300
2301 const SecDbSchema *v10_kc_schemas[] = {
2302 &v10_5_schema,
2303 &v10_4_schema,
2304 &v10_3_schema,
2305 &v10_2_schema,
2306 &v10_1_schema,
2307 &v10_0_schema,
2308 &v9_1_schema,
2309 &v9_schema,
2310 &v8_schema,
2311 &v7_schema,
2312 &v6_schema,
2313 &v5_schema,
2314 0
2315 };
2316
2317 const SecDbSchema * const * all_schemas() {
2318 return v10_kc_schemas;
2319 }
2320
2321 const SecDbSchema* current_schema() {
2322 // For now, the current schema is the first in the list.
2323 return all_schemas()[0];
2324 }
2325
2326 // class accessors for current schema.
2327 static const SecDbClass* find_class(const SecDbSchema* schema, CFStringRef class_name) {
2328 for (const SecDbClass * const *pclass = schema->classes; *pclass; ++pclass) {
2329 if( CFEqualSafe((*pclass)->name, class_name) ) {
2330 return *pclass;
2331 }
2332 }
2333 return NULL;
2334 }
2335
2336 const SecDbClass* genp_class() {
2337 static const SecDbClass* genp = NULL;
2338 static dispatch_once_t onceToken;
2339 dispatch_once(&onceToken, ^{
2340 genp = find_class(current_schema(), CFSTR("genp"));
2341 });
2342 return genp;
2343 }
2344 const SecDbClass* inet_class() {
2345 static const SecDbClass* inet = NULL;
2346 static dispatch_once_t onceToken;
2347 dispatch_once(&onceToken, ^{
2348 inet = find_class(current_schema(), CFSTR("inet"));
2349 });
2350 return inet;
2351 }
2352 const SecDbClass* cert_class() {
2353 static const SecDbClass* cert = NULL;
2354 static dispatch_once_t onceToken;
2355 dispatch_once(&onceToken, ^{
2356 cert = find_class(current_schema(), CFSTR("cert"));
2357 });
2358 return cert;
2359 }
2360 const SecDbClass* keys_class() {
2361 static const SecDbClass* keys = NULL;
2362 static dispatch_once_t onceToken;
2363 dispatch_once(&onceToken, ^{
2364 keys = find_class(current_schema(), CFSTR("keys"));
2365 });
2366 return keys;
2367 }
2368
2369 // Not really a class per-se
2370 const SecDbClass* identity_class() {
2371 return &v_identity_class;
2372 }
2373
2374 // Class with 1 element in it which is the database version->
2375 const SecDbClass* tversion_class() {
2376 static const SecDbClass* tversion = NULL;
2377 static dispatch_once_t onceToken;
2378 dispatch_once(&onceToken, ^{
2379 tversion = find_class(current_schema(), CFSTR("tversion"));
2380 });
2381 return tversion;
2382 }
2383
2384