|  | /* | 
|  | * Copyright 2001-2017 The OpenSSL Project Authors. All Rights Reserved. | 
|  | * | 
|  | * Licensed under the OpenSSL license (the "License").  You may not use | 
|  | * this file except in compliance with the License.  You can obtain a copy | 
|  | * in the file LICENSE in the source distribution or at | 
|  | * https://www.openssl.org/source/license.html | 
|  | */ | 
|  |  | 
|  | #include <stdio.h> | 
|  | #include "internal/cryptlib.h" | 
|  | #include "internal/refcount.h" | 
|  | #include <openssl/asn1.h> | 
|  | #include <openssl/objects.h> | 
|  | #include <openssl/evp.h> | 
|  | #include <openssl/x509.h> | 
|  | #include "crypto/x509.h" | 
|  |  | 
|  | int X509_CRL_set_version(X509_CRL *x, long version) | 
|  | { | 
|  | if (x == NULL) | 
|  | return 0; | 
|  | if (x->crl.version == NULL) { | 
|  | if ((x->crl.version = ASN1_INTEGER_new()) == NULL) | 
|  | return 0; | 
|  | } | 
|  | return ASN1_INTEGER_set(x->crl.version, version); | 
|  | } | 
|  |  | 
|  | int X509_CRL_set_issuer_name(X509_CRL *x, X509_NAME *name) | 
|  | { | 
|  | if (x == NULL) | 
|  | return 0; | 
|  | return X509_NAME_set(&x->crl.issuer, name); | 
|  | } | 
|  |  | 
|  | int X509_CRL_set1_lastUpdate(X509_CRL *x, const ASN1_TIME *tm) | 
|  | { | 
|  | if (x == NULL) | 
|  | return 0; | 
|  | return x509_set1_time(&x->crl.lastUpdate, tm); | 
|  | } | 
|  |  | 
|  | int X509_CRL_set1_nextUpdate(X509_CRL *x, const ASN1_TIME *tm) | 
|  | { | 
|  | if (x == NULL) | 
|  | return 0; | 
|  | return x509_set1_time(&x->crl.nextUpdate, tm); | 
|  | } | 
|  |  | 
|  | int X509_CRL_sort(X509_CRL *c) | 
|  | { | 
|  | int i; | 
|  | X509_REVOKED *r; | 
|  | /* | 
|  | * sort the data so it will be written in serial number order | 
|  | */ | 
|  | sk_X509_REVOKED_sort(c->crl.revoked); | 
|  | for (i = 0; i < sk_X509_REVOKED_num(c->crl.revoked); i++) { | 
|  | r = sk_X509_REVOKED_value(c->crl.revoked, i); | 
|  | r->sequence = i; | 
|  | } | 
|  | c->crl.enc.modified = 1; | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | int X509_CRL_up_ref(X509_CRL *crl) | 
|  | { | 
|  | int i; | 
|  |  | 
|  | if (CRYPTO_UP_REF(&crl->references, &i, crl->lock) <= 0) | 
|  | return 0; | 
|  |  | 
|  | REF_PRINT_COUNT("X509_CRL", crl); | 
|  | REF_ASSERT_ISNT(i < 2); | 
|  | return ((i > 1) ? 1 : 0); | 
|  | } | 
|  |  | 
|  | long X509_CRL_get_version(const X509_CRL *crl) | 
|  | { | 
|  | return ASN1_INTEGER_get(crl->crl.version); | 
|  | } | 
|  |  | 
|  | const ASN1_TIME *X509_CRL_get0_lastUpdate(const X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.lastUpdate; | 
|  | } | 
|  |  | 
|  | const ASN1_TIME *X509_CRL_get0_nextUpdate(const X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.nextUpdate; | 
|  | } | 
|  |  | 
|  | #if OPENSSL_API_COMPAT < 0x10100000L | 
|  | ASN1_TIME *X509_CRL_get_lastUpdate(X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.lastUpdate; | 
|  | } | 
|  |  | 
|  | ASN1_TIME *X509_CRL_get_nextUpdate(X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.nextUpdate; | 
|  | } | 
|  | #endif | 
|  |  | 
|  | X509_NAME *X509_CRL_get_issuer(const X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.issuer; | 
|  | } | 
|  |  | 
|  | const STACK_OF(X509_EXTENSION) *X509_CRL_get0_extensions(const X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.extensions; | 
|  | } | 
|  |  | 
|  | STACK_OF(X509_REVOKED) *X509_CRL_get_REVOKED(X509_CRL *crl) | 
|  | { | 
|  | return crl->crl.revoked; | 
|  | } | 
|  |  | 
|  | void X509_CRL_get0_signature(const X509_CRL *crl, const ASN1_BIT_STRING **psig, | 
|  | const X509_ALGOR **palg) | 
|  | { | 
|  | if (psig != NULL) | 
|  | *psig = &crl->signature; | 
|  | if (palg != NULL) | 
|  | *palg = &crl->sig_alg; | 
|  | } | 
|  |  | 
|  | int X509_CRL_get_signature_nid(const X509_CRL *crl) | 
|  | { | 
|  | return OBJ_obj2nid(crl->sig_alg.algorithm); | 
|  | } | 
|  |  | 
|  | const ASN1_TIME *X509_REVOKED_get0_revocationDate(const X509_REVOKED *x) | 
|  | { | 
|  | return x->revocationDate; | 
|  | } | 
|  |  | 
|  | int X509_REVOKED_set_revocationDate(X509_REVOKED *x, ASN1_TIME *tm) | 
|  | { | 
|  | ASN1_TIME *in; | 
|  |  | 
|  | if (x == NULL) | 
|  | return 0; | 
|  | in = x->revocationDate; | 
|  | if (in != tm) { | 
|  | in = ASN1_STRING_dup(tm); | 
|  | if (in != NULL) { | 
|  | ASN1_TIME_free(x->revocationDate); | 
|  | x->revocationDate = in; | 
|  | } | 
|  | } | 
|  | return (in != NULL); | 
|  | } | 
|  |  | 
|  | const ASN1_INTEGER *X509_REVOKED_get0_serialNumber(const X509_REVOKED *x) | 
|  | { | 
|  | return &x->serialNumber; | 
|  | } | 
|  |  | 
|  | int X509_REVOKED_set_serialNumber(X509_REVOKED *x, ASN1_INTEGER *serial) | 
|  | { | 
|  | ASN1_INTEGER *in; | 
|  |  | 
|  | if (x == NULL) | 
|  | return 0; | 
|  | in = &x->serialNumber; | 
|  | if (in != serial) | 
|  | return ASN1_STRING_copy(in, serial); | 
|  | return 1; | 
|  | } | 
|  |  | 
|  | const STACK_OF(X509_EXTENSION) *X509_REVOKED_get0_extensions(const X509_REVOKED *r) | 
|  | { | 
|  | return r->extensions; | 
|  | } | 
|  |  | 
|  | int i2d_re_X509_CRL_tbs(X509_CRL *crl, unsigned char **pp) | 
|  | { | 
|  | crl->crl.enc.modified = 1; | 
|  | return i2d_X509_CRL_INFO(&crl->crl, pp); | 
|  | } |