summaryrefslogtreecommitdiff
path: root/vendor/github.com/go-fed/httpsig/httpsig.go
diff options
context:
space:
mode:
authorLibravatar Terin Stock <terinjokes@gmail.com>2025-03-09 17:47:56 +0100
committerLibravatar Terin Stock <terinjokes@gmail.com>2025-03-10 01:59:49 +0100
commit3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch)
treef61faa581feaaeaba2542b9f2b8234a590684413 /vendor/github.com/go-fed/httpsig/httpsig.go
parent[chore] update URLs to forked source (diff)
downloadgotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz
[chore] remove vendor
Diffstat (limited to 'vendor/github.com/go-fed/httpsig/httpsig.go')
-rw-r--r--vendor/github.com/go-fed/httpsig/httpsig.go361
1 files changed, 0 insertions, 361 deletions
diff --git a/vendor/github.com/go-fed/httpsig/httpsig.go b/vendor/github.com/go-fed/httpsig/httpsig.go
deleted file mode 100644
index 1a6b95463..000000000
--- a/vendor/github.com/go-fed/httpsig/httpsig.go
+++ /dev/null
@@ -1,361 +0,0 @@
-// Implements HTTP request and response signing and verification. Supports the
-// major MAC and asymmetric key signature algorithms. It has several safety
-// restrictions: One, none of the widely known non-cryptographically safe
-// algorithms are permitted; Two, the RSA SHA256 algorithms must be available in
-// the binary (and it should, barring export restrictions); Finally, the library
-// assumes either the 'Authorizationn' or 'Signature' headers are to be set (but
-// not both).
-package httpsig
-
-import (
- "crypto"
- "fmt"
- "net/http"
- "strings"
- "time"
-
- "golang.org/x/crypto/ssh"
-)
-
-// Algorithm specifies a cryptography secure algorithm for signing HTTP requests
-// and responses.
-type Algorithm string
-
-const (
- // MAC-based algoirthms.
- HMAC_SHA224 Algorithm = hmacPrefix + "-" + sha224String
- HMAC_SHA256 Algorithm = hmacPrefix + "-" + sha256String
- HMAC_SHA384 Algorithm = hmacPrefix + "-" + sha384String
- HMAC_SHA512 Algorithm = hmacPrefix + "-" + sha512String
- HMAC_RIPEMD160 Algorithm = hmacPrefix + "-" + ripemd160String
- HMAC_SHA3_224 Algorithm = hmacPrefix + "-" + sha3_224String
- HMAC_SHA3_256 Algorithm = hmacPrefix + "-" + sha3_256String
- HMAC_SHA3_384 Algorithm = hmacPrefix + "-" + sha3_384String
- HMAC_SHA3_512 Algorithm = hmacPrefix + "-" + sha3_512String
- HMAC_SHA512_224 Algorithm = hmacPrefix + "-" + sha512_224String
- HMAC_SHA512_256 Algorithm = hmacPrefix + "-" + sha512_256String
- HMAC_BLAKE2S_256 Algorithm = hmacPrefix + "-" + blake2s_256String
- HMAC_BLAKE2B_256 Algorithm = hmacPrefix + "-" + blake2b_256String
- HMAC_BLAKE2B_384 Algorithm = hmacPrefix + "-" + blake2b_384String
- HMAC_BLAKE2B_512 Algorithm = hmacPrefix + "-" + blake2b_512String
- BLAKE2S_256 Algorithm = blake2s_256String
- BLAKE2B_256 Algorithm = blake2b_256String
- BLAKE2B_384 Algorithm = blake2b_384String
- BLAKE2B_512 Algorithm = blake2b_512String
- // RSA-based algorithms.
- RSA_SHA1 Algorithm = rsaPrefix + "-" + sha1String
- RSA_SHA224 Algorithm = rsaPrefix + "-" + sha224String
- // RSA_SHA256 is the default algorithm.
- RSA_SHA256 Algorithm = rsaPrefix + "-" + sha256String
- RSA_SHA384 Algorithm = rsaPrefix + "-" + sha384String
- RSA_SHA512 Algorithm = rsaPrefix + "-" + sha512String
- RSA_RIPEMD160 Algorithm = rsaPrefix + "-" + ripemd160String
- // ECDSA algorithms
- ECDSA_SHA224 Algorithm = ecdsaPrefix + "-" + sha224String
- ECDSA_SHA256 Algorithm = ecdsaPrefix + "-" + sha256String
- ECDSA_SHA384 Algorithm = ecdsaPrefix + "-" + sha384String
- ECDSA_SHA512 Algorithm = ecdsaPrefix + "-" + sha512String
- ECDSA_RIPEMD160 Algorithm = ecdsaPrefix + "-" + ripemd160String
- // ED25519 algorithms
- // can only be SHA512
- ED25519 Algorithm = ed25519Prefix
-
- // Just because you can glue things together, doesn't mean they will
- // work. The following options are not supported.
- rsa_SHA3_224 Algorithm = rsaPrefix + "-" + sha3_224String
- rsa_SHA3_256 Algorithm = rsaPrefix + "-" + sha3_256String
- rsa_SHA3_384 Algorithm = rsaPrefix + "-" + sha3_384String
- rsa_SHA3_512 Algorithm = rsaPrefix + "-" + sha3_512String
- rsa_SHA512_224 Algorithm = rsaPrefix + "-" + sha512_224String
- rsa_SHA512_256 Algorithm = rsaPrefix + "-" + sha512_256String
- rsa_BLAKE2S_256 Algorithm = rsaPrefix + "-" + blake2s_256String
- rsa_BLAKE2B_256 Algorithm = rsaPrefix + "-" + blake2b_256String
- rsa_BLAKE2B_384 Algorithm = rsaPrefix + "-" + blake2b_384String
- rsa_BLAKE2B_512 Algorithm = rsaPrefix + "-" + blake2b_512String
-)
-
-// HTTP Signatures can be applied to different HTTP headers, depending on the
-// expected application behavior.
-type SignatureScheme string
-
-const (
- // Signature will place the HTTP Signature into the 'Signature' HTTP
- // header.
- Signature SignatureScheme = "Signature"
- // Authorization will place the HTTP Signature into the 'Authorization'
- // HTTP header.
- Authorization SignatureScheme = "Authorization"
-)
-
-const (
- // The HTTP Signatures specification uses the "Signature" auth-scheme
- // for the Authorization header. This is coincidentally named, but not
- // semantically the same, as the "Signature" HTTP header value.
- signatureAuthScheme = "Signature"
-)
-
-// There are subtle differences to the values in the header. The Authorization
-// header has an 'auth-scheme' value that must be prefixed to the rest of the
-// key and values.
-func (s SignatureScheme) authScheme() string {
- switch s {
- case Authorization:
- return signatureAuthScheme
- default:
- return ""
- }
-}
-
-// Signers will sign HTTP requests or responses based on the algorithms and
-// headers selected at creation time.
-//
-// Signers are not safe to use between multiple goroutines.
-//
-// Note that signatures do set the deprecated 'algorithm' parameter for
-// backwards compatibility.
-type Signer interface {
- // SignRequest signs the request using a private key. The public key id
- // is used by the HTTP server to identify which key to use to verify the
- // signature.
- //
- // If the Signer was created using a MAC based algorithm, then the key
- // is expected to be of type []byte. If the Signer was created using an
- // RSA based algorithm, then the private key is expected to be of type
- // *rsa.PrivateKey.
- //
- // A Digest (RFC 3230) will be added to the request. The body provided
- // must match the body used in the request, and is allowed to be nil.
- // The Digest ensures the request body is not tampered with in flight,
- // and if the signer is created to also sign the "Digest" header, the
- // HTTP Signature will then ensure both the Digest and body are not both
- // modified to maliciously represent different content.
- SignRequest(pKey crypto.PrivateKey, pubKeyId string, r *http.Request, body []byte) error
- // SignResponse signs the response using a private key. The public key
- // id is used by the HTTP client to identify which key to use to verify
- // the signature.
- //
- // If the Signer was created using a MAC based algorithm, then the key
- // is expected to be of type []byte. If the Signer was created using an
- // RSA based algorithm, then the private key is expected to be of type
- // *rsa.PrivateKey.
- //
- // A Digest (RFC 3230) will be added to the response. The body provided
- // must match the body written in the response, and is allowed to be
- // nil. The Digest ensures the response body is not tampered with in
- // flight, and if the signer is created to also sign the "Digest"
- // header, the HTTP Signature will then ensure both the Digest and body
- // are not both modified to maliciously represent different content.
- SignResponse(pKey crypto.PrivateKey, pubKeyId string, r http.ResponseWriter, body []byte) error
-}
-
-// NewSigner creates a new Signer with the provided algorithm preferences to
-// make HTTP signatures. Only the first available algorithm will be used, which
-// is returned by this function along with the Signer. If none of the preferred
-// algorithms were available, then the default algorithm is used. The headers
-// specified will be included into the HTTP signatures.
-//
-// The Digest will also be calculated on a request's body using the provided
-// digest algorithm, if "Digest" is one of the headers listed.
-//
-// The provided scheme determines which header is populated with the HTTP
-// Signature.
-//
-// An error is returned if an unknown or a known cryptographically insecure
-// Algorithm is provided.
-func NewSigner(prefs []Algorithm, dAlgo DigestAlgorithm, headers []string, scheme SignatureScheme, expiresIn int64) (Signer, Algorithm, error) {
- for _, pref := range prefs {
- s, err := newSigner(pref, dAlgo, headers, scheme, expiresIn)
- if err != nil {
- continue
- }
- return s, pref, err
- }
- s, err := newSigner(defaultAlgorithm, dAlgo, headers, scheme, expiresIn)
- return s, defaultAlgorithm, err
-}
-
-// Signers will sign HTTP requests or responses based on the algorithms and
-// headers selected at creation time.
-//
-// Signers are not safe to use between multiple goroutines.
-//
-// Note that signatures do set the deprecated 'algorithm' parameter for
-// backwards compatibility.
-type SSHSigner interface {
- // SignRequest signs the request using ssh.Signer.
- // The public key id is used by the HTTP server to identify which key to use
- // to verify the signature.
- //
- // A Digest (RFC 3230) will be added to the request. The body provided
- // must match the body used in the request, and is allowed to be nil.
- // The Digest ensures the request body is not tampered with in flight,
- // and if the signer is created to also sign the "Digest" header, the
- // HTTP Signature will then ensure both the Digest and body are not both
- // modified to maliciously represent different content.
- SignRequest(pubKeyId string, r *http.Request, body []byte) error
- // SignResponse signs the response using ssh.Signer. The public key
- // id is used by the HTTP client to identify which key to use to verify
- // the signature.
- //
- // A Digest (RFC 3230) will be added to the response. The body provided
- // must match the body written in the response, and is allowed to be
- // nil. The Digest ensures the response body is not tampered with in
- // flight, and if the signer is created to also sign the "Digest"
- // header, the HTTP Signature will then ensure both the Digest and body
- // are not both modified to maliciously represent different content.
- SignResponse(pubKeyId string, r http.ResponseWriter, body []byte) error
-}
-
-// NewwSSHSigner creates a new Signer using the specified ssh.Signer
-// At the moment only ed25519 ssh keys are supported.
-// The headers specified will be included into the HTTP signatures.
-//
-// The Digest will also be calculated on a request's body using the provided
-// digest algorithm, if "Digest" is one of the headers listed.
-//
-// The provided scheme determines which header is populated with the HTTP
-// Signature.
-func NewSSHSigner(s ssh.Signer, dAlgo DigestAlgorithm, headers []string, scheme SignatureScheme, expiresIn int64) (SSHSigner, Algorithm, error) {
- sshAlgo := getSSHAlgorithm(s.PublicKey().Type())
- if sshAlgo == "" {
- return nil, "", fmt.Errorf("key type: %s not supported yet.", s.PublicKey().Type())
- }
-
- signer, err := newSSHSigner(s, sshAlgo, dAlgo, headers, scheme, expiresIn)
- if err != nil {
- return nil, "", err
- }
-
- return signer, sshAlgo, nil
-}
-
-func getSSHAlgorithm(pkType string) Algorithm {
- switch {
- case strings.HasPrefix(pkType, sshPrefix+"-"+ed25519Prefix):
- return ED25519
- case strings.HasPrefix(pkType, sshPrefix+"-"+rsaPrefix):
- return RSA_SHA1
- }
-
- return ""
-}
-
-// Verifier verifies HTTP Signatures.
-//
-// It will determine which of the supported headers has the parameters
-// that define the signature.
-//
-// Verifiers are not safe to use between multiple goroutines.
-//
-// Note that verification ignores the deprecated 'algorithm' parameter.
-type Verifier interface {
- // KeyId gets the public key id that the signature is signed with.
- //
- // Note that the application is expected to determine the algorithm
- // used based on metadata or out-of-band information for this key id.
- KeyId() string
- // Verify accepts the public key specified by KeyId and returns an
- // error if verification fails or if the signature is malformed. The
- // algorithm must be the one used to create the signature in order to
- // pass verification. The algorithm is determined based on metadata or
- // out-of-band information for the key id.
- //
- // If the signature was created using a MAC based algorithm, then the
- // key is expected to be of type []byte. If the signature was created
- // using an RSA based algorithm, then the public key is expected to be
- // of type *rsa.PublicKey.
- Verify(pKey crypto.PublicKey, algo Algorithm) error
-}
-
-const (
- // host is treated specially because golang may not include it in the
- // request header map on the server side of a request.
- hostHeader = "Host"
-)
-
-// NewVerifier verifies the given request. It returns an error if the HTTP
-// Signature parameters are not present in any headers, are present in more than
-// one header, are malformed, or are missing required parameters. It ignores
-// unknown HTTP Signature parameters.
-func NewVerifier(r *http.Request) (Verifier, error) {
- h := r.Header
- if _, hasHostHeader := h[hostHeader]; len(r.Host) > 0 && !hasHostHeader {
- h[hostHeader] = []string{r.Host}
- }
- return newVerifier(h, func(h http.Header, toInclude []string, created int64, expires int64) (string, error) {
- return signatureString(h, toInclude, addRequestTarget(r), created, expires)
- })
-}
-
-// NewResponseVerifier verifies the given response. It returns errors under the
-// same conditions as NewVerifier.
-func NewResponseVerifier(r *http.Response) (Verifier, error) {
- return newVerifier(r.Header, func(h http.Header, toInclude []string, created int64, expires int64) (string, error) {
- return signatureString(h, toInclude, requestTargetNotPermitted, created, expires)
- })
-}
-
-func newSSHSigner(sshSigner ssh.Signer, algo Algorithm, dAlgo DigestAlgorithm, headers []string, scheme SignatureScheme, expiresIn int64) (SSHSigner, error) {
- var expires, created int64 = 0, 0
-
- if expiresIn != 0 {
- created = time.Now().Unix()
- expires = created + expiresIn
- }
-
- s, err := signerFromSSHSigner(sshSigner, string(algo))
- if err != nil {
- return nil, fmt.Errorf("no crypto implementation available for ssh algo %q", algo)
- }
-
- a := &asymmSSHSigner{
- asymmSigner: &asymmSigner{
- s: s,
- dAlgo: dAlgo,
- headers: headers,
- targetHeader: scheme,
- prefix: scheme.authScheme(),
- created: created,
- expires: expires,
- },
- }
-
- return a, nil
-}
-
-func newSigner(algo Algorithm, dAlgo DigestAlgorithm, headers []string, scheme SignatureScheme, expiresIn int64) (Signer, error) {
-
- var expires, created int64 = 0, 0
- if expiresIn != 0 {
- created = time.Now().Unix()
- expires = created + expiresIn
- }
-
- s, err := signerFromString(string(algo))
- if err == nil {
- a := &asymmSigner{
- s: s,
- dAlgo: dAlgo,
- headers: headers,
- targetHeader: scheme,
- prefix: scheme.authScheme(),
- created: created,
- expires: expires,
- }
- return a, nil
- }
- m, err := macerFromString(string(algo))
- if err != nil {
- return nil, fmt.Errorf("no crypto implementation available for %q", algo)
- }
- c := &macSigner{
- m: m,
- dAlgo: dAlgo,
- headers: headers,
- targetHeader: scheme,
- prefix: scheme.authScheme(),
- created: created,
- expires: expires,
- }
- return c, nil
-}