Code to set CRLDistributionPoints in certificates.
git-svn-id: svn://svn.h5l.se/heimdal/trunk/heimdal@20102 ec53bebd-3082-4978-b11e-865c3cabbd6b
This commit is contained in:
		@@ -51,6 +51,7 @@ struct hx509_ca_tbs {
 | 
				
			|||||||
    time_t notBefore;
 | 
					    time_t notBefore;
 | 
				
			||||||
    time_t notAfter;
 | 
					    time_t notAfter;
 | 
				
			||||||
    int pathLenConstraint; /* both for CA and Proxy */
 | 
					    int pathLenConstraint; /* both for CA and Proxy */
 | 
				
			||||||
 | 
					    CRLDistributionPoints crldp;
 | 
				
			||||||
};
 | 
					};
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
@@ -66,6 +67,8 @@ hx509_ca_tbs_init(hx509_context context, hx509_ca_tbs *tbs)
 | 
				
			|||||||
    (*tbs)->eku.len = 0;
 | 
					    (*tbs)->eku.len = 0;
 | 
				
			||||||
    (*tbs)->eku.val = NULL;
 | 
					    (*tbs)->eku.val = NULL;
 | 
				
			||||||
    (*tbs)->pathLenConstraint = 0;
 | 
					    (*tbs)->pathLenConstraint = 0;
 | 
				
			||||||
 | 
					    (*tbs)->crldp.len = 0;
 | 
				
			||||||
 | 
					    (*tbs)->crldp.val = NULL;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
@@ -80,6 +83,7 @@ hx509_ca_tbs_free(hx509_ca_tbs *tbs)
 | 
				
			|||||||
    free_GeneralNames(&(*tbs)->san);
 | 
					    free_GeneralNames(&(*tbs)->san);
 | 
				
			||||||
    free_ExtKeyUsage(&(*tbs)->eku);
 | 
					    free_ExtKeyUsage(&(*tbs)->eku);
 | 
				
			||||||
    der_free_heim_integer(&(*tbs)->serial);
 | 
					    der_free_heim_integer(&(*tbs)->serial);
 | 
				
			||||||
 | 
					    free_CRLDistributionPoints(&(*tbs)->crldp);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    hx509_name_free(&(*tbs)->subject);
 | 
					    hx509_name_free(&(*tbs)->subject);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
@@ -272,6 +276,73 @@ hx509_ca_tbs_add_eku(hx509_context context,
 | 
				
			|||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int
 | 
				
			||||||
 | 
					hx509_ca_tbs_add_crl_dp_uri(hx509_context context,
 | 
				
			||||||
 | 
								    hx509_ca_tbs tbs,
 | 
				
			||||||
 | 
								    const char *uri,
 | 
				
			||||||
 | 
								    hx509_name issuername)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
					    GeneralNames crlissuer;
 | 
				
			||||||
 | 
					    DistributionPoint dp;
 | 
				
			||||||
 | 
					    DistributionPointName name;
 | 
				
			||||||
 | 
					    int ret;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    memset(&dp, 0, sizeof(dp));
 | 
				
			||||||
 | 
					    memset(&name, 0, sizeof(name));
 | 
				
			||||||
 | 
					    memset(&crlissuer, 0, sizeof(crlissuer));
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    {
 | 
				
			||||||
 | 
						GeneralName gn;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gn.element = choice_GeneralName_uniformResourceIdentifier;
 | 
				
			||||||
 | 
						gn.u.uniformResourceIdentifier = rk_UNCONST(uri);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						name.element = choice_DistributionPointName_fullName;
 | 
				
			||||||
 | 
						ret = add_GeneralNames(&name.u.fullName, &gn);
 | 
				
			||||||
 | 
						if (ret) {
 | 
				
			||||||
 | 
						    hx509_set_error_string(context, 0, ret, "out of memory");
 | 
				
			||||||
 | 
						    goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					    dp.distributionPoint = &name;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (issuername) {
 | 
				
			||||||
 | 
						GeneralName gn;
 | 
				
			||||||
 | 
						Name n;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gn.element = choice_GeneralName_directoryName;
 | 
				
			||||||
 | 
						ret = hx509_name_to_Name(issuername, &n);
 | 
				
			||||||
 | 
						if (ret) {
 | 
				
			||||||
 | 
						    hx509_set_error_string(context, 0, ret, "out of memory");
 | 
				
			||||||
 | 
						    goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						gn.u.directoryName.element = n.element;
 | 
				
			||||||
 | 
						gn.u.directoryName.u.rdnSequence = n.u.rdnSequence;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ret = add_GeneralNames(&crlissuer, &gn);
 | 
				
			||||||
 | 
						free_Name(&n);
 | 
				
			||||||
 | 
						if (ret) {
 | 
				
			||||||
 | 
						    hx509_set_error_string(context, 0, ret, "out of memory");
 | 
				
			||||||
 | 
						    goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						dp.cRLIssuer = &crlissuer;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    ret = add_CRLDistributionPoints(&tbs->crldp, &dp);
 | 
				
			||||||
 | 
					    if (ret) {
 | 
				
			||||||
 | 
						hx509_set_error_string(context, 0, ret, "out of memory");
 | 
				
			||||||
 | 
						goto out;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					out:
 | 
				
			||||||
 | 
					    free_GeneralNames(&crlissuer);
 | 
				
			||||||
 | 
					    free_DistributionPointName(&name);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    return ret;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
int
 | 
					int
 | 
				
			||||||
hx509_ca_tbs_add_san_otherName(hx509_context context,
 | 
					hx509_ca_tbs_add_san_otherName(hx509_context context,
 | 
				
			||||||
			       hx509_ca_tbs tbs,
 | 
								       hx509_ca_tbs tbs,
 | 
				
			||||||
@@ -871,6 +942,23 @@ ca_sign(hx509_context context,
 | 
				
			|||||||
	    goto out;
 | 
						    goto out;
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    if (tbs->crldp.len) {
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
						ASN1_MALLOC_ENCODE(CRLDistributionPoints, data.data, data.length,
 | 
				
			||||||
 | 
								   &tbs->crldp, &size, ret);
 | 
				
			||||||
 | 
						if (ret) {
 | 
				
			||||||
 | 
						    hx509_set_error_string(context, 0, ret, "Out of memory");
 | 
				
			||||||
 | 
						    goto out;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						if (size != data.length)
 | 
				
			||||||
 | 
						    _hx509_abort("internal ASN.1 encoder error");
 | 
				
			||||||
 | 
						ret = add_extension(context, tbsc, FALSE,
 | 
				
			||||||
 | 
								    oid_id_x509_ce_cRLDistributionPoints(),
 | 
				
			||||||
 | 
								    &data);
 | 
				
			||||||
 | 
						free(data.data);
 | 
				
			||||||
 | 
						if (ret)
 | 
				
			||||||
 | 
						    goto out;
 | 
				
			||||||
 | 
					    }
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    ASN1_MALLOC_ENCODE(TBSCertificate, data.data, data.length,tbsc, &size, ret);
 | 
					    ASN1_MALLOC_ENCODE(TBSCertificate, data.data, data.length,tbsc, &size, ret);
 | 
				
			||||||
    if (ret) {
 | 
					    if (ret) {
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user