Exemplo n.º 1
0
// 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);
}
Exemplo n.º 2
0
// 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;
}
Exemplo n.º 3
0
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);
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 7
0
// 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);
}
Exemplo n.º 8
0
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);
}