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#include <openssl/err.h>
5995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/evp.h>
6095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/obj.h>
6195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/stack.h>
6295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/x509.h>
6395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley#include <openssl/x509v3.h>
6495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
6595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
6695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509v3_get_ext_count(const STACK_OF(X509_EXTENSION) *x)
6795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
6895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (x == NULL) return(0);
6995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(sk_X509_EXTENSION_num(x));
7095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
7195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
7295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509v3_get_ext_by_NID(const STACK_OF(X509_EXTENSION) *x, int nid,
7395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			  int lastpos)
7495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
7595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	const ASN1_OBJECT *obj;
7695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
7795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	obj=OBJ_nid2obj(nid);
7895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (obj == NULL) return(-2);
7995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(X509v3_get_ext_by_OBJ(x,obj,lastpos));
8095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
8195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
8295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509v3_get_ext_by_OBJ(const STACK_OF(X509_EXTENSION) *sk, const ASN1_OBJECT *obj,
8395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			  int lastpos)
8495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
8595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int n;
8695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	X509_EXTENSION *ex;
8795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
8895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (sk == NULL) return(-1);
8995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	lastpos++;
9095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (lastpos < 0)
9195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		lastpos=0;
9295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	n=sk_X509_EXTENSION_num(sk);
9395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	for ( ; lastpos < n; lastpos++)
9495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
9595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ex=sk_X509_EXTENSION_value(sk,lastpos);
9695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (OBJ_cmp(ex->object,obj) == 0)
9795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(lastpos);
9895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
9995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(-1);
10095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
10195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
10295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509v3_get_ext_by_critical(const STACK_OF(X509_EXTENSION) *sk, int crit,
10395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			       int lastpos)
10495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
10595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int n;
10695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	X509_EXTENSION *ex;
10795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
10895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (sk == NULL) return(-1);
10995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	lastpos++;
11095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (lastpos < 0)
11195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		lastpos=0;
11295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	n=sk_X509_EXTENSION_num(sk);
11395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	for ( ; lastpos < n; lastpos++)
11495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
11595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ex=sk_X509_EXTENSION_value(sk,lastpos);
11695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if (	((ex->critical > 0) && crit) ||
11795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			((ex->critical <= 0) && !crit))
11895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(lastpos);
11995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
12095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(-1);
12195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
12295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
12395c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyX509_EXTENSION *X509v3_get_ext(const STACK_OF(X509_EXTENSION) *x, int loc)
12495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
12595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t) loc)
12695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return NULL;
12795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
12895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return sk_X509_EXTENSION_value(x,loc);
12995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
13095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
13195c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyX509_EXTENSION *X509v3_delete_ext(STACK_OF(X509_EXTENSION) *x, int loc)
13295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
13395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	X509_EXTENSION *ret;
13495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
13595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (x == NULL || loc < 0 || sk_X509_EXTENSION_num(x) <= (size_t) loc)
13695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(NULL);
13795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ret=sk_X509_EXTENSION_delete(x,loc);
13895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
13995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
14095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
14195c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleySTACK_OF(X509_EXTENSION) *X509v3_add_ext(STACK_OF(X509_EXTENSION) **x,
14295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley					 X509_EXTENSION *ex, int loc)
14395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
14495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	X509_EXTENSION *new_ex=NULL;
14595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int n;
14695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	STACK_OF(X509_EXTENSION) *sk=NULL;
14795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
14895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (x == NULL)
14995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
15095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(X509, X509v3_add_ext, ERR_R_PASSED_NULL_PARAMETER);
15195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		goto err2;
15295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
15395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
15495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (*x == NULL)
15595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
15695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if ((sk=sk_X509_EXTENSION_new_null()) == NULL)
15795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			goto err;
15895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
15995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
16095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		sk= *x;
16195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
16295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	n=sk_X509_EXTENSION_num(sk);
16395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (loc > n) loc=n;
16495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else if (loc < 0) loc=n;
16595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
16695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((new_ex=X509_EXTENSION_dup(ex)) == NULL)
16795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		goto err2;
16895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!sk_X509_EXTENSION_insert(sk,new_ex,loc))
16995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		goto err;
17095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (*x == NULL)
17195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		*x=sk;
17295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(sk);
17395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyerr:
17495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	OPENSSL_PUT_ERROR(X509, X509v3_add_ext, ERR_R_MALLOC_FAILURE);
17595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyerr2:
17695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (new_ex != NULL) X509_EXTENSION_free(new_ex);
17795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (sk != NULL) sk_X509_EXTENSION_free(sk);
17895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(NULL);
17995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
18095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
18195c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyX509_EXTENSION *X509_EXTENSION_create_by_NID(X509_EXTENSION **ex, int nid,
18295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	     int crit, ASN1_OCTET_STRING *data)
18395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
18495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	const ASN1_OBJECT *obj;
18595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	X509_EXTENSION *ret;
18695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
18795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	obj=OBJ_nid2obj(nid);
18895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (obj == NULL)
18995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
19095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		OPENSSL_PUT_ERROR(X509, X509_EXTENSION_create_by_NID, X509_R_UNKNOWN_NID);
19195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(NULL);
19295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
19395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ret=X509_EXTENSION_create_by_OBJ(ex,obj,crit,data);
19495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
19595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
19695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
19795c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyX509_EXTENSION *X509_EXTENSION_create_by_OBJ(X509_EXTENSION **ex,
19895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	     const ASN1_OBJECT *obj, int crit, ASN1_OCTET_STRING *data)
19995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
20095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	X509_EXTENSION *ret;
20195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
20295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((ex == NULL) || (*ex == NULL))
20395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		{
20495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		if ((ret=X509_EXTENSION_new()) == NULL)
20595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			{
20695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			OPENSSL_PUT_ERROR(X509, X509_EXTENSION_create_by_OBJ, ERR_R_MALLOC_FAILURE);
20795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			return(NULL);
20895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley			}
20995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		}
21095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	else
21195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		ret= *ex;
21295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
21395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!X509_EXTENSION_set_object(ret,obj))
21495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		goto err;
21595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!X509_EXTENSION_set_critical(ret,crit))
21695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		goto err;
21795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!X509_EXTENSION_set_data(ret,data))
21895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		goto err;
21995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
22095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((ex != NULL) && (*ex == NULL)) *ex=ret;
22195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ret);
22295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyerr:
22395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((ex == NULL) || (ret != *ex))
22495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		X509_EXTENSION_free(ret);
22595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(NULL);
22695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
22795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
22895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509_EXTENSION_set_object(X509_EXTENSION *ex, const ASN1_OBJECT *obj)
22995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
23095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if ((ex == NULL) || (obj == NULL))
23195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley		return(0);
23295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ASN1_OBJECT_free(ex->object);
23395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ex->object=OBJ_dup(obj);
23495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
23595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
23695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
23795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509_EXTENSION_set_critical(X509_EXTENSION *ex, int crit)
23895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
23995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (ex == NULL) return(0);
24095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	ex->critical=(crit)?0xFF:-1;
24195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
24295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
24395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
24495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509_EXTENSION_set_data(X509_EXTENSION *ex, ASN1_OCTET_STRING *data)
24595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
24695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	int i;
24795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
24895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (ex == NULL) return(0);
24995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	i=M_ASN1_OCTET_STRING_set(ex->value,data->data,data->length);
25095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (!i) return(0);
25195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(1);
25295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
25395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
25495c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyASN1_OBJECT *X509_EXTENSION_get_object(X509_EXTENSION *ex)
25595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
25695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (ex == NULL) return(NULL);
25795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ex->object);
25895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
25995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
26095c29f3cd1f6c08c6c0927868683392eea727ccAdam LangleyASN1_OCTET_STRING *X509_EXTENSION_get_data(X509_EXTENSION *ex)
26195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
26295c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (ex == NULL) return(NULL);
26395c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return(ex->value);
26495c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
26595c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley
26695c29f3cd1f6c08c6c0927868683392eea727ccAdam Langleyint X509_EXTENSION_get_critical(X509_EXTENSION *ex)
26795c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	{
26895c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if (ex == NULL) return(0);
26995c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	if(ex->critical > 0) return 1;
27095c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	return 0;
27195c29f3cd1f6c08c6c0927868683392eea727ccAdam Langley	}
272