Пример #1
0
PKCS12_SAFEBAG *
PKCS12_item_pack_safebag(void *obj, const ASN1_ITEM *it, int nid1, int nid2)
{
	PKCS12_BAGS *bag;
	PKCS12_SAFEBAG *safebag;

	if (!(bag = PKCS12_BAGS_new())) {
		PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG,
		    ERR_R_MALLOC_FAILURE);
		return NULL;
	}
	bag->type = OBJ_nid2obj(nid1);
	if (!ASN1_item_pack(obj, it, &bag->value.octet)) {
		PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG,
		    ERR_R_MALLOC_FAILURE);
		PKCS12_BAGS_free(bag);
		return NULL;
	}
	if (!(safebag = PKCS12_SAFEBAG_new())) {
		PKCS12err(PKCS12_F_PKCS12_ITEM_PACK_SAFEBAG,
		    ERR_R_MALLOC_FAILURE);
		PKCS12_BAGS_free(bag);
		return NULL;
	}
	safebag->value.bag = bag;
	safebag->type = OBJ_nid2obj(nid2);
	return safebag;
}
void PKCS12_SAFEBAG_free (PKCS12_SAFEBAG *a)
{
	if (a == NULL) return;
	switch (OBJ_obj2nid(a->type)) {

		case NID_keyBag:
			PKCS8_PRIV_KEY_INFO_free (a->value.keybag);
		break;

		case NID_pkcs8ShroudedKeyBag:
			X509_SIG_free (a->value.shkeybag);
		break;

		case NID_certBag:
		case NID_crlBag:
		case NID_secretBag:
			PKCS12_BAGS_free (a->value.bag);
		break;

		default:
			ASN1_TYPE_free (a->value.other);
		break;
	}

	ASN1_OBJECT_free (a->type);
	sk_X509_ATTRIBUTE_pop_free (a->attrib, X509_ATTRIBUTE_free);
	OPENSSL_free (a);
}