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); }
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; }
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; }
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; }
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; }