blob: 3d72787d3164dd1e371c5ceed1fbff9a9b752eee [file] [log] [blame]
Rich Salzb1322252016-05-17 14:52:22 -04001/*
2 * Copyright 1995-2016 The OpenSSL Project Authors. All Rights Reserved.
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00003 *
Rich Salzb1322252016-05-17 14:52:22 -04004 * Licensed under the OpenSSL license (the "License"). You may not use
5 * this file except in compliance with the License. You can obtain a copy
6 * in the file LICENSE in the source distribution or at
7 * https://www.openssl.org/source/license.html
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +00008 */
9
10#include <stdio.h>
Richard Levitteb39fc562015-05-14 16:56:48 +020011#include "internal/cryptlib.h"
Bodo Möllerec577821999-04-23 22:13:45 +000012#include <openssl/bn.h>
13#include <openssl/evp.h>
14#include <openssl/asn1.h>
15#include <openssl/x509.h>
Dr. Stephen Henson124055a2015-08-31 12:58:07 +010016#include "internal/x509_int.h"
Bodo Möllerec577821999-04-23 22:13:45 +000017#include <openssl/objects.h>
18#include <openssl/buffer.h>
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000019
Ulf Möller6b691a51999-04-19 21:31:43 +000020X509 *X509_REQ_to_X509(X509_REQ *r, int days, EVP_PKEY *pkey)
Matt Caswell0f113f32015-01-22 03:40:55 +000021{
22 X509 *ret = NULL;
23 X509_CINF *xi = NULL;
24 X509_NAME *xn;
FdaSilvaYY05175382016-03-17 00:15:48 +010025 EVP_PKEY *pubkey = NULL;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000026
Matt Caswell0f113f32015-01-22 03:40:55 +000027 if ((ret = X509_new()) == NULL) {
28 X509err(X509_F_X509_REQ_TO_X509, ERR_R_MALLOC_FAILURE);
FdaSilvaYY05175382016-03-17 00:15:48 +010029 return NULL;
Matt Caswell0f113f32015-01-22 03:40:55 +000030 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000031
Matt Caswell0f113f32015-01-22 03:40:55 +000032 /* duplicate the request */
Dr. Stephen Henson5cf6abd2015-09-16 18:40:26 +010033 xi = &ret->cert_info;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000034
Dr. Stephen Henson95ed0e72015-09-16 18:46:16 +010035 if (sk_X509_ATTRIBUTE_num(r->req_info.attributes) != 0) {
Dr. Stephen Hensonf422a512015-03-14 04:16:42 +000036 if ((xi->version = ASN1_INTEGER_new()) == NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +000037 goto err;
38 if (!ASN1_INTEGER_set(xi->version, 2))
39 goto err;
Matt Caswell35a1cc92015-01-17 00:06:54 +000040/*- xi->extensions=ri->attributes; <- bad, should not ever be done
41 ri->attributes=NULL; */
Matt Caswell0f113f32015-01-22 03:40:55 +000042 }
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000043
Matt Caswell0f113f32015-01-22 03:40:55 +000044 xn = X509_REQ_get_subject_name(r);
FdaSilvaYY05175382016-03-17 00:15:48 +010045 if (X509_set_subject_name(ret, xn) == 0)
Matt Caswell0f113f32015-01-22 03:40:55 +000046 goto err;
FdaSilvaYY05175382016-03-17 00:15:48 +010047 if (X509_set_issuer_name(ret, xn) == 0)
Matt Caswell0f113f32015-01-22 03:40:55 +000048 goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000049
Dr. Stephen Henson2869e792015-09-15 17:10:51 +010050 if (X509_gmtime_adj(xi->validity.notBefore, 0) == NULL)
Matt Caswell0f113f32015-01-22 03:40:55 +000051 goto err;
Dr. Stephen Henson2869e792015-09-15 17:10:51 +010052 if (X509_gmtime_adj(xi->validity.notAfter, (long)60 * 60 * 24 * days) ==
Matt Caswell0f113f32015-01-22 03:40:55 +000053 NULL)
54 goto err;
Ralf S. Engelschalld02b48c1998-12-21 10:52:47 +000055
FdaSilvaYYc5137472016-04-03 23:37:32 +020056 pubkey = X509_REQ_get0_pubkey(r);
57 if (pubkey == NULL || !X509_set_pubkey(ret, pubkey))
FdaSilvaYY05175382016-03-17 00:15:48 +010058 goto err;
59
Matt Caswell0f113f32015-01-22 03:40:55 +000060 if (!X509_sign(ret, pkey, EVP_md5()))
61 goto err;
Rich Salz222561f2015-04-30 17:33:59 -040062 return ret;
63
Matt Caswell0f113f32015-01-22 03:40:55 +000064 err:
Rich Salz222561f2015-04-30 17:33:59 -040065 X509_free(ret);
66 return NULL;
Matt Caswell0f113f32015-01-22 03:40:55 +000067}