195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) 295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * All rights reserved. 395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This package is an SSL implementation written 595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * by Eric Young (eay@cryptsoft.com). 695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The implementation was written so as to conform with Netscapes SSL. 795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This library is free for commercial and non-commercial use as long as 995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the following conditions are aheared to. The following conditions 1095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * apply to all code found in this distribution, be it the RC4, RSA, 1195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * lhash, DES, etc., code; not just the SSL code. The SSL documentation 1295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * included with this distribution is covered by the same copyright terms 1395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * except that the holder is Tim Hudson (tjh@cryptsoft.com). 1495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 1595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Copyright remains Eric Young's, and as such any Copyright notices in 1695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the code are not to be removed. 1795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * If this package is used in a product, Eric Young should be given attribution 1895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * as the author of the parts of the library used. 1995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * This can be in the form of a textual message at program startup or 2095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * in documentation (online or textual) provided with the package. 2195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 2295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Redistribution and use in source and binary forms, with or without 2395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * modification, are permitted provided that the following conditions 2495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * are met: 2595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 1. Redistributions of source code must retain the copyright 2695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * notice, this list of conditions and the following disclaimer. 2795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 2. Redistributions in binary form must reproduce the above copyright 2895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * notice, this list of conditions and the following disclaimer in the 2995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * documentation and/or other materials provided with the distribution. 3095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 3. All advertising materials mentioning features or use of this software 3195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * must display the following acknowledgement: 3295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * "This product includes cryptographic software written by 3395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * Eric Young (eay@cryptsoft.com)" 3495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The word 'cryptographic' can be left out if the rouines from the library 3595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * being used are not cryptographic related :-). 3695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 4. If you include any Windows specific code (or a derivative thereof) from 3795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the apps directory (application code) you must include an acknowledgement: 3895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" 3995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 4095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``AS IS'' AND 4195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 4295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 4395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 4495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 4595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 4695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 4795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 4895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 4995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 5095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * SUCH DAMAGE. 5195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * 5295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * The licence and distribution terms for any publically available version or 5395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * derivative of this code cannot be changed. i.e. this code cannot simply be 5495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * copied and put under another distribution licence 5595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * [including the GNU Public Licence.] */ 5695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 5795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/asn1.h> 5895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 5995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <limits.h> 6095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 61eb7d2ed1fe8a33b3e3871502ba7e12efaf94360cAdam Langley#include <openssl/asn1_mac.h> 6295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/err.h> 6395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/mem.h> 6495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 6595c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyOPENSSL_DECLARE_ERROR_REASON(ASN1, MALLOC_FAILURE); 6695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 6795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 6895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int asn1_get_length(const unsigned char **pp,int *inf,long *rl,int max); 6995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic void asn1_put_length(unsigned char **pp, int length); 7095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 7195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int _asn1_check_infinite_end(const unsigned char **p, long len) 7295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 7395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley /* If there is 0 or 1 byte left, the length check should pick 7495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * things up */ 7595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (len <= 0) 7695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(1); 7795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else if ((len >= 2) && ((*p)[0] == 0) && ((*p)[1] == 0)) 7895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 7995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley (*p)+=2; 8095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(1); 8195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 8295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 8395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 8495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 8595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_check_infinite_end(unsigned char **p, long len) 8695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 8795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return _asn1_check_infinite_end((const unsigned char **)p, len); 8895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 8995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 9095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_const_check_infinite_end(const unsigned char **p, long len) 9195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 9295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return _asn1_check_infinite_end(p, len); 9395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 9495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 9595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 9695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_get_object(const unsigned char **pp, long *plength, int *ptag, 9795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int *pclass, long omax) 9895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 9995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int i,ret; 10095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley long l; 10195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley const unsigned char *p= *pp; 10295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int tag,xclass,inf; 10395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley long max=omax; 10495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 10595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!max) goto err; 10695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret=(*p&V_ASN1_CONSTRUCTED); 10795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley xclass=(*p&V_ASN1_PRIVATE); 10895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley i= *p&V_ASN1_PRIMITIVE_TAG; 10995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (i == V_ASN1_PRIMITIVE_TAG) 11095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { /* high-tag */ 11195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p++; 11295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (--max == 0) goto err; 11395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l=0; 11495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley while (*p&0x80) 11595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 11695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l<<=7L; 11795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l|= *(p++)&0x7f; 11895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (--max == 0) goto err; 11995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (l > (INT_MAX >> 7L)) goto err; 12095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 12195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l<<=7L; 12295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l|= *(p++)&0x7f; 12395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley tag=(int)l; 12495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (--max == 0) goto err; 12595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 12695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 12795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 12895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley tag=i; 12995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p++; 13095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (--max == 0) goto err; 13195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 13295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *ptag=tag; 13395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *pclass=xclass; 13495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!asn1_get_length(&p,&inf,plength,(int)max)) goto err; 13595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 136e532f823d689d37571d7a58edd24533a951f35d9Adam Langley if (inf && !(ret & V_ASN1_CONSTRUCTED)) 137e532f823d689d37571d7a58edd24533a951f35d9Adam Langley goto err; 138e532f823d689d37571d7a58edd24533a951f35d9Adam Langley 13995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#if 0 14095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley fprintf(stderr,"p=%d + *plength=%ld > omax=%ld + *pp=%d (%d > %d)\n", 14195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley (int)p,*plength,omax,(int)*pp,(int)(p+ *plength), 14295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley (int)(omax+ *pp)); 14395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 14495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#endif 14595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (*plength > (omax - (p - *pp))) 14695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 14795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_PUT_ERROR(ASN1, ASN1_get_object, ASN1_R_TOO_LONG); 14895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley /* Set this so that even if things are not long enough 14995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * the values are set correctly */ 15095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret|=0x80; 15195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 15295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *pp=p; 15395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(ret|inf); 15495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyerr: 15595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_PUT_ERROR(ASN1, ASN1_get_object, ASN1_R_HEADER_TOO_LONG); 15695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0x80); 15795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 15895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 15995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int asn1_get_length(const unsigned char **pp, int *inf, long *rl, int max) 16095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 16195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley const unsigned char *p= *pp; 16295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley unsigned long ret=0; 16395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley unsigned int i; 16495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 16595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (max-- < 1) return(0); 16695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (*p == 0x80) 16795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 16895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *inf=1; 16995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret=0; 17095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p++; 17195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 17295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 17395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 17495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *inf=0; 17595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley i= *p&0x7f; 17695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (*(p++) & 0x80) 17795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 17895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (i > sizeof(long)) 17995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 18095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (max-- == 0) return(0); 18195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley while (i-- > 0) 18295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 18395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret<<=8L; 18495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret|= *(p++); 18595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (max-- == 0) return(0); 18695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 18795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 18895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 18995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret=i; 19095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 19195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (ret > LONG_MAX) 19295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 19395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *pp=p; 19495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *rl=(long)ret; 19595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(1); 19695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 19795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 19895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley/* class 0 is constructed 19995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley * constructed == 2 for indefinite length constructed */ 20095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ASN1_put_object(unsigned char **pp, int constructed, int length, int tag, 20195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int xclass) 20295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 20395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley unsigned char *p= *pp; 20495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int i, ttag; 20595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 20695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley i=(constructed)?V_ASN1_CONSTRUCTED:0; 20795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley i|=(xclass&V_ASN1_PRIVATE); 20895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (tag < 31) 20995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *(p++)=i|(tag&V_ASN1_PRIMITIVE_TAG); 21095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 21195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 21295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *(p++)=i|V_ASN1_PRIMITIVE_TAG; 21395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley for(i = 0, ttag = tag; ttag > 0; i++) ttag >>=7; 21495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ttag = i; 21595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley while(i-- > 0) 21695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 21795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p[i] = tag & 0x7f; 21895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if(i != (ttag - 1)) p[i] |= 0x80; 21995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley tag >>= 7; 22095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 22195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p += ttag; 22295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 22395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (constructed == 2) 22495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *(p++)=0x80; 22595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 22695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley asn1_put_length(&p,length); 22795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *pp=p; 22895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 22995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 23095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_put_eoc(unsigned char **pp) 23195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 23295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley unsigned char *p = *pp; 23395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *p++ = 0; 23495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *p++ = 0; 23595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *pp = p; 23695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 2; 23795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 23895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 23995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic void asn1_put_length(unsigned char **pp, int length) 24095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 24195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley unsigned char *p= *pp; 24295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int i,l; 24395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (length <= 127) 24495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *(p++)=(unsigned char)length; 24595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 24695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 24795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l=length; 24895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley for (i=0; l > 0; i++) 24995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l>>=8; 25095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *(p++)=i|0x80; 25195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley l=i; 25295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley while (i-- > 0) 25395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 25495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p[i]=length&0xff; 25595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley length>>=8; 25695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 25795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley p+=l; 25895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 25995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *pp=p; 26095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 26195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 26295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_object_size(int constructed, int length, int tag) 26395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 26495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int ret; 26595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 26695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret=length; 26795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret++; 26895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (tag >= 31) 26995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 27095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley while (tag > 0) 27195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 27295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley tag>>=7; 27395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret++; 27495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 27595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 27695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (constructed == 2) 27795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return ret + 3; 27895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret++; 27995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (length > 127) 28095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 28195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley while (length > 0) 28295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 28395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley length>>=8; 28495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret++; 28595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 28695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 28795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(ret); 28895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 28995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 29095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleystatic int _asn1_Finish(ASN1_const_CTX *c) 29195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 29295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if ((c->inf == (1|V_ASN1_CONSTRUCTED)) && (!c->eos)) 29395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 29495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ASN1_const_check_infinite_end(&c->p,c->slen)) 29595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 29695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->error=ASN1_R_MISSING_ASN1_EOS; 29795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 29895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 29995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 30095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if ( ((c->slen != 0) && !(c->inf & 1)) || 30195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ((c->slen < 0) && (c->inf & 1))) 30295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 30395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->error=ASN1_R_ASN1_LENGTH_MISMATCH; 30495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 30595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 30695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(1); 30795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 30895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 30995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint asn1_Finish(ASN1_CTX *c) 31095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 31195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return _asn1_Finish((ASN1_const_CTX *)c); 31295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 31395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 31495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint asn1_const_Finish(ASN1_const_CTX *c) 31595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 31695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return _asn1_Finish(c); 31795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 31895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 31995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint asn1_GetSequence(ASN1_const_CTX *c, long *length) 32095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 32195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley const unsigned char *q; 32295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 32395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley q=c->p; 32495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->inf=ASN1_get_object(&(c->p),&(c->slen),&(c->tag),&(c->xclass), 32595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley *length); 32695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (c->inf & 0x80) 32795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 32895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->error=ASN1_R_BAD_GET_ASN1_OBJECT_CALL; 32995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 33095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 33195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (c->tag != V_ASN1_SEQUENCE) 33295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 33395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->error=ASN1_R_EXPECTING_AN_ASN1_SEQUENCE; 33495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 33595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 33695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley (*length)-=(c->p-q); 33795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (c->max && (*length < 0)) 33895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 33995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->error=ASN1_R_ASN1_LENGTH_MISMATCH; 34095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 34195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 34295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (c->inf == (1|V_ASN1_CONSTRUCTED)) 34395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->slen= *length+ *(c->pp)-c->p; 34495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c->eos=0; 34595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(1); 34695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 34795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 34895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_STRING_copy(ASN1_STRING *dst, const ASN1_STRING *str) 34995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 35095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (str == NULL) 35195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 35295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dst->type = str->type; 35395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ASN1_STRING_set(dst,str->data,str->length)) 35495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 0; 35595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley dst->flags = str->flags; 35695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return 1; 35795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 35895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 35995c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyASN1_STRING *ASN1_STRING_dup(const ASN1_STRING *str) 36095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 36195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ASN1_STRING *ret; 36295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!str) 36395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 36495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret=ASN1_STRING_new(); 36595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ret) 36695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 36795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (!ASN1_STRING_copy(ret,str)) 36895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 36995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ASN1_STRING_free(ret); 37095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return NULL; 37195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 37295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return ret; 37395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 37495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 37595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_STRING_set(ASN1_STRING *str, const void *_data, int len) 37695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 37795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley unsigned char *c; 37895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley const char *data=_data; 37995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 38095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (len < 0) 38195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 38295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (data == NULL) 38395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 38495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 38595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley len=strlen(data); 38695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 38795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if ((str->length < len) || (str->data == NULL)) 38895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 38995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley c=str->data; 39095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (c == NULL) 39195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->data=OPENSSL_malloc(len+1); 39295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 39395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->data=OPENSSL_realloc(c,len+1); 39495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 39595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (str->data == NULL) 39695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 39795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_PUT_ERROR(ASN1, ASN1_STRING_set, ERR_R_MALLOC_FAILURE); 39895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->data=c; 39995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(0); 40095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 40195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 40295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->length=len; 40395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (data != NULL) 40495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 40595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley memcpy(str->data,data,len); 40695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley /* an allowance for strings :-) */ 40795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->data[len]='\0'; 40895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 40995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(1); 41095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 41195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 41295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ASN1_STRING_set0(ASN1_STRING *str, void *data, int len) 41395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 41495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (str->data) 41595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(str->data); 41695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->data = data; 41795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley str->length = len; 41895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 41995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 42095c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyASN1_STRING *ASN1_STRING_new(void) 42195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 42295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(ASN1_STRING_type_new(V_ASN1_OCTET_STRING)); 42395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 42495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 42595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 42695c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyASN1_STRING *ASN1_STRING_type_new(int type) 42795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 42895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ASN1_STRING *ret; 42995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 43095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret=(ASN1_STRING *)OPENSSL_malloc(sizeof(ASN1_STRING)); 43195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (ret == NULL) 43295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 43395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_PUT_ERROR(ASN1, ASN1_STRING_type_new, ERR_R_MALLOC_FAILURE); 43495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(NULL); 43595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 43695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret->length=0; 43795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret->type=type; 43895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret->data=NULL; 43995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ret->flags=0; 44095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(ret); 44195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 44295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 44395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ASN1_STRING_free(ASN1_STRING *a) 44495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 44595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (a == NULL) return; 44695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (a->data && !(a->flags & ASN1_STRING_FLAG_NDEF)) 44795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(a->data); 44895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley OPENSSL_free(a); 44995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 45095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 45195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_STRING_cmp(const ASN1_STRING *a, const ASN1_STRING *b) 45295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 45395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley int i; 45495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 45595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley i=(a->length-b->length); 45695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (i == 0) 45795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 45895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley i=memcmp(a->data,b->data,a->length); 45995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley if (i == 0) 46095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(a->type-b->type); 46195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 46295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(i); 46395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 46495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley else 46595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley return(i); 46695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 46795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 46895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid asn1_add_error(const unsigned char *address, int offset) 46995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley { 47095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley char buf1[DECIMAL_SIZE(address)+1],buf2[DECIMAL_SIZE(offset)+1]; 47195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 47295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley BIO_snprintf(buf1,sizeof buf1,"%lu",(unsigned long)address); 47395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley BIO_snprintf(buf2,sizeof buf2,"%d",offset); 47495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley ERR_add_error_data(4,"address=",buf1," offset=",buf2); 47595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley } 47695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 47795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_STRING_length(const ASN1_STRING *x) 47895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley{ return M_ASN1_STRING_length(x); } 47995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 48095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyvoid ASN1_STRING_length_set(ASN1_STRING *x, int len) 48195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley{ M_ASN1_STRING_length_set(x, len); return; } 48295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 48395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint ASN1_STRING_type(ASN1_STRING *x) 48495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley{ return M_ASN1_STRING_type(x); } 48595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley 48695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyunsigned char * ASN1_STRING_data(ASN1_STRING *x) 48795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley{ return M_ASN1_STRING_data(x); } 488