rsa_gen.go 31 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697989910010110210310410510610710810911011111211311411511611711811912012112212312412512612712812913013113213313413513613713813914014114214314414514614714814915015115215315415515615715815916016116216316416516616716816917017117217317417517617717817918018118218318418518618718818919019119219319419519619719819920020120220320420520620720820921021121221321421521621721821922022122222322422522622722822923023123223323423523623723823924024124224324424524624724824925025125225325425525625725825926026126226326426526626726826927027127227327427527627727827928028128228328428528628728828929029129229329429529629729829930030130230330430530630730830931031131231331431531631731831932032132232332432532632732832933033133233333433533633733833934034134234334434534634734834935035135235335435535635735835936036136236336436536636736836937037137237337437537637737837938038138238338438538638738838939039139239339439539639739839940040140240340440540640740840941041141241341441541641741841942042142242342442542642742842943043143243343443543643743843944044144244344444544644744844945045145245345445545645745845946046146246346446546646746846947047147247347447547647747847948048148248348448548648748848949049149249349449549649749849950050150250350450550650750850951051151251351451551651751851952052152252352452552652752852953053153253353453553653753853954054154254354454554654754854955055155255355455555655755855956056156256356456556656756856957057157257357457557657757857958058158258358458558658758858959059159259359459559659759859960060160260360460560660760860961061161261361461561661761861962062162262362462562662762862963063163263363463563663763863964064164264364464564664764864965065165265365465565665765865966066166266366466566666766866967067167267367467567667767867968068168268368468568668768868969069169269369469569669769869970070170270370470570670770870971071171271371471571671771871972072172272372472572672772872973073173273373473573673773873974074174274374474574674774874975075175275375475575675775875976076176276376476576676776876977077177277377477577677777877978078178278378478578678778878979079179279379479579679779879980080180280380480580680780880981081181281381481581681781881982082182282382482582682782882983083183283383483583683783883984084184284384484584684784884985085185285385485585685785885986086186286386486586686786886987087187287387487587687787887988088188288388488588688788888989089189289389489589689789889990090190290390490590690790890991091191291391491591691791891992092192292392492592692792892993093193293393493593693793893994094194294394494594694794894995095195295395495595695795895996096196296396496596696796896997097197297397497597697797897998098198298398498598698798898999099199299399499599699799899910001001100210031004100510061007100810091010101110121013101410151016101710181019102010211022102310241025102610271028102910301031103210331034103510361037103810391040104110421043104410451046104710481049105010511052105310541055105610571058105910601061106210631064106510661067106810691070107110721073107410751076107710781079108010811082108310841085108610871088108910901091109210931094109510961097109810991100110111021103110411051106110711081109111011111112111311141115111611171118111911201121112211231124112511261127112811291130113111321133113411351136113711381139114011411142114311441145114611471148114911501151115211531154115511561157115811591160116111621163116411651166116711681169117011711172117311741175117611771178117911801181118211831184118511861187118811891190119111921193119411951196119711981199120012011202120312041205120612071208120912101211121212131214121512161217121812191220122112221223122412251226122712281229123012311232123312341235123612371238123912401241124212431244124512461247
  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/rsa"
  7. "crypto/x509"
  8. "fmt"
  9. "sort"
  10. "sync"
  11. "github.com/lestrrat-go/iter/mapiter"
  12. "github.com/lestrrat-go/jwx/internal/base64"
  13. "github.com/lestrrat-go/jwx/internal/iter"
  14. "github.com/lestrrat-go/jwx/internal/json"
  15. "github.com/lestrrat-go/jwx/internal/pool"
  16. "github.com/lestrrat-go/jwx/jwa"
  17. "github.com/pkg/errors"
  18. )
  19. const (
  20. RSADKey = "d"
  21. RSADPKey = "dp"
  22. RSADQKey = "dq"
  23. RSAEKey = "e"
  24. RSANKey = "n"
  25. RSAPKey = "p"
  26. RSAQIKey = "qi"
  27. RSAQKey = "q"
  28. )
  29. type RSAPublicKey interface {
  30. Key
  31. FromRaw(*rsa.PublicKey) error
  32. E() []byte
  33. N() []byte
  34. }
  35. type rsaPublicKey struct {
  36. algorithm *string // https://tools.ietf.org/html/rfc7517#section-4.4
  37. e []byte
  38. keyID *string // https://tools.ietf.org/html/rfc7515#section-4.1.4
  39. keyOps *KeyOperationList // https://tools.ietf.org/html/rfc7517#section-4.3
  40. keyUsage *string // https://tools.ietf.org/html/rfc7517#section-4.2
  41. n []byte
  42. x509CertChain *CertificateChain // https://tools.ietf.org/html/rfc7515#section-4.1.6
  43. x509CertThumbprint *string // https://tools.ietf.org/html/rfc7515#section-4.1.7
  44. x509CertThumbprintS256 *string // https://tools.ietf.org/html/rfc7515#section-4.1.8
  45. x509URL *string // https://tools.ietf.org/html/rfc7515#section-4.1.5
  46. privateParams map[string]interface{}
  47. mu *sync.RWMutex
  48. dc json.DecodeCtx
  49. }
  50. func NewRSAPublicKey() RSAPublicKey {
  51. return newRSAPublicKey()
  52. }
  53. func newRSAPublicKey() *rsaPublicKey {
  54. return &rsaPublicKey{
  55. mu: &sync.RWMutex{},
  56. privateParams: make(map[string]interface{}),
  57. }
  58. }
  59. func (h rsaPublicKey) KeyType() jwa.KeyType {
  60. return jwa.RSA
  61. }
  62. func (h *rsaPublicKey) Algorithm() string {
  63. if h.algorithm != nil {
  64. return *(h.algorithm)
  65. }
  66. return ""
  67. }
  68. func (h *rsaPublicKey) E() []byte {
  69. return h.e
  70. }
  71. func (h *rsaPublicKey) KeyID() string {
  72. if h.keyID != nil {
  73. return *(h.keyID)
  74. }
  75. return ""
  76. }
  77. func (h *rsaPublicKey) KeyOps() KeyOperationList {
  78. if h.keyOps != nil {
  79. return *(h.keyOps)
  80. }
  81. return nil
  82. }
  83. func (h *rsaPublicKey) KeyUsage() string {
  84. if h.keyUsage != nil {
  85. return *(h.keyUsage)
  86. }
  87. return ""
  88. }
  89. func (h *rsaPublicKey) N() []byte {
  90. return h.n
  91. }
  92. func (h *rsaPublicKey) X509CertChain() []*x509.Certificate {
  93. if h.x509CertChain != nil {
  94. return h.x509CertChain.Get()
  95. }
  96. return nil
  97. }
  98. func (h *rsaPublicKey) X509CertThumbprint() string {
  99. if h.x509CertThumbprint != nil {
  100. return *(h.x509CertThumbprint)
  101. }
  102. return ""
  103. }
  104. func (h *rsaPublicKey) X509CertThumbprintS256() string {
  105. if h.x509CertThumbprintS256 != nil {
  106. return *(h.x509CertThumbprintS256)
  107. }
  108. return ""
  109. }
  110. func (h *rsaPublicKey) X509URL() string {
  111. if h.x509URL != nil {
  112. return *(h.x509URL)
  113. }
  114. return ""
  115. }
  116. func (h *rsaPublicKey) makePairs() []*HeaderPair {
  117. h.mu.RLock()
  118. defer h.mu.RUnlock()
  119. var pairs []*HeaderPair
  120. pairs = append(pairs, &HeaderPair{Key: "kty", Value: jwa.RSA})
  121. if h.algorithm != nil {
  122. pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
  123. }
  124. if h.e != nil {
  125. pairs = append(pairs, &HeaderPair{Key: RSAEKey, Value: h.e})
  126. }
  127. if h.keyID != nil {
  128. pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
  129. }
  130. if h.keyOps != nil {
  131. pairs = append(pairs, &HeaderPair{Key: KeyOpsKey, Value: *(h.keyOps)})
  132. }
  133. if h.keyUsage != nil {
  134. pairs = append(pairs, &HeaderPair{Key: KeyUsageKey, Value: *(h.keyUsage)})
  135. }
  136. if h.n != nil {
  137. pairs = append(pairs, &HeaderPair{Key: RSANKey, Value: h.n})
  138. }
  139. if h.x509CertChain != nil {
  140. pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: *(h.x509CertChain)})
  141. }
  142. if h.x509CertThumbprint != nil {
  143. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
  144. }
  145. if h.x509CertThumbprintS256 != nil {
  146. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
  147. }
  148. if h.x509URL != nil {
  149. pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
  150. }
  151. for k, v := range h.privateParams {
  152. pairs = append(pairs, &HeaderPair{Key: k, Value: v})
  153. }
  154. return pairs
  155. }
  156. func (h *rsaPublicKey) PrivateParams() map[string]interface{} {
  157. return h.privateParams
  158. }
  159. func (h *rsaPublicKey) Get(name string) (interface{}, bool) {
  160. h.mu.RLock()
  161. defer h.mu.RUnlock()
  162. switch name {
  163. case KeyTypeKey:
  164. return h.KeyType(), true
  165. case AlgorithmKey:
  166. if h.algorithm == nil {
  167. return nil, false
  168. }
  169. return *(h.algorithm), true
  170. case RSAEKey:
  171. if h.e == nil {
  172. return nil, false
  173. }
  174. return h.e, true
  175. case KeyIDKey:
  176. if h.keyID == nil {
  177. return nil, false
  178. }
  179. return *(h.keyID), true
  180. case KeyOpsKey:
  181. if h.keyOps == nil {
  182. return nil, false
  183. }
  184. return *(h.keyOps), true
  185. case KeyUsageKey:
  186. if h.keyUsage == nil {
  187. return nil, false
  188. }
  189. return *(h.keyUsage), true
  190. case RSANKey:
  191. if h.n == nil {
  192. return nil, false
  193. }
  194. return h.n, true
  195. case X509CertChainKey:
  196. if h.x509CertChain == nil {
  197. return nil, false
  198. }
  199. return h.x509CertChain.Get(), true
  200. case X509CertThumbprintKey:
  201. if h.x509CertThumbprint == nil {
  202. return nil, false
  203. }
  204. return *(h.x509CertThumbprint), true
  205. case X509CertThumbprintS256Key:
  206. if h.x509CertThumbprintS256 == nil {
  207. return nil, false
  208. }
  209. return *(h.x509CertThumbprintS256), true
  210. case X509URLKey:
  211. if h.x509URL == nil {
  212. return nil, false
  213. }
  214. return *(h.x509URL), true
  215. default:
  216. v, ok := h.privateParams[name]
  217. return v, ok
  218. }
  219. }
  220. func (h *rsaPublicKey) Set(name string, value interface{}) error {
  221. h.mu.Lock()
  222. defer h.mu.Unlock()
  223. return h.setNoLock(name, value)
  224. }
  225. func (h *rsaPublicKey) setNoLock(name string, value interface{}) error {
  226. switch name {
  227. case "kty":
  228. return nil
  229. case AlgorithmKey:
  230. switch v := value.(type) {
  231. case string:
  232. h.algorithm = &v
  233. case fmt.Stringer:
  234. tmp := v.String()
  235. h.algorithm = &tmp
  236. default:
  237. return errors.Errorf(`invalid type for %s key: %T`, AlgorithmKey, value)
  238. }
  239. return nil
  240. case RSAEKey:
  241. if v, ok := value.([]byte); ok {
  242. h.e = v
  243. return nil
  244. }
  245. return errors.Errorf(`invalid value for %s key: %T`, RSAEKey, value)
  246. case KeyIDKey:
  247. if v, ok := value.(string); ok {
  248. h.keyID = &v
  249. return nil
  250. }
  251. return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
  252. case KeyOpsKey:
  253. var acceptor KeyOperationList
  254. if err := acceptor.Accept(value); err != nil {
  255. return errors.Wrapf(err, `invalid value for %s key`, KeyOpsKey)
  256. }
  257. h.keyOps = &acceptor
  258. return nil
  259. case KeyUsageKey:
  260. switch v := value.(type) {
  261. case KeyUsageType:
  262. switch v {
  263. case ForSignature, ForEncryption:
  264. tmp := v.String()
  265. h.keyUsage = &tmp
  266. default:
  267. return errors.Errorf(`invalid key usage type %s`, v)
  268. }
  269. case string:
  270. h.keyUsage = &v
  271. default:
  272. return errors.Errorf(`invalid key usage type %s`, v)
  273. }
  274. case RSANKey:
  275. if v, ok := value.([]byte); ok {
  276. h.n = v
  277. return nil
  278. }
  279. return errors.Errorf(`invalid value for %s key: %T`, RSANKey, value)
  280. case X509CertChainKey:
  281. var acceptor CertificateChain
  282. if err := acceptor.Accept(value); err != nil {
  283. return errors.Wrapf(err, `invalid value for %s key`, X509CertChainKey)
  284. }
  285. h.x509CertChain = &acceptor
  286. return nil
  287. case X509CertThumbprintKey:
  288. if v, ok := value.(string); ok {
  289. h.x509CertThumbprint = &v
  290. return nil
  291. }
  292. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
  293. case X509CertThumbprintS256Key:
  294. if v, ok := value.(string); ok {
  295. h.x509CertThumbprintS256 = &v
  296. return nil
  297. }
  298. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
  299. case X509URLKey:
  300. if v, ok := value.(string); ok {
  301. h.x509URL = &v
  302. return nil
  303. }
  304. return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
  305. default:
  306. if h.privateParams == nil {
  307. h.privateParams = map[string]interface{}{}
  308. }
  309. h.privateParams[name] = value
  310. }
  311. return nil
  312. }
  313. func (k *rsaPublicKey) Remove(key string) error {
  314. k.mu.Lock()
  315. defer k.mu.Unlock()
  316. switch key {
  317. case AlgorithmKey:
  318. k.algorithm = nil
  319. case RSAEKey:
  320. k.e = nil
  321. case KeyIDKey:
  322. k.keyID = nil
  323. case KeyOpsKey:
  324. k.keyOps = nil
  325. case KeyUsageKey:
  326. k.keyUsage = nil
  327. case RSANKey:
  328. k.n = nil
  329. case X509CertChainKey:
  330. k.x509CertChain = nil
  331. case X509CertThumbprintKey:
  332. k.x509CertThumbprint = nil
  333. case X509CertThumbprintS256Key:
  334. k.x509CertThumbprintS256 = nil
  335. case X509URLKey:
  336. k.x509URL = nil
  337. default:
  338. delete(k.privateParams, key)
  339. }
  340. return nil
  341. }
  342. func (k *rsaPublicKey) Clone() (Key, error) {
  343. return cloneKey(k)
  344. }
  345. func (k *rsaPublicKey) DecodeCtx() json.DecodeCtx {
  346. k.mu.RLock()
  347. defer k.mu.RUnlock()
  348. return k.dc
  349. }
  350. func (k *rsaPublicKey) SetDecodeCtx(dc json.DecodeCtx) {
  351. k.mu.Lock()
  352. defer k.mu.Unlock()
  353. k.dc = dc
  354. }
  355. func (h *rsaPublicKey) UnmarshalJSON(buf []byte) error {
  356. h.algorithm = nil
  357. h.e = nil
  358. h.keyID = nil
  359. h.keyOps = nil
  360. h.keyUsage = nil
  361. h.n = nil
  362. h.x509CertChain = nil
  363. h.x509CertThumbprint = nil
  364. h.x509CertThumbprintS256 = nil
  365. h.x509URL = nil
  366. dec := json.NewDecoder(bytes.NewReader(buf))
  367. LOOP:
  368. for {
  369. tok, err := dec.Token()
  370. if err != nil {
  371. return errors.Wrap(err, `error reading token`)
  372. }
  373. switch tok := tok.(type) {
  374. case json.Delim:
  375. // Assuming we're doing everything correctly, we should ONLY
  376. // get either '{' or '}' here.
  377. if tok == '}' { // End of object
  378. break LOOP
  379. } else if tok != '{' {
  380. return errors.Errorf(`expected '{', but got '%c'`, tok)
  381. }
  382. case string: // Objects can only have string keys
  383. switch tok {
  384. case KeyTypeKey:
  385. val, err := json.ReadNextStringToken(dec)
  386. if err != nil {
  387. return errors.Wrap(err, `error reading token`)
  388. }
  389. if val != jwa.RSA.String() {
  390. return errors.Errorf(`invalid kty value for RSAPublicKey (%s)`, val)
  391. }
  392. case AlgorithmKey:
  393. if err := json.AssignNextStringToken(&h.algorithm, dec); err != nil {
  394. return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
  395. }
  396. case RSAEKey:
  397. if err := json.AssignNextBytesToken(&h.e, dec); err != nil {
  398. return errors.Wrapf(err, `failed to decode value for key %s`, RSAEKey)
  399. }
  400. case KeyIDKey:
  401. if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
  402. return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
  403. }
  404. case KeyOpsKey:
  405. var decoded KeyOperationList
  406. if err := dec.Decode(&decoded); err != nil {
  407. return errors.Wrapf(err, `failed to decode value for key %s`, KeyOpsKey)
  408. }
  409. h.keyOps = &decoded
  410. case KeyUsageKey:
  411. if err := json.AssignNextStringToken(&h.keyUsage, dec); err != nil {
  412. return errors.Wrapf(err, `failed to decode value for key %s`, KeyUsageKey)
  413. }
  414. case RSANKey:
  415. if err := json.AssignNextBytesToken(&h.n, dec); err != nil {
  416. return errors.Wrapf(err, `failed to decode value for key %s`, RSANKey)
  417. }
  418. case X509CertChainKey:
  419. var decoded CertificateChain
  420. if err := dec.Decode(&decoded); err != nil {
  421. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
  422. }
  423. h.x509CertChain = &decoded
  424. case X509CertThumbprintKey:
  425. if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
  426. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
  427. }
  428. case X509CertThumbprintS256Key:
  429. if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
  430. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
  431. }
  432. case X509URLKey:
  433. if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
  434. return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
  435. }
  436. default:
  437. if dc := h.dc; dc != nil {
  438. if localReg := dc.Registry(); localReg != nil {
  439. decoded, err := localReg.Decode(dec, tok)
  440. if err == nil {
  441. h.setNoLock(tok, decoded)
  442. continue
  443. }
  444. }
  445. }
  446. decoded, err := registry.Decode(dec, tok)
  447. if err == nil {
  448. h.setNoLock(tok, decoded)
  449. continue
  450. }
  451. return errors.Wrapf(err, `could not decode field %s`, tok)
  452. }
  453. default:
  454. return errors.Errorf(`invalid token %T`, tok)
  455. }
  456. }
  457. if h.e == nil {
  458. return errors.Errorf(`required field e is missing`)
  459. }
  460. if h.n == nil {
  461. return errors.Errorf(`required field n is missing`)
  462. }
  463. return nil
  464. }
  465. func (h rsaPublicKey) MarshalJSON() ([]byte, error) {
  466. data := make(map[string]interface{})
  467. fields := make([]string, 0, 10)
  468. for _, pair := range h.makePairs() {
  469. fields = append(fields, pair.Key.(string))
  470. data[pair.Key.(string)] = pair.Value
  471. }
  472. sort.Strings(fields)
  473. buf := pool.GetBytesBuffer()
  474. defer pool.ReleaseBytesBuffer(buf)
  475. buf.WriteByte('{')
  476. enc := json.NewEncoder(buf)
  477. for i, f := range fields {
  478. if i > 0 {
  479. buf.WriteRune(',')
  480. }
  481. buf.WriteRune('"')
  482. buf.WriteString(f)
  483. buf.WriteString(`":`)
  484. v := data[f]
  485. switch v := v.(type) {
  486. case []byte:
  487. buf.WriteRune('"')
  488. buf.WriteString(base64.EncodeToString(v))
  489. buf.WriteRune('"')
  490. default:
  491. if err := enc.Encode(v); err != nil {
  492. return nil, errors.Wrapf(err, `failed to encode value for field %s`, f)
  493. }
  494. buf.Truncate(buf.Len() - 1)
  495. }
  496. }
  497. buf.WriteByte('}')
  498. ret := make([]byte, buf.Len())
  499. copy(ret, buf.Bytes())
  500. return ret, nil
  501. }
  502. func (h *rsaPublicKey) Iterate(ctx context.Context) HeaderIterator {
  503. pairs := h.makePairs()
  504. ch := make(chan *HeaderPair, len(pairs))
  505. go func(ctx context.Context, ch chan *HeaderPair, pairs []*HeaderPair) {
  506. defer close(ch)
  507. for _, pair := range pairs {
  508. select {
  509. case <-ctx.Done():
  510. return
  511. case ch <- pair:
  512. }
  513. }
  514. }(ctx, ch, pairs)
  515. return mapiter.New(ch)
  516. }
  517. func (h *rsaPublicKey) Walk(ctx context.Context, visitor HeaderVisitor) error {
  518. return iter.WalkMap(ctx, h, visitor)
  519. }
  520. func (h *rsaPublicKey) AsMap(ctx context.Context) (map[string]interface{}, error) {
  521. return iter.AsMap(ctx, h)
  522. }
  523. type RSAPrivateKey interface {
  524. Key
  525. FromRaw(*rsa.PrivateKey) error
  526. D() []byte
  527. DP() []byte
  528. DQ() []byte
  529. E() []byte
  530. N() []byte
  531. P() []byte
  532. Q() []byte
  533. QI() []byte
  534. }
  535. type rsaPrivateKey struct {
  536. algorithm *string // https://tools.ietf.org/html/rfc7517#section-4.4
  537. d []byte
  538. dp []byte
  539. dq []byte
  540. e []byte
  541. keyID *string // https://tools.ietf.org/html/rfc7515#section-4.1.4
  542. keyOps *KeyOperationList // https://tools.ietf.org/html/rfc7517#section-4.3
  543. keyUsage *string // https://tools.ietf.org/html/rfc7517#section-4.2
  544. n []byte
  545. p []byte
  546. q []byte
  547. qi []byte
  548. x509CertChain *CertificateChain // https://tools.ietf.org/html/rfc7515#section-4.1.6
  549. x509CertThumbprint *string // https://tools.ietf.org/html/rfc7515#section-4.1.7
  550. x509CertThumbprintS256 *string // https://tools.ietf.org/html/rfc7515#section-4.1.8
  551. x509URL *string // https://tools.ietf.org/html/rfc7515#section-4.1.5
  552. privateParams map[string]interface{}
  553. mu *sync.RWMutex
  554. dc json.DecodeCtx
  555. }
  556. func NewRSAPrivateKey() RSAPrivateKey {
  557. return newRSAPrivateKey()
  558. }
  559. func newRSAPrivateKey() *rsaPrivateKey {
  560. return &rsaPrivateKey{
  561. mu: &sync.RWMutex{},
  562. privateParams: make(map[string]interface{}),
  563. }
  564. }
  565. func (h rsaPrivateKey) KeyType() jwa.KeyType {
  566. return jwa.RSA
  567. }
  568. func (h *rsaPrivateKey) Algorithm() string {
  569. if h.algorithm != nil {
  570. return *(h.algorithm)
  571. }
  572. return ""
  573. }
  574. func (h *rsaPrivateKey) D() []byte {
  575. return h.d
  576. }
  577. func (h *rsaPrivateKey) DP() []byte {
  578. return h.dp
  579. }
  580. func (h *rsaPrivateKey) DQ() []byte {
  581. return h.dq
  582. }
  583. func (h *rsaPrivateKey) E() []byte {
  584. return h.e
  585. }
  586. func (h *rsaPrivateKey) KeyID() string {
  587. if h.keyID != nil {
  588. return *(h.keyID)
  589. }
  590. return ""
  591. }
  592. func (h *rsaPrivateKey) KeyOps() KeyOperationList {
  593. if h.keyOps != nil {
  594. return *(h.keyOps)
  595. }
  596. return nil
  597. }
  598. func (h *rsaPrivateKey) KeyUsage() string {
  599. if h.keyUsage != nil {
  600. return *(h.keyUsage)
  601. }
  602. return ""
  603. }
  604. func (h *rsaPrivateKey) N() []byte {
  605. return h.n
  606. }
  607. func (h *rsaPrivateKey) P() []byte {
  608. return h.p
  609. }
  610. func (h *rsaPrivateKey) Q() []byte {
  611. return h.q
  612. }
  613. func (h *rsaPrivateKey) QI() []byte {
  614. return h.qi
  615. }
  616. func (h *rsaPrivateKey) X509CertChain() []*x509.Certificate {
  617. if h.x509CertChain != nil {
  618. return h.x509CertChain.Get()
  619. }
  620. return nil
  621. }
  622. func (h *rsaPrivateKey) X509CertThumbprint() string {
  623. if h.x509CertThumbprint != nil {
  624. return *(h.x509CertThumbprint)
  625. }
  626. return ""
  627. }
  628. func (h *rsaPrivateKey) X509CertThumbprintS256() string {
  629. if h.x509CertThumbprintS256 != nil {
  630. return *(h.x509CertThumbprintS256)
  631. }
  632. return ""
  633. }
  634. func (h *rsaPrivateKey) X509URL() string {
  635. if h.x509URL != nil {
  636. return *(h.x509URL)
  637. }
  638. return ""
  639. }
  640. func (h *rsaPrivateKey) makePairs() []*HeaderPair {
  641. h.mu.RLock()
  642. defer h.mu.RUnlock()
  643. var pairs []*HeaderPair
  644. pairs = append(pairs, &HeaderPair{Key: "kty", Value: jwa.RSA})
  645. if h.algorithm != nil {
  646. pairs = append(pairs, &HeaderPair{Key: AlgorithmKey, Value: *(h.algorithm)})
  647. }
  648. if h.d != nil {
  649. pairs = append(pairs, &HeaderPair{Key: RSADKey, Value: h.d})
  650. }
  651. if h.dp != nil {
  652. pairs = append(pairs, &HeaderPair{Key: RSADPKey, Value: h.dp})
  653. }
  654. if h.dq != nil {
  655. pairs = append(pairs, &HeaderPair{Key: RSADQKey, Value: h.dq})
  656. }
  657. if h.e != nil {
  658. pairs = append(pairs, &HeaderPair{Key: RSAEKey, Value: h.e})
  659. }
  660. if h.keyID != nil {
  661. pairs = append(pairs, &HeaderPair{Key: KeyIDKey, Value: *(h.keyID)})
  662. }
  663. if h.keyOps != nil {
  664. pairs = append(pairs, &HeaderPair{Key: KeyOpsKey, Value: *(h.keyOps)})
  665. }
  666. if h.keyUsage != nil {
  667. pairs = append(pairs, &HeaderPair{Key: KeyUsageKey, Value: *(h.keyUsage)})
  668. }
  669. if h.n != nil {
  670. pairs = append(pairs, &HeaderPair{Key: RSANKey, Value: h.n})
  671. }
  672. if h.p != nil {
  673. pairs = append(pairs, &HeaderPair{Key: RSAPKey, Value: h.p})
  674. }
  675. if h.q != nil {
  676. pairs = append(pairs, &HeaderPair{Key: RSAQKey, Value: h.q})
  677. }
  678. if h.qi != nil {
  679. pairs = append(pairs, &HeaderPair{Key: RSAQIKey, Value: h.qi})
  680. }
  681. if h.x509CertChain != nil {
  682. pairs = append(pairs, &HeaderPair{Key: X509CertChainKey, Value: *(h.x509CertChain)})
  683. }
  684. if h.x509CertThumbprint != nil {
  685. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintKey, Value: *(h.x509CertThumbprint)})
  686. }
  687. if h.x509CertThumbprintS256 != nil {
  688. pairs = append(pairs, &HeaderPair{Key: X509CertThumbprintS256Key, Value: *(h.x509CertThumbprintS256)})
  689. }
  690. if h.x509URL != nil {
  691. pairs = append(pairs, &HeaderPair{Key: X509URLKey, Value: *(h.x509URL)})
  692. }
  693. for k, v := range h.privateParams {
  694. pairs = append(pairs, &HeaderPair{Key: k, Value: v})
  695. }
  696. return pairs
  697. }
  698. func (h *rsaPrivateKey) PrivateParams() map[string]interface{} {
  699. return h.privateParams
  700. }
  701. func (h *rsaPrivateKey) Get(name string) (interface{}, bool) {
  702. h.mu.RLock()
  703. defer h.mu.RUnlock()
  704. switch name {
  705. case KeyTypeKey:
  706. return h.KeyType(), true
  707. case AlgorithmKey:
  708. if h.algorithm == nil {
  709. return nil, false
  710. }
  711. return *(h.algorithm), true
  712. case RSADKey:
  713. if h.d == nil {
  714. return nil, false
  715. }
  716. return h.d, true
  717. case RSADPKey:
  718. if h.dp == nil {
  719. return nil, false
  720. }
  721. return h.dp, true
  722. case RSADQKey:
  723. if h.dq == nil {
  724. return nil, false
  725. }
  726. return h.dq, true
  727. case RSAEKey:
  728. if h.e == nil {
  729. return nil, false
  730. }
  731. return h.e, true
  732. case KeyIDKey:
  733. if h.keyID == nil {
  734. return nil, false
  735. }
  736. return *(h.keyID), true
  737. case KeyOpsKey:
  738. if h.keyOps == nil {
  739. return nil, false
  740. }
  741. return *(h.keyOps), true
  742. case KeyUsageKey:
  743. if h.keyUsage == nil {
  744. return nil, false
  745. }
  746. return *(h.keyUsage), true
  747. case RSANKey:
  748. if h.n == nil {
  749. return nil, false
  750. }
  751. return h.n, true
  752. case RSAPKey:
  753. if h.p == nil {
  754. return nil, false
  755. }
  756. return h.p, true
  757. case RSAQKey:
  758. if h.q == nil {
  759. return nil, false
  760. }
  761. return h.q, true
  762. case RSAQIKey:
  763. if h.qi == nil {
  764. return nil, false
  765. }
  766. return h.qi, true
  767. case X509CertChainKey:
  768. if h.x509CertChain == nil {
  769. return nil, false
  770. }
  771. return h.x509CertChain.Get(), true
  772. case X509CertThumbprintKey:
  773. if h.x509CertThumbprint == nil {
  774. return nil, false
  775. }
  776. return *(h.x509CertThumbprint), true
  777. case X509CertThumbprintS256Key:
  778. if h.x509CertThumbprintS256 == nil {
  779. return nil, false
  780. }
  781. return *(h.x509CertThumbprintS256), true
  782. case X509URLKey:
  783. if h.x509URL == nil {
  784. return nil, false
  785. }
  786. return *(h.x509URL), true
  787. default:
  788. v, ok := h.privateParams[name]
  789. return v, ok
  790. }
  791. }
  792. func (h *rsaPrivateKey) Set(name string, value interface{}) error {
  793. h.mu.Lock()
  794. defer h.mu.Unlock()
  795. return h.setNoLock(name, value)
  796. }
  797. func (h *rsaPrivateKey) setNoLock(name string, value interface{}) error {
  798. switch name {
  799. case "kty":
  800. return nil
  801. case AlgorithmKey:
  802. switch v := value.(type) {
  803. case string:
  804. h.algorithm = &v
  805. case fmt.Stringer:
  806. tmp := v.String()
  807. h.algorithm = &tmp
  808. default:
  809. return errors.Errorf(`invalid type for %s key: %T`, AlgorithmKey, value)
  810. }
  811. return nil
  812. case RSADKey:
  813. if v, ok := value.([]byte); ok {
  814. h.d = v
  815. return nil
  816. }
  817. return errors.Errorf(`invalid value for %s key: %T`, RSADKey, value)
  818. case RSADPKey:
  819. if v, ok := value.([]byte); ok {
  820. h.dp = v
  821. return nil
  822. }
  823. return errors.Errorf(`invalid value for %s key: %T`, RSADPKey, value)
  824. case RSADQKey:
  825. if v, ok := value.([]byte); ok {
  826. h.dq = v
  827. return nil
  828. }
  829. return errors.Errorf(`invalid value for %s key: %T`, RSADQKey, value)
  830. case RSAEKey:
  831. if v, ok := value.([]byte); ok {
  832. h.e = v
  833. return nil
  834. }
  835. return errors.Errorf(`invalid value for %s key: %T`, RSAEKey, value)
  836. case KeyIDKey:
  837. if v, ok := value.(string); ok {
  838. h.keyID = &v
  839. return nil
  840. }
  841. return errors.Errorf(`invalid value for %s key: %T`, KeyIDKey, value)
  842. case KeyOpsKey:
  843. var acceptor KeyOperationList
  844. if err := acceptor.Accept(value); err != nil {
  845. return errors.Wrapf(err, `invalid value for %s key`, KeyOpsKey)
  846. }
  847. h.keyOps = &acceptor
  848. return nil
  849. case KeyUsageKey:
  850. switch v := value.(type) {
  851. case KeyUsageType:
  852. switch v {
  853. case ForSignature, ForEncryption:
  854. tmp := v.String()
  855. h.keyUsage = &tmp
  856. default:
  857. return errors.Errorf(`invalid key usage type %s`, v)
  858. }
  859. case string:
  860. h.keyUsage = &v
  861. default:
  862. return errors.Errorf(`invalid key usage type %s`, v)
  863. }
  864. case RSANKey:
  865. if v, ok := value.([]byte); ok {
  866. h.n = v
  867. return nil
  868. }
  869. return errors.Errorf(`invalid value for %s key: %T`, RSANKey, value)
  870. case RSAPKey:
  871. if v, ok := value.([]byte); ok {
  872. h.p = v
  873. return nil
  874. }
  875. return errors.Errorf(`invalid value for %s key: %T`, RSAPKey, value)
  876. case RSAQKey:
  877. if v, ok := value.([]byte); ok {
  878. h.q = v
  879. return nil
  880. }
  881. return errors.Errorf(`invalid value for %s key: %T`, RSAQKey, value)
  882. case RSAQIKey:
  883. if v, ok := value.([]byte); ok {
  884. h.qi = v
  885. return nil
  886. }
  887. return errors.Errorf(`invalid value for %s key: %T`, RSAQIKey, value)
  888. case X509CertChainKey:
  889. var acceptor CertificateChain
  890. if err := acceptor.Accept(value); err != nil {
  891. return errors.Wrapf(err, `invalid value for %s key`, X509CertChainKey)
  892. }
  893. h.x509CertChain = &acceptor
  894. return nil
  895. case X509CertThumbprintKey:
  896. if v, ok := value.(string); ok {
  897. h.x509CertThumbprint = &v
  898. return nil
  899. }
  900. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintKey, value)
  901. case X509CertThumbprintS256Key:
  902. if v, ok := value.(string); ok {
  903. h.x509CertThumbprintS256 = &v
  904. return nil
  905. }
  906. return errors.Errorf(`invalid value for %s key: %T`, X509CertThumbprintS256Key, value)
  907. case X509URLKey:
  908. if v, ok := value.(string); ok {
  909. h.x509URL = &v
  910. return nil
  911. }
  912. return errors.Errorf(`invalid value for %s key: %T`, X509URLKey, value)
  913. default:
  914. if h.privateParams == nil {
  915. h.privateParams = map[string]interface{}{}
  916. }
  917. h.privateParams[name] = value
  918. }
  919. return nil
  920. }
  921. func (k *rsaPrivateKey) Remove(key string) error {
  922. k.mu.Lock()
  923. defer k.mu.Unlock()
  924. switch key {
  925. case AlgorithmKey:
  926. k.algorithm = nil
  927. case RSADKey:
  928. k.d = nil
  929. case RSADPKey:
  930. k.dp = nil
  931. case RSADQKey:
  932. k.dq = nil
  933. case RSAEKey:
  934. k.e = nil
  935. case KeyIDKey:
  936. k.keyID = nil
  937. case KeyOpsKey:
  938. k.keyOps = nil
  939. case KeyUsageKey:
  940. k.keyUsage = nil
  941. case RSANKey:
  942. k.n = nil
  943. case RSAPKey:
  944. k.p = nil
  945. case RSAQKey:
  946. k.q = nil
  947. case RSAQIKey:
  948. k.qi = nil
  949. case X509CertChainKey:
  950. k.x509CertChain = nil
  951. case X509CertThumbprintKey:
  952. k.x509CertThumbprint = nil
  953. case X509CertThumbprintS256Key:
  954. k.x509CertThumbprintS256 = nil
  955. case X509URLKey:
  956. k.x509URL = nil
  957. default:
  958. delete(k.privateParams, key)
  959. }
  960. return nil
  961. }
  962. func (k *rsaPrivateKey) Clone() (Key, error) {
  963. return cloneKey(k)
  964. }
  965. func (k *rsaPrivateKey) DecodeCtx() json.DecodeCtx {
  966. k.mu.RLock()
  967. defer k.mu.RUnlock()
  968. return k.dc
  969. }
  970. func (k *rsaPrivateKey) SetDecodeCtx(dc json.DecodeCtx) {
  971. k.mu.Lock()
  972. defer k.mu.Unlock()
  973. k.dc = dc
  974. }
  975. func (h *rsaPrivateKey) UnmarshalJSON(buf []byte) error {
  976. h.algorithm = nil
  977. h.d = nil
  978. h.dp = nil
  979. h.dq = nil
  980. h.e = nil
  981. h.keyID = nil
  982. h.keyOps = nil
  983. h.keyUsage = nil
  984. h.n = nil
  985. h.p = nil
  986. h.q = nil
  987. h.qi = nil
  988. h.x509CertChain = nil
  989. h.x509CertThumbprint = nil
  990. h.x509CertThumbprintS256 = nil
  991. h.x509URL = nil
  992. dec := json.NewDecoder(bytes.NewReader(buf))
  993. LOOP:
  994. for {
  995. tok, err := dec.Token()
  996. if err != nil {
  997. return errors.Wrap(err, `error reading token`)
  998. }
  999. switch tok := tok.(type) {
  1000. case json.Delim:
  1001. // Assuming we're doing everything correctly, we should ONLY
  1002. // get either '{' or '}' here.
  1003. if tok == '}' { // End of object
  1004. break LOOP
  1005. } else if tok != '{' {
  1006. return errors.Errorf(`expected '{', but got '%c'`, tok)
  1007. }
  1008. case string: // Objects can only have string keys
  1009. switch tok {
  1010. case KeyTypeKey:
  1011. val, err := json.ReadNextStringToken(dec)
  1012. if err != nil {
  1013. return errors.Wrap(err, `error reading token`)
  1014. }
  1015. if val != jwa.RSA.String() {
  1016. return errors.Errorf(`invalid kty value for RSAPublicKey (%s)`, val)
  1017. }
  1018. case AlgorithmKey:
  1019. if err := json.AssignNextStringToken(&h.algorithm, dec); err != nil {
  1020. return errors.Wrapf(err, `failed to decode value for key %s`, AlgorithmKey)
  1021. }
  1022. case RSADKey:
  1023. if err := json.AssignNextBytesToken(&h.d, dec); err != nil {
  1024. return errors.Wrapf(err, `failed to decode value for key %s`, RSADKey)
  1025. }
  1026. case RSADPKey:
  1027. if err := json.AssignNextBytesToken(&h.dp, dec); err != nil {
  1028. return errors.Wrapf(err, `failed to decode value for key %s`, RSADPKey)
  1029. }
  1030. case RSADQKey:
  1031. if err := json.AssignNextBytesToken(&h.dq, dec); err != nil {
  1032. return errors.Wrapf(err, `failed to decode value for key %s`, RSADQKey)
  1033. }
  1034. case RSAEKey:
  1035. if err := json.AssignNextBytesToken(&h.e, dec); err != nil {
  1036. return errors.Wrapf(err, `failed to decode value for key %s`, RSAEKey)
  1037. }
  1038. case KeyIDKey:
  1039. if err := json.AssignNextStringToken(&h.keyID, dec); err != nil {
  1040. return errors.Wrapf(err, `failed to decode value for key %s`, KeyIDKey)
  1041. }
  1042. case KeyOpsKey:
  1043. var decoded KeyOperationList
  1044. if err := dec.Decode(&decoded); err != nil {
  1045. return errors.Wrapf(err, `failed to decode value for key %s`, KeyOpsKey)
  1046. }
  1047. h.keyOps = &decoded
  1048. case KeyUsageKey:
  1049. if err := json.AssignNextStringToken(&h.keyUsage, dec); err != nil {
  1050. return errors.Wrapf(err, `failed to decode value for key %s`, KeyUsageKey)
  1051. }
  1052. case RSANKey:
  1053. if err := json.AssignNextBytesToken(&h.n, dec); err != nil {
  1054. return errors.Wrapf(err, `failed to decode value for key %s`, RSANKey)
  1055. }
  1056. case RSAPKey:
  1057. if err := json.AssignNextBytesToken(&h.p, dec); err != nil {
  1058. return errors.Wrapf(err, `failed to decode value for key %s`, RSAPKey)
  1059. }
  1060. case RSAQKey:
  1061. if err := json.AssignNextBytesToken(&h.q, dec); err != nil {
  1062. return errors.Wrapf(err, `failed to decode value for key %s`, RSAQKey)
  1063. }
  1064. case RSAQIKey:
  1065. if err := json.AssignNextBytesToken(&h.qi, dec); err != nil {
  1066. return errors.Wrapf(err, `failed to decode value for key %s`, RSAQIKey)
  1067. }
  1068. case X509CertChainKey:
  1069. var decoded CertificateChain
  1070. if err := dec.Decode(&decoded); err != nil {
  1071. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertChainKey)
  1072. }
  1073. h.x509CertChain = &decoded
  1074. case X509CertThumbprintKey:
  1075. if err := json.AssignNextStringToken(&h.x509CertThumbprint, dec); err != nil {
  1076. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintKey)
  1077. }
  1078. case X509CertThumbprintS256Key:
  1079. if err := json.AssignNextStringToken(&h.x509CertThumbprintS256, dec); err != nil {
  1080. return errors.Wrapf(err, `failed to decode value for key %s`, X509CertThumbprintS256Key)
  1081. }
  1082. case X509URLKey:
  1083. if err := json.AssignNextStringToken(&h.x509URL, dec); err != nil {
  1084. return errors.Wrapf(err, `failed to decode value for key %s`, X509URLKey)
  1085. }
  1086. default:
  1087. if dc := h.dc; dc != nil {
  1088. if localReg := dc.Registry(); localReg != nil {
  1089. decoded, err := localReg.Decode(dec, tok)
  1090. if err == nil {
  1091. h.setNoLock(tok, decoded)
  1092. continue
  1093. }
  1094. }
  1095. }
  1096. decoded, err := registry.Decode(dec, tok)
  1097. if err == nil {
  1098. h.setNoLock(tok, decoded)
  1099. continue
  1100. }
  1101. return errors.Wrapf(err, `could not decode field %s`, tok)
  1102. }
  1103. default:
  1104. return errors.Errorf(`invalid token %T`, tok)
  1105. }
  1106. }
  1107. if h.d == nil {
  1108. return errors.Errorf(`required field d is missing`)
  1109. }
  1110. if h.e == nil {
  1111. return errors.Errorf(`required field e is missing`)
  1112. }
  1113. if h.n == nil {
  1114. return errors.Errorf(`required field n is missing`)
  1115. }
  1116. return nil
  1117. }
  1118. func (h rsaPrivateKey) MarshalJSON() ([]byte, error) {
  1119. data := make(map[string]interface{})
  1120. fields := make([]string, 0, 16)
  1121. for _, pair := range h.makePairs() {
  1122. fields = append(fields, pair.Key.(string))
  1123. data[pair.Key.(string)] = pair.Value
  1124. }
  1125. sort.Strings(fields)
  1126. buf := pool.GetBytesBuffer()
  1127. defer pool.ReleaseBytesBuffer(buf)
  1128. buf.WriteByte('{')
  1129. enc := json.NewEncoder(buf)
  1130. for i, f := range fields {
  1131. if i > 0 {
  1132. buf.WriteRune(',')
  1133. }
  1134. buf.WriteRune('"')
  1135. buf.WriteString(f)
  1136. buf.WriteString(`":`)
  1137. v := data[f]
  1138. switch v := v.(type) {
  1139. case []byte:
  1140. buf.WriteRune('"')
  1141. buf.WriteString(base64.EncodeToString(v))
  1142. buf.WriteRune('"')
  1143. default:
  1144. if err := enc.Encode(v); err != nil {
  1145. return nil, errors.Wrapf(err, `failed to encode value for field %s`, f)
  1146. }
  1147. buf.Truncate(buf.Len() - 1)
  1148. }
  1149. }
  1150. buf.WriteByte('}')
  1151. ret := make([]byte, buf.Len())
  1152. copy(ret, buf.Bytes())
  1153. return ret, nil
  1154. }
  1155. func (h *rsaPrivateKey) Iterate(ctx context.Context) HeaderIterator {
  1156. pairs := h.makePairs()
  1157. ch := make(chan *HeaderPair, len(pairs))
  1158. go func(ctx context.Context, ch chan *HeaderPair, pairs []*HeaderPair) {
  1159. defer close(ch)
  1160. for _, pair := range pairs {
  1161. select {
  1162. case <-ctx.Done():
  1163. return
  1164. case ch <- pair:
  1165. }
  1166. }
  1167. }(ctx, ch, pairs)
  1168. return mapiter.New(ch)
  1169. }
  1170. func (h *rsaPrivateKey) Walk(ctx context.Context, visitor HeaderVisitor) error {
  1171. return iter.WalkMap(ctx, h, visitor)
  1172. }
  1173. func (h *rsaPrivateKey) AsMap(ctx context.Context) (map[string]interface{}, error) {
  1174. return iter.AsMap(ctx, h)
  1175. }