118 lines
2.6 KiB
Go
118 lines
2.6 KiB
Go
package ecc
|
|
|
|
import (
|
|
"github.com/ProtonMail/go-crypto/openpgp/internal/encoding"
|
|
"crypto/elliptic"
|
|
"bytes"
|
|
"github.com/ProtonMail/go-crypto/bitcurves"
|
|
"github.com/ProtonMail/go-crypto/brainpool"
|
|
)
|
|
|
|
type SignatureAlgorithm uint8
|
|
|
|
const (
|
|
ECDSA SignatureAlgorithm = 1
|
|
EdDSA SignatureAlgorithm = 2
|
|
)
|
|
|
|
type CurveInfo struct {
|
|
Name string
|
|
Oid *encoding.OID
|
|
Curve elliptic.Curve
|
|
SigAlgorithm SignatureAlgorithm
|
|
CurveType CurveType
|
|
}
|
|
|
|
var curves = []CurveInfo{
|
|
{
|
|
Name: "NIST curve P-256",
|
|
Oid: encoding.NewOID([]byte{0x2A, 0x86, 0x48, 0xCE, 0x3D, 0x03, 0x01, 0x07}),
|
|
Curve: elliptic.P256(),
|
|
CurveType: NISTCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "NIST curve P-384",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x22}),
|
|
Curve: elliptic.P384(),
|
|
CurveType: NISTCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "NIST curve P-521",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x23}),
|
|
Curve: elliptic.P521(),
|
|
CurveType: NISTCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "SecP256k1",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x81, 0x04, 0x00, 0x0A}),
|
|
Curve: bitcurves.S256(),
|
|
CurveType: BitCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "Curve25519",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0x97, 0x55, 0x01, 0x05, 0x01}),
|
|
Curve: elliptic.P256(),// filler
|
|
CurveType: Curve25519,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "Ed25519",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x06, 0x01, 0x04, 0x01, 0xDA, 0x47, 0x0F, 0x01}),
|
|
Curve: elliptic.P256(), // filler
|
|
CurveType: NISTCurve,
|
|
SigAlgorithm: EdDSA,
|
|
},
|
|
{
|
|
Name: "Brainpool P256r1",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x07}),
|
|
Curve: brainpool.P256r1(),
|
|
CurveType: BrainpoolCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "BrainpoolP384r1",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0B}),
|
|
Curve: brainpool.P384r1(),
|
|
CurveType: BrainpoolCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
{
|
|
Name: "BrainpoolP512r1",
|
|
Oid: encoding.NewOID([]byte{0x2B, 0x24, 0x03, 0x03, 0x02, 0x08, 0x01, 0x01, 0x0D}),
|
|
Curve: brainpool.P512r1(),
|
|
CurveType: BrainpoolCurve,
|
|
SigAlgorithm: ECDSA,
|
|
},
|
|
}
|
|
|
|
func FindByCurve(curve elliptic.Curve) *CurveInfo {
|
|
for _, curveInfo := range curves {
|
|
if curveInfo.Curve == curve {
|
|
return &curveInfo
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func FindByOid(oid encoding.Field) *CurveInfo {
|
|
var rawBytes = oid.Bytes()
|
|
for _, curveInfo := range curves {
|
|
if bytes.Equal(curveInfo.Oid.Bytes(), rawBytes) {
|
|
return &curveInfo
|
|
}
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func FindByName(name string) *CurveInfo {
|
|
for _, curveInfo := range curves {
|
|
if curveInfo.Name == name {
|
|
return &curveInfo
|
|
}
|
|
}
|
|
return nil
|
|
} |