xref: /minix3/external/bsd/bind/dist/bin/tests/system/rsabigexponent/bigkey.c (revision 00b67f09dd46474d133c95011a48590a8e8f94c7)
1*00b67f09SDavid van Moolenbroek /*	$NetBSD: bigkey.c,v 1.6 2014/12/10 04:37:54 christos Exp $	*/
2*00b67f09SDavid van Moolenbroek 
3*00b67f09SDavid van Moolenbroek /*
4*00b67f09SDavid van Moolenbroek  * Copyright (C) 2012, 2014  Internet Systems Consortium, Inc. ("ISC")
5*00b67f09SDavid van Moolenbroek  *
6*00b67f09SDavid van Moolenbroek  * Permission to use, copy, modify, and/or distribute this software for any
7*00b67f09SDavid van Moolenbroek  * purpose with or without fee is hereby granted, provided that the above
8*00b67f09SDavid van Moolenbroek  * copyright notice and this permission notice appear in all copies.
9*00b67f09SDavid van Moolenbroek  *
10*00b67f09SDavid van Moolenbroek  * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
11*00b67f09SDavid van Moolenbroek  * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
12*00b67f09SDavid van Moolenbroek  * AND FITNESS.  IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
13*00b67f09SDavid van Moolenbroek  * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
14*00b67f09SDavid van Moolenbroek  * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
15*00b67f09SDavid van Moolenbroek  * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
16*00b67f09SDavid van Moolenbroek  * PERFORMANCE OF THIS SOFTWARE.
17*00b67f09SDavid van Moolenbroek  */
18*00b67f09SDavid van Moolenbroek 
19*00b67f09SDavid van Moolenbroek /* Id */
20*00b67f09SDavid van Moolenbroek 
21*00b67f09SDavid van Moolenbroek #include <config.h>
22*00b67f09SDavid van Moolenbroek 
23*00b67f09SDavid van Moolenbroek #if defined(OPENSSL) || defined(PKCS11CRYPTO)
24*00b67f09SDavid van Moolenbroek 
25*00b67f09SDavid van Moolenbroek #include <stdio.h>
26*00b67f09SDavid van Moolenbroek #include <stdlib.h>
27*00b67f09SDavid van Moolenbroek 
28*00b67f09SDavid van Moolenbroek #include <isc/buffer.h>
29*00b67f09SDavid van Moolenbroek #include <isc/entropy.h>
30*00b67f09SDavid van Moolenbroek #include <isc/mem.h>
31*00b67f09SDavid van Moolenbroek #include <isc/region.h>
32*00b67f09SDavid van Moolenbroek #include <isc/stdio.h>
33*00b67f09SDavid van Moolenbroek #include <isc/string.h>
34*00b67f09SDavid van Moolenbroek #include <isc/util.h>
35*00b67f09SDavid van Moolenbroek 
36*00b67f09SDavid van Moolenbroek #define DST_KEY_INTERNAL
37*00b67f09SDavid van Moolenbroek 
38*00b67f09SDavid van Moolenbroek #include <dns/dnssec.h>
39*00b67f09SDavid van Moolenbroek #include <dns/fixedname.h>
40*00b67f09SDavid van Moolenbroek #include <dns/keyvalues.h>
41*00b67f09SDavid van Moolenbroek #include <dns/log.h>
42*00b67f09SDavid van Moolenbroek #include <dns/name.h>
43*00b67f09SDavid van Moolenbroek #include <dns/rdataclass.h>
44*00b67f09SDavid van Moolenbroek #include <dns/result.h>
45*00b67f09SDavid van Moolenbroek #include <dns/secalg.h>
46*00b67f09SDavid van Moolenbroek 
47*00b67f09SDavid van Moolenbroek #include <dst/dst.h>
48*00b67f09SDavid van Moolenbroek #include <dst/result.h>
49*00b67f09SDavid van Moolenbroek 
50*00b67f09SDavid van Moolenbroek #ifdef OPENSSL
51*00b67f09SDavid van Moolenbroek #include <openssl/opensslv.h>
52*00b67f09SDavid van Moolenbroek #if OPENSSL_VERSION_NUMBER <= 0x00908000L
53*00b67f09SDavid van Moolenbroek #define USE_FIX_KEY_FILES
54*00b67f09SDavid van Moolenbroek #endif
55*00b67f09SDavid van Moolenbroek #else
56*00b67f09SDavid van Moolenbroek #define USE_FIX_KEY_FILES
57*00b67f09SDavid van Moolenbroek #endif
58*00b67f09SDavid van Moolenbroek 
59*00b67f09SDavid van Moolenbroek #ifdef USE_FIX_KEY_FILES
60*00b67f09SDavid van Moolenbroek 
61*00b67f09SDavid van Moolenbroek /*
62*00b67f09SDavid van Moolenbroek  * Use a fixed key file pair if OpenSSL doesn't support > 32 bit exponents.
63*00b67f09SDavid van Moolenbroek  */
64*00b67f09SDavid van Moolenbroek 
65*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)66*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
67*00b67f09SDavid van Moolenbroek 	FILE *fp;
68*00b67f09SDavid van Moolenbroek 
69*00b67f09SDavid van Moolenbroek 	UNUSED(argc);
70*00b67f09SDavid van Moolenbroek 	UNUSED(argv);
71*00b67f09SDavid van Moolenbroek 
72*00b67f09SDavid van Moolenbroek 	fp = fopen("Kexample.+005+10264.private", "w");
73*00b67f09SDavid van Moolenbroek 	if (fp == NULL) {
74*00b67f09SDavid van Moolenbroek 		perror("fopen(Kexample.+005+10264.private)");
75*00b67f09SDavid van Moolenbroek 		exit(1);
76*00b67f09SDavid van Moolenbroek 	}
77*00b67f09SDavid van Moolenbroek 
78*00b67f09SDavid van Moolenbroek 	fputs("Private-key-format: v1.3\n", fp);
79*00b67f09SDavid van Moolenbroek 	fputs("Algorithm: 5 (RSASHA1)\n", fp);
80*00b67f09SDavid van Moolenbroek 	fputs("Modulus: yhNbLRPA7VpLCXcgMvBwsfe7taVaTvLPY3AI+YolKwqD6"
81*00b67f09SDavid van Moolenbroek 	      "/3nLlCcz4kBOTOkQBf9bmO98WnKuOWoxuEOgudoDvQOzXNl9RJtt61"
82*00b67f09SDavid van Moolenbroek 	      "IRMscAlsVtTIfAjPLhcGy32l2s5VYWWVXx/qkcf+i/JC38YXIuVdiA"
83*00b67f09SDavid van Moolenbroek 	      "MtbgQV40ffM4lAbZ7M=\n", fp);
84*00b67f09SDavid van Moolenbroek 	fputs("PublicExponent: AQAAAAAAAQ==\n", fp);
85*00b67f09SDavid van Moolenbroek 	fputs("PrivateExponent: gfXvioazoFIJp3/H2kJncrRZaqjIf9+21CL1i"
86*00b67f09SDavid van Moolenbroek 	      "XecBOof03er8ym5AKopZQM8ie+qxvhDkIJ8YDrB7UbDxmFpPceHWYM"
87*00b67f09SDavid van Moolenbroek 	      "X0vDWQCIiEiKzRfCsBOjgJu6HS15G/oZDqDwKat+yegtzxhg48BCPq"
88*00b67f09SDavid van Moolenbroek 	      "zfHLXXUvBTA/HK/u8L1LwggqHk=\n", fp);
89*00b67f09SDavid van Moolenbroek 	fputs("Prime1: 7xAPHsNnS0w7CoEnIQiu+SrmHsy86HKJOEm9FiQybRVCwf"
90*00b67f09SDavid van Moolenbroek 	      "h4ZRQl+Z9mUbb9skjPvkM6ZeuzXTFkOjdck2y1NQ==\n", fp);
91*00b67f09SDavid van Moolenbroek 	fputs("Prime2: 2GRzzqyRR2gfITPug8Rddxt647/2DrAuKricX/AXyGcuHM"
92*00b67f09SDavid van Moolenbroek 	      "vTZ+v+mfgJn6TFqSn4SBF2zHJ876lWbQ+12aNORw==\n", fp);
93*00b67f09SDavid van Moolenbroek 	fputs("Exponent1: PnGTwxiT59N/Rq/FSAwcwoAudiF/X3iK0X09j9Dl8cY"
94*00b67f09SDavid van Moolenbroek 	      "DYAJ0bhB9es1LIaSsgLSER2b1kHbCp+FQXGVHJeZ07Q==\n", fp);
95*00b67f09SDavid van Moolenbroek 	fputs("Exponent2: Ui+zxA/zbnUSYnz+wdbrfBD2aTeKytZG4ASI3oPDZag"
96*00b67f09SDavid van Moolenbroek 	      "V9YC0eZRPjI82KQcFXoj1b/fV/HzT9/9rhU4mvCGjLw==\n", fp);
97*00b67f09SDavid van Moolenbroek 	fputs("Coefficient: sdCL6AdOaCr9c+RO8NCA492MOT9w7K9d/HauC+fif"
98*00b67f09SDavid van Moolenbroek 	      "2iWN36dA+BCKaeldS/+6ZTnV2ZVyVFQTeLJM8hplxDBwQ==\n", fp);
99*00b67f09SDavid van Moolenbroek 
100*00b67f09SDavid van Moolenbroek 	if (fclose(fp) != 0) {
101*00b67f09SDavid van Moolenbroek 		perror("fclose(Kexample.+005+10264.private)");
102*00b67f09SDavid van Moolenbroek 		exit(1);
103*00b67f09SDavid van Moolenbroek 	}
104*00b67f09SDavid van Moolenbroek 
105*00b67f09SDavid van Moolenbroek 	fp = fopen("Kexample.+005+10264.key", "w");
106*00b67f09SDavid van Moolenbroek 	if (fp == NULL) {
107*00b67f09SDavid van Moolenbroek 		perror("fopen(Kexample.+005+10264.key)");
108*00b67f09SDavid van Moolenbroek 		exit(1);
109*00b67f09SDavid van Moolenbroek 	}
110*00b67f09SDavid van Moolenbroek 
111*00b67f09SDavid van Moolenbroek 	fputs("; This is a zone-signing key, keyid 10264, for example.\n", fp);
112*00b67f09SDavid van Moolenbroek 	fputs("example. IN DNSKEY 256 3 5 BwEAAAAAAAHKE1stE8DtWksJdyA"
113*00b67f09SDavid van Moolenbroek 	      "y8HCx97u1pVpO8s9jcAj5iiUrCoPr /ecuUJzPiQE5M6RAF/1uY73x"
114*00b67f09SDavid van Moolenbroek 	      "acq45ajG4Q6C52gO9A7Nc2X1Em23rUhE yxwCWxW1Mh8CM8uFwbLfaX"
115*00b67f09SDavid van Moolenbroek 	      "azlVhZZVfH+qRx/6L8kLfxhci5V2IAy1uB BXjR98ziUBtnsw==\n", fp);
116*00b67f09SDavid van Moolenbroek 
117*00b67f09SDavid van Moolenbroek 	if (fclose(fp) != 0) {
118*00b67f09SDavid van Moolenbroek 		perror("close(Kexample.+005+10264.key)");
119*00b67f09SDavid van Moolenbroek 		exit(1);
120*00b67f09SDavid van Moolenbroek 	}
121*00b67f09SDavid van Moolenbroek 
122*00b67f09SDavid van Moolenbroek 	return(0);
123*00b67f09SDavid van Moolenbroek }
124*00b67f09SDavid van Moolenbroek #else
125*00b67f09SDavid van Moolenbroek #include <openssl/err.h>
126*00b67f09SDavid van Moolenbroek #include <openssl/objects.h>
127*00b67f09SDavid van Moolenbroek #include <openssl/rsa.h>
128*00b67f09SDavid van Moolenbroek #include <openssl/bn.h>
129*00b67f09SDavid van Moolenbroek #include <openssl/evp.h>
130*00b67f09SDavid van Moolenbroek 
131*00b67f09SDavid van Moolenbroek dst_key_t *key;
132*00b67f09SDavid van Moolenbroek dns_fixedname_t fname;
133*00b67f09SDavid van Moolenbroek dns_name_t *name;
134*00b67f09SDavid van Moolenbroek unsigned int bits = 1024U;
135*00b67f09SDavid van Moolenbroek isc_entropy_t *ectx;
136*00b67f09SDavid van Moolenbroek isc_entropysource_t *source;
137*00b67f09SDavid van Moolenbroek isc_mem_t *mctx;
138*00b67f09SDavid van Moolenbroek isc_log_t *log_;
139*00b67f09SDavid van Moolenbroek isc_logconfig_t *logconfig;
140*00b67f09SDavid van Moolenbroek int level = ISC_LOG_WARNING;
141*00b67f09SDavid van Moolenbroek isc_logdestination_t destination;
142*00b67f09SDavid van Moolenbroek char filename[255];
143*00b67f09SDavid van Moolenbroek isc_result_t result;
144*00b67f09SDavid van Moolenbroek isc_buffer_t buf;
145*00b67f09SDavid van Moolenbroek RSA *rsa;
146*00b67f09SDavid van Moolenbroek BIGNUM *e;
147*00b67f09SDavid van Moolenbroek EVP_PKEY *pkey;
148*00b67f09SDavid van Moolenbroek 
149*00b67f09SDavid van Moolenbroek #define CHECK(op, msg) \
150*00b67f09SDavid van Moolenbroek do { result = (op); \
151*00b67f09SDavid van Moolenbroek 	if (result != ISC_R_SUCCESS) { \
152*00b67f09SDavid van Moolenbroek 		fprintf(stderr, \
153*00b67f09SDavid van Moolenbroek 			"fatal error: %s returns %s at file %s line %d\n", \
154*00b67f09SDavid van Moolenbroek 			msg, isc_result_totext(result), __FILE__, __LINE__); \
155*00b67f09SDavid van Moolenbroek 		exit(1); \
156*00b67f09SDavid van Moolenbroek 	} \
157*00b67f09SDavid van Moolenbroek } while (/*CONSTCOND*/0)
158*00b67f09SDavid van Moolenbroek 
159*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)160*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
161*00b67f09SDavid van Moolenbroek 	UNUSED(argc);
162*00b67f09SDavid van Moolenbroek 	UNUSED(argv);
163*00b67f09SDavid van Moolenbroek 
164*00b67f09SDavid van Moolenbroek 	rsa = RSA_new();
165*00b67f09SDavid van Moolenbroek 	e = BN_new();
166*00b67f09SDavid van Moolenbroek 	pkey = EVP_PKEY_new();
167*00b67f09SDavid van Moolenbroek 
168*00b67f09SDavid van Moolenbroek 	if ((rsa == NULL) || (e == NULL) || (pkey == NULL) ||
169*00b67f09SDavid van Moolenbroek 	    !EVP_PKEY_set1_RSA(pkey, rsa)) {
170*00b67f09SDavid van Moolenbroek 		fprintf(stderr, "fatal error: basic OpenSSL failure\n");
171*00b67f09SDavid van Moolenbroek 		exit(1);
172*00b67f09SDavid van Moolenbroek 	}
173*00b67f09SDavid van Moolenbroek 
174*00b67f09SDavid van Moolenbroek 	/* e = 0x1000000000001 */
175*00b67f09SDavid van Moolenbroek 	BN_set_bit(e, 0);
176*00b67f09SDavid van Moolenbroek 	BN_set_bit(e, 48);
177*00b67f09SDavid van Moolenbroek 
178*00b67f09SDavid van Moolenbroek 	if (RSA_generate_key_ex(rsa, bits, e, NULL)) {
179*00b67f09SDavid van Moolenbroek 		BN_free(e);
180*00b67f09SDavid van Moolenbroek 		RSA_free(rsa);
181*00b67f09SDavid van Moolenbroek 	} else {
182*00b67f09SDavid van Moolenbroek 		fprintf(stderr,
183*00b67f09SDavid van Moolenbroek 			"fatal error: RSA_generate_key_ex() fails "
184*00b67f09SDavid van Moolenbroek 			"at file %s line %d\n",
185*00b67f09SDavid van Moolenbroek 			__FILE__, __LINE__);
186*00b67f09SDavid van Moolenbroek 		exit(1);
187*00b67f09SDavid van Moolenbroek 	}
188*00b67f09SDavid van Moolenbroek 
189*00b67f09SDavid van Moolenbroek 	dns_result_register();
190*00b67f09SDavid van Moolenbroek 
191*00b67f09SDavid van Moolenbroek 	CHECK(isc_mem_create(0, 0, &mctx), "isc_mem_create()");
192*00b67f09SDavid van Moolenbroek 	CHECK(isc_entropy_create(mctx, &ectx), "isc_entropy_create()");
193*00b67f09SDavid van Moolenbroek 	CHECK(isc_entropy_usebestsource(ectx, &source,
194*00b67f09SDavid van Moolenbroek 					"../random.data",
195*00b67f09SDavid van Moolenbroek 					ISC_ENTROPY_KEYBOARDNO),
196*00b67f09SDavid van Moolenbroek 	      "isc_entropy_usebestsource(\"../random.data\")");
197*00b67f09SDavid van Moolenbroek 	CHECK(dst_lib_init2(mctx, ectx, NULL, 0), "dst_lib_init2()");
198*00b67f09SDavid van Moolenbroek 	CHECK(isc_log_create(mctx, &log_, &logconfig), "isc_log_create()");
199*00b67f09SDavid van Moolenbroek 	isc_log_setcontext(log_);
200*00b67f09SDavid van Moolenbroek 	dns_log_init(log_);
201*00b67f09SDavid van Moolenbroek 	dns_log_setcontext(log_);
202*00b67f09SDavid van Moolenbroek 	CHECK(isc_log_settag(logconfig, "bigkey"), "isc_log_settag()");
203*00b67f09SDavid van Moolenbroek 	destination.file.stream = stderr;
204*00b67f09SDavid van Moolenbroek 	destination.file.name = NULL;
205*00b67f09SDavid van Moolenbroek 	destination.file.versions = ISC_LOG_ROLLNEVER;
206*00b67f09SDavid van Moolenbroek 	destination.file.maximum_size = 0;
207*00b67f09SDavid van Moolenbroek 	CHECK(isc_log_createchannel(logconfig, "stderr",
208*00b67f09SDavid van Moolenbroek 				    ISC_LOG_TOFILEDESC,
209*00b67f09SDavid van Moolenbroek 				    level,
210*00b67f09SDavid van Moolenbroek 				    &destination,
211*00b67f09SDavid van Moolenbroek 				    ISC_LOG_PRINTTAG | ISC_LOG_PRINTLEVEL),
212*00b67f09SDavid van Moolenbroek 	      "isc_log_createchannel()");
213*00b67f09SDavid van Moolenbroek 	CHECK(isc_log_usechannel(logconfig, "stderr", NULL, NULL),
214*00b67f09SDavid van Moolenbroek 	      "isc_log_usechannel()");
215*00b67f09SDavid van Moolenbroek 	dns_fixedname_init(&fname);
216*00b67f09SDavid van Moolenbroek 	name = dns_fixedname_name(&fname);
217*00b67f09SDavid van Moolenbroek 	isc_buffer_constinit(&buf, "example.", strlen("example."));
218*00b67f09SDavid van Moolenbroek 	isc_buffer_add(&buf, strlen("example."));
219*00b67f09SDavid van Moolenbroek 	CHECK(dns_name_fromtext(name, &buf, dns_rootname, 0, NULL),
220*00b67f09SDavid van Moolenbroek 	      "dns_name_fromtext(\"example.\")");
221*00b67f09SDavid van Moolenbroek 
222*00b67f09SDavid van Moolenbroek 	CHECK(dst_key_buildinternal(name, DNS_KEYALG_RSASHA1,
223*00b67f09SDavid van Moolenbroek 				    bits, DNS_KEYOWNER_ZONE,
224*00b67f09SDavid van Moolenbroek 				    DNS_KEYPROTO_DNSSEC, dns_rdataclass_in,
225*00b67f09SDavid van Moolenbroek 				    pkey, mctx, &key),
226*00b67f09SDavid van Moolenbroek 	      "dst_key_buildinternal(...)");
227*00b67f09SDavid van Moolenbroek 
228*00b67f09SDavid van Moolenbroek 	CHECK(dst_key_tofile(key, DST_TYPE_PRIVATE | DST_TYPE_PUBLIC, NULL),
229*00b67f09SDavid van Moolenbroek 	      "dst_key_tofile()");
230*00b67f09SDavid van Moolenbroek 	isc_buffer_init(&buf, filename, sizeof(filename) - 1);
231*00b67f09SDavid van Moolenbroek 	isc_buffer_clear(&buf);
232*00b67f09SDavid van Moolenbroek 	CHECK(dst_key_buildfilename(key, 0, NULL, &buf),
233*00b67f09SDavid van Moolenbroek 	      "dst_key_buildfilename()");
234*00b67f09SDavid van Moolenbroek 	printf("%s\n", filename);
235*00b67f09SDavid van Moolenbroek 	dst_key_free(&key);
236*00b67f09SDavid van Moolenbroek 
237*00b67f09SDavid van Moolenbroek 	isc_log_destroy(&log_);
238*00b67f09SDavid van Moolenbroek 	isc_log_setcontext(NULL);
239*00b67f09SDavid van Moolenbroek 	dns_log_setcontext(NULL);
240*00b67f09SDavid van Moolenbroek 	if (source != NULL)
241*00b67f09SDavid van Moolenbroek 		isc_entropy_destroysource(&source);
242*00b67f09SDavid van Moolenbroek 	isc_entropy_detach(&ectx);
243*00b67f09SDavid van Moolenbroek 	dst_lib_destroy();
244*00b67f09SDavid van Moolenbroek 	dns_name_destroy();
245*00b67f09SDavid van Moolenbroek 	isc_mem_destroy(&mctx);
246*00b67f09SDavid van Moolenbroek 	return (0);
247*00b67f09SDavid van Moolenbroek }
248*00b67f09SDavid van Moolenbroek #endif
249*00b67f09SDavid van Moolenbroek 
250*00b67f09SDavid van Moolenbroek #else /* OPENSSL || PKCS11CRYPTO */
251*00b67f09SDavid van Moolenbroek 
252*00b67f09SDavid van Moolenbroek #include <stdio.h>
253*00b67f09SDavid van Moolenbroek #include <stdlib.h>
254*00b67f09SDavid van Moolenbroek 
255*00b67f09SDavid van Moolenbroek #include <isc/util.h>
256*00b67f09SDavid van Moolenbroek 
257*00b67f09SDavid van Moolenbroek int
main(int argc,char ** argv)258*00b67f09SDavid van Moolenbroek main(int argc, char **argv) {
259*00b67f09SDavid van Moolenbroek 	UNUSED(argc);
260*00b67f09SDavid van Moolenbroek 	UNUSED(argv);
261*00b67f09SDavid van Moolenbroek 	fprintf(stderr, "Compiled without Crypto\n");
262*00b67f09SDavid van Moolenbroek 	exit(1);
263*00b67f09SDavid van Moolenbroek }
264*00b67f09SDavid van Moolenbroek 
265*00b67f09SDavid van Moolenbroek #endif /* OPENSSL || PKCS11CRYPTO */
266*00b67f09SDavid van Moolenbroek /*! \file */
267