| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178 |
- // This file is auto-generated by jwk/internal/cmd/genheader/main.go. DO NOT EDIT
- package jwk
- import (
- "bytes"
- "context"
- "crypto/ecdsa"
- "crypto/x509"
- "fmt"
- "sort"
- "sync"
- "github.com/lestrrat-go/iter/mapiter"
- "github.com/lestrrat-go/jwx/internal/base64"
- "github.com/lestrrat-go/jwx/internal/iter"
- "github.com/lestrrat-go/jwx/internal/json"
- "github.com/lestrrat-go/jwx/internal/pool"
- "github.com/lestrrat-go/jwx/jwa"
- "github.com/pkg/errors"
- )
- const (
- ECDSACrvKey = "crv"
- ECDSADKey = "d"
- ECDSAXKey = "x"
- ECDSAYKey = "y"
- )
- type ECDSAPublicKey interface {
- Key
- FromRaw(*ecdsa.PublicKey) error
- Crv() jwa.EllipticCurveAlgorithm
- X() []byte
- Y() []byte
- }
- type ecdsaPublicKey struct {
- algorithm *string // https://tools.ietf.org/html/rfc7517#section-4.4
- crv *jwa.EllipticCurveAlgorithm
- keyID *string // https://tools.ietf.org/html/rfc7515#section-4.1.4
- keyOps *KeyOperationList // https://tools.ietf.org/html/rfc7517#section-4.3
- keyUsage *string // https://tools.ietf.org/html/rfc7517#section-4.2
- x []byte
- x509CertChain *CertificateChain // https://tools.ietf.org/html/rfc7515#section-4.1.6
- x509CertThumbprint *string // https://tools.ietf.org/html/rfc7515#section-4.1.7
- x509CertThumbprintS256 *string // https://tools.ietf.org/html/rfc7515#section-4.1.8
- x509URL *string // https://tools.ietf.org/html/rfc7515#section-4.1.5
- y []byte
- privateParams map[string]interface{}
- mu *sync.RWMutex
- dc json.DecodeCtx
- }
- func NewECDSAPublicKey() ECDSAPublicKey {
- return newECDSAPublicKey()
- }
- func newECDSAPublicKey() *ecdsaPublicKey {
- return &ecdsaPublicKey{
- mu: &sync.RWMutex{},
- privateParams: make(map[string]interface{}),
- }
- }
- func (h ecdsaPublicKey) KeyType() jwa.KeyType {
- return jwa.EC
- }
- func (h *ecdsaPublicKey) Algorithm() string {
- if h.algorithm != nil {
- return *(h.algorithm)
- }
- return ""
- }
- func (h *ecdsaPublicKey) Crv() jwa.EllipticCurveAlgorithm {
- if h.crv != nil {
- return *(h.crv)
- }
- return jwa.InvalidEllipticCurve
- }
- func (h *ecdsaPublicKey) KeyID() string {
- if h.keyID != nil {
- return *(h.keyID)
- }
- return ""
- }
- func (h *ecdsaPublicKey) KeyOps() KeyOperationList {
- if h.keyOps != nil {
- return *(h.keyOps)
- }
- return nil
- }
- func (h *ecdsaPublicKey) KeyUsage() string {
- if h.keyUsage != nil {
- return *(h.keyUsage)
- }
- return ""
- }
- func (h *ecdsaPublicKey) X() []byte {
- return h.x
- }
- func (h *ecdsaPublicKey) X509CertChain() []*x509.Certificate {
- if h.x509CertChain != nil {
- return h.x509CertChain.Get()
- }
- return nil
- }
- func (h *ecdsaPublicKey) X509CertThumbprint() string {
- if h.x509CertThumbprint != nil {
- return *(h.x509CertThumbprint)
- }
- return ""
- }
- func (h *ecdsaPublicKey) X509CertThumbprintS256() string {
- if h.x509CertThumbprintS256 != nil {
- return *(h.x509CertThumbprintS256)
- }
- return ""
- }
- func (h *ecdsaPublicKey) X509URL() string {
- if h.x509URL != nil {
- return *(h.x509URL)
- }
- return ""
- }
- func (h *ecdsaPublicKey) Y() []byte {
- return h.y
- }
- func (h *ecdsaPublicKey) makePairs() []*HeaderPair {
- h.mu.RLock()
- defer h.mu.RUnlock()
- var pairs []*HeaderPair
- pairs = append(pairs, &HeaderPair{Key: "kty", Value: jwa.EC})
- if h.algorithm != nil {
- pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
- }
- if h.crv != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSACrvKey, Value: *(h.crv)})
- }
- if h.keyID != nil {
- pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
- }
- if h.keyOps != nil {
- pairs = append(pairs, &HeaderPair{Key: KeyOpsKey, Value: *(h.keyOps)})
- }
- if h.keyUsage != nil {
- pairs = append(pairs, &HeaderPair{Key: KeyUsageKey, Value: *(h.keyUsage)})
- }
- if h.x != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSAXKey, Value: h.x})
- }
- if h.x509CertChain != nil {
- pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: *(h.x509CertChain)})
- }
- if h.x509CertThumbprint != nil {
- pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
- }
- if h.x509CertThumbprintS256 != nil {
- pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
- }
- if h.x509URL != nil {
- pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
- }
- if h.y != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSAYKey, Value: h.y})
- }
- for k, v := range h.privateParams {
- pairs = append(pairs, &HeaderPair{Key: k, Value: v})
- }
- return pairs
- }
- func (h *ecdsaPublicKey) PrivateParams() map[string]interface{} {
- return h.privateParams
- }
- func (h *ecdsaPublicKey) Get(name string) (interface{}, bool) {
- h.mu.RLock()
- defer h.mu.RUnlock()
- switch name {
- case KeyTypeKey:
- return h.KeyType(), true
- case AlgorithmKey:
- if h.algorithm == nil {
- return nil, false
- }
- return *(h.algorithm), true
- case ECDSACrvKey:
- if h.crv == nil {
- return nil, false
- }
- return *(h.crv), true
- case KeyIDKey:
- if h.keyID == nil {
- return nil, false
- }
- return *(h.keyID), true
- case KeyOpsKey:
- if h.keyOps == nil {
- return nil, false
- }
- return *(h.keyOps), true
- case KeyUsageKey:
- if h.keyUsage == nil {
- return nil, false
- }
- return *(h.keyUsage), true
- case ECDSAXKey:
- if h.x == nil {
- return nil, false
- }
- return h.x, true
- case X509CertChainKey:
- if h.x509CertChain == nil {
- return nil, false
- }
- return h.x509CertChain.Get(), true
- case X509CertThumbprintKey:
- if h.x509CertThumbprint == nil {
- return nil, false
- }
- return *(h.x509CertThumbprint), true
- case X509CertThumbprintS256Key:
- if h.x509CertThumbprintS256 == nil {
- return nil, false
- }
- return *(h.x509CertThumbprintS256), true
- case X509URLKey:
- if h.x509URL == nil {
- return nil, false
- }
- return *(h.x509URL), true
- case ECDSAYKey:
- if h.y == nil {
- return nil, false
- }
- return h.y, true
- default:
- v, ok := h.privateParams[name]
- return v, ok
- }
- }
- func (h *ecdsaPublicKey) Set(name string, value interface{}) error {
- h.mu.Lock()
- defer h.mu.Unlock()
- return h.setNoLock(name, value)
- }
- func (h *ecdsaPublicKey) setNoLock(name string, value interface{}) error {
- switch name {
- case "kty":
- return nil
- case AlgorithmKey:
- switch v := value.(type) {
- case string:
- h.algorithm = &v
- case fmt.Stringer:
- tmp := v.String()
- h.algorithm = &tmp
- default:
- return errors.Errorf(`invalid type for %s key: %T`, AlgorithmKey, value)
- }
- return nil
- case ECDSACrvKey:
- if v, ok := value.(jwa.EllipticCurveAlgorithm); ok {
- h.crv = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSACrvKey, value)
- case KeyIDKey:
- if v, ok := value.(string); ok {
- h.keyID = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
- case KeyOpsKey:
- var acceptor KeyOperationList
- if err := acceptor.Accept(value); err != nil {
- return errors.Wrapf(err, `invalid value for %s key`, KeyOpsKey)
- }
- h.keyOps = &acceptor
- return nil
- case KeyUsageKey:
- switch v := value.(type) {
- case KeyUsageType:
- switch v {
- case ForSignature, ForEncryption:
- tmp := v.String()
- h.keyUsage = &tmp
- default:
- return errors.Errorf(`invalid key usage type %s`, v)
- }
- case string:
- h.keyUsage = &v
- default:
- return errors.Errorf(`invalid key usage type %s`, v)
- }
- case ECDSAXKey:
- if v, ok := value.([]byte); ok {
- h.x = v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSAXKey, value)
- case X509CertChainKey:
- var acceptor CertificateChain
- if err := acceptor.Accept(value); err != nil {
- return errors.Wrapf(err, `invalid value for %s key`, X509CertChainKey)
- }
- h.x509CertChain = &acceptor
- return nil
- case X509CertThumbprintKey:
- if v, ok := value.(string); ok {
- h.x509CertThumbprint = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
- case X509CertThumbprintS256Key:
- if v, ok := value.(string); ok {
- h.x509CertThumbprintS256 = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
- case X509URLKey:
- if v, ok := value.(string); ok {
- h.x509URL = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
- case ECDSAYKey:
- if v, ok := value.([]byte); ok {
- h.y = v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSAYKey, value)
- default:
- if h.privateParams == nil {
- h.privateParams = map[string]interface{}{}
- }
- h.privateParams[name] = value
- }
- return nil
- }
- func (k *ecdsaPublicKey) Remove(key string) error {
- k.mu.Lock()
- defer k.mu.Unlock()
- switch key {
- case AlgorithmKey:
- k.algorithm = nil
- case ECDSACrvKey:
- k.crv = nil
- case KeyIDKey:
- k.keyID = nil
- case KeyOpsKey:
- k.keyOps = nil
- case KeyUsageKey:
- k.keyUsage = nil
- case ECDSAXKey:
- k.x = nil
- case X509CertChainKey:
- k.x509CertChain = nil
- case X509CertThumbprintKey:
- k.x509CertThumbprint = nil
- case X509CertThumbprintS256Key:
- k.x509CertThumbprintS256 = nil
- case X509URLKey:
- k.x509URL = nil
- case ECDSAYKey:
- k.y = nil
- default:
- delete(k.privateParams, key)
- }
- return nil
- }
- func (k *ecdsaPublicKey) Clone() (Key, error) {
- return cloneKey(k)
- }
- func (k *ecdsaPublicKey) DecodeCtx() json.DecodeCtx {
- k.mu.RLock()
- defer k.mu.RUnlock()
- return k.dc
- }
- func (k *ecdsaPublicKey) SetDecodeCtx(dc json.DecodeCtx) {
- k.mu.Lock()
- defer k.mu.Unlock()
- k.dc = dc
- }
- func (h *ecdsaPublicKey) UnmarshalJSON(buf []byte) error {
- h.algorithm = nil
- h.crv = nil
- h.keyID = nil
- h.keyOps = nil
- h.keyUsage = nil
- h.x = nil
- h.x509CertChain = nil
- h.x509CertThumbprint = nil
- h.x509CertThumbprintS256 = nil
- h.x509URL = nil
- h.y = nil
- dec := json.NewDecoder(bytes.NewReader(buf))
- LOOP:
- for {
- tok, err := dec.Token()
- if err != nil {
- return errors.Wrap(err, `error reading token`)
- }
- switch tok := tok.(type) {
- case json.Delim:
- // Assuming we're doing everything correctly, we should ONLY
- // get either '{' or '}' here.
- if tok == '}' { // End of object
- break LOOP
- } else if tok != '{' {
- return errors.Errorf(`expected '{', but got '%c'`, tok)
- }
- case string: // Objects can only have string keys
- switch tok {
- case KeyTypeKey:
- val, err := json.ReadNextStringToken(dec)
- if err != nil {
- return errors.Wrap(err, `error reading token`)
- }
- if val != jwa.EC.String() {
- return errors.Errorf(`invalid kty value for RSAPublicKey (%s)`, val)
- }
- case AlgorithmKey:
- if err := json.AssignNextStringToken(&h.algorithm, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
- }
- case ECDSACrvKey:
- var decoded jwa.EllipticCurveAlgorithm
- if err := dec.Decode(&decoded); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSACrvKey)
- }
- h.crv = &decoded
- case KeyIDKey:
- if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
- }
- case KeyOpsKey:
- var decoded KeyOperationList
- if err := dec.Decode(&decoded); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, KeyOpsKey)
- }
- h.keyOps = &decoded
- case KeyUsageKey:
- if err := json.AssignNextStringToken(&h.keyUsage, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, KeyUsageKey)
- }
- case ECDSAXKey:
- if err := json.AssignNextBytesToken(&h.x, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSAXKey)
- }
- case X509CertChainKey:
- var decoded CertificateChain
- if err := dec.Decode(&decoded); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
- }
- h.x509CertChain = &decoded
- case X509CertThumbprintKey:
- if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
- }
- case X509CertThumbprintS256Key:
- if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
- }
- case X509URLKey:
- if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
- }
- case ECDSAYKey:
- if err := json.AssignNextBytesToken(&h.y, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSAYKey)
- }
- default:
- if dc := h.dc; dc != nil {
- if localReg := dc.Registry(); localReg != nil {
- decoded, err := localReg.Decode(dec, tok)
- if err == nil {
- h.setNoLock(tok, decoded)
- continue
- }
- }
- }
- decoded, err := registry.Decode(dec, tok)
- if err == nil {
- h.setNoLock(tok, decoded)
- continue
- }
- return errors.Wrapf(err, `could not decode field %s`, tok)
- }
- default:
- return errors.Errorf(`invalid token %T`, tok)
- }
- }
- if h.crv == nil {
- return errors.Errorf(`required field crv is missing`)
- }
- if h.x == nil {
- return errors.Errorf(`required field x is missing`)
- }
- if h.y == nil {
- return errors.Errorf(`required field y is missing`)
- }
- return nil
- }
- func (h ecdsaPublicKey) MarshalJSON() ([]byte, error) {
- data := make(map[string]interface{})
- fields := make([]string, 0, 11)
- for _, pair := range h.makePairs() {
- fields = append(fields, pair.Key.(string))
- data[pair.Key.(string)] = pair.Value
- }
- sort.Strings(fields)
- buf := pool.GetBytesBuffer()
- defer pool.ReleaseBytesBuffer(buf)
- buf.WriteByte('{')
- enc := json.NewEncoder(buf)
- for i, f := range fields {
- if i > 0 {
- buf.WriteRune(',')
- }
- buf.WriteRune('"')
- buf.WriteString(f)
- buf.WriteString(`":`)
- v := data[f]
- switch v := v.(type) {
- case []byte:
- buf.WriteRune('"')
- buf.WriteString(base64.EncodeToString(v))
- buf.WriteRune('"')
- default:
- if err := enc.Encode(v); err != nil {
- return nil, errors.Wrapf(err, `failed to encode value for field %s`, f)
- }
- buf.Truncate(buf.Len() - 1)
- }
- }
- buf.WriteByte('}')
- ret := make([]byte, buf.Len())
- copy(ret, buf.Bytes())
- return ret, nil
- }
- func (h *ecdsaPublicKey) Iterate(ctx context.Context) HeaderIterator {
- pairs := h.makePairs()
- ch := make(chan *HeaderPair, len(pairs))
- go func(ctx context.Context, ch chan *HeaderPair, pairs []*HeaderPair) {
- defer close(ch)
- for _, pair := range pairs {
- select {
- case <-ctx.Done():
- return
- case ch <- pair:
- }
- }
- }(ctx, ch, pairs)
- return mapiter.New(ch)
- }
- func (h *ecdsaPublicKey) Walk(ctx context.Context, visitor HeaderVisitor) error {
- return iter.WalkMap(ctx, h, visitor)
- }
- func (h *ecdsaPublicKey) AsMap(ctx context.Context) (map[string]interface{}, error) {
- return iter.AsMap(ctx, h)
- }
- type ECDSAPrivateKey interface {
- Key
- FromRaw(*ecdsa.PrivateKey) error
- Crv() jwa.EllipticCurveAlgorithm
- D() []byte
- X() []byte
- Y() []byte
- }
- type ecdsaPrivateKey struct {
- algorithm *string // https://tools.ietf.org/html/rfc7517#section-4.4
- crv *jwa.EllipticCurveAlgorithm
- d []byte
- keyID *string // https://tools.ietf.org/html/rfc7515#section-4.1.4
- keyOps *KeyOperationList // https://tools.ietf.org/html/rfc7517#section-4.3
- keyUsage *string // https://tools.ietf.org/html/rfc7517#section-4.2
- x []byte
- x509CertChain *CertificateChain // https://tools.ietf.org/html/rfc7515#section-4.1.6
- x509CertThumbprint *string // https://tools.ietf.org/html/rfc7515#section-4.1.7
- x509CertThumbprintS256 *string // https://tools.ietf.org/html/rfc7515#section-4.1.8
- x509URL *string // https://tools.ietf.org/html/rfc7515#section-4.1.5
- y []byte
- privateParams map[string]interface{}
- mu *sync.RWMutex
- dc json.DecodeCtx
- }
- func NewECDSAPrivateKey() ECDSAPrivateKey {
- return newECDSAPrivateKey()
- }
- func newECDSAPrivateKey() *ecdsaPrivateKey {
- return &ecdsaPrivateKey{
- mu: &sync.RWMutex{},
- privateParams: make(map[string]interface{}),
- }
- }
- func (h ecdsaPrivateKey) KeyType() jwa.KeyType {
- return jwa.EC
- }
- func (h *ecdsaPrivateKey) Algorithm() string {
- if h.algorithm != nil {
- return *(h.algorithm)
- }
- return ""
- }
- func (h *ecdsaPrivateKey) Crv() jwa.EllipticCurveAlgorithm {
- if h.crv != nil {
- return *(h.crv)
- }
- return jwa.InvalidEllipticCurve
- }
- func (h *ecdsaPrivateKey) D() []byte {
- return h.d
- }
- func (h *ecdsaPrivateKey) KeyID() string {
- if h.keyID != nil {
- return *(h.keyID)
- }
- return ""
- }
- func (h *ecdsaPrivateKey) KeyOps() KeyOperationList {
- if h.keyOps != nil {
- return *(h.keyOps)
- }
- return nil
- }
- func (h *ecdsaPrivateKey) KeyUsage() string {
- if h.keyUsage != nil {
- return *(h.keyUsage)
- }
- return ""
- }
- func (h *ecdsaPrivateKey) X() []byte {
- return h.x
- }
- func (h *ecdsaPrivateKey) X509CertChain() []*x509.Certificate {
- if h.x509CertChain != nil {
- return h.x509CertChain.Get()
- }
- return nil
- }
- func (h *ecdsaPrivateKey) X509CertThumbprint() string {
- if h.x509CertThumbprint != nil {
- return *(h.x509CertThumbprint)
- }
- return ""
- }
- func (h *ecdsaPrivateKey) X509CertThumbprintS256() string {
- if h.x509CertThumbprintS256 != nil {
- return *(h.x509CertThumbprintS256)
- }
- return ""
- }
- func (h *ecdsaPrivateKey) X509URL() string {
- if h.x509URL != nil {
- return *(h.x509URL)
- }
- return ""
- }
- func (h *ecdsaPrivateKey) Y() []byte {
- return h.y
- }
- func (h *ecdsaPrivateKey) makePairs() []*HeaderPair {
- h.mu.RLock()
- defer h.mu.RUnlock()
- var pairs []*HeaderPair
- pairs = append(pairs, &HeaderPair{Key: "kty", Value: jwa.EC})
- if h.algorithm != nil {
- pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
- }
- if h.crv != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSACrvKey, Value: *(h.crv)})
- }
- if h.d != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSADKey, Value: h.d})
- }
- if h.keyID != nil {
- pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
- }
- if h.keyOps != nil {
- pairs = append(pairs, &HeaderPair{Key: KeyOpsKey, Value: *(h.keyOps)})
- }
- if h.keyUsage != nil {
- pairs = append(pairs, &HeaderPair{Key: KeyUsageKey, Value: *(h.keyUsage)})
- }
- if h.x != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSAXKey, Value: h.x})
- }
- if h.x509CertChain != nil {
- pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: *(h.x509CertChain)})
- }
- if h.x509CertThumbprint != nil {
- pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
- }
- if h.x509CertThumbprintS256 != nil {
- pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
- }
- if h.x509URL != nil {
- pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
- }
- if h.y != nil {
- pairs = append(pairs, &HeaderPair{Key: ECDSAYKey, Value: h.y})
- }
- for k, v := range h.privateParams {
- pairs = append(pairs, &HeaderPair{Key: k, Value: v})
- }
- return pairs
- }
- func (h *ecdsaPrivateKey) PrivateParams() map[string]interface{} {
- return h.privateParams
- }
- func (h *ecdsaPrivateKey) Get(name string) (interface{}, bool) {
- h.mu.RLock()
- defer h.mu.RUnlock()
- switch name {
- case KeyTypeKey:
- return h.KeyType(), true
- case AlgorithmKey:
- if h.algorithm == nil {
- return nil, false
- }
- return *(h.algorithm), true
- case ECDSACrvKey:
- if h.crv == nil {
- return nil, false
- }
- return *(h.crv), true
- case ECDSADKey:
- if h.d == nil {
- return nil, false
- }
- return h.d, true
- case KeyIDKey:
- if h.keyID == nil {
- return nil, false
- }
- return *(h.keyID), true
- case KeyOpsKey:
- if h.keyOps == nil {
- return nil, false
- }
- return *(h.keyOps), true
- case KeyUsageKey:
- if h.keyUsage == nil {
- return nil, false
- }
- return *(h.keyUsage), true
- case ECDSAXKey:
- if h.x == nil {
- return nil, false
- }
- return h.x, true
- case X509CertChainKey:
- if h.x509CertChain == nil {
- return nil, false
- }
- return h.x509CertChain.Get(), true
- case X509CertThumbprintKey:
- if h.x509CertThumbprint == nil {
- return nil, false
- }
- return *(h.x509CertThumbprint), true
- case X509CertThumbprintS256Key:
- if h.x509CertThumbprintS256 == nil {
- return nil, false
- }
- return *(h.x509CertThumbprintS256), true
- case X509URLKey:
- if h.x509URL == nil {
- return nil, false
- }
- return *(h.x509URL), true
- case ECDSAYKey:
- if h.y == nil {
- return nil, false
- }
- return h.y, true
- default:
- v, ok := h.privateParams[name]
- return v, ok
- }
- }
- func (h *ecdsaPrivateKey) Set(name string, value interface{}) error {
- h.mu.Lock()
- defer h.mu.Unlock()
- return h.setNoLock(name, value)
- }
- func (h *ecdsaPrivateKey) setNoLock(name string, value interface{}) error {
- switch name {
- case "kty":
- return nil
- case AlgorithmKey:
- switch v := value.(type) {
- case string:
- h.algorithm = &v
- case fmt.Stringer:
- tmp := v.String()
- h.algorithm = &tmp
- default:
- return errors.Errorf(`invalid type for %s key: %T`, AlgorithmKey, value)
- }
- return nil
- case ECDSACrvKey:
- if v, ok := value.(jwa.EllipticCurveAlgorithm); ok {
- h.crv = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSACrvKey, value)
- case ECDSADKey:
- if v, ok := value.([]byte); ok {
- h.d = v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSADKey, value)
- case KeyIDKey:
- if v, ok := value.(string); ok {
- h.keyID = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
- case KeyOpsKey:
- var acceptor KeyOperationList
- if err := acceptor.Accept(value); err != nil {
- return errors.Wrapf(err, `invalid value for %s key`, KeyOpsKey)
- }
- h.keyOps = &acceptor
- return nil
- case KeyUsageKey:
- switch v := value.(type) {
- case KeyUsageType:
- switch v {
- case ForSignature, ForEncryption:
- tmp := v.String()
- h.keyUsage = &tmp
- default:
- return errors.Errorf(`invalid key usage type %s`, v)
- }
- case string:
- h.keyUsage = &v
- default:
- return errors.Errorf(`invalid key usage type %s`, v)
- }
- case ECDSAXKey:
- if v, ok := value.([]byte); ok {
- h.x = v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSAXKey, value)
- case X509CertChainKey:
- var acceptor CertificateChain
- if err := acceptor.Accept(value); err != nil {
- return errors.Wrapf(err, `invalid value for %s key`, X509CertChainKey)
- }
- h.x509CertChain = &acceptor
- return nil
- case X509CertThumbprintKey:
- if v, ok := value.(string); ok {
- h.x509CertThumbprint = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
- case X509CertThumbprintS256Key:
- if v, ok := value.(string); ok {
- h.x509CertThumbprintS256 = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
- case X509URLKey:
- if v, ok := value.(string); ok {
- h.x509URL = &v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
- case ECDSAYKey:
- if v, ok := value.([]byte); ok {
- h.y = v
- return nil
- }
- return errors.Errorf(`invalid value for %s key: %T`, ECDSAYKey, value)
- default:
- if h.privateParams == nil {
- h.privateParams = map[string]interface{}{}
- }
- h.privateParams[name] = value
- }
- return nil
- }
- func (k *ecdsaPrivateKey) Remove(key string) error {
- k.mu.Lock()
- defer k.mu.Unlock()
- switch key {
- case AlgorithmKey:
- k.algorithm = nil
- case ECDSACrvKey:
- k.crv = nil
- case ECDSADKey:
- k.d = nil
- case KeyIDKey:
- k.keyID = nil
- case KeyOpsKey:
- k.keyOps = nil
- case KeyUsageKey:
- k.keyUsage = nil
- case ECDSAXKey:
- k.x = nil
- case X509CertChainKey:
- k.x509CertChain = nil
- case X509CertThumbprintKey:
- k.x509CertThumbprint = nil
- case X509CertThumbprintS256Key:
- k.x509CertThumbprintS256 = nil
- case X509URLKey:
- k.x509URL = nil
- case ECDSAYKey:
- k.y = nil
- default:
- delete(k.privateParams, key)
- }
- return nil
- }
- func (k *ecdsaPrivateKey) Clone() (Key, error) {
- return cloneKey(k)
- }
- func (k *ecdsaPrivateKey) DecodeCtx() json.DecodeCtx {
- k.mu.RLock()
- defer k.mu.RUnlock()
- return k.dc
- }
- func (k *ecdsaPrivateKey) SetDecodeCtx(dc json.DecodeCtx) {
- k.mu.Lock()
- defer k.mu.Unlock()
- k.dc = dc
- }
- func (h *ecdsaPrivateKey) UnmarshalJSON(buf []byte) error {
- h.algorithm = nil
- h.crv = nil
- h.d = nil
- h.keyID = nil
- h.keyOps = nil
- h.keyUsage = nil
- h.x = nil
- h.x509CertChain = nil
- h.x509CertThumbprint = nil
- h.x509CertThumbprintS256 = nil
- h.x509URL = nil
- h.y = nil
- dec := json.NewDecoder(bytes.NewReader(buf))
- LOOP:
- for {
- tok, err := dec.Token()
- if err != nil {
- return errors.Wrap(err, `error reading token`)
- }
- switch tok := tok.(type) {
- case json.Delim:
- // Assuming we're doing everything correctly, we should ONLY
- // get either '{' or '}' here.
- if tok == '}' { // End of object
- break LOOP
- } else if tok != '{' {
- return errors.Errorf(`expected '{', but got '%c'`, tok)
- }
- case string: // Objects can only have string keys
- switch tok {
- case KeyTypeKey:
- val, err := json.ReadNextStringToken(dec)
- if err != nil {
- return errors.Wrap(err, `error reading token`)
- }
- if val != jwa.EC.String() {
- return errors.Errorf(`invalid kty value for RSAPublicKey (%s)`, val)
- }
- case AlgorithmKey:
- if err := json.AssignNextStringToken(&h.algorithm, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
- }
- case ECDSACrvKey:
- var decoded jwa.EllipticCurveAlgorithm
- if err := dec.Decode(&decoded); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSACrvKey)
- }
- h.crv = &decoded
- case ECDSADKey:
- if err := json.AssignNextBytesToken(&h.d, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSADKey)
- }
- case KeyIDKey:
- if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
- }
- case KeyOpsKey:
- var decoded KeyOperationList
- if err := dec.Decode(&decoded); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, KeyOpsKey)
- }
- h.keyOps = &decoded
- case KeyUsageKey:
- if err := json.AssignNextStringToken(&h.keyUsage, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, KeyUsageKey)
- }
- case ECDSAXKey:
- if err := json.AssignNextBytesToken(&h.x, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSAXKey)
- }
- case X509CertChainKey:
- var decoded CertificateChain
- if err := dec.Decode(&decoded); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
- }
- h.x509CertChain = &decoded
- case X509CertThumbprintKey:
- if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
- }
- case X509CertThumbprintS256Key:
- if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
- }
- case X509URLKey:
- if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
- }
- case ECDSAYKey:
- if err := json.AssignNextBytesToken(&h.y, dec); err != nil {
- return errors.Wrapf(err, `failed to decode value for key %s`, ECDSAYKey)
- }
- default:
- if dc := h.dc; dc != nil {
- if localReg := dc.Registry(); localReg != nil {
- decoded, err := localReg.Decode(dec, tok)
- if err == nil {
- h.setNoLock(tok, decoded)
- continue
- }
- }
- }
- decoded, err := registry.Decode(dec, tok)
- if err == nil {
- h.setNoLock(tok, decoded)
- continue
- }
- return errors.Wrapf(err, `could not decode field %s`, tok)
- }
- default:
- return errors.Errorf(`invalid token %T`, tok)
- }
- }
- if h.crv == nil {
- return errors.Errorf(`required field crv is missing`)
- }
- if h.d == nil {
- return errors.Errorf(`required field d is missing`)
- }
- if h.x == nil {
- return errors.Errorf(`required field x is missing`)
- }
- if h.y == nil {
- return errors.Errorf(`required field y is missing`)
- }
- return nil
- }
- func (h ecdsaPrivateKey) MarshalJSON() ([]byte, error) {
- data := make(map[string]interface{})
- fields := make([]string, 0, 12)
- for _, pair := range h.makePairs() {
- fields = append(fields, pair.Key.(string))
- data[pair.Key.(string)] = pair.Value
- }
- sort.Strings(fields)
- buf := pool.GetBytesBuffer()
- defer pool.ReleaseBytesBuffer(buf)
- buf.WriteByte('{')
- enc := json.NewEncoder(buf)
- for i, f := range fields {
- if i > 0 {
- buf.WriteRune(',')
- }
- buf.WriteRune('"')
- buf.WriteString(f)
- buf.WriteString(`":`)
- v := data[f]
- switch v := v.(type) {
- case []byte:
- buf.WriteRune('"')
- buf.WriteString(base64.EncodeToString(v))
- buf.WriteRune('"')
- default:
- if err := enc.Encode(v); err != nil {
- return nil, errors.Wrapf(err, `failed to encode value for field %s`, f)
- }
- buf.Truncate(buf.Len() - 1)
- }
- }
- buf.WriteByte('}')
- ret := make([]byte, buf.Len())
- copy(ret, buf.Bytes())
- return ret, nil
- }
- func (h *ecdsaPrivateKey) Iterate(ctx context.Context) HeaderIterator {
- pairs := h.makePairs()
- ch := make(chan *HeaderPair, len(pairs))
- go func(ctx context.Context, ch chan *HeaderPair, pairs []*HeaderPair) {
- defer close(ch)
- for _, pair := range pairs {
- select {
- case <-ctx.Done():
- return
- case ch <- pair:
- }
- }
- }(ctx, ch, pairs)
- return mapiter.New(ch)
- }
- func (h *ecdsaPrivateKey) Walk(ctx context.Context, visitor HeaderVisitor) error {
- return iter.WalkMap(ctx, h, visitor)
- }
- func (h *ecdsaPrivateKey) AsMap(ctx context.Context) (map[string]interface{}, error) {
- return iter.AsMap(ctx, h)
- }
|