Example #1
0
static int
certBag_parser(hx509_context context,
	       struct hx509_collector *c,
	       const void *data, size_t length,
	       const PKCS12_Attributes *attrs)
{
    heim_octet_string os;
    hx509_cert cert;
    PKCS12_CertBag cb;
    int ret;

    ret = decode_PKCS12_CertBag(data, length, &cb, NULL);
    if (ret)
	return ret;

    if (der_heim_oid_cmp(&asn1_oid_id_pkcs_9_at_certTypes_x509, &cb.certType)) {
	free_PKCS12_CertBag(&cb);
	return 0;
    }

    ret = decode_PKCS12_OctetString(cb.certValue.data,
				    cb.certValue.length,
				    &os,
				    NULL);
    free_PKCS12_CertBag(&cb);
    if (ret)
	return ret;

    ret = hx509_cert_init_data(context, os.data, os.length, &cert);
    der_free_octet_string(&os);
    if (ret)
	return ret;

    ret = _hx509_collector_certs_add(context, c, cert);
    if (ret) {
	hx509_cert_free(cert);
	return ret;
    }

    {
	const PKCS12_Attribute *attr;
	const heim_oid *oids[] = {
	    &asn1_oid_id_pkcs_9_at_localKeyId, &asn1_oid_id_pkcs_9_at_friendlyName
	};
	size_t i;

	for  (i = 0; i < sizeof(oids)/sizeof(oids[0]); i++) {
	    const heim_oid *oid = oids[i];
	    attr = find_attribute(attrs, oid);
	    if (attr)
		_hx509_set_cert_attribute(context, cert, oid,
					  &attr->attrValues);
	}
    }

    hx509_cert_free(cert);

    return 0;
}
Example #2
0
static int
collect_cert(hx509_context context,
             struct p11_module *p, struct p11_slot *slot,
             CK_SESSION_HANDLE session,
             CK_OBJECT_HANDLE object,
             void *ptr, CK_ATTRIBUTE *query, int num_query)
{
    struct hx509_collector *collector = ptr;
    hx509_cert cert;
    int ret;

    if ((CK_LONG)query[0].ulValueLen == -1 ||
            (CK_LONG)query[1].ulValueLen == -1)
    {
        return 0;
    }

    ret = hx509_cert_init_data(context, query[1].pValue,
                               query[1].ulValueLen, &cert);
    if (ret)
        return ret;

    if (p->ref == 0)
        _hx509_abort("pkcs11 ref == 0 on alloc");
    p->ref++;
    if (p->ref == UINT_MAX)
        _hx509_abort("pkcs11 ref to high");

    _hx509_cert_set_release(cert, p11_cert_release, p);

    {
        heim_octet_string data;

        data.data = query[0].pValue;
        data.length = query[0].ulValueLen;

        _hx509_set_cert_attribute(context,
                                  cert,
                                  oid_id_pkcs_9_at_localKeyId(),
                                  &data);
    }

    if ((CK_LONG)query[2].ulValueLen != -1) {
        char *str;

        asprintf(&str, "%.*s",
                 (int)query[2].ulValueLen, (char *)query[2].pValue);
        if (str) {
            hx509_cert_set_friendly_name(cert, str);
            free(str);
        }
    }

    ret = _hx509_collector_certs_add(context, collector, cert);
    hx509_cert_free(cert);

    return ret;
}