--- /dev/null
+#include <ctype.h>
+#include <strings.h>
+#include "ocspUtils.h"
+#include <utilLib/cspwrap.h>
+#include <Security/SecKey.h>
+#include <Security/SecKeyPriv.h>
+
+
+/*
+ * Sign some data with an identity.
+ */
+OSStatus ocspSign(
+ SecIdentityRef idRef,
+ CSSM_DATA &plainText,
+ CSSM_ALGORITHMS algId, // RSA/SHA1, DSA/SHA1
+ CSSM_DATA &sig) // caller must APP_FREE()
+{
+ const CSSM_KEY *privCssmKey;
+ OSStatus ortn;
+ SecKeyRef privKeyRef;
+ CSSM_CSP_HANDLE cspHand;
+ CSSM_RETURN crtn;
+
+ ortn = SecIdentityCopyPrivateKey(idRef, &privKeyRef);
+ if(ortn) {
+ cssmPerror("SecIdentityCopyPrivateKey", ortn);
+ return ortn;
+ }
+ ortn = SecKeyGetCSSMKey(privKeyRef, &privCssmKey);
+ if(ortn) {
+ cssmPerror("SecKeyGetCSSMKey", ortn);
+ goto errOut;
+ }
+ ortn = SecKeyGetCSPHandle(privKeyRef, &cspHand);
+ if(ortn) {
+ cssmPerror("SecKeyGetCSPHandle", ortn);
+ goto errOut;
+ }
+ sig.Data = NULL;
+ sig.Length = 0;
+ crtn = cspSign(cspHand, algId, (CSSM_KEY_PTR)privCssmKey,
+ &plainText, &sig);
+ if(crtn) {
+ cssmPerror("cspSign", crtn);
+ ortn = crtn;
+ }
+errOut:
+ CFRelease(privKeyRef);
+ return ortn;
+}