crypto.go 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667
  1. package mint
  2. import (
  3. "bytes"
  4. "crypto"
  5. "crypto/aes"
  6. "crypto/cipher"
  7. "crypto/ecdsa"
  8. "crypto/elliptic"
  9. "crypto/hmac"
  10. "crypto/rand"
  11. "crypto/rsa"
  12. "crypto/x509"
  13. "crypto/x509/pkix"
  14. "encoding/asn1"
  15. "fmt"
  16. "math/big"
  17. "time"
  18. "golang.org/x/crypto/curve25519"
  19. // Blank includes to ensure hash support
  20. _ "crypto/sha1"
  21. _ "crypto/sha256"
  22. _ "crypto/sha512"
  23. )
  24. var prng = rand.Reader
  25. type aeadFactory func(key []byte) (cipher.AEAD, error)
  26. type CipherSuiteParams struct {
  27. Suite CipherSuite
  28. Cipher aeadFactory // Cipher factory
  29. Hash crypto.Hash // Hash function
  30. KeyLen int // Key length in octets
  31. IvLen int // IV length in octets
  32. }
  33. type signatureAlgorithm uint8
  34. const (
  35. signatureAlgorithmUnknown = iota
  36. signatureAlgorithmRSA_PKCS1
  37. signatureAlgorithmRSA_PSS
  38. signatureAlgorithmECDSA
  39. )
  40. var (
  41. hashMap = map[SignatureScheme]crypto.Hash{
  42. RSA_PKCS1_SHA1: crypto.SHA1,
  43. RSA_PKCS1_SHA256: crypto.SHA256,
  44. RSA_PKCS1_SHA384: crypto.SHA384,
  45. RSA_PKCS1_SHA512: crypto.SHA512,
  46. ECDSA_P256_SHA256: crypto.SHA256,
  47. ECDSA_P384_SHA384: crypto.SHA384,
  48. ECDSA_P521_SHA512: crypto.SHA512,
  49. RSA_PSS_SHA256: crypto.SHA256,
  50. RSA_PSS_SHA384: crypto.SHA384,
  51. RSA_PSS_SHA512: crypto.SHA512,
  52. }
  53. sigMap = map[SignatureScheme]signatureAlgorithm{
  54. RSA_PKCS1_SHA1: signatureAlgorithmRSA_PKCS1,
  55. RSA_PKCS1_SHA256: signatureAlgorithmRSA_PKCS1,
  56. RSA_PKCS1_SHA384: signatureAlgorithmRSA_PKCS1,
  57. RSA_PKCS1_SHA512: signatureAlgorithmRSA_PKCS1,
  58. ECDSA_P256_SHA256: signatureAlgorithmECDSA,
  59. ECDSA_P384_SHA384: signatureAlgorithmECDSA,
  60. ECDSA_P521_SHA512: signatureAlgorithmECDSA,
  61. RSA_PSS_SHA256: signatureAlgorithmRSA_PSS,
  62. RSA_PSS_SHA384: signatureAlgorithmRSA_PSS,
  63. RSA_PSS_SHA512: signatureAlgorithmRSA_PSS,
  64. }
  65. curveMap = map[SignatureScheme]NamedGroup{
  66. ECDSA_P256_SHA256: P256,
  67. ECDSA_P384_SHA384: P384,
  68. ECDSA_P521_SHA512: P521,
  69. }
  70. newAESGCM = func(key []byte) (cipher.AEAD, error) {
  71. block, err := aes.NewCipher(key)
  72. if err != nil {
  73. return nil, err
  74. }
  75. // TLS always uses 12-byte nonces
  76. return cipher.NewGCMWithNonceSize(block, 12)
  77. }
  78. cipherSuiteMap = map[CipherSuite]CipherSuiteParams{
  79. TLS_AES_128_GCM_SHA256: {
  80. Suite: TLS_AES_128_GCM_SHA256,
  81. Cipher: newAESGCM,
  82. Hash: crypto.SHA256,
  83. KeyLen: 16,
  84. IvLen: 12,
  85. },
  86. TLS_AES_256_GCM_SHA384: {
  87. Suite: TLS_AES_256_GCM_SHA384,
  88. Cipher: newAESGCM,
  89. Hash: crypto.SHA384,
  90. KeyLen: 32,
  91. IvLen: 12,
  92. },
  93. }
  94. x509AlgMap = map[SignatureScheme]x509.SignatureAlgorithm{
  95. RSA_PKCS1_SHA1: x509.SHA1WithRSA,
  96. RSA_PKCS1_SHA256: x509.SHA256WithRSA,
  97. RSA_PKCS1_SHA384: x509.SHA384WithRSA,
  98. RSA_PKCS1_SHA512: x509.SHA512WithRSA,
  99. ECDSA_P256_SHA256: x509.ECDSAWithSHA256,
  100. ECDSA_P384_SHA384: x509.ECDSAWithSHA384,
  101. ECDSA_P521_SHA512: x509.ECDSAWithSHA512,
  102. }
  103. defaultRSAKeySize = 2048
  104. )
  105. func curveFromNamedGroup(group NamedGroup) (crv elliptic.Curve) {
  106. switch group {
  107. case P256:
  108. crv = elliptic.P256()
  109. case P384:
  110. crv = elliptic.P384()
  111. case P521:
  112. crv = elliptic.P521()
  113. }
  114. return
  115. }
  116. func namedGroupFromECDSAKey(key *ecdsa.PublicKey) (g NamedGroup) {
  117. switch key.Curve.Params().Name {
  118. case elliptic.P256().Params().Name:
  119. g = P256
  120. case elliptic.P384().Params().Name:
  121. g = P384
  122. case elliptic.P521().Params().Name:
  123. g = P521
  124. }
  125. return
  126. }
  127. func keyExchangeSizeFromNamedGroup(group NamedGroup) (size int) {
  128. size = 0
  129. switch group {
  130. case X25519:
  131. size = 32
  132. case P256:
  133. size = 65
  134. case P384:
  135. size = 97
  136. case P521:
  137. size = 133
  138. case FFDHE2048:
  139. size = 256
  140. case FFDHE3072:
  141. size = 384
  142. case FFDHE4096:
  143. size = 512
  144. case FFDHE6144:
  145. size = 768
  146. case FFDHE8192:
  147. size = 1024
  148. }
  149. return
  150. }
  151. func primeFromNamedGroup(group NamedGroup) (p *big.Int) {
  152. switch group {
  153. case FFDHE2048:
  154. p = finiteFieldPrime2048
  155. case FFDHE3072:
  156. p = finiteFieldPrime3072
  157. case FFDHE4096:
  158. p = finiteFieldPrime4096
  159. case FFDHE6144:
  160. p = finiteFieldPrime6144
  161. case FFDHE8192:
  162. p = finiteFieldPrime8192
  163. }
  164. return
  165. }
  166. func schemeValidForKey(alg SignatureScheme, key crypto.Signer) bool {
  167. sigType := sigMap[alg]
  168. switch key.(type) {
  169. case *rsa.PrivateKey:
  170. return sigType == signatureAlgorithmRSA_PKCS1 || sigType == signatureAlgorithmRSA_PSS
  171. case *ecdsa.PrivateKey:
  172. return sigType == signatureAlgorithmECDSA
  173. default:
  174. return false
  175. }
  176. }
  177. func ffdheKeyShareFromPrime(p *big.Int) (priv, pub *big.Int, err error) {
  178. primeLen := len(p.Bytes())
  179. for {
  180. // g = 2 for all ffdhe groups
  181. priv, err = rand.Int(prng, p)
  182. if err != nil {
  183. return
  184. }
  185. pub = big.NewInt(0)
  186. pub.Exp(big.NewInt(2), priv, p)
  187. if len(pub.Bytes()) == primeLen {
  188. return
  189. }
  190. }
  191. }
  192. func newKeyShare(group NamedGroup) (pub []byte, priv []byte, err error) {
  193. switch group {
  194. case P256, P384, P521:
  195. var x, y *big.Int
  196. crv := curveFromNamedGroup(group)
  197. priv, x, y, err = elliptic.GenerateKey(crv, prng)
  198. if err != nil {
  199. return
  200. }
  201. pub = elliptic.Marshal(crv, x, y)
  202. return
  203. case FFDHE2048, FFDHE3072, FFDHE4096, FFDHE6144, FFDHE8192:
  204. p := primeFromNamedGroup(group)
  205. x, X, err2 := ffdheKeyShareFromPrime(p)
  206. if err2 != nil {
  207. err = err2
  208. return
  209. }
  210. priv = x.Bytes()
  211. pubBytes := X.Bytes()
  212. numBytes := keyExchangeSizeFromNamedGroup(group)
  213. pub = make([]byte, numBytes)
  214. copy(pub[numBytes-len(pubBytes):], pubBytes)
  215. return
  216. case X25519:
  217. var private, public [32]byte
  218. _, err = prng.Read(private[:])
  219. if err != nil {
  220. return
  221. }
  222. curve25519.ScalarBaseMult(&public, &private)
  223. priv = private[:]
  224. pub = public[:]
  225. return
  226. default:
  227. return nil, nil, fmt.Errorf("tls.newkeyshare: Unsupported group %v", group)
  228. }
  229. }
  230. func keyAgreement(group NamedGroup, pub []byte, priv []byte) ([]byte, error) {
  231. switch group {
  232. case P256, P384, P521:
  233. if len(pub) != keyExchangeSizeFromNamedGroup(group) {
  234. return nil, fmt.Errorf("tls.keyagreement: Wrong public key size")
  235. }
  236. crv := curveFromNamedGroup(group)
  237. pubX, pubY := elliptic.Unmarshal(crv, pub)
  238. x, _ := crv.Params().ScalarMult(pubX, pubY, priv)
  239. xBytes := x.Bytes()
  240. numBytes := len(crv.Params().P.Bytes())
  241. ret := make([]byte, numBytes)
  242. copy(ret[numBytes-len(xBytes):], xBytes)
  243. return ret, nil
  244. case FFDHE2048, FFDHE3072, FFDHE4096, FFDHE6144, FFDHE8192:
  245. numBytes := keyExchangeSizeFromNamedGroup(group)
  246. if len(pub) != numBytes {
  247. return nil, fmt.Errorf("tls.keyagreement: Wrong public key size")
  248. }
  249. p := primeFromNamedGroup(group)
  250. x := big.NewInt(0).SetBytes(priv)
  251. Y := big.NewInt(0).SetBytes(pub)
  252. ZBytes := big.NewInt(0).Exp(Y, x, p).Bytes()
  253. ret := make([]byte, numBytes)
  254. copy(ret[numBytes-len(ZBytes):], ZBytes)
  255. return ret, nil
  256. case X25519:
  257. if len(pub) != keyExchangeSizeFromNamedGroup(group) {
  258. return nil, fmt.Errorf("tls.keyagreement: Wrong public key size")
  259. }
  260. var private, public, ret [32]byte
  261. copy(private[:], priv)
  262. copy(public[:], pub)
  263. curve25519.ScalarMult(&ret, &private, &public)
  264. return ret[:], nil
  265. default:
  266. return nil, fmt.Errorf("tls.keyagreement: Unsupported group %v", group)
  267. }
  268. }
  269. func newSigningKey(sig SignatureScheme) (crypto.Signer, error) {
  270. switch sig {
  271. case RSA_PKCS1_SHA1, RSA_PKCS1_SHA256,
  272. RSA_PKCS1_SHA384, RSA_PKCS1_SHA512,
  273. RSA_PSS_SHA256, RSA_PSS_SHA384,
  274. RSA_PSS_SHA512:
  275. return rsa.GenerateKey(prng, defaultRSAKeySize)
  276. case ECDSA_P256_SHA256:
  277. return ecdsa.GenerateKey(elliptic.P256(), prng)
  278. case ECDSA_P384_SHA384:
  279. return ecdsa.GenerateKey(elliptic.P384(), prng)
  280. case ECDSA_P521_SHA512:
  281. return ecdsa.GenerateKey(elliptic.P521(), prng)
  282. default:
  283. return nil, fmt.Errorf("tls.newsigningkey: Unsupported signature algorithm [%04x]", sig)
  284. }
  285. }
  286. // XXX(rlb): Copied from crypto/x509
  287. type ecdsaSignature struct {
  288. R, S *big.Int
  289. }
  290. func sign(alg SignatureScheme, privateKey crypto.Signer, sigInput []byte) ([]byte, error) {
  291. var opts crypto.SignerOpts
  292. hash := hashMap[alg]
  293. if hash == crypto.SHA1 {
  294. return nil, fmt.Errorf("tls.crypt.sign: Use of SHA-1 is forbidden")
  295. }
  296. sigType := sigMap[alg]
  297. var realInput []byte
  298. switch key := privateKey.(type) {
  299. case *rsa.PrivateKey:
  300. switch {
  301. case allowPKCS1 && sigType == signatureAlgorithmRSA_PKCS1:
  302. logf(logTypeCrypto, "signing with PKCS1, hashSize=[%d]", hash.Size())
  303. opts = hash
  304. case !allowPKCS1 && sigType == signatureAlgorithmRSA_PKCS1:
  305. fallthrough
  306. case sigType == signatureAlgorithmRSA_PSS:
  307. logf(logTypeCrypto, "signing with PSS, hashSize=[%d]", hash.Size())
  308. opts = &rsa.PSSOptions{SaltLength: hash.Size(), Hash: hash}
  309. default:
  310. return nil, fmt.Errorf("tls.crypto.sign: Unsupported algorithm for RSA key")
  311. }
  312. h := hash.New()
  313. h.Write(sigInput)
  314. realInput = h.Sum(nil)
  315. case *ecdsa.PrivateKey:
  316. if sigType != signatureAlgorithmECDSA {
  317. return nil, fmt.Errorf("tls.crypto.sign: Unsupported algorithm for ECDSA key")
  318. }
  319. algGroup := curveMap[alg]
  320. keyGroup := namedGroupFromECDSAKey(key.Public().(*ecdsa.PublicKey))
  321. if algGroup != keyGroup {
  322. return nil, fmt.Errorf("tls.crypto.sign: Unsupported hash/curve combination")
  323. }
  324. h := hash.New()
  325. h.Write(sigInput)
  326. realInput = h.Sum(nil)
  327. default:
  328. return nil, fmt.Errorf("tls.crypto.sign: Unsupported private key type")
  329. }
  330. sig, err := privateKey.Sign(prng, realInput, opts)
  331. logf(logTypeCrypto, "signature: %x", sig)
  332. return sig, err
  333. }
  334. func verify(alg SignatureScheme, publicKey crypto.PublicKey, sigInput []byte, sig []byte) error {
  335. hash := hashMap[alg]
  336. if hash == crypto.SHA1 {
  337. return fmt.Errorf("tls.crypt.sign: Use of SHA-1 is forbidden")
  338. }
  339. sigType := sigMap[alg]
  340. switch pub := publicKey.(type) {
  341. case *rsa.PublicKey:
  342. switch {
  343. case allowPKCS1 && sigType == signatureAlgorithmRSA_PKCS1:
  344. logf(logTypeCrypto, "verifying with PKCS1, hashSize=[%d]", hash.Size())
  345. h := hash.New()
  346. h.Write(sigInput)
  347. realInput := h.Sum(nil)
  348. return rsa.VerifyPKCS1v15(pub, hash, realInput, sig)
  349. case !allowPKCS1 && sigType == signatureAlgorithmRSA_PKCS1:
  350. fallthrough
  351. case sigType == signatureAlgorithmRSA_PSS:
  352. logf(logTypeCrypto, "verifying with PSS, hashSize=[%d]", hash.Size())
  353. opts := &rsa.PSSOptions{SaltLength: hash.Size(), Hash: hash}
  354. h := hash.New()
  355. h.Write(sigInput)
  356. realInput := h.Sum(nil)
  357. return rsa.VerifyPSS(pub, hash, realInput, sig, opts)
  358. default:
  359. return fmt.Errorf("tls.verify: Unsupported algorithm for RSA key")
  360. }
  361. case *ecdsa.PublicKey:
  362. if sigType != signatureAlgorithmECDSA {
  363. return fmt.Errorf("tls.verify: Unsupported algorithm for ECDSA key")
  364. }
  365. if curveMap[alg] != namedGroupFromECDSAKey(pub) {
  366. return fmt.Errorf("tls.verify: Unsupported curve for ECDSA key")
  367. }
  368. ecdsaSig := new(ecdsaSignature)
  369. if rest, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
  370. return err
  371. } else if len(rest) != 0 {
  372. return fmt.Errorf("tls.verify: trailing data after ECDSA signature")
  373. }
  374. if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
  375. return fmt.Errorf("tls.verify: ECDSA signature contained zero or negative values")
  376. }
  377. h := hash.New()
  378. h.Write(sigInput)
  379. realInput := h.Sum(nil)
  380. if !ecdsa.Verify(pub, realInput, ecdsaSig.R, ecdsaSig.S) {
  381. return fmt.Errorf("tls.verify: ECDSA verification failure")
  382. }
  383. return nil
  384. default:
  385. return fmt.Errorf("tls.verify: Unsupported key type")
  386. }
  387. }
  388. // 0
  389. // |
  390. // v
  391. // PSK -> HKDF-Extract = Early Secret
  392. // |
  393. // +-----> Derive-Secret(.,
  394. // | "ext binder" |
  395. // | "res binder",
  396. // | "")
  397. // | = binder_key
  398. // |
  399. // +-----> Derive-Secret(., "c e traffic",
  400. // | ClientHello)
  401. // | = client_early_traffic_secret
  402. // |
  403. // +-----> Derive-Secret(., "e exp master",
  404. // | ClientHello)
  405. // | = early_exporter_master_secret
  406. // v
  407. // Derive-Secret(., "derived", "")
  408. // |
  409. // v
  410. // (EC)DHE -> HKDF-Extract = Handshake Secret
  411. // |
  412. // +-----> Derive-Secret(., "c hs traffic",
  413. // | ClientHello...ServerHello)
  414. // | = client_handshake_traffic_secret
  415. // |
  416. // +-----> Derive-Secret(., "s hs traffic",
  417. // | ClientHello...ServerHello)
  418. // | = server_handshake_traffic_secret
  419. // v
  420. // Derive-Secret(., "derived", "")
  421. // |
  422. // v
  423. // 0 -> HKDF-Extract = Master Secret
  424. // |
  425. // +-----> Derive-Secret(., "c ap traffic",
  426. // | ClientHello...server Finished)
  427. // | = client_application_traffic_secret_0
  428. // |
  429. // +-----> Derive-Secret(., "s ap traffic",
  430. // | ClientHello...server Finished)
  431. // | = server_application_traffic_secret_0
  432. // |
  433. // +-----> Derive-Secret(., "exp master",
  434. // | ClientHello...server Finished)
  435. // | = exporter_master_secret
  436. // |
  437. // +-----> Derive-Secret(., "res master",
  438. // ClientHello...client Finished)
  439. // = resumption_master_secret
  440. // From RFC 5869
  441. // PRK = HMAC-Hash(salt, IKM)
  442. func HkdfExtract(hash crypto.Hash, saltIn, input []byte) []byte {
  443. salt := saltIn
  444. // if [salt is] not provided, it is set to a string of HashLen zeros
  445. if salt == nil {
  446. salt = bytes.Repeat([]byte{0}, hash.Size())
  447. }
  448. h := hmac.New(hash.New, salt)
  449. h.Write(input)
  450. out := h.Sum(nil)
  451. logf(logTypeCrypto, "HKDF Extract:\n")
  452. logf(logTypeCrypto, "Salt [%d]: %x\n", len(salt), salt)
  453. logf(logTypeCrypto, "Input [%d]: %x\n", len(input), input)
  454. logf(logTypeCrypto, "Output [%d]: %x\n", len(out), out)
  455. return out
  456. }
  457. const (
  458. labelExternalBinder = "ext binder"
  459. labelResumptionBinder = "res binder"
  460. labelEarlyTrafficSecret = "c e traffic"
  461. labelEarlyExporterSecret = "e exp master"
  462. labelClientHandshakeTrafficSecret = "c hs traffic"
  463. labelServerHandshakeTrafficSecret = "s hs traffic"
  464. labelClientApplicationTrafficSecret = "c ap traffic"
  465. labelServerApplicationTrafficSecret = "s ap traffic"
  466. labelExporterSecret = "exp master"
  467. labelResumptionSecret = "res master"
  468. labelDerived = "derived"
  469. labelFinished = "finished"
  470. labelResumption = "resumption"
  471. )
  472. // struct HkdfLabel {
  473. // uint16 length;
  474. // opaque label<9..255>;
  475. // opaque hash_value<0..255>;
  476. // };
  477. func hkdfEncodeLabel(labelIn string, hashValue []byte, outLen int) []byte {
  478. label := "tls13 " + labelIn
  479. labelLen := len(label)
  480. hashLen := len(hashValue)
  481. hkdfLabel := make([]byte, 2+1+labelLen+1+hashLen)
  482. hkdfLabel[0] = byte(outLen >> 8)
  483. hkdfLabel[1] = byte(outLen)
  484. hkdfLabel[2] = byte(labelLen)
  485. copy(hkdfLabel[3:3+labelLen], []byte(label))
  486. hkdfLabel[3+labelLen] = byte(hashLen)
  487. copy(hkdfLabel[3+labelLen+1:], hashValue)
  488. return hkdfLabel
  489. }
  490. func HkdfExpand(hash crypto.Hash, prk, info []byte, outLen int) []byte {
  491. out := []byte{}
  492. T := []byte{}
  493. i := byte(1)
  494. for len(out) < outLen {
  495. block := append(T, info...)
  496. block = append(block, i)
  497. h := hmac.New(hash.New, prk)
  498. h.Write(block)
  499. T = h.Sum(nil)
  500. out = append(out, T...)
  501. i++
  502. }
  503. return out[:outLen]
  504. }
  505. func HkdfExpandLabel(hash crypto.Hash, secret []byte, label string, hashValue []byte, outLen int) []byte {
  506. info := hkdfEncodeLabel(label, hashValue, outLen)
  507. derived := HkdfExpand(hash, secret, info, outLen)
  508. logf(logTypeCrypto, "HKDF Expand: label=[tls13 ] + '%s',requested length=%d\n", label, outLen)
  509. logf(logTypeCrypto, "PRK [%d]: %x\n", len(secret), secret)
  510. logf(logTypeCrypto, "Hash [%d]: %x\n", len(hashValue), hashValue)
  511. logf(logTypeCrypto, "Info [%d]: %x\n", len(info), info)
  512. logf(logTypeCrypto, "Derived key [%d]: %x\n", len(derived), derived)
  513. return derived
  514. }
  515. func deriveSecret(params CipherSuiteParams, secret []byte, label string, messageHash []byte) []byte {
  516. return HkdfExpandLabel(params.Hash, secret, label, messageHash, params.Hash.Size())
  517. }
  518. func computeFinishedData(params CipherSuiteParams, baseKey []byte, input []byte) []byte {
  519. macKey := HkdfExpandLabel(params.Hash, baseKey, labelFinished, []byte{}, params.Hash.Size())
  520. mac := hmac.New(params.Hash.New, macKey)
  521. mac.Write(input)
  522. return mac.Sum(nil)
  523. }
  524. type keySet struct {
  525. cipher aeadFactory
  526. key []byte
  527. iv []byte
  528. }
  529. func makeTrafficKeys(params CipherSuiteParams, secret []byte) keySet {
  530. logf(logTypeCrypto, "making traffic keys: secret=%x", secret)
  531. return keySet{
  532. cipher: params.Cipher,
  533. key: HkdfExpandLabel(params.Hash, secret, "key", []byte{}, params.KeyLen),
  534. iv: HkdfExpandLabel(params.Hash, secret, "iv", []byte{}, params.IvLen),
  535. }
  536. }
  537. func MakeNewSelfSignedCert(name string, alg SignatureScheme) (crypto.Signer, *x509.Certificate, error) {
  538. priv, err := newSigningKey(alg)
  539. if err != nil {
  540. return nil, nil, err
  541. }
  542. cert, err := newSelfSigned(name, alg, priv)
  543. if err != nil {
  544. return nil, nil, err
  545. }
  546. return priv, cert, nil
  547. }
  548. func newSelfSigned(name string, alg SignatureScheme, priv crypto.Signer) (*x509.Certificate, error) {
  549. sigAlg, ok := x509AlgMap[alg]
  550. if !ok {
  551. return nil, fmt.Errorf("tls.selfsigned: Unknown signature algorithm [%04x]", alg)
  552. }
  553. if len(name) == 0 {
  554. return nil, fmt.Errorf("tls.selfsigned: No name provided")
  555. }
  556. serial, err := rand.Int(rand.Reader, big.NewInt(0xA0A0A0A0))
  557. if err != nil {
  558. return nil, err
  559. }
  560. template := &x509.Certificate{
  561. SerialNumber: serial,
  562. NotBefore: time.Now(),
  563. NotAfter: time.Now().AddDate(0, 0, 1),
  564. SignatureAlgorithm: sigAlg,
  565. Subject: pkix.Name{CommonName: name},
  566. DNSNames: []string{name},
  567. KeyUsage: x509.KeyUsageDigitalSignature | x509.KeyUsageKeyAgreement | x509.KeyUsageKeyEncipherment,
  568. ExtKeyUsage: []x509.ExtKeyUsage{x509.ExtKeyUsageServerAuth},
  569. }
  570. der, err := x509.CreateCertificate(prng, template, template, priv.Public(), priv)
  571. if err != nil {
  572. return nil, err
  573. }
  574. // It is safe to ignore the error here because we're parsing known-good data
  575. cert, _ := x509.ParseCertificate(der)
  576. return cert, nil
  577. }