symmetric_gen.go 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519
  1. // This file is auto-generated by jwk/internal/cmd/genheader/main.go. DO NOT EDIT
  2. package jwk
  3. import (
  4. "bytes"
  5. "context"
  6. "crypto/x509"
  7. "fmt"
  8. "sort"
  9. "sync"
  10. "github.com/lestrrat-go/iter/mapiter"
  11. "github.com/lestrrat-go/jwx/internal/base64"
  12. "github.com/lestrrat-go/jwx/internal/iter"
  13. "github.com/lestrrat-go/jwx/internal/json"
  14. "github.com/lestrrat-go/jwx/internal/pool"
  15. "github.com/lestrrat-go/jwx/jwa"
  16. "github.com/pkg/errors"
  17. )
  18. const (
  19. SymmetricOctetsKey = "k"
  20. )
  21. type SymmetricKey interface {
  22. Key
  23. FromRaw([]byte) error
  24. Octets() []byte
  25. }
  26. type symmetricKey struct {
  27. algorithm *string // https://tools.ietf.org/html/rfc7517#section-4.4
  28. keyID *string // https://tools.ietf.org/html/rfc7515#section-4.1.4
  29. keyOps *KeyOperationList // https://tools.ietf.org/html/rfc7517#section-4.3
  30. keyUsage *string // https://tools.ietf.org/html/rfc7517#section-4.2
  31. octets []byte
  32. x509CertChain *CertificateChain // https://tools.ietf.org/html/rfc7515#section-4.1.6
  33. x509CertThumbprint *string // https://tools.ietf.org/html/rfc7515#section-4.1.7
  34. x509CertThumbprintS256 *string // https://tools.ietf.org/html/rfc7515#section-4.1.8
  35. x509URL *string // https://tools.ietf.org/html/rfc7515#section-4.1.5
  36. privateParams map[string]interface{}
  37. mu *sync.RWMutex
  38. dc json.DecodeCtx
  39. }
  40. func NewSymmetricKey() SymmetricKey {
  41. return newSymmetricKey()
  42. }
  43. func newSymmetricKey() *symmetricKey {
  44. return &symmetricKey{
  45. mu: &sync.RWMutex{},
  46. privateParams: make(map[string]interface{}),
  47. }
  48. }
  49. func (h symmetricKey) KeyType() jwa.KeyType {
  50. return jwa.OctetSeq
  51. }
  52. func (h *symmetricKey) Algorithm() string {
  53. if h.algorithm != nil {
  54. return *(h.algorithm)
  55. }
  56. return ""
  57. }
  58. func (h *symmetricKey) KeyID() string {
  59. if h.keyID != nil {
  60. return *(h.keyID)
  61. }
  62. return ""
  63. }
  64. func (h *symmetricKey) KeyOps() KeyOperationList {
  65. if h.keyOps != nil {
  66. return *(h.keyOps)
  67. }
  68. return nil
  69. }
  70. func (h *symmetricKey) KeyUsage() string {
  71. if h.keyUsage != nil {
  72. return *(h.keyUsage)
  73. }
  74. return ""
  75. }
  76. func (h *symmetricKey) Octets() []byte {
  77. return h.octets
  78. }
  79. func (h *symmetricKey) X509CertChain() []*x509.Certificate {
  80. if h.x509CertChain != nil {
  81. return h.x509CertChain.Get()
  82. }
  83. return nil
  84. }
  85. func (h *symmetricKey) X509CertThumbprint() string {
  86. if h.x509CertThumbprint != nil {
  87. return *(h.x509CertThumbprint)
  88. }
  89. return ""
  90. }
  91. func (h *symmetricKey) X509CertThumbprintS256() string {
  92. if h.x509CertThumbprintS256 != nil {
  93. return *(h.x509CertThumbprintS256)
  94. }
  95. return ""
  96. }
  97. func (h *symmetricKey) X509URL() string {
  98. if h.x509URL != nil {
  99. return *(h.x509URL)
  100. }
  101. return ""
  102. }
  103. func (h *symmetricKey) makePairs() []*HeaderPair {
  104. h.mu.RLock()
  105. defer h.mu.RUnlock()
  106. var pairs []*HeaderPair
  107. pairs = append(pairs, &HeaderPair{Key: "kty", Value: jwa.OctetSeq})
  108. if h.algorithm != nil {
  109. pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
  110. }
  111. if h.keyID != nil {
  112. pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
  113. }
  114. if h.keyOps != nil {
  115. pairs = append(pairs, &HeaderPair{Key: KeyOpsKey, Value: *(h.keyOps)})
  116. }
  117. if h.keyUsage != nil {
  118. pairs = append(pairs, &HeaderPair{Key: KeyUsageKey, Value: *(h.keyUsage)})
  119. }
  120. if h.octets != nil {
  121. pairs = append(pairs, &HeaderPair{Key: SymmetricOctetsKey, Value: h.octets})
  122. }
  123. if h.x509CertChain != nil {
  124. pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: *(h.x509CertChain)})
  125. }
  126. if h.x509CertThumbprint != nil {
  127. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
  128. }
  129. if h.x509CertThumbprintS256 != nil {
  130. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
  131. }
  132. if h.x509URL != nil {
  133. pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
  134. }
  135. for k, v := range h.privateParams {
  136. pairs = append(pairs, &HeaderPair{Key: k, Value: v})
  137. }
  138. return pairs
  139. }
  140. func (h *symmetricKey) PrivateParams() map[string]interface{} {
  141. return h.privateParams
  142. }
  143. func (h *symmetricKey) Get(name string) (interface{}, bool) {
  144. h.mu.RLock()
  145. defer h.mu.RUnlock()
  146. switch name {
  147. case KeyTypeKey:
  148. return h.KeyType(), true
  149. case AlgorithmKey:
  150. if h.algorithm == nil {
  151. return nil, false
  152. }
  153. return *(h.algorithm), true
  154. case KeyIDKey:
  155. if h.keyID == nil {
  156. return nil, false
  157. }
  158. return *(h.keyID), true
  159. case KeyOpsKey:
  160. if h.keyOps == nil {
  161. return nil, false
  162. }
  163. return *(h.keyOps), true
  164. case KeyUsageKey:
  165. if h.keyUsage == nil {
  166. return nil, false
  167. }
  168. return *(h.keyUsage), true
  169. case SymmetricOctetsKey:
  170. if h.octets == nil {
  171. return nil, false
  172. }
  173. return h.octets, true
  174. case X509CertChainKey:
  175. if h.x509CertChain == nil {
  176. return nil, false
  177. }
  178. return h.x509CertChain.Get(), true
  179. case X509CertThumbprintKey:
  180. if h.x509CertThumbprint == nil {
  181. return nil, false
  182. }
  183. return *(h.x509CertThumbprint), true
  184. case X509CertThumbprintS256Key:
  185. if h.x509CertThumbprintS256 == nil {
  186. return nil, false
  187. }
  188. return *(h.x509CertThumbprintS256), true
  189. case X509URLKey:
  190. if h.x509URL == nil {
  191. return nil, false
  192. }
  193. return *(h.x509URL), true
  194. default:
  195. v, ok := h.privateParams[name]
  196. return v, ok
  197. }
  198. }
  199. func (h *symmetricKey) Set(name string, value interface{}) error {
  200. h.mu.Lock()
  201. defer h.mu.Unlock()
  202. return h.setNoLock(name, value)
  203. }
  204. func (h *symmetricKey) setNoLock(name string, value interface{}) error {
  205. switch name {
  206. case "kty":
  207. return nil
  208. case AlgorithmKey:
  209. switch v := value.(type) {
  210. case string:
  211. h.algorithm = &v
  212. case fmt.Stringer:
  213. tmp := v.String()
  214. h.algorithm = &tmp
  215. default:
  216. return errors.Errorf(`invalid type for %s key: %T`, AlgorithmKey, value)
  217. }
  218. return nil
  219. case KeyIDKey:
  220. if v, ok := value.(string); ok {
  221. h.keyID = &v
  222. return nil
  223. }
  224. return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
  225. case KeyOpsKey:
  226. var acceptor KeyOperationList
  227. if err := acceptor.Accept(value); err != nil {
  228. return errors.Wrapf(err, `invalid value for %s key`, KeyOpsKey)
  229. }
  230. h.keyOps = &acceptor
  231. return nil
  232. case KeyUsageKey:
  233. switch v := value.(type) {
  234. case KeyUsageType:
  235. switch v {
  236. case ForSignature, ForEncryption:
  237. tmp := v.String()
  238. h.keyUsage = &tmp
  239. default:
  240. return errors.Errorf(`invalid key usage type %s`, v)
  241. }
  242. case string:
  243. h.keyUsage = &v
  244. default:
  245. return errors.Errorf(`invalid key usage type %s`, v)
  246. }
  247. case SymmetricOctetsKey:
  248. if v, ok := value.([]byte); ok {
  249. h.octets = v
  250. return nil
  251. }
  252. return errors.Errorf(`invalid value for %s key: %T`, SymmetricOctetsKey, value)
  253. case X509CertChainKey:
  254. var acceptor CertificateChain
  255. if err := acceptor.Accept(value); err != nil {
  256. return errors.Wrapf(err, `invalid value for %s key`, X509CertChainKey)
  257. }
  258. h.x509CertChain = &acceptor
  259. return nil
  260. case X509CertThumbprintKey:
  261. if v, ok := value.(string); ok {
  262. h.x509CertThumbprint = &v
  263. return nil
  264. }
  265. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
  266. case X509CertThumbprintS256Key:
  267. if v, ok := value.(string); ok {
  268. h.x509CertThumbprintS256 = &v
  269. return nil
  270. }
  271. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
  272. case X509URLKey:
  273. if v, ok := value.(string); ok {
  274. h.x509URL = &v
  275. return nil
  276. }
  277. return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
  278. default:
  279. if h.privateParams == nil {
  280. h.privateParams = map[string]interface{}{}
  281. }
  282. h.privateParams[name] = value
  283. }
  284. return nil
  285. }
  286. func (k *symmetricKey) Remove(key string) error {
  287. k.mu.Lock()
  288. defer k.mu.Unlock()
  289. switch key {
  290. case AlgorithmKey:
  291. k.algorithm = nil
  292. case KeyIDKey:
  293. k.keyID = nil
  294. case KeyOpsKey:
  295. k.keyOps = nil
  296. case KeyUsageKey:
  297. k.keyUsage = nil
  298. case SymmetricOctetsKey:
  299. k.octets = nil
  300. case X509CertChainKey:
  301. k.x509CertChain = nil
  302. case X509CertThumbprintKey:
  303. k.x509CertThumbprint = nil
  304. case X509CertThumbprintS256Key:
  305. k.x509CertThumbprintS256 = nil
  306. case X509URLKey:
  307. k.x509URL = nil
  308. default:
  309. delete(k.privateParams, key)
  310. }
  311. return nil
  312. }
  313. func (k *symmetricKey) Clone() (Key, error) {
  314. return cloneKey(k)
  315. }
  316. func (k *symmetricKey) DecodeCtx() json.DecodeCtx {
  317. k.mu.RLock()
  318. defer k.mu.RUnlock()
  319. return k.dc
  320. }
  321. func (k *symmetricKey) SetDecodeCtx(dc json.DecodeCtx) {
  322. k.mu.Lock()
  323. defer k.mu.Unlock()
  324. k.dc = dc
  325. }
  326. func (h *symmetricKey) UnmarshalJSON(buf []byte) error {
  327. h.algorithm = nil
  328. h.keyID = nil
  329. h.keyOps = nil
  330. h.keyUsage = nil
  331. h.octets = nil
  332. h.x509CertChain = nil
  333. h.x509CertThumbprint = nil
  334. h.x509CertThumbprintS256 = nil
  335. h.x509URL = nil
  336. dec := json.NewDecoder(bytes.NewReader(buf))
  337. LOOP:
  338. for {
  339. tok, err := dec.Token()
  340. if err != nil {
  341. return errors.Wrap(err, `error reading token`)
  342. }
  343. switch tok := tok.(type) {
  344. case json.Delim:
  345. // Assuming we're doing everything correctly, we should ONLY
  346. // get either '{' or '}' here.
  347. if tok == '}' { // End of object
  348. break LOOP
  349. } else if tok != '{' {
  350. return errors.Errorf(`expected '{', but got '%c'`, tok)
  351. }
  352. case string: // Objects can only have string keys
  353. switch tok {
  354. case KeyTypeKey:
  355. val, err := json.ReadNextStringToken(dec)
  356. if err != nil {
  357. return errors.Wrap(err, `error reading token`)
  358. }
  359. if val != jwa.OctetSeq.String() {
  360. return errors.Errorf(`invalid kty value for RSAPublicKey (%s)`, val)
  361. }
  362. case AlgorithmKey:
  363. if err := json.AssignNextStringToken(&h.algorithm, dec); err != nil {
  364. return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
  365. }
  366. case KeyIDKey:
  367. if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
  368. return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
  369. }
  370. case KeyOpsKey:
  371. var decoded KeyOperationList
  372. if err := dec.Decode(&decoded); err != nil {
  373. return errors.Wrapf(err, `failed to decode value for key %s`, KeyOpsKey)
  374. }
  375. h.keyOps = &decoded
  376. case KeyUsageKey:
  377. if err := json.AssignNextStringToken(&h.keyUsage, dec); err != nil {
  378. return errors.Wrapf(err, `failed to decode value for key %s`, KeyUsageKey)
  379. }
  380. case SymmetricOctetsKey:
  381. if err := json.AssignNextBytesToken(&h.octets, dec); err != nil {
  382. return errors.Wrapf(err, `failed to decode value for key %s`, SymmetricOctetsKey)
  383. }
  384. case X509CertChainKey:
  385. var decoded CertificateChain
  386. if err := dec.Decode(&decoded); err != nil {
  387. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
  388. }
  389. h.x509CertChain = &decoded
  390. case X509CertThumbprintKey:
  391. if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
  392. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
  393. }
  394. case X509CertThumbprintS256Key:
  395. if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
  396. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
  397. }
  398. case X509URLKey:
  399. if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
  400. return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
  401. }
  402. default:
  403. if dc := h.dc; dc != nil {
  404. if localReg := dc.Registry(); localReg != nil {
  405. decoded, err := localReg.Decode(dec, tok)
  406. if err == nil {
  407. h.setNoLock(tok, decoded)
  408. continue
  409. }
  410. }
  411. }
  412. decoded, err := registry.Decode(dec, tok)
  413. if err == nil {
  414. h.setNoLock(tok, decoded)
  415. continue
  416. }
  417. return errors.Wrapf(err, `could not decode field %s`, tok)
  418. }
  419. default:
  420. return errors.Errorf(`invalid token %T`, tok)
  421. }
  422. }
  423. if h.octets == nil {
  424. return errors.Errorf(`required field k is missing`)
  425. }
  426. return nil
  427. }
  428. func (h symmetricKey) MarshalJSON() ([]byte, error) {
  429. data := make(map[string]interface{})
  430. fields := make([]string, 0, 9)
  431. for _, pair := range h.makePairs() {
  432. fields = append(fields, pair.Key.(string))
  433. data[pair.Key.(string)] = pair.Value
  434. }
  435. sort.Strings(fields)
  436. buf := pool.GetBytesBuffer()
  437. defer pool.ReleaseBytesBuffer(buf)
  438. buf.WriteByte('{')
  439. enc := json.NewEncoder(buf)
  440. for i, f := range fields {
  441. if i > 0 {
  442. buf.WriteRune(',')
  443. }
  444. buf.WriteRune('"')
  445. buf.WriteString(f)
  446. buf.WriteString(`":`)
  447. v := data[f]
  448. switch v := v.(type) {
  449. case []byte:
  450. buf.WriteRune('"')
  451. buf.WriteString(base64.EncodeToString(v))
  452. buf.WriteRune('"')
  453. default:
  454. if err := enc.Encode(v); err != nil {
  455. return nil, errors.Wrapf(err, `failed to encode value for field %s`, f)
  456. }
  457. buf.Truncate(buf.Len() - 1)
  458. }
  459. }
  460. buf.WriteByte('}')
  461. ret := make([]byte, buf.Len())
  462. copy(ret, buf.Bytes())
  463. return ret, nil
  464. }
  465. func (h *symmetricKey) Iterate(ctx context.Context) HeaderIterator {
  466. pairs := h.makePairs()
  467. ch := make(chan *HeaderPair, len(pairs))
  468. go func(ctx context.Context, ch chan *HeaderPair, pairs []*HeaderPair) {
  469. defer close(ch)
  470. for _, pair := range pairs {
  471. select {
  472. case <-ctx.Done():
  473. return
  474. case ch <- pair:
  475. }
  476. }
  477. }(ctx, ch, pairs)
  478. return mapiter.New(ch)
  479. }
  480. func (h *symmetricKey) Walk(ctx context.Context, visitor HeaderVisitor) error {
  481. return iter.WalkMap(ctx, h, visitor)
  482. }
  483. func (h *symmetricKey) AsMap(ctx context.Context) (map[string]interface{}, error) {
  484. return iter.AsMap(ctx, h)
  485. }