]> git.saurik.com Git - apple/security.git/blobdiff - OSX/libsecurity_apple_cspdl/lib/SSContext.h
Security-57336.1.9.tar.gz
[apple/security.git] / OSX / libsecurity_apple_cspdl / lib / SSContext.h
diff --git a/OSX/libsecurity_apple_cspdl/lib/SSContext.h b/OSX/libsecurity_apple_cspdl/lib/SSContext.h
new file mode 100644 (file)
index 0000000..bf59ec7
--- /dev/null
@@ -0,0 +1,167 @@
+/*
+ * Copyright (c) 2000-2001,2011-2012,2014 Apple 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.
+ */
+
+
+//
+// SSContext.h - Security Server contexts 
+//
+#ifndef _H_SS_CONTEXT
+#define _H_SS_CONTEXT
+
+#include <security_cdsa_plugin/CSPsession.h>
+#include <securityd_client/ssclient.h>
+#include <security_cdsa_utilities/digestobject.h>
+#include <security_cdsa_client/cspclient.h>
+
+//
+// Parent class for all CSPContexts implemented in this CSP.  Currently the
+// only thing we add is a reference to our creator's session.
+//
+class SSCSPSession;
+class SSKey;
+
+class SSContext : public CSPFullPluginSession::CSPContext
+{
+public:
+       SSContext(SSCSPSession &session);
+       ~SSContext() { clearOutBuf(); }
+       virtual void init(const Context &context, bool encoding);
+
+protected:
+       SecurityServer::ClientSession &clientSession();
+       SSCSPSession &mSession;
+       
+       // mOutBuf provides a holding tank for implied final() operations
+       // resulting from an outputSize(true, 0). This form of outputSize()
+       // is understood to only occur just prior to the final() call. To avoid
+       // an extra RPC (just to perform the outputSize(), most subclasses of
+       // SSContext actually perform the final() operation at this time,
+       // storing the result in mOutBuf. At final(), mOutBuf() is just copied
+       // to the caller's supplied output buffer. 
+       CssmData mOutBuf;               
+       
+       // We remember a pointer to the passed in context and assume it will
+       // remain a valid from init(), update() all the way though the call to
+       // final().
+       const Context *mContext;
+       
+       void clearOutBuf();
+       void copyOutBuf(CssmData &out);
+};
+
+// context for signature (sign and verify)
+class SSSignatureContext : public SSContext
+{
+public:
+       SSSignatureContext(SSCSPSession &session);
+       ~SSSignatureContext();
+       virtual void init(const Context &context, bool signing);
+       virtual void update(const CssmData &data);
+       virtual size_t outputSize(bool final, size_t inSize);
+       
+       /* sign */
+       void sign(CssmData &sig);
+       virtual void final(CssmData &out);
+       
+       /* verify */
+       virtual void final(const CssmData &in);
+       
+       /* for raw sign/verify - optionally called after init */ 
+       virtual void setDigestAlgorithm(CSSM_ALGORITHMS digestAlg);
+
+private:
+       /* stash the context's key for final sign/verify */
+       SecurityServer::KeyHandle mKeyHandle;   
+       
+       /* alg-dependent, calculated at init time */
+       CSSM_ALGORITHMS mSigAlg;                // raw signature alg
+       CSSM_ALGORITHMS mDigestAlg;             // digest
+
+       /* exactly one of these is used to collect updates */
+       NullDigest                      *mNullDigest;
+       CssmClient::Digest      *mDigest;
+};
+
+// Context for GenerateRandom operations
+class SSRandomContext : public SSContext
+{
+public:
+       SSRandomContext(SSCSPSession &session);
+       virtual void init(const Context &context, bool);
+       virtual size_t outputSize(bool final, size_t inSize);
+       virtual void final(CssmData &out);
+       
+private:
+       uint32 mOutSize;                // spec'd in context at init() time 
+};
+
+// Context for Encrypt and Decrypt operations
+class SSCryptContext : public SSContext
+{
+public:
+       SSCryptContext(SSCSPSession &session);
+       ~SSCryptContext();
+       virtual void init(const Context &context, bool encoding);
+       virtual size_t inputSize(size_t outSize);
+       virtual size_t outputSize(bool final, size_t inSize);
+       virtual void minimumProgress(size_t &in, size_t &out);
+       virtual void update(void *inp, size_t &inSize, void *outp,
+                                               size_t &outSize);
+       virtual void final(CssmData &out);
+
+private:
+       SecurityServer::KeyHandle mKeyHandle;
+       NullDigest mNullDigest;                                         // accumulator
+};
+
+// Digest, using raw CSP
+class SSDigestContext : public SSContext
+{
+public:
+       SSDigestContext(SSCSPSession &session);
+       ~SSDigestContext();
+       virtual void init(const Context &context, bool);
+       virtual void update(const CssmData &data);
+       virtual void final(CssmData &out);
+       virtual size_t outputSize(bool final, size_t inSize);
+
+private:
+       CssmClient::Digest *mDigest;
+};
+
+// common class for MAC generate, verify
+class SSMACContext : public SSContext
+{
+public:
+       SSMACContext(SSCSPSession &session);
+       virtual void init(const Context &context, bool);
+       virtual void update(const CssmData &data);
+       virtual size_t outputSize(bool final, size_t inSize);
+       
+       /* sign */
+       void genMac(CssmData &mac);
+       virtual void final(CssmData &out);
+       /* verify */
+       virtual void final(const CssmData &in);
+       
+private:
+       SecurityServer::KeyHandle mKeyHandle;
+       NullDigest mNullDigest;                                 // accumulator
+};
+
+
+#endif // _H_SS_CONTEXT