"fmt"
"hash"
"io"
+
+ "crypto/go.cypherpunks.ru/gogost/v5/gost3410"
)
// verifyHandshakeSignature verifies a signature against pre-hashed
if err := rsa.VerifyPSS(pubKey, hashFunc, signed, sig, signOpts); err != nil {
return err
}
+ case signatureGOST:
+ pubKey, ok := pubkey.(*gost3410.PublicKey)
+ if !ok {
+ return fmt.Errorf("expected GOST public key, got %T", pubkey)
+ }
+ ok, err := gost3410.PublicKeyReverseDigestAndSignature{Pub: pubKey}.VerifyDigest(signed, sig)
+ if err != nil {
+ return err
+ }
+ if !ok {
+ return errors.New("tls: GOST verification failure")
+ }
default:
return errors.New("internal error: unknown signature type")
}
sigType = signatureECDSA
case Ed25519:
sigType = signatureEd25519
+ case GOSTR34102012256A, GOSTR34102012256B, GOSTR34102012256C, GOSTR34102012256D, GOSTR34102012512A, GOSTR34102012512B, GOSTR34102012512C:
+ sigType = signatureGOST
default:
return 0, 0, fmt.Errorf("unsupported signature algorithm: %v", signatureAlgorithm)
}
hash = crypto.SHA512
case Ed25519:
hash = directSigning
+ case GOSTR34102012256A, GOSTR34102012256B, GOSTR34102012256C, GOSTR34102012256D:
+ hash = crypto.GOSTR34112012256
+ case GOSTR34102012512A, GOSTR34102012512B, GOSTR34102012512C:
+ hash = crypto.GOSTR34112012512
default:
return 0, 0, fmt.Errorf("unsupported signature algorithm: %v", signatureAlgorithm)
}
// and optionally filtered by its explicit SupportedSignatureAlgorithms.
//
// This function must be kept in sync with supportedSignatureAlgorithms.
+// FIPS filtering is applied in the caller, selectSignatureScheme.
func signatureSchemesForCertificate(version uint16, cert *Certificate) []SignatureScheme {
priv, ok := cert.PrivateKey.(crypto.Signer)
if !ok {
}
case ed25519.PublicKey:
sigAlgs = []SignatureScheme{Ed25519}
+ case *gost3410.PublicKey:
+ switch pub.C.Name {
+ case "id-tc26-gost-3410-12-256-paramSetA":
+ return []SignatureScheme{GOSTR34102012256A}
+ case "id-tc26-gost-3410-12-256-paramSetB":
+ return []SignatureScheme{GOSTR34102012256B}
+ case "id-tc26-gost-3410-12-256-paramSetC":
+ return []SignatureScheme{GOSTR34102012256C}
+ case "id-tc26-gost-3410-12-256-paramSetD":
+ return []SignatureScheme{GOSTR34102012256D}
+ case "id-tc26-gost-3410-12-512-paramSetA":
+ return []SignatureScheme{GOSTR34102012512A}
+ case "id-tc26-gost-3410-12-512-paramSetB":
+ return []SignatureScheme{GOSTR34102012512B}
+ case "id-tc26-gost-3410-12-512-paramSetC":
+ return []SignatureScheme{GOSTR34102012512C}
+ default:
+ return nil
+ }
default:
return nil
}
case *rsa.PublicKey:
return fmt.Errorf("tls: certificate RSA key size too small for supported signature algorithms")
case ed25519.PublicKey:
+ case *gost3410.PublicKey:
default:
return fmt.Errorf("tls: unsupported certificate key (%T)", pub)
}