OpenSSL  1.0.1c
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Macros
x_all.c
Go to the documentation of this file.
1 /* crypto/x509/x_all.c */
2 /* Copyright (C) 1995-1998 Eric Young ([email protected])
3  * All rights reserved.
4  *
5  * This package is an SSL implementation written
6  * by Eric Young ([email protected]).
7  * The implementation was written so as to conform with Netscapes SSL.
8  *
9  * This library is free for commercial and non-commercial use as long as
10  * the following conditions are aheared to. The following conditions
11  * apply to all code found in this distribution, be it the RC4, RSA,
12  * lhash, DES, etc., code; not just the SSL code. The SSL documentation
13  * included with this distribution is covered by the same copyright terms
14  * except that the holder is Tim Hudson ([email protected]).
15  *
16  * Copyright remains Eric Young's, and as such any Copyright notices in
17  * the code are not to be removed.
18  * If this package is used in a product, Eric Young should be given attribution
19  * as the author of the parts of the library used.
20  * This can be in the form of a textual message at program startup or
21  * in documentation (online or textual) provided with the package.
22  *
23  * Redistribution and use in source and binary forms, with or without
24  * modification, are permitted provided that the following conditions
25  * are met:
26  * 1. Redistributions of source code must retain the copyright
27  * notice, this list of conditions and the following disclaimer.
28  * 2. Redistributions in binary form must reproduce the above copyright
29  * notice, this list of conditions and the following disclaimer in the
30  * documentation and/or other materials provided with the distribution.
31  * 3. All advertising materials mentioning features or use of this software
32  * must display the following acknowledgement:
33  * "This product includes cryptographic software written by
34  * Eric Young ([email protected])"
35  * The word 'cryptographic' can be left out if the rouines from the library
36  * being used are not cryptographic related :-).
37  * 4. If you include any Windows specific code (or a derivative thereof) from
38  * the apps directory (application code) you must include an acknowledgement:
39  * "This product includes software written by Tim Hudson ([email protected])"
40  *
41  * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND
42  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
43  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
44  * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
45  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
46  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
47  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
48  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
49  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
50  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
51  * SUCH DAMAGE.
52  *
53  * The licence and distribution terms for any publically available version or
54  * derivative of this code cannot be changed. i.e. this code cannot simply be
55  * copied and put under another distribution licence
56  * [including the GNU Public Licence.]
57  */
58 
59 #include <stdio.h>
60 #include <openssl/stack.h>
61 #include "cryptlib.h"
62 #include <openssl/buffer.h>
63 #include <openssl/asn1.h>
64 #include <openssl/evp.h>
65 #include <openssl/x509.h>
66 #ifndef OPENSSL_NO_RSA
67 #include <openssl/rsa.h>
68 #endif
69 #ifndef OPENSSL_NO_DSA
70 #include <openssl/dsa.h>
71 #endif
72 
74  {
76  a->signature,a->cert_info,r));
77  }
78 
80  {
82  a->sig_alg,a->signature,a->req_info,r));
83  }
84 
86  {
88  a->sig_algor,a->signature,a->spkac,r));
89  }
90 
91 int X509_sign(X509 *x, EVP_PKEY *pkey, const EVP_MD *md)
92  {
93  x->cert_info->enc.modified = 1;
95  x->sig_alg, x->signature, x->cert_info,pkey,md));
96  }
97 
99  {
101  x->cert_info->signature,
102  x->sig_alg, x->signature, x->cert_info, ctx);
103  }
104 
105 int X509_REQ_sign(X509_REQ *x, EVP_PKEY *pkey, const EVP_MD *md)
106  {
108  x->signature, x->req_info,pkey,md));
109  }
110 
112  {
114  x->sig_alg, NULL, x->signature, x->req_info, ctx);
115  }
116 
117 int X509_CRL_sign(X509_CRL *x, EVP_PKEY *pkey, const EVP_MD *md)
118  {
119  x->crl->enc.modified = 1;
121  x->sig_alg, x->signature, x->crl,pkey,md));
122  }
123 
125  {
127  x->crl->sig_alg, x->sig_alg, x->signature, x->crl, ctx);
128  }
129 
131  {
133  x->signature, x->spkac,pkey,md));
134  }
135 
136 #ifndef OPENSSL_NO_FP_API
137 X509 *d2i_X509_fp(FILE *fp, X509 **x509)
138  {
139  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509), fp, x509);
140  }
141 
142 int i2d_X509_fp(FILE *fp, X509 *x509)
143  {
144  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509), fp, x509);
145  }
146 #endif
147 
149  {
150  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509), bp, x509);
151  }
152 
153 int i2d_X509_bio(BIO *bp, X509 *x509)
154  {
155  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509), bp, x509);
156  }
157 
158 #ifndef OPENSSL_NO_FP_API
160  {
161  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
162  }
163 
164 int i2d_X509_CRL_fp(FILE *fp, X509_CRL *crl)
165  {
166  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_CRL), fp, crl);
167  }
168 #endif
169 
171  {
172  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
173  }
174 
176  {
177  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_CRL), bp, crl);
178  }
179 
180 #ifndef OPENSSL_NO_FP_API
181 PKCS7 *d2i_PKCS7_fp(FILE *fp, PKCS7 **p7)
182  {
183  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
184  }
185 
186 int i2d_PKCS7_fp(FILE *fp, PKCS7 *p7)
187  {
188  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(PKCS7), fp, p7);
189  }
190 #endif
191 
193  {
194  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
195  }
196 
198  {
199  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(PKCS7), bp, p7);
200  }
201 
202 #ifndef OPENSSL_NO_FP_API
204  {
205  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
206  }
207 
208 int i2d_X509_REQ_fp(FILE *fp, X509_REQ *req)
209  {
210  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(X509_REQ), fp, req);
211  }
212 #endif
213 
215  {
216  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
217  }
218 
220  {
221  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(X509_REQ), bp, req);
222  }
223 
224 #ifndef OPENSSL_NO_RSA
225 
226 #ifndef OPENSSL_NO_FP_API
228  {
230  }
231 
232 int i2d_RSAPrivateKey_fp(FILE *fp, RSA *rsa)
233  {
235  }
236 
238  {
239  return ASN1_item_d2i_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
240  }
241 
242 
243 RSA *d2i_RSA_PUBKEY_fp(FILE *fp, RSA **rsa)
244  {
245  return ASN1_d2i_fp((void *(*)(void))
246  RSA_new,(D2I_OF(void))d2i_RSA_PUBKEY, fp,
247  (void **)rsa);
248  }
249 
250 int i2d_RSAPublicKey_fp(FILE *fp, RSA *rsa)
251  {
252  return ASN1_item_i2d_fp(ASN1_ITEM_rptr(RSAPublicKey), fp, rsa);
253  }
254 
255 int i2d_RSA_PUBKEY_fp(FILE *fp, RSA *rsa)
256  {
257  return ASN1_i2d_fp((I2D_OF(void))i2d_RSA_PUBKEY,fp,rsa);
258  }
259 #endif
260 
262  {
264  }
265 
267  {
269  }
270 
272  {
273  return ASN1_item_d2i_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
274  }
275 
276 
278  {
279  return ASN1_d2i_bio_of(RSA,RSA_new,d2i_RSA_PUBKEY,bp,rsa);
280  }
281 
283  {
284  return ASN1_item_i2d_bio(ASN1_ITEM_rptr(RSAPublicKey), bp, rsa);
285  }
286 
288  {
289  return ASN1_i2d_bio_of(RSA,i2d_RSA_PUBKEY,bp,rsa);
290  }
291 #endif
292 
293 #ifndef OPENSSL_NO_DSA
294 #ifndef OPENSSL_NO_FP_API
296  {
298  }
299 
300 int i2d_DSAPrivateKey_fp(FILE *fp, DSA *dsa)
301  {
303  }
304 
305 DSA *d2i_DSA_PUBKEY_fp(FILE *fp, DSA **dsa)
306  {
307  return ASN1_d2i_fp_of(DSA,DSA_new,d2i_DSA_PUBKEY,fp,dsa);
308  }
309 
310 int i2d_DSA_PUBKEY_fp(FILE *fp, DSA *dsa)
311  {
312  return ASN1_i2d_fp_of(DSA,i2d_DSA_PUBKEY,fp,dsa);
313  }
314 #endif
315 
317  {
319 );
320  }
321 
323  {
325  }
326 
328  {
329  return ASN1_d2i_bio_of(DSA,DSA_new,d2i_DSA_PUBKEY,bp,dsa);
330  }
331 
333  {
334  return ASN1_i2d_bio_of(DSA,i2d_DSA_PUBKEY,bp,dsa);
335  }
336 
337 #endif
338 
339 #ifndef OPENSSL_NO_EC
340 #ifndef OPENSSL_NO_FP_API
342  {
344  }
345 
346 int i2d_EC_PUBKEY_fp(FILE *fp, EC_KEY *eckey)
347  {
348  return ASN1_i2d_fp_of(EC_KEY,i2d_EC_PUBKEY,fp,eckey);
349  }
350 
352  {
354  }
355 
356 int i2d_ECPrivateKey_fp(FILE *fp, EC_KEY *eckey)
357  {
358  return ASN1_i2d_fp_of(EC_KEY,i2d_ECPrivateKey,fp,eckey);
359  }
360 #endif
362  {
364  }
365 
367  {
368  return ASN1_i2d_bio_of(EC_KEY,i2d_EC_PUBKEY,bp,ecdsa);
369  }
370 
372  {
374  }
375 
377  {
378  return ASN1_i2d_bio_of(EC_KEY,i2d_ECPrivateKey,bp,eckey);
379  }
380 #endif
381 
382 
383 int X509_pubkey_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
384  unsigned int *len)
385  {
387  key = X509_get0_pubkey_bitstr(data);
388  if(!key) return 0;
389  return EVP_Digest(key->data, key->length, md, len, type, NULL);
390  }
391 
392 int X509_digest(const X509 *data, const EVP_MD *type, unsigned char *md,
393  unsigned int *len)
394  {
395  return(ASN1_item_digest(ASN1_ITEM_rptr(X509),type,(char *)data,md,len));
396  }
397 
398 int X509_CRL_digest(const X509_CRL *data, const EVP_MD *type, unsigned char *md,
399  unsigned int *len)
400  {
401  return(ASN1_item_digest(ASN1_ITEM_rptr(X509_CRL),type,(char *)data,md,len));
402  }
403 
404 int X509_REQ_digest(const X509_REQ *data, const EVP_MD *type, unsigned char *md,
405  unsigned int *len)
406  {
407  return(ASN1_item_digest(ASN1_ITEM_rptr(X509_REQ),type,(char *)data,md,len));
408  }
409 
410 int X509_NAME_digest(const X509_NAME *data, const EVP_MD *type, unsigned char *md,
411  unsigned int *len)
412  {
413  return(ASN1_item_digest(ASN1_ITEM_rptr(X509_NAME),type,(char *)data,md,len));
414  }
415 
417  unsigned char *md, unsigned int *len)
418  {
420  (char *)data,md,len));
421  }
422 
423 
424 #ifndef OPENSSL_NO_FP_API
426  {
427  return ASN1_d2i_fp_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,fp,p8);
428  }
429 
430 int i2d_PKCS8_fp(FILE *fp, X509_SIG *p8)
431  {
432  return ASN1_i2d_fp_of(X509_SIG,i2d_X509_SIG,fp,p8);
433  }
434 #endif
435 
437  {
438  return ASN1_d2i_bio_of(X509_SIG,X509_SIG_new,d2i_X509_SIG,bp,p8);
439  }
440 
442  {
443  return ASN1_i2d_bio_of(X509_SIG,i2d_X509_SIG,bp,p8);
444  }
445 
446 #ifndef OPENSSL_NO_FP_API
448  PKCS8_PRIV_KEY_INFO **p8inf)
449  {
450  return ASN1_d2i_fp_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
451  d2i_PKCS8_PRIV_KEY_INFO,fp,p8inf);
452  }
453 
455  {
456  return ASN1_i2d_fp_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,fp,
457  p8inf);
458  }
459 
461  {
462  PKCS8_PRIV_KEY_INFO *p8inf;
463  int ret;
464  p8inf = EVP_PKEY2PKCS8(key);
465  if(!p8inf) return 0;
466  ret = i2d_PKCS8_PRIV_KEY_INFO_fp(fp, p8inf);
467  PKCS8_PRIV_KEY_INFO_free(p8inf);
468  return ret;
469  }
470 
471 int i2d_PrivateKey_fp(FILE *fp, EVP_PKEY *pkey)
472  {
473  return ASN1_i2d_fp_of(EVP_PKEY,i2d_PrivateKey,fp,pkey);
474  }
475 
477 {
479 }
480 
481 int i2d_PUBKEY_fp(FILE *fp, EVP_PKEY *pkey)
482  {
483  return ASN1_i2d_fp_of(EVP_PKEY,i2d_PUBKEY,fp,pkey);
484  }
485 
487 {
489 }
490 
491 #endif
492 
494  PKCS8_PRIV_KEY_INFO **p8inf)
495  {
496  return ASN1_d2i_bio_of(PKCS8_PRIV_KEY_INFO,PKCS8_PRIV_KEY_INFO_new,
497  d2i_PKCS8_PRIV_KEY_INFO,bp,p8inf);
498  }
499 
501  {
502  return ASN1_i2d_bio_of(PKCS8_PRIV_KEY_INFO,i2d_PKCS8_PRIV_KEY_INFO,bp,
503  p8inf);
504  }
505 
507  {
508  PKCS8_PRIV_KEY_INFO *p8inf;
509  int ret;
510  p8inf = EVP_PKEY2PKCS8(key);
511  if(!p8inf) return 0;
512  ret = i2d_PKCS8_PRIV_KEY_INFO_bio(bp, p8inf);
513  PKCS8_PRIV_KEY_INFO_free(p8inf);
514  return ret;
515  }
516 
518  {
519  return ASN1_i2d_bio_of(EVP_PKEY,i2d_PrivateKey,bp,pkey);
520  }
521 
523  {
525  }
526 
528  {
529  return ASN1_i2d_bio_of(EVP_PKEY,i2d_PUBKEY,bp,pkey);
530  }
531 
533  {
535  }