1e1051a39Sopenharmony_ci/* 2e1051a39Sopenharmony_ci * Copyright 2001-2021 The OpenSSL Project Authors. All Rights Reserved. 3e1051a39Sopenharmony_ci * 4e1051a39Sopenharmony_ci * Licensed under the Apache License 2.0 (the "License"). You may not use 5e1051a39Sopenharmony_ci * this file except in compliance with the License. You can obtain a copy 6e1051a39Sopenharmony_ci * in the file LICENSE in the source distribution or at 7e1051a39Sopenharmony_ci * https://www.openssl.org/source/license.html 8e1051a39Sopenharmony_ci */ 9e1051a39Sopenharmony_ci 10e1051a39Sopenharmony_ci#include <stdio.h> 11e1051a39Sopenharmony_ci#include "internal/cryptlib.h" 12e1051a39Sopenharmony_ci#include "internal/refcount.h" 13e1051a39Sopenharmony_ci#include <openssl/asn1.h> 14e1051a39Sopenharmony_ci#include <openssl/objects.h> 15e1051a39Sopenharmony_ci#include <openssl/evp.h> 16e1051a39Sopenharmony_ci#include <openssl/x509.h> 17e1051a39Sopenharmony_ci#include "crypto/x509.h" 18e1051a39Sopenharmony_ci 19e1051a39Sopenharmony_ciint X509_CRL_set_version(X509_CRL *x, long version) 20e1051a39Sopenharmony_ci{ 21e1051a39Sopenharmony_ci if (x == NULL) 22e1051a39Sopenharmony_ci return 0; 23e1051a39Sopenharmony_ci if (x->crl.version == NULL) { 24e1051a39Sopenharmony_ci if ((x->crl.version = ASN1_INTEGER_new()) == NULL) 25e1051a39Sopenharmony_ci return 0; 26e1051a39Sopenharmony_ci } 27e1051a39Sopenharmony_ci return ASN1_INTEGER_set(x->crl.version, version); 28e1051a39Sopenharmony_ci} 29e1051a39Sopenharmony_ci 30e1051a39Sopenharmony_ciint X509_CRL_set_issuer_name(X509_CRL *x, const X509_NAME *name) 31e1051a39Sopenharmony_ci{ 32e1051a39Sopenharmony_ci if (x == NULL) 33e1051a39Sopenharmony_ci return 0; 34e1051a39Sopenharmony_ci return X509_NAME_set(&x->crl.issuer, name); 35e1051a39Sopenharmony_ci} 36e1051a39Sopenharmony_ci 37e1051a39Sopenharmony_ciint X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) 38e1051a39Sopenharmony_ci{ 39e1051a39Sopenharmony_ci if (x == NULL) 40e1051a39Sopenharmony_ci return 0; 41e1051a39Sopenharmony_ci return ossl_x509_set1_time(&x->crl.lastUpdate, tm); 42e1051a39Sopenharmony_ci} 43e1051a39Sopenharmony_ci 44e1051a39Sopenharmony_ciint X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) 45e1051a39Sopenharmony_ci{ 46e1051a39Sopenharmony_ci if (x == NULL) 47e1051a39Sopenharmony_ci return 0; 48e1051a39Sopenharmony_ci return ossl_x509_set1_time(&x->crl.nextUpdate, tm); 49e1051a39Sopenharmony_ci} 50e1051a39Sopenharmony_ci 51e1051a39Sopenharmony_ciint X509_CRL_sort(X509_CRL *c) 52e1051a39Sopenharmony_ci{ 53e1051a39Sopenharmony_ci int i; 54e1051a39Sopenharmony_ci X509_REVOKED *r; 55e1051a39Sopenharmony_ci /* 56e1051a39Sopenharmony_ci * sort the data so it will be written in serial number order 57e1051a39Sopenharmony_ci */ 58e1051a39Sopenharmony_ci sk_X509_REVOKED_sort(c->crl.revoked); 59e1051a39Sopenharmony_ci for (i = 0; i < sk_X509_REVOKED_num(c->crl.revoked); i++) { 60e1051a39Sopenharmony_ci r = sk_X509_REVOKED_value(c->crl.revoked, i); 61e1051a39Sopenharmony_ci r->sequence = i; 62e1051a39Sopenharmony_ci } 63e1051a39Sopenharmony_ci c->crl.enc.modified = 1; 64e1051a39Sopenharmony_ci return 1; 65e1051a39Sopenharmony_ci} 66e1051a39Sopenharmony_ci 67e1051a39Sopenharmony_ciint X509_CRL_up_ref(X509_CRL *crl) 68e1051a39Sopenharmony_ci{ 69e1051a39Sopenharmony_ci int i; 70e1051a39Sopenharmony_ci 71e1051a39Sopenharmony_ci if (CRYPTO_UP_REF(&crl->references, &i, crl->lock) <= 0) 72e1051a39Sopenharmony_ci return 0; 73e1051a39Sopenharmony_ci 74e1051a39Sopenharmony_ci REF_PRINT_COUNT("X509_CRL", crl); 75e1051a39Sopenharmony_ci REF_ASSERT_ISNT(i < 2); 76e1051a39Sopenharmony_ci return ((i > 1) ? 1 : 0); 77e1051a39Sopenharmony_ci} 78e1051a39Sopenharmony_ci 79e1051a39Sopenharmony_cilong X509_CRL_get_version(const X509_CRL *crl) 80e1051a39Sopenharmony_ci{ 81e1051a39Sopenharmony_ci return ASN1_INTEGER_get(crl->crl.version); 82e1051a39Sopenharmony_ci} 83e1051a39Sopenharmony_ci 84e1051a39Sopenharmony_ciconst ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl) 85e1051a39Sopenharmony_ci{ 86e1051a39Sopenharmony_ci return crl->crl.lastUpdate; 87e1051a39Sopenharmony_ci} 88e1051a39Sopenharmony_ci 89e1051a39Sopenharmony_ciconst ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl) 90e1051a39Sopenharmony_ci{ 91e1051a39Sopenharmony_ci return crl->crl.nextUpdate; 92e1051a39Sopenharmony_ci} 93e1051a39Sopenharmony_ci 94e1051a39Sopenharmony_ci#ifndef OPENSSL_NO_DEPRECATED_1_1_0 95e1051a39Sopenharmony_ciASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl) 96e1051a39Sopenharmony_ci{ 97e1051a39Sopenharmony_ci return crl->crl.lastUpdate; 98e1051a39Sopenharmony_ci} 99e1051a39Sopenharmony_ci 100e1051a39Sopenharmony_ciASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl) 101e1051a39Sopenharmony_ci{ 102e1051a39Sopenharmony_ci return crl->crl.nextUpdate; 103e1051a39Sopenharmony_ci} 104e1051a39Sopenharmony_ci#endif 105e1051a39Sopenharmony_ci 106e1051a39Sopenharmony_ciX509_NAME *X509_CRL_get_issuer(const X509_CRL *crl) 107e1051a39Sopenharmony_ci{ 108e1051a39Sopenharmony_ci return crl->crl.issuer; 109e1051a39Sopenharmony_ci} 110e1051a39Sopenharmony_ci 111e1051a39Sopenharmony_ciconst STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl) 112e1051a39Sopenharmony_ci{ 113e1051a39Sopenharmony_ci return crl->crl.extensions; 114e1051a39Sopenharmony_ci} 115e1051a39Sopenharmony_ci 116e1051a39Sopenharmony_ciSTACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl) 117e1051a39Sopenharmony_ci{ 118e1051a39Sopenharmony_ci return crl->crl.revoked; 119e1051a39Sopenharmony_ci} 120e1051a39Sopenharmony_ci 121e1051a39Sopenharmony_civoid X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, 122e1051a39Sopenharmony_ci const X509_ALGOR **palg) 123e1051a39Sopenharmony_ci{ 124e1051a39Sopenharmony_ci if (psig != NULL) 125e1051a39Sopenharmony_ci *psig = &crl->signature; 126e1051a39Sopenharmony_ci if (palg != NULL) 127e1051a39Sopenharmony_ci *palg = &crl->sig_alg; 128e1051a39Sopenharmony_ci} 129e1051a39Sopenharmony_ci 130e1051a39Sopenharmony_ciint X509_CRL_get_signature_nid(const X509_CRL *crl) 131e1051a39Sopenharmony_ci{ 132e1051a39Sopenharmony_ci return OBJ_obj2nid(crl->sig_alg.algorithm); 133e1051a39Sopenharmony_ci} 134e1051a39Sopenharmony_ci 135e1051a39Sopenharmony_ciconst ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x) 136e1051a39Sopenharmony_ci{ 137e1051a39Sopenharmony_ci return x->revocationDate; 138e1051a39Sopenharmony_ci} 139e1051a39Sopenharmony_ci 140e1051a39Sopenharmony_ciint X509_REVOKED_set_revocationDate(X509_REVOKED *x, ASN1_TIME *tm) 141e1051a39Sopenharmony_ci{ 142e1051a39Sopenharmony_ci ASN1_TIME *in; 143e1051a39Sopenharmony_ci 144e1051a39Sopenharmony_ci if (x == NULL) 145e1051a39Sopenharmony_ci return 0; 146e1051a39Sopenharmony_ci in = x->revocationDate; 147e1051a39Sopenharmony_ci if (in != tm) { 148e1051a39Sopenharmony_ci in = ASN1_STRING_dup(tm); 149e1051a39Sopenharmony_ci if (in != NULL) { 150e1051a39Sopenharmony_ci ASN1_TIME_free(x->revocationDate); 151e1051a39Sopenharmony_ci x->revocationDate = in; 152e1051a39Sopenharmony_ci } 153e1051a39Sopenharmony_ci } 154e1051a39Sopenharmony_ci return (in != NULL); 155e1051a39Sopenharmony_ci} 156e1051a39Sopenharmony_ci 157e1051a39Sopenharmony_ciconst ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x) 158e1051a39Sopenharmony_ci{ 159e1051a39Sopenharmony_ci return &x->serialNumber; 160e1051a39Sopenharmony_ci} 161e1051a39Sopenharmony_ci 162e1051a39Sopenharmony_ciint X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial) 163e1051a39Sopenharmony_ci{ 164e1051a39Sopenharmony_ci ASN1_INTEGER *in; 165e1051a39Sopenharmony_ci 166e1051a39Sopenharmony_ci if (x == NULL) 167e1051a39Sopenharmony_ci return 0; 168e1051a39Sopenharmony_ci in = &x->serialNumber; 169e1051a39Sopenharmony_ci if (in != serial) 170e1051a39Sopenharmony_ci return ASN1_STRING_copy(in, serial); 171e1051a39Sopenharmony_ci return 1; 172e1051a39Sopenharmony_ci} 173e1051a39Sopenharmony_ci 174e1051a39Sopenharmony_ciconst STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(const X509_REVOKED *r) 175e1051a39Sopenharmony_ci{ 176e1051a39Sopenharmony_ci return r->extensions; 177e1051a39Sopenharmony_ci} 178e1051a39Sopenharmony_ci 179e1051a39Sopenharmony_ciint i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **pp) 180e1051a39Sopenharmony_ci{ 181e1051a39Sopenharmony_ci crl->crl.enc.modified = 1; 182e1051a39Sopenharmony_ci return i2d_X509_CRL_INFO(&crl->crl, pp); 183e1051a39Sopenharmony_ci} 184