headers_gen.go 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714
  1. // This file is auto-generated by jwe/internal/cmd/genheaders/main.go. DO NOT EDIT
  2. package jwe
  3. import (
  4. "bytes"
  5. "context"
  6. "sort"
  7. "sync"
  8. "github.com/lestrrat-go/jwx/internal/base64"
  9. "github.com/lestrrat-go/jwx/internal/json"
  10. "github.com/lestrrat-go/jwx/internal/pool"
  11. "github.com/lestrrat-go/jwx/jwa"
  12. "github.com/lestrrat-go/jwx/jwk"
  13. "github.com/pkg/errors"
  14. )
  15. const (
  16. AgreementPartyUInfoKey = "apu"
  17. AgreementPartyVInfoKey = "apv"
  18. AlgorithmKey = "alg"
  19. CompressionKey = "zip"
  20. ContentEncryptionKey = "enc"
  21. ContentTypeKey = "cty"
  22. CriticalKey = "crit"
  23. EphemeralPublicKeyKey = "epk"
  24. JWKKey = "jwk"
  25. JWKSetURLKey = "jku"
  26. KeyIDKey = "kid"
  27. TypeKey = "typ"
  28. X509CertChainKey = "x5c"
  29. X509CertThumbprintKey = "x5t"
  30. X509CertThumbprintS256Key = "x5t#S256"
  31. X509URLKey = "x5u"
  32. )
  33. // Headers describe a standard Header set.
  34. type Headers interface {
  35. json.Marshaler
  36. json.Unmarshaler
  37. AgreementPartyUInfo() []byte
  38. AgreementPartyVInfo() []byte
  39. Algorithm() jwa.KeyEncryptionAlgorithm
  40. Compression() jwa.CompressionAlgorithm
  41. ContentEncryption() jwa.ContentEncryptionAlgorithm
  42. ContentType() string
  43. Critical() []string
  44. EphemeralPublicKey() jwk.Key
  45. JWK() jwk.Key
  46. JWKSetURL() string
  47. KeyID() string
  48. Type() string
  49. X509CertChain() []string
  50. X509CertThumbprint() string
  51. X509CertThumbprintS256() string
  52. X509URL() string
  53. Iterate(ctx context.Context) Iterator
  54. Walk(ctx context.Context, v Visitor) error
  55. AsMap(ctx context.Context) (map[string]interface{}, error)
  56. Get(string) (interface{}, bool)
  57. Set(string, interface{}) error
  58. Remove(string) error
  59. Encode() ([]byte, error)
  60. Decode([]byte) error
  61. // PrivateParams returns the map containing the non-standard ('private') parameters
  62. // in the associated header. WARNING: DO NOT USE PrivateParams()
  63. // IF YOU HAVE CONCURRENT CODE ACCESSING THEM. Use AsMap() to
  64. // get a copy of the entire header instead
  65. PrivateParams() map[string]interface{}
  66. Clone(context.Context) (Headers, error)
  67. Copy(context.Context, Headers) error
  68. Merge(context.Context, Headers) (Headers, error)
  69. }
  70. type stdHeaders struct {
  71. agreementPartyUInfo []byte
  72. agreementPartyVInfo []byte
  73. algorithm *jwa.KeyEncryptionAlgorithm
  74. compression *jwa.CompressionAlgorithm
  75. contentEncryption *jwa.ContentEncryptionAlgorithm
  76. contentType *string
  77. critical []string
  78. ephemeralPublicKey jwk.Key
  79. jwk jwk.Key
  80. jwkSetURL *string
  81. keyID *string
  82. typ *string
  83. x509CertChain []string
  84. x509CertThumbprint *string
  85. x509CertThumbprintS256 *string
  86. x509URL *string
  87. privateParams map[string]interface{}
  88. mu *sync.RWMutex
  89. }
  90. func NewHeaders() Headers {
  91. return &stdHeaders{
  92. mu: &sync.RWMutex{},
  93. privateParams: map[string]interface{}{},
  94. }
  95. }
  96. func (h *stdHeaders) AgreementPartyUInfo() []byte {
  97. h.mu.RLock()
  98. defer h.mu.RUnlock()
  99. return h.agreementPartyUInfo
  100. }
  101. func (h *stdHeaders) AgreementPartyVInfo() []byte {
  102. h.mu.RLock()
  103. defer h.mu.RUnlock()
  104. return h.agreementPartyVInfo
  105. }
  106. func (h *stdHeaders) Algorithm() jwa.KeyEncryptionAlgorithm {
  107. h.mu.RLock()
  108. defer h.mu.RUnlock()
  109. if h.algorithm == nil {
  110. return ""
  111. }
  112. return *(h.algorithm)
  113. }
  114. func (h *stdHeaders) Compression() jwa.CompressionAlgorithm {
  115. h.mu.RLock()
  116. defer h.mu.RUnlock()
  117. if h.compression == nil {
  118. return jwa.NoCompress
  119. }
  120. return *(h.compression)
  121. }
  122. func (h *stdHeaders) ContentEncryption() jwa.ContentEncryptionAlgorithm {
  123. h.mu.RLock()
  124. defer h.mu.RUnlock()
  125. if h.contentEncryption == nil {
  126. return ""
  127. }
  128. return *(h.contentEncryption)
  129. }
  130. func (h *stdHeaders) ContentType() string {
  131. h.mu.RLock()
  132. defer h.mu.RUnlock()
  133. if h.contentType == nil {
  134. return ""
  135. }
  136. return *(h.contentType)
  137. }
  138. func (h *stdHeaders) Critical() []string {
  139. h.mu.RLock()
  140. defer h.mu.RUnlock()
  141. return h.critical
  142. }
  143. func (h *stdHeaders) EphemeralPublicKey() jwk.Key {
  144. h.mu.RLock()
  145. defer h.mu.RUnlock()
  146. return h.ephemeralPublicKey
  147. }
  148. func (h *stdHeaders) JWK() jwk.Key {
  149. h.mu.RLock()
  150. defer h.mu.RUnlock()
  151. return h.jwk
  152. }
  153. func (h *stdHeaders) JWKSetURL() string {
  154. h.mu.RLock()
  155. defer h.mu.RUnlock()
  156. if h.jwkSetURL == nil {
  157. return ""
  158. }
  159. return *(h.jwkSetURL)
  160. }
  161. func (h *stdHeaders) KeyID() string {
  162. h.mu.RLock()
  163. defer h.mu.RUnlock()
  164. if h.keyID == nil {
  165. return ""
  166. }
  167. return *(h.keyID)
  168. }
  169. func (h *stdHeaders) Type() string {
  170. h.mu.RLock()
  171. defer h.mu.RUnlock()
  172. if h.typ == nil {
  173. return ""
  174. }
  175. return *(h.typ)
  176. }
  177. func (h *stdHeaders) X509CertChain() []string {
  178. h.mu.RLock()
  179. defer h.mu.RUnlock()
  180. return h.x509CertChain
  181. }
  182. func (h *stdHeaders) X509CertThumbprint() string {
  183. h.mu.RLock()
  184. defer h.mu.RUnlock()
  185. if h.x509CertThumbprint == nil {
  186. return ""
  187. }
  188. return *(h.x509CertThumbprint)
  189. }
  190. func (h *stdHeaders) X509CertThumbprintS256() string {
  191. h.mu.RLock()
  192. defer h.mu.RUnlock()
  193. if h.x509CertThumbprintS256 == nil {
  194. return ""
  195. }
  196. return *(h.x509CertThumbprintS256)
  197. }
  198. func (h *stdHeaders) X509URL() string {
  199. h.mu.RLock()
  200. defer h.mu.RUnlock()
  201. if h.x509URL == nil {
  202. return ""
  203. }
  204. return *(h.x509URL)
  205. }
  206. func (h *stdHeaders) makePairs() []*HeaderPair {
  207. h.mu.RLock()
  208. defer h.mu.RUnlock()
  209. var pairs []*HeaderPair
  210. if h.agreementPartyUInfo != nil {
  211. pairs = append(pairs, &HeaderPair{Key: AgreementPartyUInfoKey, Value: h.agreementPartyUInfo})
  212. }
  213. if h.agreementPartyVInfo != nil {
  214. pairs = append(pairs, &HeaderPair{Key: AgreementPartyVInfoKey, Value: h.agreementPartyVInfo})
  215. }
  216. if h.algorithm != nil {
  217. pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
  218. }
  219. if h.compression != nil {
  220. pairs = append(pairs, &HeaderPair{Key: CompressionKey, Value: *(h.compression)})
  221. }
  222. if h.contentEncryption != nil {
  223. pairs = append(pairs, &HeaderPair{Key: ContentEncryptionKey, Value: *(h.contentEncryption)})
  224. }
  225. if h.contentType != nil {
  226. pairs = append(pairs, &HeaderPair{Key: ContentTypeKey, Value: *(h.contentType)})
  227. }
  228. if h.critical != nil {
  229. pairs = append(pairs, &HeaderPair{Key: CriticalKey, Value: h.critical})
  230. }
  231. if h.ephemeralPublicKey != nil {
  232. pairs = append(pairs, &HeaderPair{Key: EphemeralPublicKeyKey, Value: h.ephemeralPublicKey})
  233. }
  234. if h.jwk != nil {
  235. pairs = append(pairs, &HeaderPair{Key: JWKKey, Value: h.jwk})
  236. }
  237. if h.jwkSetURL != nil {
  238. pairs = append(pairs, &HeaderPair{Key: JWKSetURLKey, Value: *(h.jwkSetURL)})
  239. }
  240. if h.keyID != nil {
  241. pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
  242. }
  243. if h.typ != nil {
  244. pairs = append(pairs, &HeaderPair{Key: TypeKey, Value: *(h.typ)})
  245. }
  246. if h.x509CertChain != nil {
  247. pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: h.x509CertChain})
  248. }
  249. if h.x509CertThumbprint != nil {
  250. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
  251. }
  252. if h.x509CertThumbprintS256 != nil {
  253. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
  254. }
  255. if h.x509URL != nil {
  256. pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
  257. }
  258. for k, v := range h.privateParams {
  259. pairs = append(pairs, &HeaderPair{Key: k, Value: v})
  260. }
  261. return pairs
  262. }
  263. func (h *stdHeaders) PrivateParams() map[string]interface{} {
  264. h.mu.RLock()
  265. defer h.mu.RUnlock()
  266. return h.privateParams
  267. }
  268. func (h *stdHeaders) Get(name string) (interface{}, bool) {
  269. h.mu.RLock()
  270. defer h.mu.RUnlock()
  271. switch name {
  272. case AgreementPartyUInfoKey:
  273. if h.agreementPartyUInfo == nil {
  274. return nil, false
  275. }
  276. return h.agreementPartyUInfo, true
  277. case AgreementPartyVInfoKey:
  278. if h.agreementPartyVInfo == nil {
  279. return nil, false
  280. }
  281. return h.agreementPartyVInfo, true
  282. case AlgorithmKey:
  283. if h.algorithm == nil {
  284. return nil, false
  285. }
  286. return *(h.algorithm), true
  287. case CompressionKey:
  288. if h.compression == nil {
  289. return nil, false
  290. }
  291. return *(h.compression), true
  292. case ContentEncryptionKey:
  293. if h.contentEncryption == nil {
  294. return nil, false
  295. }
  296. return *(h.contentEncryption), true
  297. case ContentTypeKey:
  298. if h.contentType == nil {
  299. return nil, false
  300. }
  301. return *(h.contentType), true
  302. case CriticalKey:
  303. if h.critical == nil {
  304. return nil, false
  305. }
  306. return h.critical, true
  307. case EphemeralPublicKeyKey:
  308. if h.ephemeralPublicKey == nil {
  309. return nil, false
  310. }
  311. return h.ephemeralPublicKey, true
  312. case JWKKey:
  313. if h.jwk == nil {
  314. return nil, false
  315. }
  316. return h.jwk, true
  317. case JWKSetURLKey:
  318. if h.jwkSetURL == nil {
  319. return nil, false
  320. }
  321. return *(h.jwkSetURL), true
  322. case KeyIDKey:
  323. if h.keyID == nil {
  324. return nil, false
  325. }
  326. return *(h.keyID), true
  327. case TypeKey:
  328. if h.typ == nil {
  329. return nil, false
  330. }
  331. return *(h.typ), true
  332. case X509CertChainKey:
  333. if h.x509CertChain == nil {
  334. return nil, false
  335. }
  336. return h.x509CertChain, true
  337. case X509CertThumbprintKey:
  338. if h.x509CertThumbprint == nil {
  339. return nil, false
  340. }
  341. return *(h.x509CertThumbprint), true
  342. case X509CertThumbprintS256Key:
  343. if h.x509CertThumbprintS256 == nil {
  344. return nil, false
  345. }
  346. return *(h.x509CertThumbprintS256), true
  347. case X509URLKey:
  348. if h.x509URL == nil {
  349. return nil, false
  350. }
  351. return *(h.x509URL), true
  352. default:
  353. v, ok := h.privateParams[name]
  354. return v, ok
  355. }
  356. }
  357. func (h *stdHeaders) Set(name string, value interface{}) error {
  358. h.mu.Lock()
  359. defer h.mu.Unlock()
  360. return h.setNoLock(name, value)
  361. }
  362. func (h *stdHeaders) setNoLock(name string, value interface{}) error {
  363. switch name {
  364. case AgreementPartyUInfoKey:
  365. if v, ok := value.([]byte); ok {
  366. h.agreementPartyUInfo = v
  367. return nil
  368. }
  369. return errors.Errorf(`invalid value for %s key: %T`, AgreementPartyUInfoKey, value)
  370. case AgreementPartyVInfoKey:
  371. if v, ok := value.([]byte); ok {
  372. h.agreementPartyVInfo = v
  373. return nil
  374. }
  375. return errors.Errorf(`invalid value for %s key: %T`, AgreementPartyVInfoKey, value)
  376. case AlgorithmKey:
  377. if v, ok := value.(jwa.KeyEncryptionAlgorithm); ok {
  378. h.algorithm = &v
  379. return nil
  380. }
  381. return errors.Errorf(`invalid value for %s key: %T`, AlgorithmKey, value)
  382. case CompressionKey:
  383. if v, ok := value.(jwa.CompressionAlgorithm); ok {
  384. h.compression = &v
  385. return nil
  386. }
  387. return errors.Errorf(`invalid value for %s key: %T`, CompressionKey, value)
  388. case ContentEncryptionKey:
  389. if v, ok := value.(jwa.ContentEncryptionAlgorithm); ok {
  390. if v == "" {
  391. return errors.New(`"enc" field cannot be an empty string`)
  392. }
  393. h.contentEncryption = &v
  394. return nil
  395. }
  396. return errors.Errorf(`invalid value for %s key: %T`, ContentEncryptionKey, value)
  397. case ContentTypeKey:
  398. if v, ok := value.(string); ok {
  399. h.contentType = &v
  400. return nil
  401. }
  402. return errors.Errorf(`invalid value for %s key: %T`, ContentTypeKey, value)
  403. case CriticalKey:
  404. if v, ok := value.([]string); ok {
  405. h.critical = v
  406. return nil
  407. }
  408. return errors.Errorf(`invalid value for %s key: %T`, CriticalKey, value)
  409. case EphemeralPublicKeyKey:
  410. if v, ok := value.(jwk.Key); ok {
  411. h.ephemeralPublicKey = v
  412. return nil
  413. }
  414. return errors.Errorf(`invalid value for %s key: %T`, EphemeralPublicKeyKey, value)
  415. case JWKKey:
  416. if v, ok := value.(jwk.Key); ok {
  417. h.jwk = v
  418. return nil
  419. }
  420. return errors.Errorf(`invalid value for %s key: %T`, JWKKey, value)
  421. case JWKSetURLKey:
  422. if v, ok := value.(string); ok {
  423. h.jwkSetURL = &v
  424. return nil
  425. }
  426. return errors.Errorf(`invalid value for %s key: %T`, JWKSetURLKey, value)
  427. case KeyIDKey:
  428. if v, ok := value.(string); ok {
  429. h.keyID = &v
  430. return nil
  431. }
  432. return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
  433. case TypeKey:
  434. if v, ok := value.(string); ok {
  435. h.typ = &v
  436. return nil
  437. }
  438. return errors.Errorf(`invalid value for %s key: %T`, TypeKey, value)
  439. case X509CertChainKey:
  440. if v, ok := value.([]string); ok {
  441. h.x509CertChain = v
  442. return nil
  443. }
  444. return errors.Errorf(`invalid value for %s key: %T`, X509CertChainKey, value)
  445. case X509CertThumbprintKey:
  446. if v, ok := value.(string); ok {
  447. h.x509CertThumbprint = &v
  448. return nil
  449. }
  450. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
  451. case X509CertThumbprintS256Key:
  452. if v, ok := value.(string); ok {
  453. h.x509CertThumbprintS256 = &v
  454. return nil
  455. }
  456. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
  457. case X509URLKey:
  458. if v, ok := value.(string); ok {
  459. h.x509URL = &v
  460. return nil
  461. }
  462. return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
  463. default:
  464. if h.privateParams == nil {
  465. h.privateParams = map[string]interface{}{}
  466. }
  467. h.privateParams[name] = value
  468. }
  469. return nil
  470. }
  471. func (h *stdHeaders) Remove(key string) error {
  472. h.mu.Lock()
  473. defer h.mu.Unlock()
  474. switch key {
  475. case AgreementPartyUInfoKey:
  476. h.agreementPartyUInfo = nil
  477. case AgreementPartyVInfoKey:
  478. h.agreementPartyVInfo = nil
  479. case AlgorithmKey:
  480. h.algorithm = nil
  481. case CompressionKey:
  482. h.compression = nil
  483. case ContentEncryptionKey:
  484. h.contentEncryption = nil
  485. case ContentTypeKey:
  486. h.contentType = nil
  487. case CriticalKey:
  488. h.critical = nil
  489. case EphemeralPublicKeyKey:
  490. h.ephemeralPublicKey = nil
  491. case JWKKey:
  492. h.jwk = nil
  493. case JWKSetURLKey:
  494. h.jwkSetURL = nil
  495. case KeyIDKey:
  496. h.keyID = nil
  497. case TypeKey:
  498. h.typ = nil
  499. case X509CertChainKey:
  500. h.x509CertChain = nil
  501. case X509CertThumbprintKey:
  502. h.x509CertThumbprint = nil
  503. case X509CertThumbprintS256Key:
  504. h.x509CertThumbprintS256 = nil
  505. case X509URLKey:
  506. h.x509URL = nil
  507. default:
  508. delete(h.privateParams, key)
  509. }
  510. return nil
  511. }
  512. func (h *stdHeaders) UnmarshalJSON(buf []byte) error {
  513. h.agreementPartyUInfo = nil
  514. h.agreementPartyVInfo = nil
  515. h.algorithm = nil
  516. h.compression = nil
  517. h.contentEncryption = nil
  518. h.contentType = nil
  519. h.critical = nil
  520. h.ephemeralPublicKey = nil
  521. h.jwk = nil
  522. h.jwkSetURL = nil
  523. h.keyID = nil
  524. h.typ = nil
  525. h.x509CertChain = nil
  526. h.x509CertThumbprint = nil
  527. h.x509CertThumbprintS256 = nil
  528. h.x509URL = nil
  529. dec := json.NewDecoder(bytes.NewReader(buf))
  530. LOOP:
  531. for {
  532. tok, err := dec.Token()
  533. if err != nil {
  534. return errors.Wrap(err, `error reading token`)
  535. }
  536. switch tok := tok.(type) {
  537. case json.Delim:
  538. // Assuming we're doing everything correctly, we should ONLY
  539. // get either '{' or '}' here.
  540. if tok == '}' { // End of object
  541. break LOOP
  542. } else if tok != '{' {
  543. return errors.Errorf(`expected '{', but got '%c'`, tok)
  544. }
  545. case string: // Objects can only have string keys
  546. switch tok {
  547. case AgreementPartyUInfoKey:
  548. if err := json.AssignNextBytesToken(&h.agreementPartyUInfo, dec); err != nil {
  549. return errors.Wrapf(err, `failed to decode value for key %s`, AgreementPartyUInfoKey)
  550. }
  551. case AgreementPartyVInfoKey:
  552. if err := json.AssignNextBytesToken(&h.agreementPartyVInfo, dec); err != nil {
  553. return errors.Wrapf(err, `failed to decode value for key %s`, AgreementPartyVInfoKey)
  554. }
  555. case AlgorithmKey:
  556. var decoded jwa.KeyEncryptionAlgorithm
  557. if err := dec.Decode(&decoded); err != nil {
  558. return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
  559. }
  560. h.algorithm = &decoded
  561. case CompressionKey:
  562. var decoded jwa.CompressionAlgorithm
  563. if err := dec.Decode(&decoded); err != nil {
  564. return errors.Wrapf(err, `failed to decode value for key %s`, CompressionKey)
  565. }
  566. h.compression = &decoded
  567. case ContentEncryptionKey:
  568. var decoded jwa.ContentEncryptionAlgorithm
  569. if err := dec.Decode(&decoded); err != nil {
  570. return errors.Wrapf(err, `failed to decode value for key %s`, ContentEncryptionKey)
  571. }
  572. h.contentEncryption = &decoded
  573. case ContentTypeKey:
  574. if err := json.AssignNextStringToken(&h.contentType, dec); err != nil {
  575. return errors.Wrapf(err, `failed to decode value for key %s`, ContentTypeKey)
  576. }
  577. case CriticalKey:
  578. var decoded []string
  579. if err := dec.Decode(&decoded); err != nil {
  580. return errors.Wrapf(err, `failed to decode value for key %s`, CriticalKey)
  581. }
  582. h.critical = decoded
  583. case EphemeralPublicKeyKey:
  584. var buf json.RawMessage
  585. if err := dec.Decode(&buf); err != nil {
  586. return errors.Wrapf(err, `failed to decode value for key %s`, EphemeralPublicKeyKey)
  587. }
  588. key, err := jwk.ParseKey(buf)
  589. if err != nil {
  590. return errors.Wrapf(err, `failed to parse JWK for key %s`, EphemeralPublicKeyKey)
  591. }
  592. h.ephemeralPublicKey = key
  593. case JWKKey:
  594. var buf json.RawMessage
  595. if err := dec.Decode(&buf); err != nil {
  596. return errors.Wrapf(err, `failed to decode value for key %s`, JWKKey)
  597. }
  598. key, err := jwk.ParseKey(buf)
  599. if err != nil {
  600. return errors.Wrapf(err, `failed to parse JWK for key %s`, JWKKey)
  601. }
  602. h.jwk = key
  603. case JWKSetURLKey:
  604. if err := json.AssignNextStringToken(&h.jwkSetURL, dec); err != nil {
  605. return errors.Wrapf(err, `failed to decode value for key %s`, JWKSetURLKey)
  606. }
  607. case KeyIDKey:
  608. if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
  609. return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
  610. }
  611. case TypeKey:
  612. if err := json.AssignNextStringToken(&h.typ, dec); err != nil {
  613. return errors.Wrapf(err, `failed to decode value for key %s`, TypeKey)
  614. }
  615. case X509CertChainKey:
  616. var decoded []string
  617. if err := dec.Decode(&decoded); err != nil {
  618. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
  619. }
  620. h.x509CertChain = decoded
  621. case X509CertThumbprintKey:
  622. if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
  623. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
  624. }
  625. case X509CertThumbprintS256Key:
  626. if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
  627. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
  628. }
  629. case X509URLKey:
  630. if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
  631. return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
  632. }
  633. default:
  634. decoded, err := registry.Decode(dec, tok)
  635. if err != nil {
  636. return err
  637. }
  638. h.setNoLock(tok, decoded)
  639. }
  640. default:
  641. return errors.Errorf(`invalid token %T`, tok)
  642. }
  643. }
  644. return nil
  645. }
  646. func (h stdHeaders) MarshalJSON() ([]byte, error) {
  647. data := make(map[string]interface{})
  648. fields := make([]string, 0, 16)
  649. for _, pair := range h.makePairs() {
  650. fields = append(fields, pair.Key.(string))
  651. data[pair.Key.(string)] = pair.Value
  652. }
  653. sort.Strings(fields)
  654. buf := pool.GetBytesBuffer()
  655. defer pool.ReleaseBytesBuffer(buf)
  656. buf.WriteByte('{')
  657. enc := json.NewEncoder(buf)
  658. for i, f := range fields {
  659. if i > 0 {
  660. buf.WriteRune(',')
  661. }
  662. buf.WriteRune('"')
  663. buf.WriteString(f)
  664. buf.WriteString(`":`)
  665. v := data[f]
  666. switch v := v.(type) {
  667. case []byte:
  668. buf.WriteRune('"')
  669. buf.WriteString(base64.EncodeToString(v))
  670. buf.WriteRune('"')
  671. default:
  672. if err := enc.Encode(v); err != nil {
  673. errors.Errorf(`failed to encode value for field %s`, f)
  674. }
  675. buf.Truncate(buf.Len() - 1)
  676. }
  677. }
  678. buf.WriteByte('}')
  679. ret := make([]byte, buf.Len())
  680. copy(ret, buf.Bytes())
  681. return ret, nil
  682. }