summaryrefslogtreecommitdiffstats
path: root/crypto/pkcs12/p12_sbag.c
diff options
context:
space:
mode:
Diffstat (limited to 'crypto/pkcs12/p12_sbag.c')
-rw-r--r--crypto/pkcs12/p12_sbag.c66
1 files changed, 65 insertions, 1 deletions
diff --git a/crypto/pkcs12/p12_sbag.c b/crypto/pkcs12/p12_sbag.c
index ccb9acb17e..3da437f7ea 100644
--- a/crypto/pkcs12/p12_sbag.c
+++ b/crypto/pkcs12/p12_sbag.c
@@ -1,5 +1,5 @@
/*
- * Copyright 1999-2018 The OpenSSL Project Authors. All Rights Reserved.
+ * Copyright 1999-2020 The OpenSSL Project Authors. All Rights Reserved.
*
* Licensed under the Apache License 2.0 (the "License"). You may not use
* this file except in compliance with the License. You can obtain a copy
@@ -71,6 +71,16 @@ int PKCS12_SAFEBAG_get_bag_nid(const PKCS12_SAFEBAG *bag)
return OBJ_obj2nid(bag->value.bag->type);
}
+const ASN1_OBJECT *PKCS12_SAFEBAG_get0_bag_type(const PKCS12_SAFEBAG *bag)
+{
+ return bag->value.bag->type;
+}
+
+const ASN1_TYPE *PKCS12_SAFEBAG_get0_bag_obj(const PKCS12_SAFEBAG *bag)
+{
+ return bag->value.bag->value.other;
+}
+
X509 *PKCS12_SAFEBAG_get1_cert(const PKCS12_SAFEBAG *bag)
{
if (PKCS12_SAFEBAG_get_nid(bag) != NID_certBag)
@@ -103,6 +113,60 @@ PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_crl(X509_CRL *crl)
NID_x509Crl, NID_crlBag);
}
+PKCS12_SAFEBAG *PKCS12_SAFEBAG_create_secret(int type, int vtype, const unsigned char *value, int len)
+{
+ PKCS12_BAGS *bag;
+ PKCS12_SAFEBAG *safebag;
+
+ if ((bag = PKCS12_BAGS_new()) == NULL) {
+ PKCS12err(0, ERR_R_MALLOC_FAILURE);
+ return NULL;
+ }
+ bag->type = OBJ_nid2obj(type);
+
+ switch(vtype) {
+ case V_ASN1_OCTET_STRING:
+ {
+ ASN1_OCTET_STRING *strtmp = ASN1_OCTET_STRING_new();
+
+ if (strtmp == NULL) {
+ PKCS12err(0, ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ /* Pack data into an octet string */
+ if (!ASN1_OCTET_STRING_set(strtmp, value, len)) {
+ ASN1_OCTET_STRING_free(strtmp);
+ PKCS12err(0, PKCS12_R_ENCODE_ERROR);
+ goto err;
+ }
+ bag->value.other = ASN1_TYPE_new();
+ if (bag->value.other == NULL) {
+ ASN1_OCTET_STRING_free(strtmp);
+ PKCS12err(0, ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ ASN1_TYPE_set(bag->value.other, vtype, strtmp);
+ }
+ break;
+
+ default:
+ PKCS12err(0, PKCS12_R_INVALID_TYPE);
+ goto err;
+ }
+
+ if ((safebag = PKCS12_SAFEBAG_new()) == NULL) {
+ PKCS12err(0, ERR_R_MALLOC_FAILURE);
+ goto err;
+ }
+ safebag->value.bag = bag;
+ safebag->type = OBJ_nid2obj(NID_secretBag);
+ return safebag;
+
+ err:
+ PKCS12_BAGS_free(bag);
+ return NULL;
+}
+
/* Turn PKCS8 object into a keybag */
PKCS12_SAFEBAG *PKCS12_SAFEBAG_create0_p8inf(PKCS8_PRIV_KEY_INFO *p8)