]> git.saurik.com Git - apple/security.git/blobdiff - libsecurity_ssl/lib/sslCrypto.h
Security-55163.44.tar.gz
[apple/security.git] / libsecurity_ssl / lib / sslCrypto.h
diff --git a/libsecurity_ssl/lib/sslCrypto.h b/libsecurity_ssl/lib/sslCrypto.h
new file mode 100644 (file)
index 0000000..9fa6876
--- /dev/null
@@ -0,0 +1,233 @@
+/*
+ * Copyright (c) 2006-2008,2010-2012 Apple Inc. All Rights Reserved.
+ *
+ * @APPLE_LICENSE_HEADER_START@
+ *
+ * This file contains Original Code and/or Modifications of Original Code
+ * as defined in and that are subject to the Apple Public Source License
+ * Version 2.0 (the 'License'). You may not use this file except in
+ * compliance with the License. Please obtain a copy of the License at
+ * http://www.opensource.apple.com/apsl/ and read it before using this
+ * file.
+ *
+ * The 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.
+ *
+ * @APPLE_LICENSE_HEADER_END@
+ */
+
+/*
+ * sslCrypto.h - interface between SSL and crypto libraries
+ */
+
+#ifndef        _SSL_CRYPTO_H_
+#define _SSL_CRYPTO_H_ 1
+
+#include "ssl.h"
+#include "sslContext.h"
+#include <Security/SecKeyPriv.h>
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+#ifndef                NDEBUG
+extern void stPrintCdsaError(const char *op, OSStatus crtn);
+#else
+#define stPrintCdsaError(o, cr)
+#endif
+
+/*
+ * Free a pubKey object.
+ */
+extern OSStatus sslFreePubKey(SSLPubKey **pubKey);
+
+/*
+ * Free a privKey object.
+ */
+extern OSStatus sslFreePrivKey(SSLPrivKey **privKey);
+
+extern CFIndex sslPubKeyGetAlgorithmID(SSLPubKey *pubKey);
+extern CFIndex sslPrivKeyGetAlgorithmID(SSLPrivKey *privKey);
+
+/*
+ * Create a new SecTrust object and return it.
+ */
+OSStatus
+sslCreateSecTrust(
+       SSLContext                              *ctx,
+       CFArrayRef                              certChain,
+       bool                                    arePeerCerts,
+    SecTrustRef             *trust);   /* RETURNED */
+
+
+/*
+ * Verify a cert chain.
+ */
+extern OSStatus sslVerifyCertChain(
+       SSLContext                              *ctx,
+#ifdef USE_SSLCERTIFICATE
+       const SSLCertificate    *certChain,
+#else /* !USE_SSLCERTIFICATE */
+       CFArrayRef                              certChain,
+#endif /* !USE_SSLCERTIFICATE */
+       bool                                    arePeerCerts);
+
+/*
+ * Get the peer's public key from the certificate chain.
+ */
+extern OSStatus sslCopyPeerPubKey(
+       SSLContext                              *ctx,
+       SSLPubKey               **pubKey);
+
+
+/*
+ * Raw RSA/DSA sign/verify.
+ */
+OSStatus sslRawSign(
+       SSLContext                      *ctx,
+       SSLPrivKey          *privKey,
+       const uint8_t       *plainText,
+       size_t              plainTextLen,
+       uint8_t                         *sig,                   // mallocd by caller; RETURNED
+       size_t              sigLen,         // available
+       size_t              *actualBytes);  // RETURNED
+
+OSStatus sslRawVerify(
+       SSLContext                      *ctx,
+       SSLPubKey           *pubKey,
+       const uint8_t           *plainText,
+       size_t              plainTextLen,
+       const uint8_t       *sig,
+       size_t              sigLen);        // available
+
+/* TLS 1.2 style RSA sign */
+OSStatus sslRsaSign(
+    SSLContext                 *ctx,
+    SSLPrivKey          *privKey,
+    const SecAsn1AlgId  *algId,
+    const uint8_t       *plainText,
+    size_t              plainTextLen,
+    uint8_t                            *sig,                   // mallocd by caller; RETURNED
+    size_t              sigLen,         // available
+    size_t              *actualBytes);  // RETURNED
+
+/* TLS 1.2 style RSA verify */
+OSStatus sslRsaVerify(
+    SSLContext          *ctx,
+    SSLPubKey           *pubKey,
+    const SecAsn1AlgId  *algId,
+    const uint8_t       *plainText,
+    size_t              plainTextLen,
+    const uint8_t       *sig,
+    size_t              sigLen);         // available
+
+/*
+ * Encrypt/Decrypt
+ */
+OSStatus sslRsaEncrypt(
+       SSLContext                      *ctx,
+       SSLPubKey           *pubKey,
+#ifdef USE_CDSA_CRYPTO
+       CSSM_CSP_HANDLE         cspHand,
+#endif
+       const uint32_t          padding,
+       const uint8_t       *plainText,
+       size_t              plainTextLen,
+       uint8_t                         *cipherText,            // mallocd by caller; RETURNED
+       size_t              cipherTextLen,      // available
+       size_t              *actualBytes);      // RETURNED
+OSStatus sslRsaDecrypt(
+       SSLContext                      *ctx,
+       SSLPrivKey                      *privKey,
+       const uint32_t          padding,
+       const uint8_t       *cipherText,
+       size_t              cipherTextLen,
+       uint8_t                         *plainText,                     // mallocd by caller; RETURNED
+       size_t              plainTextLen,               // available
+       size_t              *actualBytes);              // RETURNED
+
+/*
+ * Obtain size of key in bytes.
+ */
+extern size_t sslPrivKeyLengthInBytes(
+       SSLPrivKey *sslKey);
+
+extern size_t sslPubKeyLengthInBytes(
+       SSLPubKey *sslKey);
+
+/* Obtain max signature size in bytes. */
+extern OSStatus sslGetMaxSigSize(
+       SSLPrivKey *privKey,
+       size_t           *maxSigSize);
+
+#if 0
+/*
+ * Get raw key bits from an RSA public key.
+ */
+OSStatus sslGetPubKeyBits(
+       SSLContext                      *ctx,
+       SSLPubKey           *pubKey,
+       SSLBuffer                       *modulus,               // data mallocd and RETURNED
+       SSLBuffer                       *exponent);             // data mallocd and RETURNED
+#endif
+
+/*
+ * Given raw RSA key bits, cook up a SSLPubKey. Used in
+ * Server-initiated key exchange.
+ */
+OSStatus sslGetPubKeyFromBits(
+       SSLContext                      *ctx,
+       const SSLBuffer         *modulus,
+       const SSLBuffer         *exponent,
+       SSLPubKey           **pubKey);       // mallocd and RETURNED
+
+OSStatus sslVerifySelectedCipher(
+       SSLContext              *ctx,
+       const SSLCipherSpec *selectedCipherSpec);
+
+#if APPLE_DH
+int sslDhGenerateParams(SSLContext *ctx, uint32_t g, size_t prime_size,
+    SSLBuffer *params, SSLBuffer *generator, SSLBuffer *prime);
+
+OSStatus sslDhCreateKey(SSLContext *ctx);
+OSStatus sslDhGenerateKeyPair(SSLContext *ctx);
+OSStatus sslDhKeyExchange(SSLContext *ctx);
+
+OSStatus sslDecodeDhParams(
+       const SSLBuffer *blob,                  /* Input - PKCS-3 encoded */
+       SSLBuffer               *prime,                 /* Output - wire format */
+    SSLBuffer          *generator);    /* Output - wire format */
+
+OSStatus sslEncodeDhParams(
+    SSLBuffer           *blob,                 /* data mallocd and RETURNED - PKCS-3 encoded */
+    const SSLBuffer            *prime,                 /* Input - wire format */
+    const SSLBuffer            *generator);    /* Input - wire format */
+
+#endif /* APPLE_DH */
+
+/*
+ * Given an ECDSA public key in CSSM format, extract the SSL_ECDSA_NamedCurve
+ * from its algorithm parameters.
+ */
+OSStatus sslEcdsaPeerCurve(
+       SSLPubKey *pubKey,
+       SSL_ECDSA_NamedCurve *namedCurve);
+OSStatus sslEcdhGenerateKeyPair(
+       SSLContext                      *ctx,
+       SSL_ECDSA_NamedCurve namedCurve);
+OSStatus sslEcdhKeyExchange(
+       SSLContext              *ctx,
+       SSLBuffer               *exchanged);
+
+#ifdef __cplusplus
+}
+#endif
+
+
+#endif /* _SSL_CRYPTO_H_ */