1#include "csptests.h"
2
3#include <security_cdsa_client/keyclient.h>
4#include <security_cdsa_client/cspclient.h>
5#include <security_cdsa_client/macclient.h>
6#include <security_cdsa_client/genkey.h>
7#include <security_cdsa_client/wrapkey.h>
8
9using namespace CssmClient;
10
11static void testCrypt(const Guid &cspGuid);
12static void testDigests(const Guid &cspGuid);
13static void testRandom(const Guid &cspGuid);
14static void testMac(const Guid &cspGuid);
15static void testWrap(const Guid &cspGuid);
16
17
18void csptests()
19{
20	testCrypt(gGuidAppleCSP);
21	testCrypt(gGuidAppleCSPDL);
22	testDigests(gGuidAppleCSP);
23	testRandom(gGuidAppleCSP);
24	testRandom(gGuidAppleCSPDL);
25	testMac(gGuidAppleCSP);
26	testMac(gGuidAppleCSPDL);
27}
28
29void testmac()
30{
31	testMac(gGuidAppleCSP);
32}
33
34void testwrap()
35{
36	testWrap(gGuidAppleCSP);
37}
38
39static void testCrypt(const Guid &cspGuid)
40{
41    printf("\n* performing encrypt/decrypt test...\n");
42
43	CSP csp(cspGuid);
44
45    printf("Generating key\n");
46	GenerateKey genKey(csp, CSSM_ALGID_DES, 64);
47	Key key = genKey(KeySpec(CSSM_KEYUSE_ANY, CSSM_KEYATTR_RETURN_DEFAULT));
48    printf("done\n");
49
50	// Gnerate IV
51    printf("Generating iv\n");
52	//CssmData iv = Random(csp, CSSM_ALGID_SHARandom)(8);
53	CssmPolyData iv("12345678");
54
55	CssmPolyData in("Om mani padme hum");
56	printf("input=");
57	dump(in);
58
59	// Encrypt
60    printf("Encrypting\n");
61
62	Encrypt encrypt(csp, CSSM_ALGID_DES);
63	encrypt.mode(CSSM_ALGMODE_CBCPadIV8);
64	encrypt.padding(CSSM_PADDING_PKCS1);
65	encrypt.initVector(iv);
66	encrypt.key(key);
67	CssmData cipher;
68	CssmData remcipher;
69	encrypt.encrypt(&in, 1, &cipher, 1);
70	encrypt.final(remcipher);
71	printf("ciphertext=");
72	dump(cipher);
73	printf("remainder=");
74	dump(remcipher);
75
76	// Decrypt
77    printf("Decrypting\n");
78
79	Decrypt decrypt(csp, CSSM_ALGID_DES);
80	decrypt.key(key);
81	decrypt.mode(CSSM_ALGMODE_CBCPadIV8);
82	decrypt.padding(CSSM_PADDING_PKCS1);
83	decrypt.initVector(iv);
84	CssmData plain;
85	CssmData remplain;
86	CssmData inp[] = { cipher, remcipher };
87	decrypt.decrypt(inp, 2, &plain, 1);
88	decrypt.final(remplain);
89	printf("plaintext=");
90	dump(plain);
91	printf("remainder=");
92	dump(remplain);
93
94    printf("end encrypt/decrypt test\n");
95}
96
97static void testDigests(const Guid &cspGuid)
98{
99	printf("\n* performing digest test...\n");
100	CSP csp(cspGuid);
101	Digest md5(csp, CSSM_ALGID_MD5);
102	StringData data("Once in a blue moon");
103	DataBuffer<20> digest;
104	md5.digest(data, digest);
105	printf("digest=");
106	dump(digest);
107}
108
109
110static void testRandom(const Guid &cspGuid)
111{
112	printf("\n* performing random test...\n");
113	CSP csp(cspGuid);
114	CssmData result = Random(csp, CSSM_ALGID_APPLE_YARROW)(16);
115	assert(result.length() == 16);
116	printf("result=");
117	dump(result);
118	free(result.data());
119}
120
121
122void dump(const CssmData &data)
123{
124	unsigned char *p = data;
125	for (uint32 n = 0; n < data.length(); n++)
126		printf("%2.2x", p[n]);
127	printf("\n");
128}
129
130static void testMac(const Guid &cspGuid)
131{
132    printf("\n* performing mac test...\n");
133
134	CssmData keyData;
135	keyData.Length = 8;
136	keyData.Data = (uint8 *)"1234567";
137
138	CSP csp(cspGuid);
139
140	Key key(csp, keyData);
141
142    printf("Generating key\n");
143	GenerateKey genKey(csp, CSSM_ALGID_DES, 64);
144	key = genKey(KeySpec(CSSM_KEYUSE_ANY, CSSM_KEYATTR_RETURN_DEFAULT));
145    printf("done\n");
146
147	GenerateMac mac(csp, CSSM_ALGID_SHA1HMAC);
148	mac.key(key);
149	StringData data("Om mani padme hum");
150	DataBuffer<20> signature;
151	mac.sign(data, signature);
152	printf("signature=");
153	dump(signature);
154
155	VerifyMac vmac(csp, CSSM_ALGID_SHA1HMAC);
156	vmac.key(key);
157	vmac.verify(data, signature);
158	printf("testing mac verify\n");
159
160	bool failed = false;
161	try
162	{
163		printf("testing mac verify with bad data\n");
164		StringData baddata("not even close to the original");
165		vmac.verify(baddata, signature);
166	}
167	catch(const CssmError &e)
168	{
169		printf("caught verify error\n");
170		failed = true;
171		if (e.osStatus() != CSSMERR_CSP_VERIFY_FAILED)
172			throw;
173	}
174	if (!failed) throw Error(CSSMERR_CSP_VERIFY_FAILED);
175
176    printf("end mac test\n");
177}
178
179static void testWrap(const Guid &cspGuid)
180{
181    printf("\n* performing wrap test...\n");
182
183	CssmData keyData;
184	keyData.Length = 8;
185	keyData.Data = (uint8 *)"1234567";
186
187	CSP csp(cspGuid);
188
189	Key key(csp, keyData);
190
191	Key wrappedKey;
192	GenerateKey genKey(csp, CSSM_ALGID_RC4, 128);
193	key = genKey(KeySpec(CSSM_KEYUSE_ANY, CSSM_KEYATTR_RETURN_DEFAULT));
194
195	WrapKey wrapKey(csp, CSSM_ALGID_RC2);
196	wrapKey.key(key);
197
198	AccessCredentials(cred);
199	wrapKey.cred(&cred);
200	wrapKey.mode(CSSM_ALGMODE_CBC_IV8);
201	CssmData initVec;
202	initVec.Length = 8;
203	initVec.Data = (uint8 *)"12345678";
204	wrapKey.initVector(initVec);
205
206	wrappedKey=wrapKey(key);
207
208
209	printf("end wrap test\n");
210}
211