⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 ks_p12.c

📁 samba最新软件
💻 C
📖 第 1 页 / 共 2 页
字号:
    }    if (flags & HX509_CERTS_CREATE) {	ret = hx509_certs_init(context, "MEMORY:ks-file-create",			       0, lock, &p12->certs);	if (ret == 0)	    *data = p12;	goto out;    }    ret = _hx509_map_file(residue, &buf, &len, NULL);    if (ret) {	hx509_clear_error_string(context);	goto out;    }    ret = decode_PKCS12_PFX(buf, len, &pfx, NULL);    _hx509_unmap_file(buf, len);    if (ret) {	hx509_set_error_string(context, 0, ret,			       "Failed to decode the PFX in %s", residue);	goto out;    }    if (der_heim_oid_cmp(&pfx.authSafe.contentType, oid_id_pkcs7_data()) != 0) {	free_PKCS12_PFX(&pfx);	ret = EINVAL;	hx509_set_error_string(context, 0, ret,			       "PKCS PFX isn't a pkcs7-data container");	goto out;    }    if (pfx.authSafe.content == NULL) {	free_PKCS12_PFX(&pfx);	ret = EINVAL;	hx509_set_error_string(context, 0, ret,			       "PKCS PFX missing data");	goto out;    }    {	heim_octet_string asdata;	ret = decode_PKCS12_OctetString(pfx.authSafe.content->data,					pfx.authSafe.content->length,					&asdata,					NULL);	free_PKCS12_PFX(&pfx);	if (ret) {	    hx509_clear_error_string(context);	    goto out;	}	ret = decode_PKCS12_AuthenticatedSafe(asdata.data, 					      asdata.length,					      &as,					      NULL);	der_free_octet_string(&asdata);	if (ret) {	    hx509_clear_error_string(context);	    goto out;	}    }    for (i = 0; i < as.len; i++)	parse_pkcs12_type(context,			  c,			  &as.val[i].contentType,			  as.val[i].content->data,			  as.val[i].content->length,			  NULL);    free_PKCS12_AuthenticatedSafe(&as);    ret = _hx509_collector_collect_certs(context, c, &p12->certs);    if (ret == 0)	*data = p12;out:    _hx509_collector_free(c);    if (ret && p12) {	if (p12->fn)	    free(p12->fn);	if (p12->certs)	    hx509_certs_free(&p12->certs);	free(p12);    }    return ret;}static intaddBag(hx509_context context,       PKCS12_AuthenticatedSafe *as,       const heim_oid *oid,       void *data,       size_t length){    void *ptr;    int ret;    ptr = realloc(as->val, sizeof(as->val[0]) * (as->len + 1));    if (ptr == NULL) {	hx509_set_error_string(context, 0, ENOMEM, "out of memory");	return ENOMEM;    }    as->val = ptr;    ret = der_copy_oid(oid, &as->val[as->len].contentType);    if (ret) {	hx509_set_error_string(context, 0, ret, "out of memory");	return ret;    }        as->val[as->len].content = calloc(1, sizeof(*as->val[0].content));    if (as->val[as->len].content == NULL) {	der_free_oid(&as->val[as->len].contentType);	hx509_set_error_string(context, 0, ENOMEM, "malloc out of memory");	return ENOMEM;    }    as->val[as->len].content->data = data;    as->val[as->len].content->length = length;    as->len++;    return 0;}static intstore_func(hx509_context context, void *ctx, hx509_cert c){    PKCS12_AuthenticatedSafe *as = ctx;    PKCS12_OctetString os;    PKCS12_CertBag cb;    size_t size;    int ret;    memset(&os, 0, sizeof(os));    memset(&cb, 0, sizeof(cb));    os.data = NULL;    os.length = 0;    ret = hx509_cert_binary(context, c, &os);    if (ret)	return ret;    ASN1_MALLOC_ENCODE(PKCS12_OctetString,		       cb.certValue.data,cb.certValue.length,		       &os, &size, ret);    free(os.data);    if (ret)	goto out;    ret = der_copy_oid(oid_id_pkcs_9_at_certTypes_x509(), &cb.certType);    if (ret) {	free_PKCS12_CertBag(&cb);	goto out;    }    ASN1_MALLOC_ENCODE(PKCS12_CertBag, os.data, os.length,		       &cb, &size, ret);    free_PKCS12_CertBag(&cb);    if (ret)	goto out;    ret = addBag(context, as, oid_id_pkcs12_certBag(), os.data, os.length);    if (_hx509_cert_private_key_exportable(c)) {	hx509_private_key key = _hx509_cert_private_key(c);	PKCS8PrivateKeyInfo pki;	memset(&pki, 0, sizeof(pki));	ret = der_parse_hex_heim_integer("00", &pki.version);	if (ret)	    return ret;	ret = _hx509_private_key_oid(context, key, 				     &pki.privateKeyAlgorithm.algorithm);	if (ret) {	    free_PKCS8PrivateKeyInfo(&pki);	    return ret;	}	ret = _hx509_private_key_export(context,					_hx509_cert_private_key(c),					&pki.privateKey);	if (ret) {	    free_PKCS8PrivateKeyInfo(&pki);	    return ret;	}	/* set attribute, oid_id_pkcs_9_at_localKeyId() */	ASN1_MALLOC_ENCODE(PKCS8PrivateKeyInfo, os.data, os.length,			   &pki, &size, ret);	free_PKCS8PrivateKeyInfo(&pki);	if (ret)	    return ret;	ret = addBag(context, as, oid_id_pkcs12_keyBag(), os.data, os.length);	if (ret)	    return ret;    }out:    return ret;}static intp12_store(hx509_context context, 	  hx509_certs certs, void *data, int flags, hx509_lock lock){    struct ks_pkcs12 *p12 = data;    PKCS12_PFX pfx;    PKCS12_AuthenticatedSafe as;    PKCS12_OctetString asdata;    size_t size;    int ret;    memset(&as, 0, sizeof(as));    memset(&pfx, 0, sizeof(pfx));    ret = hx509_certs_iter(context, p12->certs, store_func, &as);    if (ret)	goto out;    ASN1_MALLOC_ENCODE(PKCS12_AuthenticatedSafe, asdata.data, asdata.length,		       &as, &size, ret);    free_PKCS12_AuthenticatedSafe(&as);    if (ret)	return ret;		           ret = der_parse_hex_heim_integer("03", &pfx.version);    if (ret) {	free(asdata.data);	goto out;    }    pfx.authSafe.content = calloc(1, sizeof(*pfx.authSafe.content));    ASN1_MALLOC_ENCODE(PKCS12_OctetString, 		       pfx.authSafe.content->data,		       pfx.authSafe.content->length,		       &asdata, &size, ret);    free(asdata.data);    if (ret)	goto out;    ret = der_copy_oid(oid_id_pkcs7_data(), &pfx.authSafe.contentType);    if (ret)	goto out;    ASN1_MALLOC_ENCODE(PKCS12_PFX, asdata.data, asdata.length,		       &pfx, &size, ret);    if (ret)	goto out;#if 0    const struct _hx509_password *pw;    pw = _hx509_lock_get_passwords(lock);    if (pw != NULL) {	pfx.macData = calloc(1, sizeof(*pfx.macData));	if (pfx.macData == NULL) {	    ret = ENOMEM;	    hx509_set_error_string(context, 0, ret, "malloc out of memory");	    return ret;	}	if (pfx.macData == NULL) {	    free(asdata.data);	    goto out;	}    }    ret = calculate_hash(&aspath, pw, pfx.macData);#endif    rk_dumpdata(p12->fn, asdata.data, asdata.length);    free(asdata.data);out:    free_PKCS12_AuthenticatedSafe(&as);    free_PKCS12_PFX(&pfx);    return ret;}static intp12_free(hx509_certs certs, void *data){    struct ks_pkcs12 *p12 = data;    hx509_certs_free(&p12->certs);    free(p12->fn);    free(p12);    return 0;}static int p12_add(hx509_context context, hx509_certs certs, void *data, hx509_cert c){    struct ks_pkcs12 *p12 = data;    return hx509_certs_add(context, p12->certs, c);}static int p12_iter_start(hx509_context context,	       hx509_certs certs,	       void *data,	       void **cursor){    struct ks_pkcs12 *p12 = data;    return hx509_certs_start_seq(context, p12->certs, cursor);}static intp12_iter(hx509_context context,	 hx509_certs certs,	 void *data,	 void *cursor,	 hx509_cert *cert){    struct ks_pkcs12 *p12 = data;    return hx509_certs_next_cert(context, p12->certs, cursor, cert);}static intp12_iter_end(hx509_context context,	     hx509_certs certs,	     void *data,	     void *cursor){    struct ks_pkcs12 *p12 = data;    return hx509_certs_end_seq(context, p12->certs, cursor);}static struct hx509_keyset_ops keyset_pkcs12 = {    "PKCS12",    0,    p12_init,    p12_store,    p12_free,    p12_add,    NULL,    p12_iter_start,    p12_iter,    p12_iter_end};void_hx509_ks_pkcs12_register(hx509_context context){    _hx509_ks_register(context, &keyset_pkcs12);}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -