summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDr. Stephen Henson <steve@openssl.org>2000-08-22 22:20:25 +0000
committerDr. Stephen Henson <steve@openssl.org>2000-08-22 22:20:25 +0000
commitd096b524afbdc371032d96d22f1686d88bfba0e9 (patch)
tree8682cc9a6ca3c3142f940a30237f3148e69bf498
parentc9b51693dc8f9f198281a4f8a976cf5e118313b4 (diff)
Add support for 'other' PKCS#7 content types.
-rw-r--r--CHANGES6
-rw-r--r--crypto/asn1/p7_lib.c12
-rw-r--r--crypto/pkcs7/pkcs7.h3
3 files changed, 16 insertions, 5 deletions
diff --git a/CHANGES b/CHANGES
index 278c98279c..e0120ae153 100644
--- a/CHANGES
+++ b/CHANGES
@@ -4,6 +4,12 @@
Changes between 0.9.5a and 0.9.6 [xx XXX 2000]
+ *) Unrecognized PKCS#7 content types are now handled via a
+ catch all ASN1_TYPE structure. This allows unsupported
+ types to be stored as a "blob" and an application can
+ encode and decode it manually.
+ [Steve Henson]
+
*) Fix various signed/unsigned issues to make a_strex,c
compile under VC++.
[Oscar Jacobsson <oscar.jacobsson@celocom.com>]
diff --git a/crypto/asn1/p7_lib.c b/crypto/asn1/p7_lib.c
index 76cb675497..b1196ef581 100644
--- a/crypto/asn1/p7_lib.c
+++ b/crypto/asn1/p7_lib.c
@@ -104,6 +104,7 @@ int i2d_PKCS7(PKCS7 *a, unsigned char **pp)
M_ASN1_I2D_len(a->d.encrypted,i2d_PKCS7_ENCRYPT);
break;
default:
+ M_ASN1_I2D_len(a->d.other,i2d_ASN1_TYPE);
break;
}
}
@@ -138,6 +139,7 @@ int i2d_PKCS7(PKCS7 *a, unsigned char **pp)
M_ASN1_I2D_put(a->d.encrypted,i2d_PKCS7_ENCRYPT);
break;
default:
+ M_ASN1_I2D_put(a->d.other,i2d_ASN1_TYPE);
break;
}
M_ASN1_I2D_INF_seq_end();
@@ -189,6 +191,7 @@ int i2d_PKCS7(PKCS7 *a, unsigned char **pp)
M_ASN1_I2D_len(a->d.encrypted,i2d_PKCS7_ENCRYPT);
break;
default:
+ M_ASN1_I2D_len(a->d.other,i2d_ASN1_TYPE);
break;
}
/* Work out explicit tag content size */
@@ -228,6 +231,7 @@ int i2d_PKCS7(PKCS7 *a, unsigned char **pp)
M_ASN1_I2D_put(a->d.encrypted,i2d_PKCS7_ENCRYPT);
break;
default:
+ M_ASN1_I2D_put(a->d.other,i2d_ASN1_TYPE);
break;
}
}
@@ -298,10 +302,8 @@ PKCS7 *d2i_PKCS7(PKCS7 **a, unsigned char **pp, long length)
M_ASN1_D2I_get(ret->d.encrypted,d2i_PKCS7_ENCRYPT);
break;
default:
- c.error=ASN1_R_BAD_PKCS7_TYPE;
- c.line=__LINE__;
- goto err;
- /* break; */
+ M_ASN1_D2I_get(ret->d.other,d2i_ASN1_TYPE);
+ break;
}
if (Tinf == (1|V_ASN1_CONSTRUCTED))
{
@@ -378,7 +380,7 @@ void PKCS7_content_free(PKCS7 *a)
PKCS7_ENCRYPT_free(a->d.encrypted);
break;
default:
- /* MEMORY LEAK */
+ ASN1_TYPE_free(a->d.other);
break;
}
}
diff --git a/crypto/pkcs7/pkcs7.h b/crypto/pkcs7/pkcs7.h
index f3f85f57af..ac46c8dd15 100644
--- a/crypto/pkcs7/pkcs7.h
+++ b/crypto/pkcs7/pkcs7.h
@@ -210,6 +210,9 @@ typedef struct pkcs7_st
/* NID_pkcs7_encrypted */
PKCS7_ENCRYPT *encrypted;
+
+ /* Anything else */
+ ASN1_TYPE *other;
} d;
} PKCS7;