mirror of
https://github.com/go-gitea/gitea
synced 2024-11-09 03:34:24 +00:00
55 lines
1.3 KiB
Go
55 lines
1.3 KiB
Go
|
//+build go1.15
|
||
|
|
||
|
package jwt
|
||
|
|
||
|
import (
|
||
|
"crypto/ecdsa"
|
||
|
"crypto/rand"
|
||
|
)
|
||
|
|
||
|
// Implements the Sign method from SigningMethod
|
||
|
// For this signing method, key must be an ecdsa.PrivateKey struct
|
||
|
func (m *SigningMethodECDSA) Sign(signingString string, key interface{}) (string, error) {
|
||
|
// Get the key
|
||
|
var ecdsaKey *ecdsa.PrivateKey
|
||
|
switch k := key.(type) {
|
||
|
case *ecdsa.PrivateKey:
|
||
|
ecdsaKey = k
|
||
|
default:
|
||
|
return "", ErrInvalidKeyType
|
||
|
}
|
||
|
|
||
|
// Create the hasher
|
||
|
if !m.Hash.Available() {
|
||
|
return "", ErrHashUnavailable
|
||
|
}
|
||
|
|
||
|
hasher := m.Hash.New()
|
||
|
hasher.Write([]byte(signingString))
|
||
|
|
||
|
// Sign the string and return r, s
|
||
|
if r, s, err := ecdsa.Sign(rand.Reader, ecdsaKey, hasher.Sum(nil)); err == nil {
|
||
|
curveBits := ecdsaKey.Curve.Params().BitSize
|
||
|
|
||
|
if m.CurveBits != curveBits {
|
||
|
return "", ErrInvalidKey
|
||
|
}
|
||
|
|
||
|
keyBytes := curveBits / 8
|
||
|
if curveBits%8 > 0 {
|
||
|
keyBytes += 1
|
||
|
}
|
||
|
|
||
|
// We serialize the outputs (r and s) into big-endian byte arrays
|
||
|
// padded with zeros on the left to make sure the sizes work out.
|
||
|
// Output must be 2*keyBytes long.
|
||
|
out := make([]byte, 2*keyBytes)
|
||
|
r.FillBytes(out[0:keyBytes]) // r is assigned to the first half of output.
|
||
|
s.FillBytes(out[keyBytes:]) // s is assigned to the second half of output.
|
||
|
|
||
|
return EncodeSegment(out), nil
|
||
|
} else {
|
||
|
return "", err
|
||
|
}
|
||
|
}
|