Remove combine option from ASN.1 code.
Remove the combine option. This was used for compatibility with some non standard behaviour in ancient versions of OpenSSL: specifically the X509_ATTRIBUTE and DSAPublicKey handling. Since these have now been revised it is no longer needed. Reviewed-by: Richard Levitte <levitte@openssl.org>
This commit is contained in:
parent
ea6b07b54c
commit
ee9d76371a
6 changed files with 23 additions and 66 deletions
|
@ -973,7 +973,7 @@ void ERR_load_ASN1_strings(void);
|
||||||
# define ASN1_F_ASN1_INTEGER_TO_BN 119
|
# define ASN1_F_ASN1_INTEGER_TO_BN 119
|
||||||
# define ASN1_F_ASN1_ITEM_D2I_FP 206
|
# define ASN1_F_ASN1_ITEM_D2I_FP 206
|
||||||
# define ASN1_F_ASN1_ITEM_DUP 191
|
# define ASN1_F_ASN1_ITEM_DUP 191
|
||||||
# define ASN1_F_ASN1_ITEM_EX_COMBINE_NEW 121
|
# define ASN1_F_ASN1_ITEM_EX_NEW 121
|
||||||
# define ASN1_F_ASN1_ITEM_EX_D2I 120
|
# define ASN1_F_ASN1_ITEM_EX_D2I 120
|
||||||
# define ASN1_F_ASN1_ITEM_I2D_BIO 192
|
# define ASN1_F_ASN1_ITEM_I2D_BIO 192
|
||||||
# define ASN1_F_ASN1_ITEM_I2D_FP 193
|
# define ASN1_F_ASN1_ITEM_I2D_FP 193
|
||||||
|
|
|
@ -101,7 +101,7 @@ static ERR_STRING_DATA ASN1_str_functs[] = {
|
||||||
{ERR_FUNC(ASN1_F_ASN1_INTEGER_TO_BN), "ASN1_INTEGER_to_BN"},
|
{ERR_FUNC(ASN1_F_ASN1_INTEGER_TO_BN), "ASN1_INTEGER_to_BN"},
|
||||||
{ERR_FUNC(ASN1_F_ASN1_ITEM_D2I_FP), "ASN1_item_d2i_fp"},
|
{ERR_FUNC(ASN1_F_ASN1_ITEM_D2I_FP), "ASN1_item_d2i_fp"},
|
||||||
{ERR_FUNC(ASN1_F_ASN1_ITEM_DUP), "ASN1_item_dup"},
|
{ERR_FUNC(ASN1_F_ASN1_ITEM_DUP), "ASN1_item_dup"},
|
||||||
{ERR_FUNC(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW), "ASN1_ITEM_EX_COMBINE_NEW"},
|
{ERR_FUNC(ASN1_F_ASN1_ITEM_EX_NEW), "ASN1_ITEM_EX_NEW"},
|
||||||
{ERR_FUNC(ASN1_F_ASN1_ITEM_EX_D2I), "ASN1_ITEM_EX_D2I"},
|
{ERR_FUNC(ASN1_F_ASN1_ITEM_EX_D2I), "ASN1_ITEM_EX_D2I"},
|
||||||
{ERR_FUNC(ASN1_F_ASN1_ITEM_I2D_BIO), "ASN1_item_i2d_bio"},
|
{ERR_FUNC(ASN1_F_ASN1_ITEM_I2D_BIO), "ASN1_item_i2d_bio"},
|
||||||
{ERR_FUNC(ASN1_F_ASN1_ITEM_I2D_FP), "ASN1_item_i2d_fp"},
|
{ERR_FUNC(ASN1_F_ASN1_ITEM_I2D_FP), "ASN1_item_i2d_fp"},
|
||||||
|
|
|
@ -299,11 +299,6 @@ extern "C" {
|
||||||
(flags), (tag), offsetof(stname, field),\
|
(flags), (tag), offsetof(stname, field),\
|
||||||
#field, ASN1_ITEM_ref(type) }
|
#field, ASN1_ITEM_ref(type) }
|
||||||
|
|
||||||
/* used when the structure is combined with the parent */
|
|
||||||
|
|
||||||
# define ASN1_EX_COMBINE(flags, tag, type) { \
|
|
||||||
(flags)|ASN1_TFLG_COMBINE, (tag), 0, NULL, ASN1_ITEM_ref(type) }
|
|
||||||
|
|
||||||
/* implicit and explicit helper macros */
|
/* implicit and explicit helper macros */
|
||||||
|
|
||||||
# define ASN1_IMP_EX(stname, field, type, tag, ex) \
|
# define ASN1_IMP_EX(stname, field, type, tag, ex) \
|
||||||
|
@ -542,15 +537,6 @@ struct ASN1_ADB_TABLE_st {
|
||||||
|
|
||||||
# define ASN1_TFLG_ADB_INT (0x1<<9)
|
# define ASN1_TFLG_ADB_INT (0x1<<9)
|
||||||
|
|
||||||
/*
|
|
||||||
* This flag means a parent structure is passed instead of the field: this is
|
|
||||||
* useful is a SEQUENCE is being combined with a CHOICE for example. Since
|
|
||||||
* this means the structure and item name will differ we need to use the
|
|
||||||
* ASN1_CHOICE_END_name() macro for example.
|
|
||||||
*/
|
|
||||||
|
|
||||||
# define ASN1_TFLG_COMBINE (0x1<<10)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes
|
* This flag when present in a SEQUENCE OF, SET OF or EXPLICIT causes
|
||||||
* indefinite length constructed encoding to be used if required.
|
* indefinite length constructed encoding to be used if required.
|
||||||
|
|
|
@ -63,23 +63,14 @@
|
||||||
#include <openssl/objects.h>
|
#include <openssl/objects.h>
|
||||||
#include "asn1_locl.h"
|
#include "asn1_locl.h"
|
||||||
|
|
||||||
static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
|
||||||
int combine);
|
|
||||||
|
|
||||||
/* Free up an ASN1 structure */
|
/* Free up an ASN1 structure */
|
||||||
|
|
||||||
void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it)
|
void ASN1_item_free(ASN1_VALUE *val, const ASN1_ITEM *it)
|
||||||
{
|
{
|
||||||
asn1_item_combine_free(&val, it, 0);
|
ASN1_item_ex_free(&val, it);
|
||||||
}
|
}
|
||||||
|
|
||||||
void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
void ASN1_item_ex_free(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||||
{
|
|
||||||
asn1_item_combine_free(pval, it, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
|
||||||
int combine)
|
|
||||||
{
|
{
|
||||||
const ASN1_TEMPLATE *tt = NULL, *seqtt;
|
const ASN1_TEMPLATE *tt = NULL, *seqtt;
|
||||||
const ASN1_EXTERN_FUNCS *ef;
|
const ASN1_EXTERN_FUNCS *ef;
|
||||||
|
@ -125,10 +116,8 @@ static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
}
|
}
|
||||||
if (asn1_cb)
|
if (asn1_cb)
|
||||||
asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
|
asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
|
||||||
if (!combine) {
|
OPENSSL_free(*pval);
|
||||||
OPENSSL_free(*pval);
|
*pval = NULL;
|
||||||
*pval = NULL;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case ASN1_ITYPE_EXTERN:
|
case ASN1_ITYPE_EXTERN:
|
||||||
|
@ -163,10 +152,8 @@ static void asn1_item_combine_free(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
}
|
}
|
||||||
if (asn1_cb)
|
if (asn1_cb)
|
||||||
asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
|
asn1_cb(ASN1_OP_FREE_POST, pval, it, NULL);
|
||||||
if (!combine) {
|
OPENSSL_free(*pval);
|
||||||
OPENSSL_free(*pval);
|
*pval = NULL;
|
||||||
*pval = NULL;
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -180,13 +167,12 @@ void asn1_template_free(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
|
||||||
for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
|
for (i = 0; i < sk_ASN1_VALUE_num(sk); i++) {
|
||||||
ASN1_VALUE *vtmp = sk_ASN1_VALUE_value(sk, i);
|
ASN1_VALUE *vtmp = sk_ASN1_VALUE_value(sk, i);
|
||||||
|
|
||||||
asn1_item_combine_free(&vtmp, ASN1_ITEM_ptr(tt->item), 0);
|
ASN1_item_ex_free(&vtmp, ASN1_ITEM_ptr(tt->item));
|
||||||
}
|
}
|
||||||
sk_ASN1_VALUE_free(sk);
|
sk_ASN1_VALUE_free(sk);
|
||||||
*pval = NULL;
|
*pval = NULL;
|
||||||
} else {
|
} else {
|
||||||
asn1_item_combine_free(pval, ASN1_ITEM_ptr(tt->item),
|
ASN1_item_ex_free(pval, ASN1_ITEM_ptr(tt->item));
|
||||||
tt->flags & ASN1_TFLG_COMBINE);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -65,8 +65,6 @@
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "asn1_locl.h"
|
#include "asn1_locl.h"
|
||||||
|
|
||||||
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
|
||||||
int combine);
|
|
||||||
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
static int asn1_primitive_new(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
||||||
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
static void asn1_item_clear(ASN1_VALUE **pval, const ASN1_ITEM *it);
|
||||||
static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
|
static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt);
|
||||||
|
@ -84,12 +82,6 @@ ASN1_VALUE *ASN1_item_new(const ASN1_ITEM *it)
|
||||||
/* Allocate an ASN1 structure */
|
/* Allocate an ASN1 structure */
|
||||||
|
|
||||||
int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
int ASN1_item_ex_new(ASN1_VALUE **pval, const ASN1_ITEM *it)
|
||||||
{
|
|
||||||
return asn1_item_ex_combine_new(pval, it, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
|
||||||
int combine)
|
|
||||||
{
|
{
|
||||||
const ASN1_TEMPLATE *tt = NULL;
|
const ASN1_TEMPLATE *tt = NULL;
|
||||||
const ASN1_EXTERN_FUNCS *ef;
|
const ASN1_EXTERN_FUNCS *ef;
|
||||||
|
@ -102,8 +94,7 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
else
|
else
|
||||||
asn1_cb = 0;
|
asn1_cb = 0;
|
||||||
|
|
||||||
if (!combine)
|
*pval = NULL;
|
||||||
*pval = NULL;
|
|
||||||
|
|
||||||
#ifdef CRYPTO_MDEBUG
|
#ifdef CRYPTO_MDEBUG
|
||||||
if (it->sname)
|
if (it->sname)
|
||||||
|
@ -146,12 +137,10 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!combine) {
|
*pval = OPENSSL_malloc(it->size);
|
||||||
*pval = OPENSSL_malloc(it->size);
|
if (!*pval)
|
||||||
if (!*pval)
|
goto memerr;
|
||||||
goto memerr;
|
memset(*pval, 0, it->size);
|
||||||
memset(*pval, 0, it->size);
|
|
||||||
}
|
|
||||||
asn1_set_choice_selector(pval, -1, it);
|
asn1_set_choice_selector(pval, -1, it);
|
||||||
if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
|
if (asn1_cb && !asn1_cb(ASN1_OP_NEW_POST, pval, it, NULL))
|
||||||
goto auxerr;
|
goto auxerr;
|
||||||
|
@ -171,14 +160,12 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (!combine) {
|
*pval = OPENSSL_malloc(it->size);
|
||||||
*pval = OPENSSL_malloc(it->size);
|
if (!*pval)
|
||||||
if (!*pval)
|
goto memerr;
|
||||||
goto memerr;
|
memset(*pval, 0, it->size);
|
||||||
memset(*pval, 0, it->size);
|
asn1_do_lock(pval, 0, it);
|
||||||
asn1_do_lock(pval, 0, it);
|
asn1_enc_init(pval, it);
|
||||||
asn1_enc_init(pval, it);
|
|
||||||
}
|
|
||||||
for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
|
for (i = 0, tt = it->templates; i < it->tcount; tt++, i++) {
|
||||||
pseqval = asn1_get_field_ptr(pval, tt);
|
pseqval = asn1_get_field_ptr(pval, tt);
|
||||||
if (!asn1_template_new(pseqval, tt))
|
if (!asn1_template_new(pseqval, tt))
|
||||||
|
@ -195,7 +182,7 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
return 1;
|
return 1;
|
||||||
|
|
||||||
memerr:
|
memerr:
|
||||||
ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ERR_R_MALLOC_FAILURE);
|
ASN1err(ASN1_F_ASN1_ITEM_EX_NEW, ERR_R_MALLOC_FAILURE);
|
||||||
#ifdef CRYPTO_MDEBUG
|
#ifdef CRYPTO_MDEBUG
|
||||||
if (it->sname)
|
if (it->sname)
|
||||||
CRYPTO_pop_info();
|
CRYPTO_pop_info();
|
||||||
|
@ -203,7 +190,7 @@ static int asn1_item_ex_combine_new(ASN1_VALUE **pval, const ASN1_ITEM *it,
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
auxerr:
|
auxerr:
|
||||||
ASN1err(ASN1_F_ASN1_ITEM_EX_COMBINE_NEW, ASN1_R_AUX_ERROR);
|
ASN1err(ASN1_F_ASN1_ITEM_EX_NEW, ASN1_R_AUX_ERROR);
|
||||||
ASN1_item_ex_free(pval, it);
|
ASN1_item_ex_free(pval, it);
|
||||||
#ifdef CRYPTO_MDEBUG
|
#ifdef CRYPTO_MDEBUG
|
||||||
if (it->sname)
|
if (it->sname)
|
||||||
|
@ -278,7 +265,7 @@ static int asn1_template_new(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
|
||||||
goto done;
|
goto done;
|
||||||
}
|
}
|
||||||
/* Otherwise pass it back to the item routine */
|
/* Otherwise pass it back to the item routine */
|
||||||
ret = asn1_item_ex_combine_new(pval, it, tt->flags & ASN1_TFLG_COMBINE);
|
ret = ASN1_item_ex_new(pval, it);
|
||||||
done:
|
done:
|
||||||
#ifdef CRYPTO_MDEBUG
|
#ifdef CRYPTO_MDEBUG
|
||||||
if (it->sname)
|
if (it->sname)
|
||||||
|
|
|
@ -202,8 +202,6 @@ int asn1_enc_restore(int *len, unsigned char **out, ASN1_VALUE **pval,
|
||||||
ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
|
ASN1_VALUE **asn1_get_field_ptr(ASN1_VALUE **pval, const ASN1_TEMPLATE *tt)
|
||||||
{
|
{
|
||||||
ASN1_VALUE **pvaltmp;
|
ASN1_VALUE **pvaltmp;
|
||||||
if (tt->flags & ASN1_TFLG_COMBINE)
|
|
||||||
return pval;
|
|
||||||
pvaltmp = offset2ptr(*pval, tt->offset);
|
pvaltmp = offset2ptr(*pval, tt->offset);
|
||||||
/*
|
/*
|
||||||
* NOTE for BOOLEAN types the field is just a plain int so we can't
|
* NOTE for BOOLEAN types the field is just a plain int so we can't
|
||||||
|
|
Loading…
Reference in a new issue