--- /dev/null
+/* Copyright (c) 2002-2003,2006,2008 Apple Inc.
+ *
+ * dbAttrs.cpp - Apple DL/DB/Keychain attributes and name/value pairs.
+ * The attribute lists here are not necessarily complete lists
+ * of the attrs in any given schema; they are only the ones we want
+ * to examine with dbTool.
+ */
+
+#include "dbAttrs.h"
+#include <Security/cssmapple.h>
+#include <Security/SecKeychainItem.h>
+#include <Security/cssmapplePriv.h>
+#include <security_cdsa_utilities/Schema.h>
+
+/* declare a CSSM_DB_ATTRIBUTE_INFO with NAME_AS_STRING */
+#define DB_ATTRIBUTE(name, type) \
+ { CSSM_DB_ATTRIBUTE_NAME_AS_STRING, \
+ {(char *)#name}, \
+ CSSM_DB_ATTRIBUTE_FORMAT_ ## type \
+ }
+
+/* declare a CSSM_DB_ATTRIBUTE_INFO with NAME_AS_INTEGER */
+#define DB_INT_ATTRIBUTE(name, type) \
+ { CSSM_DB_ATTRIBUTE_NAME_AS_INTEGER, \
+ { (char *)name }, \
+ CSSM_DB_ATTRIBUTE_FORMAT_ ## type \
+ }
+
+
+/* declare one entry in a table of nameValuePairs */
+#define NVP(attr) {attr, #attr}
+
+/* the NULL entry which terminates all nameValuePair tables */
+#define NVP_END {0, NULL}
+
+/* declare a RelationInfo */
+#define RELATION_INFO(relationId, attributes, nameValues) \
+ { relationId, \
+ #relationId, \
+ sizeof(attributes) / sizeof(CSSM_DB_ATTRIBUTE_INFO), \
+ attributes, \
+ nameValues }
+
+/* CSSM_DB_RECORDTYPE names */
+const NameValuePair recordTypeNames[] =
+{
+ NVP(CSSM_DL_DB_SCHEMA_INFO),
+ NVP(CSSM_DL_DB_SCHEMA_INDEXES),
+ NVP(CSSM_DL_DB_SCHEMA_ATTRIBUTES),
+ NVP(CSSM_DL_DB_SCHEMA_PARSING_MODULE),
+ NVP(CSSM_DL_DB_RECORD_ANY),
+ NVP(CSSM_DL_DB_RECORD_CERT),
+ NVP(CSSM_DL_DB_RECORD_CRL),
+ NVP(CSSM_DL_DB_RECORD_POLICY),
+ NVP(CSSM_DL_DB_RECORD_GENERIC),
+ NVP(CSSM_DL_DB_RECORD_PUBLIC_KEY),
+ NVP(CSSM_DL_DB_RECORD_PRIVATE_KEY),
+ NVP(CSSM_DL_DB_RECORD_SYMMETRIC_KEY),
+ NVP(CSSM_DL_DB_RECORD_ALL_KEYS),
+ /* Apple-specific */
+ NVP(CSSM_DL_DB_RECORD_GENERIC_PASSWORD),
+ NVP(CSSM_DL_DB_RECORD_INTERNET_PASSWORD),
+ NVP(CSSM_DL_DB_RECORD_APPLESHARE_PASSWORD),
+ NVP(CSSM_DL_DB_RECORD_X509_CERTIFICATE),
+ NVP(CSSM_DL_DB_RECORD_X509_CRL),
+ NVP(CSSM_DL_DB_RECORD_USER_TRUST),
+ /* private to AppleCSPDL */
+ NVP(DBBlobRelationID),
+ /* private to Sec layer */
+ NVP(CSSM_DL_DB_RECORD_UNLOCK_REFERRAL),
+ NVP(CSSM_DL_DB_RECORD_EXTENDED_ATTRIBUTE),
+ NVP_END
+};
+
+/* CSSM_CERT_TYPE names */
+const NameValuePair certTypeNames[] =
+{
+ NVP(CSSM_CERT_UNKNOWN),
+ NVP(CSSM_CERT_X_509v1),
+ NVP(CSSM_CERT_X_509v2),
+ NVP(CSSM_CERT_X_509v3),
+ NVP(CSSM_CERT_PGP),
+ NVP(CSSM_CERT_SPKI),
+ NVP(CSSM_CERT_SDSIv1),
+ NVP(CSSM_CERT_Intel),
+ NVP(CSSM_CERT_X_509_ATTRIBUTE),
+ NVP(CSSM_CERT_X9_ATTRIBUTE),
+ NVP(CSSM_CERT_TUPLE),
+ NVP(CSSM_CERT_ACL_ENTRY),
+ NVP(CSSM_CERT_MULTIPLE),
+ NVP_END
+};
+
+/* CSSM_CERT_ENCODING names */
+const NameValuePair certEncodingNames[] =
+{
+ NVP(CSSM_CERT_ENCODING_UNKNOWN),
+ NVP(CSSM_CERT_ENCODING_CUSTOM),
+ NVP(CSSM_CERT_ENCODING_BER),
+ NVP(CSSM_CERT_ENCODING_DER),
+ NVP(CSSM_CERT_ENCODING_NDR),
+ NVP(CSSM_CERT_ENCODING_SEXPR),
+ NVP(CSSM_CERT_ENCODING_PGP),
+ NVP(CSSM_CERT_ENCODING_MULTIPLE),
+ NVP_END
+};
+
+/* CSSM_CRL_TYPE names */
+const NameValuePair crlTypeNames[] =
+{
+ NVP(CSSM_CRL_TYPE_UNKNOWN),
+ NVP(CSSM_CRL_TYPE_X_509v1),
+ NVP(CSSM_CRL_TYPE_X_509v2),
+ NVP(CSSM_CRL_TYPE_SPKI),
+ NVP(CSSM_CRL_TYPE_MULTIPLE),
+ NVP_END
+};
+
+/* CSSM_CRL_ENCODING names */
+const NameValuePair crlEncodingNames[] =
+{
+ NVP(CSSM_CRL_ENCODING_UNKNOWN),
+ NVP(CSSM_CRL_ENCODING_CUSTOM),
+ NVP(CSSM_CRL_ENCODING_BER),
+ NVP(CSSM_CRL_ENCODING_DER),
+ NVP(CSSM_CRL_ENCODING_BLOOM),
+ NVP(CSSM_CRL_ENCODING_SEXPR),
+ NVP(CSSM_CRL_ENCODING_MULTIPLE),
+ NVP_END
+};
+
+
+/* CSSM_ALGORITHMS names */
+const NameValuePair algIdNames[] =
+{
+ NVP(CSSM_ALGID_NONE),
+ NVP(CSSM_ALGID_DES),
+ NVP(CSSM_ALGID_DESX),
+ NVP(CSSM_ALGID_3DES_3KEY_EDE),
+ NVP(CSSM_ALGID_3DES_3KEY),
+ NVP(CSSM_ALGID_RC2),
+ NVP(CSSM_ALGID_RC5),
+ NVP(CSSM_ALGID_RC4),
+ NVP(CSSM_ALGID_RSA),
+ NVP(CSSM_ALGID_DSA),
+ NVP(CSSM_ALGID_FEE),
+ NVP_END
+};
+
+/* CSSM_DL_DB_SCHEMA_INFO */
+static const CSSM_DB_ATTRIBUTE_INFO schemaInfoAttrs[] = {
+ DB_ATTRIBUTE(RelationID, UINT32),
+ DB_ATTRIBUTE(RelationName, STRING),
+};
+
+static const NameValuePair *schemaInfoNvp[] = {
+ recordTypeNames,
+ NULL
+};
+
+const RelationInfo schemaInfoRelation =
+ RELATION_INFO(CSSM_DL_DB_SCHEMA_INFO,
+ schemaInfoAttrs,
+ schemaInfoNvp);
+
+/* CSSM_DL_DB_RECORD_ALL_KEYS (partial) */
+static const CSSM_DB_ATTRIBUTE_INFO allKeysAttrs[] = {
+ DB_ATTRIBUTE(KeyClass, UINT32),
+ DB_ATTRIBUTE(KeyType, UINT32),
+ DB_ATTRIBUTE(PrintName, BLOB),
+ DB_ATTRIBUTE(Alias, BLOB),
+ DB_ATTRIBUTE(Permanent, UINT32),
+ DB_ATTRIBUTE(Private, UINT32),
+ DB_ATTRIBUTE(Modifiable, UINT32),
+ DB_ATTRIBUTE(Label, BLOB),
+ DB_ATTRIBUTE(ApplicationTag, BLOB),
+ DB_ATTRIBUTE(KeyCreator, BLOB),
+ DB_ATTRIBUTE(KeySizeInBits, UINT32),
+ DB_ATTRIBUTE(EffectiveKeySize, UINT32),
+ DB_ATTRIBUTE(StartDate, BLOB),
+ DB_ATTRIBUTE(EndDate, BLOB),
+ DB_ATTRIBUTE(Sensitive, UINT32),
+ DB_ATTRIBUTE(AlwaysSensitive, UINT32),
+ DB_ATTRIBUTE(Extractable, UINT32),
+ DB_ATTRIBUTE(NeverExtractable, UINT32),
+ DB_ATTRIBUTE(Encrypt, UINT32),
+ DB_ATTRIBUTE(Decrypt, UINT32),
+ DB_ATTRIBUTE(Derive, UINT32),
+ DB_ATTRIBUTE(Sign, UINT32),
+ DB_ATTRIBUTE(Verify, UINT32),
+ DB_ATTRIBUTE(SignRecover, UINT32),
+ DB_ATTRIBUTE(VerifyRecover, UINT32),
+ DB_ATTRIBUTE(Wrap, UINT32),
+ DB_ATTRIBUTE(Unwrap, UINT32),
+};
+
+static const NameValuePair *allKeysNvp[] = {
+ recordTypeNames, /* KeyClass - in this context,
+ * a subset of these */
+ algIdNames,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo allKeysRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_ALL_KEYS,
+ allKeysAttrs,
+ allKeysNvp);
+
+/* CSSM_DL_DB_RECORD_ANY, with the few attrs that all records have in common */
+static const CSSM_DB_ATTRIBUTE_INFO anyRecordAttrs[] = {
+ DB_ATTRIBUTE(PrintName, BLOB)
+};
+
+static const NameValuePair *anyRecordNvp[] = {
+ NULL
+};
+
+const RelationInfo anyRecordRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_ANY,
+ anyRecordAttrs,
+ anyRecordNvp);
+
+/* CSSM_DL_DB_RECORD_CERT - obsolete */
+static const CSSM_DB_ATTRIBUTE_INFO certRecordAttrs[] = {
+ DB_ATTRIBUTE(CertType, UINT32),
+ DB_ATTRIBUTE(CertEncoding, UINT32),
+ DB_ATTRIBUTE(PrintName, BLOB),
+ DB_ATTRIBUTE(Alias, BLOB),
+ DB_ATTRIBUTE(CertIdentity, BLOB),
+ DB_ATTRIBUTE(KeyLabel, BLOB)
+};
+
+static const NameValuePair *certRecordNvp[] = {
+ certTypeNames,
+ certEncodingNames,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo certRecordRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_CERT,
+ certRecordAttrs,
+ certRecordNvp);
+
+/* Apple-specific CSSM_DL_DB_RECORD_X509_CERTIFICATE */
+static const CSSM_DB_ATTRIBUTE_INFO x509CertRecordAttrs[] = {
+ DB_ATTRIBUTE(CertType, UINT32),
+ DB_ATTRIBUTE(CertEncoding, UINT32),
+ DB_ATTRIBUTE(PrintName, BLOB),
+ DB_ATTRIBUTE(Alias, BLOB),
+ DB_ATTRIBUTE(Subject, BLOB),
+ DB_ATTRIBUTE(Issuer, BLOB),
+ DB_ATTRIBUTE(SerialNumber, BLOB),
+ DB_ATTRIBUTE(SubjectKeyIdentifier, BLOB),
+ DB_ATTRIBUTE(PublicKeyHash, BLOB)
+};
+
+static const NameValuePair *x509CertRecordNvp[] = {
+ certTypeNames,
+ certEncodingNames,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo x509CertRecordRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_X509_CERTIFICATE,
+ x509CertRecordAttrs,
+ x509CertRecordNvp);
+
+
+/* Apple-specific CSSM_DL_DB_RECORD_X509_CRL */
+static const CSSM_DB_ATTRIBUTE_INFO x509CrlRecordAttrs[] = {
+ DB_ATTRIBUTE(CrlType, UINT32),
+ DB_ATTRIBUTE(CrlEncoding, UINT32),
+ DB_ATTRIBUTE(PrintName, BLOB),
+ DB_ATTRIBUTE(Alias, BLOB),
+ DB_ATTRIBUTE(Issuer, BLOB),
+ DB_ATTRIBUTE(ThisUpdate, BLOB),
+ DB_ATTRIBUTE(NextUpdate, BLOB),
+ DB_ATTRIBUTE(URI, BLOB),
+ DB_ATTRIBUTE(CrlNumber, UINT32),
+ DB_ATTRIBUTE(DeltaCrlNumber, UINT32),
+};
+
+static const NameValuePair *x509CrlRecordNvp[] = {
+ crlTypeNames,
+ crlEncodingNames,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo x509CrlRecordRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_X509_CRL,
+ x509CrlRecordAttrs,
+ x509CrlRecordNvp);
+
+
+/* generic keychain template, when recordType unknown */
+static const CSSM_DB_ATTRIBUTE_INFO genericKcAttrs[] = {
+ DB_INT_ATTRIBUTE(kSecInvisibleItemAttr, SINT32),
+ DB_ATTRIBUTE(PrintName, BLOB),
+ DB_INT_ATTRIBUTE(kSecDescriptionItemAttr, BLOB),
+ DB_INT_ATTRIBUTE(kSecTypeItemAttr, UINT32),
+ /* more to come */
+};
+
+static const NameValuePair *genericKcNvp[] = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo genericKcRelation =
+ RELATION_INFO(0, // not used!
+ genericKcAttrs,
+ genericKcNvp);
+
+/* UserTrust */
+static const CSSM_DB_ATTRIBUTE_INFO userTrustAttrs[] = {
+ DB_ATTRIBUTE(TrustedCertificate, BLOB),
+ DB_ATTRIBUTE(TrustedPolicy, BLOB),
+ DB_ATTRIBUTE(PrintName, BLOB),
+};
+
+static const NameValuePair *userTrustNvp[] = {
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+};
+
+const RelationInfo userTrustRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_USER_TRUST,
+ userTrustAttrs,
+ userTrustNvp);
+
+/* remainder added after the schema were publicly available via Schema.h */
+
+/* unlock referral record */
+
+using namespace Security;
+using namespace KeychainCore;
+
+static const CSSM_DB_ATTRIBUTE_INFO unlockReferralRecordAttrs[] =
+{
+ Schema::kUnlockReferralType,
+ Schema::kUnlockReferralDbName,
+ Schema::kUnlockReferralDbGuid,
+ Schema::kUnlockReferralDbSSID,
+ Schema::kUnlockReferralDbSSType,
+ Schema::kUnlockReferralDbNetname,
+ Schema::kUnlockReferralKeyLabel,
+ Schema::kUnlockReferralKeyAppTag,
+ Schema::kUnlockReferralPrintName,
+ Schema::kUnlockReferralAlias
+};
+
+const NameValuePair referralTypeNames[] =
+{
+ NVP(CSSM_APPLE_UNLOCK_TYPE_KEY_DIRECT),
+ NVP(CSSM_APPLE_UNLOCK_TYPE_WRAPPED_PRIVATE),
+ NVP_END
+};
+
+
+static const NameValuePair *referralNvp[] = {
+ referralTypeNames,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo referralRecordRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_UNLOCK_REFERRAL,
+ unlockReferralRecordAttrs,
+ referralNvp);
+
+/* extended attribute record */
+static const CSSM_DB_ATTRIBUTE_INFO extendedAttrRecordAttrs[] =
+{
+ Schema::kExtendedAttributeRecordType,
+ Schema::kExtendedAttributeItemID,
+ Schema::kExtendedAttributeAttributeName,
+ Schema::kExtendedAttributeModDate,
+ Schema::kExtendedAttributeAttributeValue
+};
+
+static const NameValuePair *extendedAttrNvp[] = {
+ recordTypeNames,
+ NULL,
+ NULL,
+ NULL,
+ NULL
+};
+
+const RelationInfo extendedAttrRelation =
+ RELATION_INFO(CSSM_DL_DB_RECORD_EXTENDED_ATTRIBUTE,
+ extendedAttrRecordAttrs,
+ extendedAttrNvp);
+