]> git.saurik.com Git - apple/security.git/blob - OSX/libsecurity_apple_csp/tests/t-rsa.cpp
Security-59306.80.4.tar.gz
[apple/security.git] / OSX / libsecurity_apple_csp / tests / t-rsa.cpp
1 /*
2 * Copyright (c) 2000-2001,2011,2014 Apple Inc. All Rights Reserved.
3 *
4 * The contents of this file constitute Original Code as defined in and are
5 * subject to the Apple Public Source License Version 1.2 (the 'License').
6 * You may not use this file except in compliance with the License. Please obtain
7 * a copy of the License at http://www.apple.com/publicsource and read it before
8 * using this file.
9 *
10 * This Original Code and all software distributed under the License are
11 * distributed on an 'AS IS' basis, WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESS
12 * OR IMPLIED, AND APPLE HEREBY DISCLAIMS ALL SUCH WARRANTIES, INCLUDING WITHOUT
13 * LIMITATION, ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR
14 * PURPOSE, QUIET ENJOYMENT OR NON-INFRINGEMENT. Please see the License for the
15 * specific language governing rights and limitations under the License.
16 */
17
18
19 #include <bsafe.h>
20 #include <aglobal.h>
21
22 #include <stdlib.h>
23 #include <stdio.h>
24 #include <string.h>
25
26
27 B_ALGORITHM_METHOD *chooser[] = {
28 &AM_SHA_RANDOM,
29 &AM_RSA_KEY_GEN,
30 &AM_RSA_STRONG_KEY_GEN,
31 &AM_RSA_ENCRYPT,
32 &AM_RSA_DECRYPT,
33 &AM_RSA_CRT_ENCRYPT,
34 &AM_RSA_CRT_DECRYPT,
35 NULL
36 };
37
38
39 char in[] = "something wicked this way comes, "
40 "and it's a private key!";
41 unsigned char crypt[1024];
42 unsigned char out[1024], out2[1024];
43
44 unsigned char seed[] = { 17, 22, 99, 205, 3 };
45
46 unsigned char exponent[] = { 1, 0, 1 };
47
48 #define check(expr) \
49 if (status = (expr)) { printf("error %d at %d\n", status, __LINE__); abort(); } else /* ok */
50
51 int main(int argc, char *argv[])
52 {
53 int status;
54
55 int keySize = argv[1] ? atoi(argv[1]) : 512;
56 printf("Key size = %d bits\n", keySize);
57
58 B_KEY_OBJ pubKey = NULL; check(B_CreateKeyObject(&pubKey));
59 B_KEY_OBJ privKey = NULL; check(B_CreateKeyObject(&privKey));
60
61 B_ALGORITHM_OBJ random = NULL; check(B_CreateAlgorithmObject(&random));
62 check(B_SetAlgorithmInfo(random, AI_X962Random_V0, NULL));
63 check(B_RandomInit(random, chooser, NULL));
64 check(B_RandomUpdate(random, seed, sizeof(seed), NULL));
65 for (int n = 0; n < 5; n++) {
66 unsigned char buf[4];
67 check(B_GenerateRandomBytes(random,
68 POINTER(buf), sizeof(buf), NULL));
69 printf("Randoms = ");
70 for (int n = 0; n < sizeof(buf); n++)
71 printf("%2.2x", buf[n]);
72 printf("\n");
73 }
74
75 B_ALGORITHM_OBJ gen = NULL; check(B_CreateAlgorithmObject(&gen));
76 A_RSA_KEY_GEN_PARAMS args;
77 args.modulusBits = keySize;
78 args.publicExponent.data = exponent;
79 args.publicExponent.len = sizeof(exponent);
80 check(B_SetAlgorithmInfo(gen, AI_RSAStrongKeyGen, POINTER(&args)));
81 check(B_GenerateInit(gen, chooser, NULL));
82 check(B_GenerateKeypair(gen, pubKey, privKey, random, NULL));
83
84 B_ALGORITHM_OBJ enc = NULL; check(B_CreateAlgorithmObject(&enc));
85 check(B_SetAlgorithmInfo(enc, AI_PKCS_RSAPublic, NULL));
86 check(B_EncryptInit(enc, pubKey, chooser, NULL));
87 unsigned int inLen;
88 check(B_EncryptUpdate(enc, crypt, &inLen, sizeof(crypt),
89 POINTER(in), sizeof(in), random, NULL));
90 printf("EncryptUpdate output = %u\n", inLen);
91 check(B_EncryptFinal(enc, crypt, &inLen, sizeof(crypt), random, NULL));
92 printf("EncryptFinal output=%u\n", inLen);
93
94 B_ALGORITHM_OBJ dec = NULL; check(B_CreateAlgorithmObject(&dec));
95 check(B_SetAlgorithmInfo(dec, AI_PKCS_RSAPrivate, NULL));
96 check(B_DecryptInit(dec, privKey, chooser, NULL));
97 unsigned int outLen, outLen2;
98 check(B_DecryptUpdate(dec, out, &outLen, sizeof(out),
99 crypt, inLen, random, NULL));
100 printf("DecryptUpdate output = %u\n", outLen);
101 check(B_DecryptFinal(dec, out2, &outLen2, sizeof(out2), random, NULL));
102 printf("DecryptFinal output=%u %s\n", outLen2, (char*)out2);
103
104
105 B_DestroyKeyObject(&pubKey);
106 B_DestroyKeyObject(&privKey);
107 B_DestroyAlgorithmObject(&random);
108 exit(0);
109 }
110
111 void T_free(POINTER p)
112 { free(p); }
113
114 POINTER T_malloc(unsigned int size)
115 { return (POINTER)malloc(size); }
116
117 POINTER T_realloc(POINTER p, unsigned int size)
118 { return (POINTER)realloc(p, size); }
119
120 int T_memcmp(POINTER p1, POINTER p2, unsigned int size)
121 { return memcmp(p1, p2, size); }
122 void T_memcpy(POINTER p1, POINTER p2, unsigned int size)
123 { memcpy(p1, p2, size); }
124 void T_memmove(POINTER p1, POINTER p2, unsigned int size)
125 { memmove(p1, p2, size); }
126 void T_memset(POINTER p1, int size, unsigned int val)
127 { memset(p1, size, val); }
128 extern "C" int T_GetDynamicList()
129 { printf("GetDynamicList!\n"); abort(); }