--- /dev/null
+/*
+ * Copyright (c) 2003-2004 Apple Computer, Inc. All Rights Reserved.
+ *
+ * The contents of this file constitute Original Code as defined in and are
+ * subject to the Apple Public Source License Version 1.2 (the 'License').
+ * You may not use this file except in compliance with the License. Please
+ * obtain a copy of the License at http://www.apple.com/publicsource and
+ * read it before using this file.
+ *
+ * This Original Code and all software distributed under the License are
+ * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER
+ * EXPRESS OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES,
+ * INCLUDING WITHOUT LIMITATION, ANY WARRANTIES OF MERCHANTABILITY,
+ * FITNESS FOR A PARTICULAR PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT.
+ * Please see the License for the specific language governing rights and
+ * limitations under the License.
+ */
+/*
+ * nssAppUtils.cpp
+ */
+
+#include "nssAppUtils.h"
+#include "common.h"
+#include "cspwrap.h"
+#include <Security/SecAsn1Coder.h>
+#include <Security/osKeyTemplates.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <strings.h>
+
+/*
+ * Create pubKeyPartial as copy of pubKey without the DSA params.
+ * Returned partial key is RAW. Incoming key can be raw or ref.
+ */
+CSSM_RETURN extractDsaPartial(
+ CSSM_CSP_HANDLE cspHand,
+ const CSSM_KEY *pubKey,
+ CSSM_KEY_PTR pubKeyPartial)
+{
+ const CSSM_KEY *thePubKey = pubKey;
+ CSSM_KEY rawPubKey;
+ CSSM_RETURN crtn;
+
+ if(pubKey->KeyHeader.BlobType == CSSM_KEYBLOB_REFERENCE) {
+ /* first get this in raw form */
+ crtn = cspRefKeyToRaw(cspHand, pubKey, &rawPubKey);
+ if(crtn) {
+ return crtn;
+ }
+ thePubKey = &rawPubKey;
+ }
+
+ /* decode raw public key */
+ NSS_DSAPublicKeyX509 nssPub;
+ SecAsn1CoderRef coder;
+
+ OSStatus ortn = SecAsn1CoderCreate(&coder);
+ if(ortn) {
+ cssmPerror("SecAsn1CoderCreate", ortn);
+ return ortn;
+ }
+ memset(&nssPub, 0, sizeof(nssPub));
+ if(SecAsn1DecodeData(coder, &thePubKey->KeyData, kSecAsn1DSAPublicKeyX509Template,
+ &nssPub)) {
+ printf("***Error decoding DSA public key. Aborting.\n");
+ return 1;
+ }
+
+ /* zero out the params and reencode */
+ nssPub.dsaAlg.params = NULL;
+ CSSM_DATA newKey = {0, NULL};
+ if(SecAsn1EncodeItem(coder, &nssPub, kSecAsn1DSAPublicKeyX509Template,
+ &newKey)) {
+ printf("***Error reencoding DSA pub key\n");
+ return 1;
+ }
+
+ /* copy - newKey is in coder space */
+ *pubKeyPartial = *thePubKey;
+ appCopyCssmData(&newKey, &pubKeyPartial->KeyData);
+
+ if(pubKey->KeyHeader.BlobType == CSSM_KEYBLOB_REFERENCE) {
+ /* free the KeyData mallocd by cspRefKeyToRaw */
+ CSSM_FREE(thePubKey->KeyData.Data);
+ pubKeyPartial->KeyHeader.BlobType = CSSM_KEYBLOB_RAW;
+ }
+ pubKeyPartial->KeyHeader.KeyAttr |= CSSM_KEYATTR_PARTIAL;
+ SecAsn1CoderRelease(coder);
+ return CSSM_OK;
+}