dumb-jose/jwk/rsa.go

47 lines
730 B
Go

package jwk
import (
"crypto/rsa"
"encoding/base64"
"encoding/json"
"errors"
"math/big"
)
type RSAPublicKeyHeader struct {
Modulus string `json:"n"`
Exponent string `json:"e"`
}
var (
ErrUnsupportedPublicExponent = errors.New("Public exponent is not 65537")
)
func ParseRSAPublicKey(data []byte) (*rsa.PublicKey, error) {
var header RSAPublicKeyHeader
err := json.Unmarshal(data, &header)
if err != nil {
return nil, err
}
rawN, err := base64.RawURLEncoding.DecodeString(header.Modulus)
if err != nil {
return nil, err
}
n := new(big.Int).SetBytes(rawN)
if header.Exponent != "AQAB" {
return nil, ErrUnsupportedPublicExponent
}
key := &rsa.PublicKey{
N: n,
E: 65537,
}
return key, nil
}