bn/bn_exp.c: constant-time MOD_EXP_CTIME_COPY_FROM_PREBUF.
[openssl.git] / demos / selfsign.c
1 /* NOCW */
2 /* cc -o ssdemo -I../include selfsign.c ../libcrypto.a */
3
4 #include <stdio.h>
5 #include <stdlib.h>
6
7 #include <openssl/pem.h>
8 #include <openssl/conf.h>
9 #include <openssl/x509v3.h>
10
11 int mkit(X509 **x509p, EVP_PKEY **pkeyp, int bits, int serial, int days);
12
13 int main()
14 {
15     BIO *bio_err;
16     X509 *x509 = NULL;
17     EVP_PKEY *pkey = NULL;
18
19     CRYPTO_set_mem_debug(1);
20     CRYPTO_mem_ctrl(CRYPTO_MEM_CHECK_ON);
21
22     bio_err = BIO_new_fp(stderr, BIO_NOCLOSE);
23
24     mkit(&x509, &pkey, 512, 0, 365);
25
26     RSA_print_fp(stdout, pkey->pkey.rsa, 0);
27     X509_print_fp(stdout, x509);
28
29     PEM_write_PrivateKey(stdout, pkey, NULL, NULL, 0, NULL, NULL);
30     PEM_write_X509(stdout, x509);
31
32     X509_free(x509);
33     EVP_PKEY_free(pkey);
34
35 #ifdef CUSTOM_EXT
36     /* Only needed if we add objects or custom extensions */
37     X509V3_EXT_cleanup();
38     OBJ_cleanup();
39 #endif
40
41     CRYPTO_mem_leaks(bio_err);
42     BIO_free(bio_err);
43     return (0);
44 }
45
46 static void callback(p, n, arg)
47 int p;
48 int n;
49 void *arg;
50 {
51     char c = 'B';
52
53     if (p == 0)
54         c = '.';
55     if (p == 1)
56         c = '+';
57     if (p == 2)
58         c = '*';
59     if (p == 3)
60         c = '\n';
61     fputc(c, stderr);
62 }
63
64 int mkit(x509p, pkeyp, bits, serial, days)
65 X509 **x509p;
66 EVP_PKEY **pkeyp;
67 int bits;
68 int serial;
69 int days;
70 {
71     X509 *x;
72     EVP_PKEY *pk;
73     RSA *rsa;
74     X509_NAME *name = NULL;
75     X509_NAME_ENTRY *ne = NULL;
76     X509_EXTENSION *ex = NULL;
77
78     if ((pkeyp == NULL) || (*pkeyp == NULL)) {
79         if ((pk = EVP_PKEY_new()) == NULL) {
80             abort();
81             return (0);
82         }
83     } else
84         pk = *pkeyp;
85
86     if ((x509p == NULL) || (*x509p == NULL)) {
87         if ((x = X509_new()) == NULL)
88             goto err;
89     } else
90         x = *x509p;
91
92     rsa = RSA_generate_key(bits, RSA_F4, callback, NULL);
93     if (!EVP_PKEY_assign_RSA(pk, rsa)) {
94         abort();
95         goto err;
96     }
97     rsa = NULL;
98
99     X509_set_version(x, 3);
100     ASN1_INTEGER_set(X509_get_serialNumber(x), serial);
101     X509_gmtime_adj(X509_get_notBefore(x), 0);
102     X509_gmtime_adj(X509_get_notAfter(x), (long)60 * 60 * 24 * days);
103     X509_set_pubkey(x, pk);
104
105     name = X509_get_subject_name(x);
106
107     /*
108      * This function creates and adds the entry, working out the correct
109      * string type and performing checks on its length. Normally we'd check
110      * the return value for errors...
111      */
112     X509_NAME_add_entry_by_txt(name, "C", MBSTRING_ASC, "UK", -1, -1, 0);
113     X509_NAME_add_entry_by_txt(name, "CN",
114                                MBSTRING_ASC, "OpenSSL Group", -1, -1, 0);
115
116     X509_set_issuer_name(x, name);
117
118     /*
119      * Add extension using V3 code: we can set the config file as NULL
120      * because we wont reference any other sections. We can also set the
121      * context to NULL because none of these extensions below will need to
122      * access it.
123      */
124
125     ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_cert_type, "server");
126     X509_add_ext(x, ex, -1);
127     X509_EXTENSION_free(ex);
128
129     ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_comment,
130                              "example comment extension");
131     X509_add_ext(x, ex, -1);
132     X509_EXTENSION_free(ex);
133
134     ex = X509V3_EXT_conf_nid(NULL, NULL, NID_netscape_ssl_server_name,
135                              "www.openssl.org");
136
137     X509_add_ext(x, ex, -1);
138     X509_EXTENSION_free(ex);
139
140 #ifdef ADD_CA_CONSTRAINT
141     /* might want something like this too.... */
142     ex = X509V3_EXT_conf_nid(NULL, NULL, NID_basic_constraints,
143                              "critical,CA:TRUE");
144
145     X509_add_ext(x, ex, -1);
146     X509_EXTENSION_free(ex);
147 #endif
148
149 #ifdef ADD_A_CUSTOM_EXTENSION
150     /* Maybe even add our own extension based on existing */
151     {
152         int nid;
153         nid = OBJ_create("1.2.3.4", "MyAlias", "My Test Alias Extension");
154         X509V3_EXT_add_alias(nid, NID_netscape_comment);
155         ex = X509V3_EXT_conf_nid(NULL, NULL, nid, "example comment alias");
156         X509_add_ext(x, ex, -1);
157         X509_EXTENSION_free(ex);
158     }
159 #endif
160
161     if (!X509_sign(x, pk, EVP_md5()))
162         goto err;
163
164     *x509p = x;
165     *pkeyp = pk;
166     return (1);
167  err:
168     return (0);
169 }