Exemplo n.º 1
0
static void
_os_set (OCTET_STRING_t **pos, const void *s, gsize sSize)
{
	if (*pos)
		OCTET_STRING_fromBuf(*pos, s, sSize);
	else
		*pos = OCTET_STRING_new_fromBuf(&asn_DEF_OCTET_STRING, s, sSize);
}
Exemplo n.º 2
0
static PartialAttribute_t *make_partial_attribute(char *key, char *value) {
    PartialAttribute_t *pa = calloc(1, sizeof *pa);

    OCTET_STRING_fromString(&pa->type, key);
    ASN_SEQUENCE_ADD(&pa->vals,
        OCTET_STRING_new_fromBuf(&asn_DEF_AttributeValue, value, -1));

    return pa;
}
Exemplo n.º 3
0
static PartialAttribute_t *make_partial_attribute_from_file(char *key, char *filename) {
    PartialAttribute_t *pa = calloc(1, sizeof *pa);
    char buffer[4096];
    size_t buflen;

    FILE *f = fopen(filename, "rb");
    assert(f);
    buflen = fread(buffer, 1, sizeof buffer, f);
    fclose(f);

    OCTET_STRING_fromString(&pa->type, key);
    ASN_SEQUENCE_ADD(&pa->vals,
        OCTET_STRING_new_fromBuf(&asn_DEF_AttributeValue, buffer, buflen));

    return pa;
}
Exemplo n.º 4
0
static void
check_serialize() {
	LogLine_t ll;
	VariablePartSet_t *vps;
	VariablePart_t *vp;
	VisibleString_t *vpart;
	asn_enc_rval_t erval;
	int i;

	memset(&ll, 0, sizeof(ll));
	vps = calloc(1, sizeof(*vps));
	vp = calloc(1, sizeof(*vp));
	vpart = OCTET_STRING_new_fromBuf(&asn_DEF_VisibleString, "123", 3);

	vp->present = VariablePart_PR_vset;
	ASN_SET_ADD(&vp->choice.vset, vpart);
	vps->resolution.accept_as = accept_as_unknown;
	ASN_SEQUENCE_ADD(&vps->vparts, vp);
	ASN_SEQUENCE_ADD(&ll.varsets, vps);
	OCTET_STRING_fromBuf(&ll.line_digest, "zzz\007", 4);

	asn_fprint(stderr, &asn_DEF_LogLine, &ll);
	buf_size = 128;
	uint8_t scratch[buf_size];
	buf = scratch;
	erval = der_encode(&asn_DEF_LogLine, &ll, buf_fill, 0);
	assert(erval.encoded > 1);
	fprintf(stderr, "Encoded in %zd bytes\n", erval.encoded);
	fprintf(stderr, "\n");
	for(i = 0; i < buf_pos; i++) {
		fprintf(stderr, "%d ", buf[i]);
	}
	fprintf(stderr, "\n\n");
	assert(erval.encoded == sizeof(buf0));
	assert(memcmp(buf0, buf, sizeof(buf0)) == 0);
	ASN_STRUCT_FREE_CONTENTS_ONLY(asn_DEF_LogLine, &ll);
	return;
}
Exemplo n.º 5
0
Arquivo: dvcs.c Projeto: unizeto/bmd
long _create_CertEtcToken(CertEtcToken_PR flag, Certificate_t *certificate, CertEtcToken_t **cert_token)
{
	CertEtcToken_t *certTok=NULL;
	Certificate_t *cert=NULL;

	bmd_crypt_ctx_t *hash_context=NULL;
	GenBuf_t *der=NULL;
	GenBuf_t *hash=NULL;
	long ret_val=0;
	OCTET_STRING_t *octet_str=NULL;
	long status;
	CertificateSerialNumber_t *sn=NULL;
	Name_t *issuer=NULL;
	IssuerSerial_t *issuer_serial=NULL;
	GeneralNames_t *general_list=NULL;
	GeneralName_t *general_name=NULL;


	if(certificate == NULL)
		{ return -1; }
	if(cert_token == NULL)
		{ return -2; }
	if(*cert_token != NULL)
		{ return -3; }

	//wartosci niewymienione w nawiasie nie sa dopuszczalne w DVCSRequest
	if(flag != CertEtcToken_PR_certificate && flag != CertEtcToken_PR_esscertid && flag != CertEtcToken_PR_extension && flag != CertEtcToken_PR_oscpcertid)
		{ return -4; }

	//niezaimplementowane
	if(flag == CertEtcToken_PR_extension || flag == CertEtcToken_PR_oscpcertid)
		{ return -5; }

	certTok=(CertEtcToken_t*)calloc(1, sizeof(CertEtcToken_t));
	if(certTok == NULL)
		{ return -6; }

	//caly certyfikat wrzucany
	if(flag == CertEtcToken_PR_certificate)
	{
		certTok->present=CertEtcToken_PR_certificate;
		ret_val=asn_cloneContent(&asn_DEF_Certificate, (void *)certificate, (void **)&cert);
		if(ret_val != 0)
		{
			free(certTok);
			return -7;
		}
		certTok->choice.certificate=*cert;
		//niszczenie samego opakowania - zawartosc zostala przypisana
		free(cert); cert=NULL;
	}
	//hash z certyfikatu wrzucany (ESSCertId)
	else
	{
		if(flag == CertEtcToken_PR_esscertid)
		{
			certTok->present=CertEtcToken_PR_esscertid;

			status=asn1_encode(&asn_DEF_Certificate,certificate, NULL, &der);
			if( status != BMD_OK )
				return -8;

			//certyfikat zakodoany
			//liczenie hashu
			//liczenie skroutu z danych za pomoca SHA-1
			bmd_set_ctx_hash(&hash_context,BMD_HASH_ALGO_SHA1);
			bmd_hash_data(der, &hash_context, &hash, NULL);
			free_gen_buf(&der);
			bmd_ctx_destroy(&hash_context);

			//hash wyliczony
			/*Hash_t jest typedefem na OCTET_STRING_t*/
			octet_str=OCTET_STRING_new_fromBuf(&asn_DEF_OCTET_STRING, (const char*)hash->buf, hash->size);
			free_gen_buf(&hash);
			if(hash == NULL)
			{
				free(certTok);
				return -12;
			}
			//
			certTok->choice.esscertid.certHash=*octet_str;
			//niszczenie samego opakowania - zawartosc zostala przypisana
			free(octet_str); octet_str=NULL;

			/*!DONE issuerSerial*/

			//klonowanie seriala certyfikatu z Certificate_t
			ret_val=asn_cloneContent( &asn_DEF_CertificateSerialNumber, &(cert->tbsCertificate.serialNumber), (void **)&(sn));
			if(ret_val != 0)
			{
				asn_DEF_CertEtcToken.free_struct(&asn_DEF_CertEtcToken, certTok ,1);
				free(certTok);
				return -13;
			}

			ret_val=asn_cloneContent( &asn_DEF_Name, &(cert->tbsCertificate.issuer), (void **)&(issuer));
			if(ret_val != 0)
			{
				asn_DEF_CertEtcToken.free_struct(&asn_DEF_CertEtcToken, certTok ,1);
				free(certTok);
				asn_DEF_CertificateSerialNumber.free_struct(&asn_DEF_CertificateSerialNumber, sn, 1);
				free(sn); sn=NULL;
				return -14;
			}

			general_name=(GeneralName_t*)calloc(1, sizeof(GeneralName_t));
			if(general_name == NULL)
			{
				asn_DEF_CertEtcToken.free_struct(&asn_DEF_CertEtcToken, certTok ,1);
				free(certTok);
				asn_DEF_CertificateSerialNumber.free_struct(&asn_DEF_CertificateSerialNumber, sn, 1);
				free(sn); sn=NULL;
				asn_DEF_Name.free_struct(&asn_DEF_Name, issuer, 1);
				free(issuer); issuer=NULL;
				return -15;
			}

			general_name->present=GeneralName_PR_directoryName;
			general_name->choice.directoryName=*issuer;
			free(issuer); issuer=NULL; //opakowanie mozna zwolnic (bebechy przypisane wewnatrz general_name)

			general_list=(GeneralNames_t*)calloc(1, sizeof(GeneralNames_t));
			if(general_list == NULL)
			{
				asn_DEF_CertEtcToken.free_struct(&asn_DEF_CertEtcToken, certTok ,1);
				free(certTok);
				asn_DEF_CertificateSerialNumber.free_struct(&asn_DEF_CertificateSerialNumber, sn, 1);
				free(sn); sn=NULL;
				//opakowanie issuer zostalo zwolnione a bebechy odpowiednio przypisane do general_name
				asn_DEF_GeneralName.free_struct(&asn_DEF_GeneralName, general_name, 1);
				free(general_name); general_name=NULL;
				return -16;
			}

			//binduje wskaznik, wiec juz z general_name nic nie trzeba juz robic
			if( (asn_set_add((void*)&(general_list->list), (void*)general_name)) != 0 )
			{
				asn_DEF_CertEtcToken.free_struct(&asn_DEF_CertEtcToken, certTok ,1);
				free(certTok);
				asn_DEF_CertificateSerialNumber.free_struct(&asn_DEF_CertificateSerialNumber, sn, 1);
				free(sn); sn=NULL;
				asn_DEF_GeneralName.free_struct(&asn_DEF_GeneralName, general_name, 1);
				free(general_name); general_name=NULL;
				free(general_list); general_list=NULL;
				return -17;
			}

			issuer_serial=(IssuerSerial_t*)calloc(1, sizeof(IssuerSerial_t));
			if(issuer_serial == NULL)
			{
				asn_DEF_CertEtcToken.free_struct(&asn_DEF_CertEtcToken, certTok ,1);
				free(certTok);
				asn_DEF_CertificateSerialNumber.free_struct(&asn_DEF_CertificateSerialNumber, sn, 1);
				free(sn); sn=NULL;
				asn_DEF_GeneralNames.free_struct(&asn_DEF_GeneralNames, general_list, 1);
				free(general_list); general_list=NULL;
				return -18;
			}

			issuer_serial->issuer=*general_list;
			free(general_list); general_list=NULL; //opakowanie mozna zwolnic, bebechy odpowiendio przypisane

			issuer_serial->serial=*sn;
			free(sn); sn=NULL; //opakowanie mozna zwolnic, bebechy odpowiendio przypisane

			//binduje wskazniki
			certTok->choice.esscertid.issuerSerial=issuer_serial;

			/*!DONE issuerSerial*/
		}
	}

	*cert_token=certTok;
	return 0;
}