#include <Security/SecPolicy.h>
#include <Security/SecPolicyPriv.h>
#include <security_keychain/Policies.h>
#include <security_keychain/PolicyCursor.h>
#include "SecBridge.h"
CFTypeID
SecPolicyGetTypeID(void)
{
BEGIN_SECAPI
return gTypes().Policy.typeID;
END_SECAPI1(_kCFRuntimeNotATypeID)
}
OSStatus
SecPolicyGetOID(SecPolicyRef policyRef, CSSM_OID* oid)
{
BEGIN_SECAPI
Required(oid) = Policy::required(policyRef)->oid();
END_SECAPI2("SecPolicyGetOID")
}
OSStatus
SecPolicyGetValue(SecPolicyRef policyRef, CSSM_DATA* value)
{
BEGIN_SECAPI
Required(value) = Policy::required(policyRef)->value();
END_SECAPI2("SecPolicyGetValue")
}
OSStatus
SecPolicySetValue(SecPolicyRef policyRef, const CSSM_DATA *value)
{
BEGIN_SECAPI
Required(value);
const CssmData newValue(value->Data, value->Length);
Policy::required(policyRef)->setValue(newValue);
END_SECAPI2("SecPolicySetValue")
}
OSStatus
SecPolicyGetTPHandle(SecPolicyRef policyRef, CSSM_TP_HANDLE* tpHandle)
{
BEGIN_SECAPI
Required(tpHandle) = Policy::required(policyRef)->tp()->handle();
END_SECAPI2("SecPolicyGetTPHandle")
}
OSStatus
SecPolicyCopyAll(CSSM_CERT_TYPE certificateType, CFArrayRef* policies)
{
BEGIN_SECAPI
Required(policies);
CFMutableArrayRef currPolicies = NULL;
currPolicies = CFArrayCreateMutable(NULL, 0, NULL);
if ( currPolicies )
{
SecPointer<PolicyCursor> cursor(new PolicyCursor(NULL, NULL));
SecPointer<Policy> policy;
while ( cursor->next(policy) )
{
CFArrayAppendValue(currPolicies, policy->handle());
CFRelease(policy->handle());
}
*policies = CFArrayCreateCopy(NULL, currPolicies);
CFRelease(currPolicies);
CFRelease(cursor->handle());
}
END_SECAPI2("SecPolicyCopyAll")
}
OSStatus
SecPolicyCopy(CSSM_CERT_TYPE certificateType, const CSSM_OID *policyOID, SecPolicyRef* policy)
{
Required(policy);
Required(policyOID);
SecPolicySearchRef srchRef = NULL;
OSStatus ortn;
ortn = SecPolicySearchCreate(certificateType, policyOID, NULL, &srchRef);
if(ortn) {
return ortn;
}
ortn = SecPolicySearchCopyNext(srchRef, policy);
CFRelease(srchRef);
return ortn;
}