/*
- * Copyright 1999-2016 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
#include <openssl/pkcs12.h>
#include "p12_local.h"
+DEFINE_STACK_OF(PKCS7)
+DEFINE_STACK_OF(PKCS12_SAFEBAG)
+
static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags,
PKCS12_SAFEBAG *bag);
if (!mac_iter)
mac_iter = 1;
- if (!pkey && !cert && !ca) {
+ if (pkey == NULL && cert == NULL && ca == NULL) {
PKCS12err(PKCS12_F_PKCS12_CREATE, PKCS12_R_INVALID_NULL_ARGUMENT);
return NULL;
}
if (pkey && cert) {
if (!X509_check_private_key(cert, pkey))
return NULL;
- X509_digest(cert, EVP_sha1(), keyid, &keyidlen);
+ if (!X509_digest(cert, EVP_sha1(), keyid, &keyidlen))
+ return NULL;
}
if (cert) {
p12 = PKCS12_add_safes(safes, 0);
- if (!p12)
+ if (p12 == NULL)
goto err;
sk_PKCS7_pop_free(safes, PKCS7_free);
}
+PKCS12_SAFEBAG *PKCS12_add_secret(STACK_OF(PKCS12_SAFEBAG) **pbags,
+ int nid_type, const unsigned char *value, int len)
+{
+ PKCS12_SAFEBAG *bag = NULL;
+
+ /* Add secret, storing the value as an octet string */
+ if ((bag = PKCS12_SAFEBAG_create_secret(nid_type, V_ASN1_OCTET_STRING, value, len)) == NULL)
+ goto err;
+
+ if (!pkcs12_add_bag(pbags, bag))
+ goto err;
+
+ return bag;
+ err:
+ PKCS12_SAFEBAG_free(bag);
+ return NULL;
+}
+
int PKCS12_add_safe(STACK_OF(PKCS7) **psafes, STACK_OF(PKCS12_SAFEBAG) *bags,
int nid_safe, int iter, const char *pass)
{
PKCS7 *p7 = NULL;
int free_safes = 0;
- if (!*psafes) {
+ if (*psafes == NULL) {
*psafes = sk_PKCS7_new_null();
- if (!*psafes)
+ if (*psafes == NULL)
return 0;
free_safes = 1;
- } else
- free_safes = 0;
+ }
if (nid_safe == 0)
#ifdef OPENSSL_NO_RC2
p7 = PKCS12_pack_p7data(bags);
else
p7 = PKCS12_pack_p7encdata(nid_safe, pass, -1, NULL, 0, iter, bags);
- if (!p7)
+ if (p7 == NULL)
goto err;
if (!sk_PKCS7_push(*psafes, p7))
static int pkcs12_add_bag(STACK_OF(PKCS12_SAFEBAG) **pbags,
PKCS12_SAFEBAG *bag)
{
- int free_bags;
- if (!pbags)
+ int free_bags = 0;
+
+ if (pbags == NULL)
return 1;
- if (!*pbags) {
+ if (*pbags == NULL) {
*pbags = sk_PKCS12_SAFEBAG_new_null();
- if (!*pbags)
+ if (*pbags == NULL)
return 0;
free_bags = 1;
- } else
- free_bags = 0;
+ }
if (!sk_PKCS12_SAFEBAG_push(*pbags, bag)) {
if (free_bags) {
PKCS12 *PKCS12_add_safes(STACK_OF(PKCS7) *safes, int nid_p7)
{
PKCS12 *p12;
+
if (nid_p7 <= 0)
nid_p7 = NID_pkcs7_data;
p12 = PKCS12_init(nid_p7);
-
- if (!p12)
+ if (p12 == NULL)
return NULL;
if (!PKCS12_pack_authsafes(p12, safes)) {