]> git.saurik.com Git - apple/security.git/blobdiff - SecuritySNACCRuntime/c++-lib/src/cdsaUtils.cpp
Security-163.tar.gz
[apple/security.git] / SecuritySNACCRuntime / c++-lib / src / cdsaUtils.cpp
diff --git a/SecuritySNACCRuntime/c++-lib/src/cdsaUtils.cpp b/SecuritySNACCRuntime/c++-lib/src/cdsaUtils.cpp
deleted file mode 100644 (file)
index 55583c1..0000000
+++ /dev/null
@@ -1,197 +0,0 @@
-/*
- * Copyright (c) 2000-2001 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.
- */
-
-
-/*
- * cdsaUtils.cpp - utility functions for CDSA-related code
- */
-
-#include "cdsaUtils.h"
-#include <Security/cssmerr.h>
-
-#ifdef NDEBUG
-
-#include <Security/globalizer.h>
-
-/* silent cerr substitute */
-ModuleNexus<Asn1ErrorClass> AsnNullError;
-#endif /* NDEBUG */
-
-/* malloc/copy AsnBits.bits -->CssmOwnedData */
-void SC_asnBitsToCssmData(
-       const AsnBits &bits,
-       CssmOwnedData &oData)
-{
-       size_t len = (bits.BitLen() + 7) / 8;
-       oData.copy(reinterpret_cast<const uint8 *>(bits.BitOcts()), len);
-}
-
-/* given DER-encoded bit string, decoded it and malloc/copy results 
- * back to a CssmOwnedData */
-void SC_decodeAsnBitsToCssmData(
-       const CssmData encodedBits,
-       CssmOwnedData &oData)
-{
-       AsnBits decodedBits;
-       SC_decodeAsnObj(encodedBits, decodedBits);
-       size_t len = (decodedBits.BitLen() + 7) / 8;
-       oData.copy(reinterpret_cast<const uint8 *>(decodedBits.BitOcts()), len);
-}
-
-/*
- * Universal BDecPdu/BEncPdu replacements, used below in SC_decodeAsnObj and
- * SC_encodeAsnObj.
- *
- * All AsnType subclasses implement this either via PDU_MEMBER_MACROS
- * for SecuritySNACCRuntime built-in types, or explicitly for all
- * other classes using asn-useful.h. To faciliate a global "one
- * routine for encode/decode" which operates on AsnType &'s, we have 
- * to explicitly provide this here. Why this is not in AsnType, I don't 
- * know.
- */
-static int SC_BDecPDU(
-       AsnType         &asnObj, 
-       BUF_TYPE        b, 
-       AsnLen          &bytesDecoded)
-{
-    ENV_TYPE env;
-
-    bytesDecoded = 0;
-       try {
-         asnObj.BDec(b, bytesDecoded, env);
-         return !b.ReadError();
-    }
-       catch(...) {
-        return false;
-       }
-}
-
-static int SC_BEncPdu(
-       AsnType         &asnObj,
-       BUF_TYPE        b, 
-       AsnLen          &bytesEncoded)
-{
-    bytesEncoded = asnObj.BEnc(b);
-    return !b.WriteError();
-}
-
-/* DER-decode any AsnType object */
-void SC_decodeAsnObj(
-       const CssmData          &derEncoded,
-       AsnType                         &asnObj)
-{
-       AsnBuf                                  buf;
-       size_t                                  len = (size_t)derEncoded.length();
-       
-       buf.InstallData(reinterpret_cast<char *>(derEncoded.data()), len);
-       if(!SC_BDecPDU(asnObj, buf, len)) {
-               CssmError::throwMe(CSSMERR_CL_UNKNOWN_FORMAT);
-       }
-}
-
-/* 
- * DER-encode any AsnType object.
- * Unfortunately the call has to give an estimate of the max encoded size of 
- * the result. There is no way (that I know of) to figure this out at encode
- * time. If this turns out to be a problem we might have to do a retry,
- * doubling the size of the encoded buffer. Be liberal; the maxEncodedSize
- * buffer is only temporary - due to snacc encoding style, a copy out is 
- * necessary in any case, so the mallocd size of encodedBuf is exactly the
- * right size. 
- */
-void SC_encodeAsnObj(
-       AsnType                         &asnObj,
-       CssmOwnedData           &derEncoded,
-       size_t                          maxEncodedSize)
-{
-       CssmAutoData aData(derEncoded.allocator);               // temp encode target
-       aData.malloc(maxEncodedSize);
-       memset(aData.data(), 0, maxEncodedSize);
-       AsnBuf encBuf;
-       encBuf.Init(static_cast<char *>(aData.data()), maxEncodedSize);
-       encBuf.ResetInWriteRvsMode();
-       AsnLen encoded;
-       int rtn = SC_BEncPdu(asnObj, encBuf, encoded);
-       if(encoded > maxEncodedSize) {
-               CssmError::throwMe(CSSMERR_CSSM_BUFFER_TOO_SMALL);
-       }
-       if(!rtn) {
-               /* not sure how this can happen... */
-               CssmError::throwMe(CSSMERR_CSSM_BUFFER_TOO_SMALL);
-       }
-       /* success; copy out to caller */
-       derEncoded.get().clear();
-       derEncoded.copy(encBuf.DataPtr(), encBuf.DataLen());
-}
-
-/*
- * Given a contentLength, obtain the length of the DER length encoding.
- */
-size_t SC_lengthOfLength(
-       size_t contentLen)
-{
-       if(contentLen < 128) {
-               return 1;       
-       }
-       else if(contentLen < 256) {
-               return 2;
-       }
-       else if(contentLen < 65536) {
-               return 3;
-       }
-       else if(contentLen < 16777126) {
-               return 4;
-       }
-       else {
-               return 5;
-       }
-}
-
-/*
- * Encode a DER length field. Pass in the lengthOfLength if you've obtained
- * it in a previous call to SC_lengthOfLength.
- */
-void SC_encodeLength(
-       size_t  contentLen,
-       void    *cp,
-       size_t  lengthOfLength)
-{
-       if(lengthOfLength == 0) {
-               lengthOfLength = SC_lengthOfLength(contentLen);
-       }
-       unsigned char *ucp = reinterpret_cast<unsigned char *>(cp);
-       if(lengthOfLength == 1) {
-               /* easy case */
-               *ucp = contentLen;
-               return;
-       }
-       lengthOfLength--;
-       *ucp = (0x80 + lengthOfLength);
-       ucp += lengthOfLength;
-       for(size_t i=0; i<lengthOfLength; i++) {
-               *ucp-- = contentLen & 0xff;
-               contentLen >>= 8;
-       }
-}
-
-/*
- * Explicitly non-inlined SnaccError throw 
- */
-void SnaccExcep::throwMe(int err)
-{
-       throw SnaccExcep(err);
-}