headers_gen.go 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561
  1. // This file is auto-generated by jws/internal/cmd/genheaders/main.go. DO NOT EDIT
  2. package jws
  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. AlgorithmKey = "alg"
  17. ContentTypeKey = "cty"
  18. CriticalKey = "crit"
  19. JWKKey = "jwk"
  20. JWKSetURLKey = "jku"
  21. KeyIDKey = "kid"
  22. TypeKey = "typ"
  23. X509CertChainKey = "x5c"
  24. X509CertThumbprintKey = "x5t"
  25. X509CertThumbprintS256Key = "x5t#S256"
  26. X509URLKey = "x5u"
  27. )
  28. // Headers describe a standard Header set.
  29. type Headers interface {
  30. json.Marshaler
  31. json.Unmarshaler
  32. Algorithm() jwa.SignatureAlgorithm
  33. ContentType() string
  34. Critical() []string
  35. JWK() jwk.Key
  36. JWKSetURL() string
  37. KeyID() string
  38. Type() string
  39. X509CertChain() []string
  40. X509CertThumbprint() string
  41. X509CertThumbprintS256() string
  42. X509URL() string
  43. Iterate(ctx context.Context) Iterator
  44. Walk(context.Context, Visitor) error
  45. AsMap(context.Context) (map[string]interface{}, error)
  46. Copy(context.Context, Headers) error
  47. Merge(context.Context, Headers) (Headers, error)
  48. Get(string) (interface{}, bool)
  49. Set(string, interface{}) error
  50. Remove(string) error
  51. // PrivateParams returns the non-standard elements in the source structure
  52. // WARNING: DO NOT USE PrivateParams() IF YOU HAVE CONCURRENT CODE ACCESSING THEM.
  53. // Use AsMap() to get a copy of the entire header instead
  54. PrivateParams() map[string]interface{}
  55. }
  56. type stdHeaders struct {
  57. algorithm *jwa.SignatureAlgorithm // https://tools.ietf.org/html/rfc7515#section-4.1.1
  58. contentType *string // https://tools.ietf.org/html/rfc7515#section-4.1.10
  59. critical []string // https://tools.ietf.org/html/rfc7515#section-4.1.11
  60. jwk jwk.Key // https://tools.ietf.org/html/rfc7515#section-4.1.3
  61. jwkSetURL *string // https://tools.ietf.org/html/rfc7515#section-4.1.2
  62. keyID *string // https://tools.ietf.org/html/rfc7515#section-4.1.4
  63. typ *string // https://tools.ietf.org/html/rfc7515#section-4.1.9
  64. x509CertChain []string // https://tools.ietf.org/html/rfc7515#section-4.1.6
  65. x509CertThumbprint *string // https://tools.ietf.org/html/rfc7515#section-4.1.7
  66. x509CertThumbprintS256 *string // https://tools.ietf.org/html/rfc7515#section-4.1.8
  67. x509URL *string // https://tools.ietf.org/html/rfc7515#section-4.1.5
  68. privateParams map[string]interface{}
  69. mu *sync.RWMutex
  70. dc DecodeCtx
  71. raw []byte // stores the raw version of the header so it can be used later
  72. }
  73. func NewHeaders() Headers {
  74. return &stdHeaders{
  75. mu: &sync.RWMutex{},
  76. }
  77. }
  78. func (h *stdHeaders) Algorithm() jwa.SignatureAlgorithm {
  79. h.mu.RLock()
  80. defer h.mu.RUnlock()
  81. if h.algorithm == nil {
  82. return ""
  83. }
  84. return *(h.algorithm)
  85. }
  86. func (h *stdHeaders) ContentType() string {
  87. h.mu.RLock()
  88. defer h.mu.RUnlock()
  89. if h.contentType == nil {
  90. return ""
  91. }
  92. return *(h.contentType)
  93. }
  94. func (h *stdHeaders) Critical() []string {
  95. h.mu.RLock()
  96. defer h.mu.RUnlock()
  97. return h.critical
  98. }
  99. func (h *stdHeaders) JWK() jwk.Key {
  100. h.mu.RLock()
  101. defer h.mu.RUnlock()
  102. return h.jwk
  103. }
  104. func (h *stdHeaders) JWKSetURL() string {
  105. h.mu.RLock()
  106. defer h.mu.RUnlock()
  107. if h.jwkSetURL == nil {
  108. return ""
  109. }
  110. return *(h.jwkSetURL)
  111. }
  112. func (h *stdHeaders) KeyID() string {
  113. h.mu.RLock()
  114. defer h.mu.RUnlock()
  115. if h.keyID == nil {
  116. return ""
  117. }
  118. return *(h.keyID)
  119. }
  120. func (h *stdHeaders) Type() string {
  121. h.mu.RLock()
  122. defer h.mu.RUnlock()
  123. if h.typ == nil {
  124. return ""
  125. }
  126. return *(h.typ)
  127. }
  128. func (h *stdHeaders) X509CertChain() []string {
  129. h.mu.RLock()
  130. defer h.mu.RUnlock()
  131. return h.x509CertChain
  132. }
  133. func (h *stdHeaders) X509CertThumbprint() string {
  134. h.mu.RLock()
  135. defer h.mu.RUnlock()
  136. if h.x509CertThumbprint == nil {
  137. return ""
  138. }
  139. return *(h.x509CertThumbprint)
  140. }
  141. func (h *stdHeaders) X509CertThumbprintS256() string {
  142. h.mu.RLock()
  143. defer h.mu.RUnlock()
  144. if h.x509CertThumbprintS256 == nil {
  145. return ""
  146. }
  147. return *(h.x509CertThumbprintS256)
  148. }
  149. func (h *stdHeaders) X509URL() string {
  150. h.mu.RLock()
  151. defer h.mu.RUnlock()
  152. if h.x509URL == nil {
  153. return ""
  154. }
  155. return *(h.x509URL)
  156. }
  157. func (h *stdHeaders) DecodeCtx() DecodeCtx {
  158. h.mu.RLock()
  159. defer h.mu.RUnlock()
  160. return h.dc
  161. }
  162. func (h *stdHeaders) SetDecodeCtx(dc DecodeCtx) {
  163. h.mu.Lock()
  164. defer h.mu.Unlock()
  165. h.dc = dc
  166. }
  167. func (h *stdHeaders) rawBuffer() []byte {
  168. return h.raw
  169. }
  170. func (h *stdHeaders) makePairs() []*HeaderPair {
  171. h.mu.RLock()
  172. defer h.mu.RUnlock()
  173. var pairs []*HeaderPair
  174. if h.algorithm != nil {
  175. pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
  176. }
  177. if h.contentType != nil {
  178. pairs = append(pairs, &HeaderPair{Key: ContentTypeKey, Value: *(h.contentType)})
  179. }
  180. if h.critical != nil {
  181. pairs = append(pairs, &HeaderPair{Key: CriticalKey, Value: h.critical})
  182. }
  183. if h.jwk != nil {
  184. pairs = append(pairs, &HeaderPair{Key: JWKKey, Value: h.jwk})
  185. }
  186. if h.jwkSetURL != nil {
  187. pairs = append(pairs, &HeaderPair{Key: JWKSetURLKey, Value: *(h.jwkSetURL)})
  188. }
  189. if h.keyID != nil {
  190. pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
  191. }
  192. if h.typ != nil {
  193. pairs = append(pairs, &HeaderPair{Key: TypeKey, Value: *(h.typ)})
  194. }
  195. if h.x509CertChain != nil {
  196. pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: h.x509CertChain})
  197. }
  198. if h.x509CertThumbprint != nil {
  199. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
  200. }
  201. if h.x509CertThumbprintS256 != nil {
  202. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
  203. }
  204. if h.x509URL != nil {
  205. pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
  206. }
  207. for k, v := range h.privateParams {
  208. pairs = append(pairs, &HeaderPair{Key: k, Value: v})
  209. }
  210. sort.Slice(pairs, func(i, j int) bool {
  211. return pairs[i].Key.(string) < pairs[j].Key.(string)
  212. })
  213. return pairs
  214. }
  215. func (h *stdHeaders) PrivateParams() map[string]interface{} {
  216. h.mu.RLock()
  217. defer h.mu.RUnlock()
  218. return h.privateParams
  219. }
  220. func (h *stdHeaders) Get(name string) (interface{}, bool) {
  221. h.mu.RLock()
  222. defer h.mu.RUnlock()
  223. switch name {
  224. case AlgorithmKey:
  225. if h.algorithm == nil {
  226. return nil, false
  227. }
  228. return *(h.algorithm), true
  229. case ContentTypeKey:
  230. if h.contentType == nil {
  231. return nil, false
  232. }
  233. return *(h.contentType), true
  234. case CriticalKey:
  235. if h.critical == nil {
  236. return nil, false
  237. }
  238. return h.critical, true
  239. case JWKKey:
  240. if h.jwk == nil {
  241. return nil, false
  242. }
  243. return h.jwk, true
  244. case JWKSetURLKey:
  245. if h.jwkSetURL == nil {
  246. return nil, false
  247. }
  248. return *(h.jwkSetURL), true
  249. case KeyIDKey:
  250. if h.keyID == nil {
  251. return nil, false
  252. }
  253. return *(h.keyID), true
  254. case TypeKey:
  255. if h.typ == nil {
  256. return nil, false
  257. }
  258. return *(h.typ), true
  259. case X509CertChainKey:
  260. if h.x509CertChain == nil {
  261. return nil, false
  262. }
  263. return h.x509CertChain, true
  264. case X509CertThumbprintKey:
  265. if h.x509CertThumbprint == nil {
  266. return nil, false
  267. }
  268. return *(h.x509CertThumbprint), true
  269. case X509CertThumbprintS256Key:
  270. if h.x509CertThumbprintS256 == nil {
  271. return nil, false
  272. }
  273. return *(h.x509CertThumbprintS256), true
  274. case X509URLKey:
  275. if h.x509URL == nil {
  276. return nil, false
  277. }
  278. return *(h.x509URL), true
  279. default:
  280. v, ok := h.privateParams[name]
  281. return v, ok
  282. }
  283. }
  284. func (h *stdHeaders) Set(name string, value interface{}) error {
  285. h.mu.Lock()
  286. defer h.mu.Unlock()
  287. return h.setNoLock(name, value)
  288. }
  289. func (h *stdHeaders) setNoLock(name string, value interface{}) error {
  290. switch name {
  291. case AlgorithmKey:
  292. var acceptor jwa.SignatureAlgorithm
  293. if err := acceptor.Accept(value); err != nil {
  294. return errors.Wrapf(err, `invalid value for %s key`, AlgorithmKey)
  295. }
  296. h.algorithm = &acceptor
  297. return nil
  298. case ContentTypeKey:
  299. if v, ok := value.(string); ok {
  300. h.contentType = &v
  301. return nil
  302. }
  303. return errors.Errorf(`invalid value for %s key: %T`, ContentTypeKey, value)
  304. case CriticalKey:
  305. if v, ok := value.([]string); ok {
  306. h.critical = v
  307. return nil
  308. }
  309. return errors.Errorf(`invalid value for %s key: %T`, CriticalKey, value)
  310. case JWKKey:
  311. if v, ok := value.(jwk.Key); ok {
  312. h.jwk = v
  313. return nil
  314. }
  315. return errors.Errorf(`invalid value for %s key: %T`, JWKKey, value)
  316. case JWKSetURLKey:
  317. if v, ok := value.(string); ok {
  318. h.jwkSetURL = &v
  319. return nil
  320. }
  321. return errors.Errorf(`invalid value for %s key: %T`, JWKSetURLKey, value)
  322. case KeyIDKey:
  323. if v, ok := value.(string); ok {
  324. h.keyID = &v
  325. return nil
  326. }
  327. return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
  328. case TypeKey:
  329. if v, ok := value.(string); ok {
  330. h.typ = &v
  331. return nil
  332. }
  333. return errors.Errorf(`invalid value for %s key: %T`, TypeKey, value)
  334. case X509CertChainKey:
  335. if v, ok := value.([]string); ok {
  336. h.x509CertChain = v
  337. return nil
  338. }
  339. return errors.Errorf(`invalid value for %s key: %T`, X509CertChainKey, value)
  340. case X509CertThumbprintKey:
  341. if v, ok := value.(string); ok {
  342. h.x509CertThumbprint = &v
  343. return nil
  344. }
  345. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
  346. case X509CertThumbprintS256Key:
  347. if v, ok := value.(string); ok {
  348. h.x509CertThumbprintS256 = &v
  349. return nil
  350. }
  351. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
  352. case X509URLKey:
  353. if v, ok := value.(string); ok {
  354. h.x509URL = &v
  355. return nil
  356. }
  357. return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
  358. default:
  359. if h.privateParams == nil {
  360. h.privateParams = map[string]interface{}{}
  361. }
  362. h.privateParams[name] = value
  363. }
  364. return nil
  365. }
  366. func (h *stdHeaders) Remove(key string) error {
  367. h.mu.Lock()
  368. defer h.mu.Unlock()
  369. switch key {
  370. case AlgorithmKey:
  371. h.algorithm = nil
  372. case ContentTypeKey:
  373. h.contentType = nil
  374. case CriticalKey:
  375. h.critical = nil
  376. case JWKKey:
  377. h.jwk = nil
  378. case JWKSetURLKey:
  379. h.jwkSetURL = nil
  380. case KeyIDKey:
  381. h.keyID = nil
  382. case TypeKey:
  383. h.typ = nil
  384. case X509CertChainKey:
  385. h.x509CertChain = nil
  386. case X509CertThumbprintKey:
  387. h.x509CertThumbprint = nil
  388. case X509CertThumbprintS256Key:
  389. h.x509CertThumbprintS256 = nil
  390. case X509URLKey:
  391. h.x509URL = nil
  392. default:
  393. delete(h.privateParams, key)
  394. }
  395. return nil
  396. }
  397. func (h *stdHeaders) UnmarshalJSON(buf []byte) error {
  398. h.algorithm = nil
  399. h.contentType = nil
  400. h.critical = nil
  401. h.jwk = nil
  402. h.jwkSetURL = nil
  403. h.keyID = nil
  404. h.typ = nil
  405. h.x509CertChain = nil
  406. h.x509CertThumbprint = nil
  407. h.x509CertThumbprintS256 = nil
  408. h.x509URL = nil
  409. dec := json.NewDecoder(bytes.NewReader(buf))
  410. LOOP:
  411. for {
  412. tok, err := dec.Token()
  413. if err != nil {
  414. return errors.Wrap(err, `error reading token`)
  415. }
  416. switch tok := tok.(type) {
  417. case json.Delim:
  418. // Assuming we're doing everything correctly, we should ONLY
  419. // get either '{' or '}' here.
  420. if tok == '}' { // End of object
  421. break LOOP
  422. } else if tok != '{' {
  423. return errors.Errorf(`expected '{', but got '%c'`, tok)
  424. }
  425. case string: // Objects can only have string keys
  426. switch tok {
  427. case AlgorithmKey:
  428. var decoded jwa.SignatureAlgorithm
  429. if err := dec.Decode(&decoded); err != nil {
  430. return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
  431. }
  432. h.algorithm = &decoded
  433. case ContentTypeKey:
  434. if err := json.AssignNextStringToken(&h.contentType, dec); err != nil {
  435. return errors.Wrapf(err, `failed to decode value for key %s`, ContentTypeKey)
  436. }
  437. case CriticalKey:
  438. var decoded []string
  439. if err := dec.Decode(&decoded); err != nil {
  440. return errors.Wrapf(err, `failed to decode value for key %s`, CriticalKey)
  441. }
  442. h.critical = decoded
  443. case JWKKey:
  444. var buf json.RawMessage
  445. if err := dec.Decode(&buf); err != nil {
  446. return errors.Wrapf(err, `failed to decode value for key %s`, JWKKey)
  447. }
  448. key, err := jwk.ParseKey(buf)
  449. if err != nil {
  450. return errors.Wrapf(err, `failed to parse JWK for key %s`, JWKKey)
  451. }
  452. h.jwk = key
  453. case JWKSetURLKey:
  454. if err := json.AssignNextStringToken(&h.jwkSetURL, dec); err != nil {
  455. return errors.Wrapf(err, `failed to decode value for key %s`, JWKSetURLKey)
  456. }
  457. case KeyIDKey:
  458. if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
  459. return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
  460. }
  461. case TypeKey:
  462. if err := json.AssignNextStringToken(&h.typ, dec); err != nil {
  463. return errors.Wrapf(err, `failed to decode value for key %s`, TypeKey)
  464. }
  465. case X509CertChainKey:
  466. var decoded []string
  467. if err := dec.Decode(&decoded); err != nil {
  468. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
  469. }
  470. h.x509CertChain = decoded
  471. case X509CertThumbprintKey:
  472. if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
  473. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
  474. }
  475. case X509CertThumbprintS256Key:
  476. if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
  477. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
  478. }
  479. case X509URLKey:
  480. if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
  481. return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
  482. }
  483. default:
  484. decoded, err := registry.Decode(dec, tok)
  485. if err != nil {
  486. return err
  487. }
  488. h.setNoLock(tok, decoded)
  489. }
  490. default:
  491. return errors.Errorf(`invalid token %T`, tok)
  492. }
  493. }
  494. if dc := h.dc; dc != nil {
  495. if dc.CollectRaw() {
  496. h.raw = buf
  497. }
  498. }
  499. return nil
  500. }
  501. func (h stdHeaders) MarshalJSON() ([]byte, error) {
  502. buf := pool.GetBytesBuffer()
  503. defer pool.ReleaseBytesBuffer(buf)
  504. buf.WriteByte('{')
  505. enc := json.NewEncoder(buf)
  506. for i, p := range h.makePairs() {
  507. if i > 0 {
  508. buf.WriteRune(',')
  509. }
  510. buf.WriteRune('"')
  511. buf.WriteString(p.Key.(string))
  512. buf.WriteString(`":`)
  513. v := p.Value
  514. switch v := v.(type) {
  515. case []byte:
  516. buf.WriteRune('"')
  517. buf.WriteString(base64.EncodeToString(v))
  518. buf.WriteRune('"')
  519. default:
  520. if err := enc.Encode(v); err != nil {
  521. errors.Errorf(`failed to encode value for field %s`, p.Key)
  522. }
  523. buf.Truncate(buf.Len() - 1)
  524. }
  525. }
  526. buf.WriteByte('}')
  527. ret := make([]byte, buf.Len())
  528. copy(ret, buf.Bytes())
  529. return ret, nil
  530. }