예제 #1
0
파일: public_key.go 프로젝트: qbit/client
func NewECDSAPublicKey(creationTime time.Time, pub *ecdsa.PublicKey) *PublicKey {
	pk := &PublicKey{
		CreationTime: creationTime,
		PubKeyAlgo:   PubKeyAlgoECDSA,
		PublicKey:    pub,
		ec:           new(ecdsaKey),
	}
	switch pub.Curve {
	case elliptic.P256():
		pk.ec.oid = oidCurveP256
	case elliptic.P384():
		pk.ec.oid = oidCurveP384
	case elliptic.P521():
		pk.ec.oid = oidCurveP521
	case brainpool.P256r1():
		pk.ec.oid = oidCurveP256r1
	case brainpool.P384r1():
		pk.ec.oid = oidCurveP384r1
	case brainpool.P512r1():
		pk.ec.oid = oidCurveP512r1
	}
	pk.ec.p.bytes = elliptic.Marshal(pub.Curve, pub.X, pub.Y)
	pk.ec.p.bitLength = uint16(8 * len(pk.ec.p.bytes))

	pk.setFingerPrintAndKeyId()
	return pk
}
예제 #2
0
파일: public_key.go 프로젝트: qbit/client
func (f *ecdsaKey) newECDSA() (*ecdsa.PublicKey, error) {
	var c elliptic.Curve
	if bytes.Equal(f.oid, oidCurveP256) {
		c = elliptic.P256()
	} else if bytes.Equal(f.oid, oidCurveP384) {
		c = elliptic.P384()
	} else if bytes.Equal(f.oid, oidCurveP521) {
		c = elliptic.P521()
	} else if bytes.Equal(f.oid, oidCurveP256r1) {
		c = brainpool.P256r1()
	} else if bytes.Equal(f.oid, oidCurveP384r1) {
		c = brainpool.P384r1()
	} else if bytes.Equal(f.oid, oidCurveP512r1) {
		c = brainpool.P512r1()
	} else {
		return nil, errors.UnsupportedError(fmt.Sprintf("unsupported oid: %x", f.oid))
	}
	x, y := elliptic.Unmarshal(c, f.p.bytes)
	if x == nil {
		return nil, errors.UnsupportedError("failed to parse EC point")
	}
	return &ecdsa.PublicKey{Curve: c, X: x, Y: y}, nil
}