]> git.saurik.com Git - apple/security.git/blobdiff - SecurityTests/testclient/csptests.cpp
Security-57031.1.35.tar.gz
[apple/security.git] / SecurityTests / testclient / csptests.cpp
diff --git a/SecurityTests/testclient/csptests.cpp b/SecurityTests/testclient/csptests.cpp
new file mode 100644 (file)
index 0000000..ac1b575
--- /dev/null
@@ -0,0 +1,210 @@
+#include "csptests.h"
+
+#include <security_cdsa_client/keyclient.h>
+#include <security_cdsa_client/cspclient.h>
+#include <security_cdsa_client/macclient.h>
+#include <security_cdsa_client/genkey.h>
+#include <security_cdsa_client/wrapkey.h>
+
+using namespace CssmClient;
+
+static void testCrypt(const Guid &cspGuid);
+static void testDigests(const Guid &cspGuid);
+static void testRandom(const Guid &cspGuid);
+static void testMac(const Guid &cspGuid);
+static void testWrap(const Guid &cspGuid);
+
+
+void csptests()
+{
+       testCrypt(gGuidAppleCSP);
+       testCrypt(gGuidAppleCSPDL);
+       testDigests(gGuidAppleCSP);
+       testRandom(gGuidAppleCSP);
+       testRandom(gGuidAppleCSPDL);
+       testMac(gGuidAppleCSP);
+       testMac(gGuidAppleCSPDL);
+}
+
+void testmac()
+{
+       testMac(gGuidAppleCSP);
+}
+
+void testwrap()
+{
+       testWrap(gGuidAppleCSP);
+}
+
+static void testCrypt(const Guid &cspGuid)
+{
+    printf("\n* performing encrypt/decrypt test...\n");
+       
+       CSP csp(cspGuid);
+
+    printf("Generating key\n");
+       GenerateKey genKey(csp, CSSM_ALGID_DES, 64);
+       Key key = genKey(KeySpec(CSSM_KEYUSE_ANY, CSSM_KEYATTR_RETURN_DEFAULT));
+    printf("done\n");
+
+       // Gnerate IV
+    printf("Generating iv\n");
+       //CssmData iv = Random(csp, CSSM_ALGID_SHARandom)(8);
+       CssmPolyData iv("12345678");
+
+       CssmPolyData in("Om mani padme hum");
+       printf("input=");
+       dump(in);
+
+       // Encrypt
+    printf("Encrypting\n");
+
+       Encrypt encrypt(csp, CSSM_ALGID_DES);
+       encrypt.mode(CSSM_ALGMODE_CBCPadIV8);
+       encrypt.padding(CSSM_PADDING_PKCS1);
+       encrypt.initVector(iv);
+       encrypt.key(key);
+       CssmData cipher;
+       CssmData remcipher;
+       encrypt.encrypt(&in, 1, &cipher, 1);
+       encrypt.final(remcipher);
+       printf("ciphertext=");
+       dump(cipher);
+       printf("remainder=");
+       dump(remcipher);
+
+       // Decrypt
+    printf("Decrypting\n");
+
+       Decrypt decrypt(csp, CSSM_ALGID_DES);
+       decrypt.key(key);
+       decrypt.mode(CSSM_ALGMODE_CBCPadIV8);
+       decrypt.padding(CSSM_PADDING_PKCS1);
+       decrypt.initVector(iv);
+       CssmData plain;
+       CssmData remplain;
+       CssmData inp[] = { cipher, remcipher };
+       decrypt.decrypt(inp, 2, &plain, 1);
+       decrypt.final(remplain);
+       printf("plaintext=");
+       dump(plain);
+       printf("remainder=");
+       dump(remplain);
+
+    printf("end encrypt/decrypt test\n");
+}
+
+static void testDigests(const Guid &cspGuid)
+{
+       printf("\n* performing digest test...\n");
+       CSP csp(cspGuid);
+       Digest md5(csp, CSSM_ALGID_MD5);
+       StringData data("Once in a blue moon");
+       DataBuffer<20> digest;
+       md5.digest(data, digest);
+       printf("digest=");
+       dump(digest);
+}
+
+
+static void testRandom(const Guid &cspGuid)
+{
+       printf("\n* performing random test...\n");
+       CSP csp(cspGuid);
+       CssmData result = Random(csp, CSSM_ALGID_APPLE_YARROW)(16);
+       assert(result.length() == 16);
+       printf("result=");
+       dump(result);
+       free(result.data());
+}
+
+
+void dump(const CssmData &data)
+{
+       unsigned char *p = data;
+       for (uint32 n = 0; n < data.length(); n++)
+               printf("%2.2x", p[n]);
+       printf("\n");
+}
+
+static void testMac(const Guid &cspGuid)
+{
+    printf("\n* performing mac test...\n");
+       
+       CssmData keyData;
+       keyData.Length = 8;
+       keyData.Data = (uint8 *)"1234567";
+
+       CSP csp(cspGuid);
+
+       Key key(csp, keyData);
+
+    printf("Generating key\n");
+       GenerateKey genKey(csp, CSSM_ALGID_DES, 64);
+       key = genKey(KeySpec(CSSM_KEYUSE_ANY, CSSM_KEYATTR_RETURN_DEFAULT));
+    printf("done\n");
+
+       GenerateMac mac(csp, CSSM_ALGID_SHA1HMAC);
+       mac.key(key);
+       StringData data("Om mani padme hum");
+       DataBuffer<20> signature;
+       mac.sign(data, signature);
+       printf("signature=");
+       dump(signature);
+       
+       VerifyMac vmac(csp, CSSM_ALGID_SHA1HMAC);
+       vmac.key(key);
+       vmac.verify(data, signature);
+       printf("testing mac verify\n");
+       
+       bool failed = false;
+       try
+       {
+               printf("testing mac verify with bad data\n");
+               StringData baddata("not even close to the original");
+               vmac.verify(baddata, signature);
+       }
+       catch(const CssmError &e)
+       {
+               printf("caught verify error\n");
+               failed = true;
+               if (e.osStatus() != CSSMERR_CSP_VERIFY_FAILED)
+                       throw;
+       }
+       if (!failed) throw Error(CSSMERR_CSP_VERIFY_FAILED);
+
+    printf("end mac test\n");
+}
+
+static void testWrap(const Guid &cspGuid)
+{
+    printf("\n* performing wrap test...\n");
+       
+       CssmData keyData;
+       keyData.Length = 8;
+       keyData.Data = (uint8 *)"1234567";
+
+       CSP csp(cspGuid);
+
+       Key key(csp, keyData);
+       
+       Key wrappedKey;
+       GenerateKey genKey(csp, CSSM_ALGID_RC4, 128);
+       key = genKey(KeySpec(CSSM_KEYUSE_ANY, CSSM_KEYATTR_RETURN_DEFAULT));
+
+       WrapKey wrapKey(csp, CSSM_ALGID_RC2);
+       wrapKey.key(key);
+
+       AccessCredentials(cred);
+       wrapKey.cred(&cred);
+       wrapKey.mode(CSSM_ALGMODE_CBC_IV8);
+       CssmData initVec;
+       initVec.Length = 8;
+       initVec.Data = (uint8 *)"12345678";
+       wrapKey.initVector(initVec);
+
+       wrappedKey=wrapKey(key);
+       
+               
+       printf("end wrap test\n");
+}