/* Copyright (C) 1995-1998 Eric Young ([email protected]) * All rights reserved. * * This package is an SSL implementation written * by Eric Young ([email protected]). * The implementation was written so as to conform with Netscapes SSL. * * This library is free for commercial and non-commercial use as long as * the following conditions are aheared to. The following conditions * apply to all code found in this distribution, be it the RC4, RSA, * lhash, DES, etc., code; not just the SSL code. The SSL documentation * included with this distribution is covered by the same copyright terms * except that the holder is Tim Hudson ([email protected]). * * Copyright remains Eric Young's, and as such any Copyright notices in * the code are not to be removed. * If this package is used in a product, Eric Young should be given attribution * as the author of the parts of the library used. * This can be in the form of a textual message at program startup or * in documentation (online or textual) provided with the package. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * 3. All advertising materials mentioning features or use of this software * must display the following acknowledgement: * "This product includes cryptographic software written by * Eric Young ([email protected])" * The word 'cryptographic' can be left out if the rouines from the library * being used are not cryptographic related :-). * 4. If you include any Windows specific code (or a derivative thereof) from * the apps directory (application code) you must include an acknowledgement: * "This product includes software written by Tim Hudson ([email protected])" * * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF * SUCH DAMAGE. * * The licence and distribution terms for any publically available version or * derivative of this code cannot be changed. i.e. this code cannot simply be * copied and put under another distribution licence * [including the GNU Public Licence.] */ #include <openssl/asn1.h> #include <limits.h> #include <string.h> #include <openssl/bytestring.h> #include <openssl/err.h> #include <openssl/mem.h> #include "../internal.h" #include "internal.h" // Cross-module errors from crypto/x509/i2d_pr.c. OPENSSL_DECLARE_ERROR_REASON(…) // Cross-module errors from crypto/x509/algorithm.c. OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) // Cross-module errors from crypto/x509/asn1_gen.c. TODO(davidben): Remove // these once asn1_gen.c is gone. OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) OPENSSL_DECLARE_ERROR_REASON(…) // Limit |ASN1_STRING|s to 64 MiB of data. Most of this module, as well as // downstream code, does not correctly handle overflow. We cap string fields // more tightly than strictly necessary to fit in |int|. This is not expected to // impact real world uses of this field. // // In particular, this limit is small enough that the bit count of a BIT STRING // comfortably fits in an |int|, with room for arithmetic. #define ASN1_STRING_MAX … static void asn1_put_length(unsigned char **pp, int length); int ASN1_get_object(const unsigned char **inp, long *out_len, int *out_tag, int *out_class, long in_len) { … } // class 0 is constructed constructed == 2 for indefinite length constructed void ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, int xclass) { … } int ASN1_put_eoc(unsigned char **pp) { … } static void asn1_put_length(unsigned char **pp, int length) { … } int ASN1_object_size(int constructed, int length, int tag) { … } int ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) { … } ASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str) { … } int ASN1_STRING_set(ASN1_STRING *str, const void *_data, ossl_ssize_t len_s) { … } void ASN1_STRING_set0(ASN1_STRING *str, void *data, int len) { … } ASN1_STRING *ASN1_STRING_new(void) { … } ASN1_STRING *ASN1_STRING_type_new(int type) { … } void ASN1_STRING_free(ASN1_STRING *str) { … } int ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b) { … } int ASN1_STRING_length(const ASN1_STRING *str) { … } int ASN1_STRING_type(const ASN1_STRING *str) { … } unsigned char *ASN1_STRING_data(ASN1_STRING *str) { … } const unsigned char *ASN1_STRING_get0_data(const ASN1_STRING *str) { … }