X-Git-Url: https://git.saurik.com/apple/security.git/blobdiff_plain/72a12576750f52947eb043106ba5c12c0d07decf..b1ab9ed8d0e0f1c3b66d7daa8fd5564444c56195:/libsecurity_apple_csp/lib/SignatureContext.cpp diff --git a/libsecurity_apple_csp/lib/SignatureContext.cpp b/libsecurity_apple_csp/lib/SignatureContext.cpp new file mode 100644 index 00000000..f7085c7d --- /dev/null +++ b/libsecurity_apple_csp/lib/SignatureContext.cpp @@ -0,0 +1,127 @@ +/* + * 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. + */ + + +/* + * SignatureContext.h - AppleCSPContext sublass for generic sign/verify + */ + +#include "SignatureContext.h" +#include "AppleCSPUtils.h" +#include "AppleCSPSession.h" +#include + +#include + +#define cspSigDebug(args...) secdebug("cspSig", ## args) + +SignatureContext::~SignatureContext() +{ + delete &mDigest; + delete &mSigner; + mInitFlag = false; +} + +/* both sign & verify */ +void SignatureContext::init( + const Context &context, + bool isSigning) +{ + mDigest.digestInit(); + mSigner.signerInit(context, isSigning); + mInitFlag = true; +} + +/* both sign & verify */ +void SignatureContext::update( + const CssmData &data) +{ + mDigest.digestUpdate(data.Data, data.Length); +} + +/* sign only */ +void SignatureContext::final( + CssmData &out) +{ + void *digest; + size_t digestLen; + void *sig = out.data(); + size_t sigLen = out.length(); + + /* first obtain the digest */ + digestLen = mDigest.digestSizeInBytes(); + digest = session().malloc(digestLen); + mDigest.digestFinal(digest); + + /* now sign */ + try { + mSigner.sign(digest, + digestLen, + sig, + &sigLen); + } + catch(...) { + session().free(digest); + throw; + } + session().free(digest); + if(out.length() < sigLen) { + cspSigDebug("SignatureContext: mallocd sig too small!"); + CssmError::throwMe(CSSMERR_CSP_INTERNAL_ERROR); + } + out.length(sigLen); +} + +/* verify only */ +void SignatureContext::final( + const CssmData &in) +{ + void *digest; + size_t digestLen; + + /* first obtain the digest */ + digestLen = mDigest.digestSizeInBytes(); + digest = session().malloc(digestLen); + mDigest.digestFinal(digest); + + /* now verify */ + try { + mSigner.verify(digest, + digestLen, + in.Data, + in.Length); + } + catch(...) { + session().free(digest); + throw; + } + session().free(digest); +} + +size_t SignatureContext::outputSize( + bool final, + size_t inSize) +{ + return mSigner.maxSigSize(); +} + +/* for raw sign/verify - optionally called after init */ +void SignatureContext::setDigestAlgorithm( + CSSM_ALGORITHMS digestAlg) +{ + mSigner.setDigestAlg(digestAlg); +}