// Set from OpenSSL representation void OSSLGOSTPrivateKey::setFromOSSL(const EVP_PKEY* pkey) { const EC_KEY* eckey = (const EC_KEY*) EVP_PKEY_get0((EVP_PKEY*) pkey); const BIGNUM* priv = EC_KEY_get0_private_key(eckey); setD(OSSL::bn2ByteString(priv)); ByteString inEC; int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)); inEC.resize(i2d_ASN1_OBJECT(OBJ_nid2obj(nid), NULL)); unsigned char *p = &inEC[0]; i2d_ASN1_OBJECT(OBJ_nid2obj(nid), &p); setEC(inEC); }
// Convert an OpenSSL NID to a ByteString ByteString OSSL::oid2ByteString(int nid) { ByteString rv; if (nid != NID_undef) { rv.resize(i2d_ASN1_OBJECT(OBJ_nid2obj(nid), NULL)); unsigned char *p = &rv[0]; i2d_ASN1_OBJECT(OBJ_nid2obj(nid), &p); } return rv; }
static int gost2001_param_encode(const EVP_PKEY *pkey, unsigned char **pder) { int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group (EVP_PKEY_get0((EVP_PKEY *)pkey))); return i2d_ASN1_OBJECT(OBJ_nid2obj(nid), pder); }
int i2d_X509_EXTENSION(X509_EXTENSION *a, unsigned char **pp) { int k=0; int r=0,ret=0; unsigned char **p=NULL; if (a == NULL) return(0); p=NULL; for (;;) { if (k) { r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); if (pp == NULL) return(r); p=pp; ASN1_put_object(p,1,ret,V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); } ret+=i2d_ASN1_OBJECT(a->object,p); if ((a->critical) || a->netscape_hack) ret+=i2d_ASN1_BOOLEAN(a->critical,p); ret+=i2d_ASN1_OCTET_STRING(a->value,p); if (k++) return(r); } }
/* sequence */ int i2d_X509_ATTRIBUTE(X509_ATTRIBUTE *a, unsigned char **pp) { int k=0; int r=0,ret=0; unsigned char **p=NULL; if (a == NULL) return(0); p=NULL; for (;;) { if (k) { r=ASN1_object_size(1,ret,V_ASN1_SEQUENCE); if (pp == NULL) return(r); p=pp; ASN1_put_object(p,1,ret,V_ASN1_SEQUENCE, V_ASN1_UNIVERSAL); } ret+=i2d_ASN1_OBJECT(a->object,p); if (a->set) ret+=i2d_ASN1_SET_OF_ASN1_TYPE(a->value.set,p,(i2d_func_t)i2d_ASN1_TYPE, V_ASN1_SET,V_ASN1_UNIVERSAL,IS_SET); else ret+=i2d_ASN1_TYPE(a->value.single,p); if (k++) return(r); } }
int i2d_GENERAL_NAME(GENERAL_NAME *a, unsigned char **pp) { unsigned char *p; int ret; ret = 0; /* Save the location of initial TAG */ if(pp) p = *pp; else p = NULL; /* GEN_DNAME needs special treatment because of EXPLICIT tag */ if(a->type == GEN_DIRNAME) { int v = 0; M_ASN1_I2D_len_EXP_opt(a->d.dirn, i2d_X509_NAME, 4, v); if(!p) return ret; M_ASN1_I2D_put_EXP_opt(a->d.dirn, i2d_X509_NAME, 4, v); *pp = p; return ret; } switch(a->type) { case GEN_X400: case GEN_EDIPARTY: ret = i2d_ASN1_TYPE(a->d.other, pp); break; case GEN_OTHERNAME: ret = i2d_OTHERNAME(a->d.otherName, pp); break; case GEN_EMAIL: case GEN_DNS: case GEN_URI: ret = i2d_ASN1_IA5STRING(a->d.ia5, pp); break; case GEN_IPADD: ret = i2d_ASN1_OCTET_STRING(a->d.ip, pp); break; case GEN_RID: ret = i2d_ASN1_OBJECT(a->d.rid, pp); break; } /* Replace TAG with IMPLICIT value */ if(p) *p = (*p & V_ASN1_CONSTRUCTED) | a->type; return ret; }
// Set from OpenSSL representation void OSSLGOSTPublicKey::setFromOSSL(const EVP_PKEY* pkey) { ByteString der; int len = i2d_PUBKEY((EVP_PKEY*) pkey, NULL); if (len != 37 + 64) { ERROR_MSG("bad GOST public key encoding length %d", len); return; } der.resize(len); unsigned char *p = &der[0]; i2d_PUBKEY((EVP_PKEY*) pkey, &p); // can check: der is prefix + 64 bytes setQ(der.substr(37)); ByteString inEC; const EC_KEY* eckey = (const EC_KEY*) EVP_PKEY_get0((EVP_PKEY*) pkey); int nid = EC_GROUP_get_curve_name(EC_KEY_get0_group(eckey)); inEC.resize(i2d_ASN1_OBJECT(OBJ_nid2obj(nid), NULL)); p = &inEC[0]; i2d_ASN1_OBJECT(OBJ_nid2obj(nid), &p); setEC(inEC); }
static int gost94_param_encode(const EVP_PKEY *pkey, unsigned char **pder) { int nid=gost94_nid_by_params(EVP_PKEY_get0((EVP_PKEY *)pkey)); return i2d_ASN1_OBJECT(OBJ_nid2obj(nid),pder); }