// Funkcja umieszcza w ContentInfo struktur�SignedData. Jeeli // w ContentInfo istniay ju jakie dane, zostan zwolnione, // a na ich miejsce umieszczona podana strukturka // Wykonywana jest kopia struktury SignedData long ContentInfo_set_SignedData(ContentInfo_t* content, SignedData_t* sigData) { long OID_id_signedData[] = {OID_CMS_ID_SIGNED_DATA_LONG}; long ret; if ((content == NULL) || (sigData == NULL)) return ERR_WRONG_ARGUMENT; // wyzeruj strukture ContentInfo asn_DEF_ContentInfo.free_struct( &asn_DEF_ContentInfo, content, 1); memset(content, 0, sizeof(ContentInfo_t)); // ustaw identyfikator OBJECT_IDENTIFIER_set_arcs( &(content->contentType), OID_id_signedData, sizeof(*OID_id_signedData), sizeof(OID_id_signedData)/sizeof(*OID_id_signedData)); // umiesc dane ret = ANY_fromType(&content->content, &asn_DEF_SignedData, sigData); if ( ret ) return ret; return 0; }
// Umieszczenie danych zaszyfrowanych i informacji o algorytmie // szyfrujacym w strukturze // WYKONYWANE SA KOPIE iv oraz data long EnvelopedData_set_EncryptedData(EnvelopedData_t *envData,GenBuf_t *iv,GenBuf_t *data,bmd_encryption_params_t *options) { long OID_id_data[] = {OID_CMS_ID_DATA_LONG}; /*long OID_id_DES_CBC[] = {1,3,14,3,2,7};*/ long OID_id_DES_EDE3_CBC[] = {1,2,840,113549,3,7}; long *oid; long oidsize; long err = 0; OCTET_STRING_t *oiv = NULL; // set data OID err = OBJECT_IDENTIFIER_set_arcs(&(envData->encryptedContentInfo.contentType),OID_id_data, sizeof(OID_id_data[0]), sizeof(OID_id_data)/sizeof(OID_id_data[0])); if ( err ) return err; // set Algorithm OID if ( options->encryption_algo == BMD_CRYPT_ALGO_DES3 ) { oid = OID_id_DES_EDE3_CBC; oidsize = sizeof(OID_id_DES_EDE3_CBC)/sizeof(OID_id_DES_EDE3_CBC[0]); } else return BMD_ERR_UNIMPLEMENTED; err = AlgorithmIdentifier_set_OID(&(envData->encryptedContentInfo.contentEncryptionAlgorithm),oid, oidsize); if ( err ) return err; // set Algorithm IV oiv = mallocStructure(sizeof(OCTET_STRING_t)); OCTET_STRING_fromBuf(oiv,(char *)iv->buf, iv->size); envData->encryptedContentInfo.contentEncryptionAlgorithm.parameters = mallocStructure(sizeof(ANY_t)); err = ANY_fromType(envData->encryptedContentInfo.contentEncryptionAlgorithm.parameters, &asn_DEF_OCTET_STRING, oiv); if ( err ) return ERR_OPERATION_FAILED; asn_DEF_OCTET_STRING.free_struct(&asn_DEF_OCTET_STRING,oiv, 0); if( options->encryption_type==BMD_CMS_ENV_INTERNAL ) { // set Encrypted Data envData->encryptedContentInfo.encryptedContent = mallocStructure(sizeof(EncryptedContent_t)); OCTET_STRING_fromBuf(envData->encryptedContentInfo.encryptedContent,(char *)data->buf, data->size); } return err; }
// Funkcja umieszcza w ContentInfo struktur�EnvelopedData. Jeeli // w ContentInfo istniay ju jakie dane, zostan zwolnione, // a na ich miejsce umieszczona podana strukturka // Wykonywana jest kopia struktury EnvelopedData long ContentInfo_set_EnvelopedData(ContentInfo_t* content, EnvelopedData_t* envData) { long OID_id_envelopedData[] = {OID_CMS_ID_ENVELOPED_DATA_LONG}; long err = 0; if ((content == NULL) || (envData == NULL)) return ERR_WRONG_ARGUMENT; // wyzeruj strukture ContentInfo asn_DEF_ContentInfo.free_struct( &asn_DEF_ContentInfo, content, 1); memset(content, 0, sizeof(ContentInfo_t)); // ustaw identyfikator OBJECT_IDENTIFIER_set_arcs( &(content->contentType), OID_id_envelopedData, sizeof(*OID_id_envelopedData), sizeof(OID_id_envelopedData)/sizeof(*OID_id_envelopedData)); // umiesc dane err = ANY_fromType(&content->content, &asn_DEF_EnvelopedData, envData); if ( err ) return err; return err; }
ANY_t * ANY_new_fromType(asn_TYPE_descriptor_t *td, void *sptr) { ANY_t tmp; ANY_t *st; if(!td || !sptr) { errno = EINVAL; return 0; } memset(&tmp, 0, sizeof(tmp)); if(ANY_fromType(&tmp, td, sptr)) return 0; st = (ANY_t *)CALLOC(1, sizeof(ANY_t)); if(st) { *st = tmp; return st; } else { FREEMEM(tmp.buf); return 0; } }