* STACK_OF(ASN1_TYPE) *set; ASN1_TYPE *single; } value; } X509_ATTRIBUTE; * this needs some extra thought because the CHOICE type is merged with the * main structure and because the value can be anything at all we *must* try * the SET OF first because the ASN1_ANY type will swallow anything including * the whole SET OF structure. */ ASN1_CHOICE(X509_ATTRIBUTE_SET) = { ASN1_SET_OF(X509_ATTRIBUTE, value.set, ASN1_ANY), ASN1_SIMPLE(X509_ATTRIBUTE, value.single, ASN1_ANY) } ASN1_CHOICE_END_selector(X509_ATTRIBUTE, X509_ATTRIBUTE_SET, single) ASN1_SEQUENCE(X509_ATTRIBUTE) = { ASN1_SIMPLE(X509_ATTRIBUTE, object, ASN1_OBJECT), /* CHOICE type merged with parent */ ASN1_EX_COMBINE(0, 0, X509_ATTRIBUTE_SET) } ASN1_SEQUENCE_END(X509_ATTRIBUTE) IMPLEMENT_ASN1_FUNCTIONS(X509_ATTRIBUTE) IMPLEMENT_ASN1_DUP_FUNCTION(X509_ATTRIBUTE) X509_ATTRIBUTE *X509_ATTRIBUTE_create(int nid, int atrtype, void *value) { X509_ATTRIBUTE *ret = NULL; ASN1_TYPE *val = NULL; if ((ret = X509_ATTRIBUTE_new()) == NULL) return (NULL); /* TODO(fork): const correctness. */ ret->object = (ASN1_OBJECT *)OBJ_nid2obj(nid); ret->single = 0;
IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPrivateKey, DSAPrivateKey) ASN1_SEQUENCE_cb(DSAparams, dsa_cb) = { ASN1_SIMPLE(DSA, p, BIGNUM), ASN1_SIMPLE(DSA, q, BIGNUM), ASN1_SIMPLE(DSA, g, BIGNUM), } ASN1_SEQUENCE_END_cb(DSA, DSAparams) IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAparams, DSAparams) /* DSA public key is a bit trickier... its effectively a CHOICE type * decided by a field called write_params which can either write out * just the public key as an INTEGER or the parameters and public key * in a SEQUENCE */ ASN1_SEQUENCE(dsa_pub_internal) = { ASN1_SIMPLE(DSA, pub_key, BIGNUM), ASN1_SIMPLE(DSA, p, BIGNUM), ASN1_SIMPLE(DSA, q, BIGNUM), ASN1_SIMPLE(DSA, g, BIGNUM) } ASN1_SEQUENCE_END_name(DSA, dsa_pub_internal) ASN1_CHOICE_cb(DSAPublicKey, dsa_cb) = { ASN1_SIMPLE(DSA, pub_key, BIGNUM), ASN1_EX_COMBINE(0, 0, dsa_pub_internal) } ASN1_CHOICE_END_cb(DSA, DSAPublicKey, write_params) IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname(DSA, DSAPublicKey, DSAPublicKey)
ASN1_SIMPLE (DSA, p, BIGNUM), ASN1_SIMPLE (DSA, q, BIGNUM), ASN1_SIMPLE (DSA, g, BIGNUM),} ASN1_SEQUENCE_END_cb (DSA, DSAparams) IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname (DSA, DSAparams, DSAparams) /* DSA public key is a bit trickier... its effectively a CHOICE type * decided by a field called write_params which can either write out * just the public key as an INTEGER or the parameters and public key * in a SEQUENCE */ ASN1_SEQUENCE (dsa_pub_internal) = { ASN1_SIMPLE (DSA, pub_key, BIGNUM), ASN1_SIMPLE (DSA, p, BIGNUM), ASN1_SIMPLE (DSA, q, BIGNUM), ASN1_SIMPLE (DSA, g, BIGNUM)} ASN1_SEQUENCE_END_name (DSA, dsa_pub_internal) ASN1_CHOICE_cb (DSAPublicKey, dsa_cb) = { ASN1_SIMPLE (DSA, pub_key, BIGNUM), ASN1_EX_COMBINE (0, 0, dsa_pub_internal)} ASN1_CHOICE_END_cb (DSA, DSAPublicKey, write_params) IMPLEMENT_ASN1_ENCODE_FUNCTIONS_const_fname (DSA, DSAPublicKey, DSAPublicKey) DSA *DSAparams_dup (DSA * dsa) { return ASN1_item_dup (ASN1_ITEM_rptr (DSAparams), dsa); } int DSA_sign (int type, const unsigned char *dgst, int dlen, unsigned char *sig, unsigned int *siglen, DSA * dsa) { DSA_SIG *s; RAND_seed (dgst, dlen); s = DSA_do_sign (dgst, dlen, dsa); if (s == NULL)