Support encoding of PKCS#7 "data" containers
This commit is contained in:
@@ -16,6 +16,7 @@
|
|||||||
#include "pkcs7_data.h"
|
#include "pkcs7_data.h"
|
||||||
|
|
||||||
#include <asn1/asn1.h>
|
#include <asn1/asn1.h>
|
||||||
|
#include <asn1/oid.h>
|
||||||
|
|
||||||
typedef struct private_pkcs7_data_t private_pkcs7_data_t;
|
typedef struct private_pkcs7_data_t private_pkcs7_data_t;
|
||||||
|
|
||||||
@@ -35,7 +36,7 @@ struct private_pkcs7_data_t {
|
|||||||
chunk_t content;
|
chunk_t content;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Encoded PKCS#7 signed-data
|
* Encoded PKCS#7 data
|
||||||
*/
|
*/
|
||||||
chunk_t encoding;
|
chunk_t encoding;
|
||||||
};
|
};
|
||||||
@@ -82,9 +83,9 @@ METHOD(container_t, destroy, void,
|
|||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* See header.
|
* Create an empty container
|
||||||
*/
|
*/
|
||||||
pkcs7_t *pkcs7_data_load(chunk_t encoding, chunk_t content)
|
static private_pkcs7_data_t* create_empty()
|
||||||
{
|
{
|
||||||
private_pkcs7_data_t *this;
|
private_pkcs7_data_t *this;
|
||||||
|
|
||||||
@@ -98,9 +99,56 @@ pkcs7_t *pkcs7_data_load(chunk_t encoding, chunk_t content)
|
|||||||
.destroy = _destroy,
|
.destroy = _destroy,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
.encoding = chunk_clone(encoding),
|
|
||||||
.content = chunk_clone(content),
|
|
||||||
);
|
);
|
||||||
|
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header.
|
||||||
|
*/
|
||||||
|
pkcs7_t *pkcs7_data_load(chunk_t encoding, chunk_t content)
|
||||||
|
{
|
||||||
|
private_pkcs7_data_t *this = create_empty();
|
||||||
|
|
||||||
|
this->encoding = chunk_clone(encoding);
|
||||||
|
this->content = chunk_clone(content);
|
||||||
|
|
||||||
return &this->public;
|
return &this->public;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* See header.
|
||||||
|
*/
|
||||||
|
pkcs7_t *pkcs7_data_gen(container_type_t type, va_list args)
|
||||||
|
{
|
||||||
|
private_pkcs7_data_t *this;
|
||||||
|
chunk_t blob = chunk_empty;
|
||||||
|
|
||||||
|
while (TRUE)
|
||||||
|
{
|
||||||
|
switch (va_arg(args, builder_part_t))
|
||||||
|
{
|
||||||
|
case BUILD_BLOB:
|
||||||
|
blob = va_arg(args, chunk_t);
|
||||||
|
continue;
|
||||||
|
case BUILD_END:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (blob.len)
|
||||||
|
{
|
||||||
|
this = create_empty();
|
||||||
|
|
||||||
|
this->content = asn1_wrap(ASN1_OCTET_STRING, "c", blob);
|
||||||
|
this->encoding = asn1_wrap(ASN1_SEQUENCE, "mm",
|
||||||
|
asn1_build_known_oid(OID_PKCS7_DATA),
|
||||||
|
asn1_wrap(ASN1_CONTEXT_C_0, "c", this->content));
|
||||||
|
return &this->public;
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|||||||
@@ -33,4 +33,14 @@
|
|||||||
*/
|
*/
|
||||||
pkcs7_t *pkcs7_data_load(chunk_t encoding, chunk_t content);
|
pkcs7_t *pkcs7_data_load(chunk_t encoding, chunk_t content);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Generate a PKCS#7 data container.
|
||||||
|
*
|
||||||
|
* The only accepted builder argument is BUILDER_BLOB.
|
||||||
|
*
|
||||||
|
* @param type container type, must be CONTAINER_PKCS7_DATA
|
||||||
|
* @param args builder_t arguments to use.
|
||||||
|
*/
|
||||||
|
pkcs7_t *pkcs7_data_gen(container_type_t type, va_list args);
|
||||||
|
|
||||||
#endif /** PKCS7_DATA_H_ @}*/
|
#endif /** PKCS7_DATA_H_ @}*/
|
||||||
|
|||||||
@@ -15,6 +15,7 @@
|
|||||||
|
|
||||||
#include "pkcs7_plugin.h"
|
#include "pkcs7_plugin.h"
|
||||||
#include "pkcs7_generic.h"
|
#include "pkcs7_generic.h"
|
||||||
|
#include "pkcs7_data.h"
|
||||||
|
|
||||||
#include <library.h>
|
#include <library.h>
|
||||||
|
|
||||||
@@ -43,6 +44,8 @@ METHOD(plugin_t, get_features, int,
|
|||||||
static plugin_feature_t f[] = {
|
static plugin_feature_t f[] = {
|
||||||
PLUGIN_REGISTER(CONTAINER_DECODE, pkcs7_generic_load, TRUE),
|
PLUGIN_REGISTER(CONTAINER_DECODE, pkcs7_generic_load, TRUE),
|
||||||
PLUGIN_PROVIDE(CONTAINER_DECODE, CONTAINER_PKCS7),
|
PLUGIN_PROVIDE(CONTAINER_DECODE, CONTAINER_PKCS7),
|
||||||
|
PLUGIN_REGISTER(CONTAINER_ENCODE, pkcs7_data_gen, TRUE),
|
||||||
|
PLUGIN_PROVIDE(CONTAINER_ENCODE, CONTAINER_PKCS7_DATA),
|
||||||
};
|
};
|
||||||
*features = f;
|
*features = f;
|
||||||
return countof(f);
|
return countof(f);
|
||||||
|
|||||||
Reference in New Issue
Block a user