Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.
 
 
 
 
 
 

843 рядки
28 KiB

  1. // Copyright 2010 The Go Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style
  3. // license that can be found in the LICENSE file.
  4. package main
  5. import (
  6. "crypto"
  7. "crypto/ecdsa"
  8. "crypto/elliptic"
  9. "crypto/md5"
  10. "crypto/rand"
  11. "crypto/rsa"
  12. "crypto/sha1"
  13. "crypto/x509"
  14. "encoding/asn1"
  15. "errors"
  16. "io"
  17. "math/big"
  18. )
  19. var errClientKeyExchange = errors.New("tls: invalid ClientKeyExchange message")
  20. var errServerKeyExchange = errors.New("tls: invalid ServerKeyExchange message")
  21. // rsaKeyAgreement implements the standard TLS key agreement where the client
  22. // encrypts the pre-master secret to the server's public key.
  23. type rsaKeyAgreement struct {
  24. version uint16
  25. clientVersion uint16
  26. exportKey *rsa.PrivateKey
  27. }
  28. func (ka *rsaKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  29. // Save the client version for comparison later.
  30. ka.clientVersion = versionToWire(clientHello.vers, clientHello.isDTLS)
  31. if !config.Bugs.RSAEphemeralKey {
  32. return nil, nil
  33. }
  34. // Generate an ephemeral RSA key to use instead of the real
  35. // one, as in RSA_EXPORT.
  36. key, err := rsa.GenerateKey(config.rand(), 512)
  37. if err != nil {
  38. return nil, err
  39. }
  40. ka.exportKey = key
  41. modulus := key.N.Bytes()
  42. exponent := big.NewInt(int64(key.E)).Bytes()
  43. serverRSAParams := make([]byte, 0, 2+len(modulus)+2+len(exponent))
  44. serverRSAParams = append(serverRSAParams, byte(len(modulus)>>8), byte(len(modulus)))
  45. serverRSAParams = append(serverRSAParams, modulus...)
  46. serverRSAParams = append(serverRSAParams, byte(len(exponent)>>8), byte(len(exponent)))
  47. serverRSAParams = append(serverRSAParams, exponent...)
  48. var tls12HashId uint8
  49. if ka.version >= VersionTLS12 {
  50. if tls12HashId, err = pickTLS12HashForSignature(signatureRSA, clientHello.signatureAndHashes, config.signatureAndHashesForServer()); err != nil {
  51. return nil, err
  52. }
  53. }
  54. digest, hashFunc, err := hashForServerKeyExchange(signatureRSA, tls12HashId, ka.version, clientHello.random, hello.random, serverRSAParams)
  55. if err != nil {
  56. return nil, err
  57. }
  58. privKey, ok := cert.PrivateKey.(*rsa.PrivateKey)
  59. if !ok {
  60. return nil, errors.New("RSA ephemeral key requires an RSA server private key")
  61. }
  62. sig, err := rsa.SignPKCS1v15(config.rand(), privKey, hashFunc, digest)
  63. if err != nil {
  64. return nil, errors.New("failed to sign RSA parameters: " + err.Error())
  65. }
  66. skx := new(serverKeyExchangeMsg)
  67. sigAndHashLen := 0
  68. if ka.version >= VersionTLS12 {
  69. sigAndHashLen = 2
  70. }
  71. skx.key = make([]byte, len(serverRSAParams)+sigAndHashLen+2+len(sig))
  72. copy(skx.key, serverRSAParams)
  73. k := skx.key[len(serverRSAParams):]
  74. if ka.version >= VersionTLS12 {
  75. k[0] = tls12HashId
  76. k[1] = signatureRSA
  77. k = k[2:]
  78. }
  79. k[0] = byte(len(sig) >> 8)
  80. k[1] = byte(len(sig))
  81. copy(k[2:], sig)
  82. return skx, nil
  83. }
  84. func (ka *rsaKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  85. preMasterSecret := make([]byte, 48)
  86. _, err := io.ReadFull(config.rand(), preMasterSecret[2:])
  87. if err != nil {
  88. return nil, err
  89. }
  90. if len(ckx.ciphertext) < 2 {
  91. return nil, errClientKeyExchange
  92. }
  93. ciphertext := ckx.ciphertext
  94. if version != VersionSSL30 {
  95. ciphertextLen := int(ckx.ciphertext[0])<<8 | int(ckx.ciphertext[1])
  96. if ciphertextLen != len(ckx.ciphertext)-2 {
  97. return nil, errClientKeyExchange
  98. }
  99. ciphertext = ckx.ciphertext[2:]
  100. }
  101. key := cert.PrivateKey.(*rsa.PrivateKey)
  102. if ka.exportKey != nil {
  103. key = ka.exportKey
  104. }
  105. err = rsa.DecryptPKCS1v15SessionKey(config.rand(), key, ciphertext, preMasterSecret)
  106. if err != nil {
  107. return nil, err
  108. }
  109. // This check should be done in constant-time, but this is a testing
  110. // implementation. See the discussion at the end of section 7.4.7.1 of
  111. // RFC 4346.
  112. vers := uint16(preMasterSecret[0])<<8 | uint16(preMasterSecret[1])
  113. if ka.clientVersion != vers {
  114. return nil, errors.New("tls: invalid version in RSA premaster")
  115. }
  116. return preMasterSecret, nil
  117. }
  118. func (ka *rsaKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  119. return errors.New("tls: unexpected ServerKeyExchange")
  120. }
  121. func (ka *rsaKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  122. preMasterSecret := make([]byte, 48)
  123. vers := clientHello.vers
  124. if config.Bugs.RsaClientKeyExchangeVersion != 0 {
  125. vers = config.Bugs.RsaClientKeyExchangeVersion
  126. }
  127. vers = versionToWire(vers, clientHello.isDTLS)
  128. preMasterSecret[0] = byte(vers >> 8)
  129. preMasterSecret[1] = byte(vers)
  130. _, err := io.ReadFull(config.rand(), preMasterSecret[2:])
  131. if err != nil {
  132. return nil, nil, err
  133. }
  134. encrypted, err := rsa.EncryptPKCS1v15(config.rand(), cert.PublicKey.(*rsa.PublicKey), preMasterSecret)
  135. if err != nil {
  136. return nil, nil, err
  137. }
  138. ckx := new(clientKeyExchangeMsg)
  139. if clientHello.vers != VersionSSL30 && !config.Bugs.SSL3RSAKeyExchange {
  140. ckx.ciphertext = make([]byte, len(encrypted)+2)
  141. ckx.ciphertext[0] = byte(len(encrypted) >> 8)
  142. ckx.ciphertext[1] = byte(len(encrypted))
  143. copy(ckx.ciphertext[2:], encrypted)
  144. } else {
  145. ckx.ciphertext = encrypted
  146. }
  147. return preMasterSecret, ckx, nil
  148. }
  149. // sha1Hash calculates a SHA1 hash over the given byte slices.
  150. func sha1Hash(slices [][]byte) []byte {
  151. hsha1 := sha1.New()
  152. for _, slice := range slices {
  153. hsha1.Write(slice)
  154. }
  155. return hsha1.Sum(nil)
  156. }
  157. // md5SHA1Hash implements TLS 1.0's hybrid hash function which consists of the
  158. // concatenation of an MD5 and SHA1 hash.
  159. func md5SHA1Hash(slices [][]byte) []byte {
  160. md5sha1 := make([]byte, md5.Size+sha1.Size)
  161. hmd5 := md5.New()
  162. for _, slice := range slices {
  163. hmd5.Write(slice)
  164. }
  165. copy(md5sha1, hmd5.Sum(nil))
  166. copy(md5sha1[md5.Size:], sha1Hash(slices))
  167. return md5sha1
  168. }
  169. // hashForServerKeyExchange hashes the given slices and returns their digest
  170. // and the identifier of the hash function used. The hashFunc argument is only
  171. // used for >= TLS 1.2 and precisely identifies the hash function to use.
  172. func hashForServerKeyExchange(sigType, hashFunc uint8, version uint16, slices ...[]byte) ([]byte, crypto.Hash, error) {
  173. if version >= VersionTLS12 {
  174. hash, err := lookupTLSHash(hashFunc)
  175. if err != nil {
  176. return nil, 0, err
  177. }
  178. h := hash.New()
  179. for _, slice := range slices {
  180. h.Write(slice)
  181. }
  182. return h.Sum(nil), hash, nil
  183. }
  184. if sigType == signatureECDSA {
  185. return sha1Hash(slices), crypto.SHA1, nil
  186. }
  187. return md5SHA1Hash(slices), crypto.MD5SHA1, nil
  188. }
  189. // pickTLS12HashForSignature returns a TLS 1.2 hash identifier for signing a
  190. // ServerKeyExchange given the signature type being used and the client's
  191. // advertized list of supported signature and hash combinations.
  192. func pickTLS12HashForSignature(sigType uint8, clientList, serverList []signatureAndHash) (uint8, error) {
  193. if len(clientList) == 0 {
  194. // If the client didn't specify any signature_algorithms
  195. // extension then we can assume that it supports SHA1. See
  196. // http://tools.ietf.org/html/rfc5246#section-7.4.1.4.1
  197. return hashSHA1, nil
  198. }
  199. for _, sigAndHash := range clientList {
  200. if sigAndHash.signature != sigType {
  201. continue
  202. }
  203. if isSupportedSignatureAndHash(sigAndHash, serverList) {
  204. return sigAndHash.hash, nil
  205. }
  206. }
  207. return 0, errors.New("tls: client doesn't support any common hash functions")
  208. }
  209. func curveForCurveID(id CurveID) (elliptic.Curve, bool) {
  210. switch id {
  211. case CurveP224:
  212. return elliptic.P224(), true
  213. case CurveP256:
  214. return elliptic.P256(), true
  215. case CurveP384:
  216. return elliptic.P384(), true
  217. case CurveP521:
  218. return elliptic.P521(), true
  219. default:
  220. return nil, false
  221. }
  222. }
  223. // keyAgreementAuthentication is a helper interface that specifies how
  224. // to authenticate the ServerKeyExchange parameters.
  225. type keyAgreementAuthentication interface {
  226. signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error)
  227. verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error
  228. }
  229. // nilKeyAgreementAuthentication does not authenticate the key
  230. // agreement parameters.
  231. type nilKeyAgreementAuthentication struct{}
  232. func (ka *nilKeyAgreementAuthentication) signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) {
  233. skx := new(serverKeyExchangeMsg)
  234. skx.key = params
  235. return skx, nil
  236. }
  237. func (ka *nilKeyAgreementAuthentication) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error {
  238. return nil
  239. }
  240. // signedKeyAgreement signs the ServerKeyExchange parameters with the
  241. // server's private key.
  242. type signedKeyAgreement struct {
  243. version uint16
  244. sigType uint8
  245. }
  246. func (ka *signedKeyAgreement) signParameters(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg, params []byte) (*serverKeyExchangeMsg, error) {
  247. var tls12HashId uint8
  248. var err error
  249. if ka.version >= VersionTLS12 {
  250. if tls12HashId, err = pickTLS12HashForSignature(ka.sigType, clientHello.signatureAndHashes, config.signatureAndHashesForServer()); err != nil {
  251. return nil, err
  252. }
  253. }
  254. digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, hello.random, params)
  255. if err != nil {
  256. return nil, err
  257. }
  258. if config.Bugs.InvalidSKXSignature {
  259. digest[0] ^= 0x80
  260. }
  261. var sig []byte
  262. switch ka.sigType {
  263. case signatureECDSA:
  264. privKey, ok := cert.PrivateKey.(*ecdsa.PrivateKey)
  265. if !ok {
  266. return nil, errors.New("ECDHE ECDSA requires an ECDSA server private key")
  267. }
  268. r, s, err := ecdsa.Sign(config.rand(), privKey, digest)
  269. if err != nil {
  270. return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
  271. }
  272. order := privKey.Curve.Params().N
  273. r = maybeCorruptECDSAValue(r, config.Bugs.BadECDSAR, order)
  274. s = maybeCorruptECDSAValue(s, config.Bugs.BadECDSAS, order)
  275. sig, err = asn1.Marshal(ecdsaSignature{r, s})
  276. case signatureRSA:
  277. privKey, ok := cert.PrivateKey.(*rsa.PrivateKey)
  278. if !ok {
  279. return nil, errors.New("ECDHE RSA requires a RSA server private key")
  280. }
  281. sig, err = rsa.SignPKCS1v15(config.rand(), privKey, hashFunc, digest)
  282. if err != nil {
  283. return nil, errors.New("failed to sign ECDHE parameters: " + err.Error())
  284. }
  285. default:
  286. return nil, errors.New("unknown ECDHE signature algorithm")
  287. }
  288. skx := new(serverKeyExchangeMsg)
  289. if config.Bugs.UnauthenticatedECDH {
  290. skx.key = params
  291. } else {
  292. sigAndHashLen := 0
  293. if ka.version >= VersionTLS12 {
  294. sigAndHashLen = 2
  295. }
  296. skx.key = make([]byte, len(params)+sigAndHashLen+2+len(sig))
  297. copy(skx.key, params)
  298. k := skx.key[len(params):]
  299. if ka.version >= VersionTLS12 {
  300. k[0] = tls12HashId
  301. k[1] = ka.sigType
  302. k = k[2:]
  303. }
  304. k[0] = byte(len(sig) >> 8)
  305. k[1] = byte(len(sig))
  306. copy(k[2:], sig)
  307. }
  308. return skx, nil
  309. }
  310. func (ka *signedKeyAgreement) verifyParameters(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, params []byte, sig []byte) error {
  311. if len(sig) < 2 {
  312. return errServerKeyExchange
  313. }
  314. var tls12HashId uint8
  315. if ka.version >= VersionTLS12 {
  316. // handle SignatureAndHashAlgorithm
  317. var sigAndHash []uint8
  318. sigAndHash, sig = sig[:2], sig[2:]
  319. if sigAndHash[1] != ka.sigType {
  320. return errServerKeyExchange
  321. }
  322. tls12HashId = sigAndHash[0]
  323. if len(sig) < 2 {
  324. return errServerKeyExchange
  325. }
  326. if !isSupportedSignatureAndHash(signatureAndHash{ka.sigType, tls12HashId}, config.signatureAndHashesForClient()) {
  327. return errors.New("tls: unsupported hash function for ServerKeyExchange")
  328. }
  329. }
  330. sigLen := int(sig[0])<<8 | int(sig[1])
  331. if sigLen+2 != len(sig) {
  332. return errServerKeyExchange
  333. }
  334. sig = sig[2:]
  335. digest, hashFunc, err := hashForServerKeyExchange(ka.sigType, tls12HashId, ka.version, clientHello.random, serverHello.random, params)
  336. if err != nil {
  337. return err
  338. }
  339. switch ka.sigType {
  340. case signatureECDSA:
  341. pubKey, ok := cert.PublicKey.(*ecdsa.PublicKey)
  342. if !ok {
  343. return errors.New("ECDHE ECDSA requires a ECDSA server public key")
  344. }
  345. ecdsaSig := new(ecdsaSignature)
  346. if _, err := asn1.Unmarshal(sig, ecdsaSig); err != nil {
  347. return err
  348. }
  349. if ecdsaSig.R.Sign() <= 0 || ecdsaSig.S.Sign() <= 0 {
  350. return errors.New("ECDSA signature contained zero or negative values")
  351. }
  352. if !ecdsa.Verify(pubKey, digest, ecdsaSig.R, ecdsaSig.S) {
  353. return errors.New("ECDSA verification failure")
  354. }
  355. case signatureRSA:
  356. pubKey, ok := cert.PublicKey.(*rsa.PublicKey)
  357. if !ok {
  358. return errors.New("ECDHE RSA requires a RSA server public key")
  359. }
  360. if err := rsa.VerifyPKCS1v15(pubKey, hashFunc, digest, sig); err != nil {
  361. return err
  362. }
  363. default:
  364. return errors.New("unknown ECDHE signature algorithm")
  365. }
  366. return nil
  367. }
  368. // ecdheRSAKeyAgreement implements a TLS key agreement where the server
  369. // generates a ephemeral EC public/private key pair and signs it. The
  370. // pre-master secret is then calculated using ECDH. The signature may
  371. // either be ECDSA or RSA.
  372. type ecdheKeyAgreement struct {
  373. auth keyAgreementAuthentication
  374. privateKey []byte
  375. curve elliptic.Curve
  376. x, y *big.Int
  377. }
  378. func maybeCorruptECDSAValue(n *big.Int, typeOfCorruption BadValue, limit *big.Int) *big.Int {
  379. switch typeOfCorruption {
  380. case BadValueNone:
  381. return n
  382. case BadValueNegative:
  383. return new(big.Int).Neg(n)
  384. case BadValueZero:
  385. return big.NewInt(0)
  386. case BadValueLimit:
  387. return limit
  388. case BadValueLarge:
  389. bad := new(big.Int).Set(limit)
  390. return bad.Lsh(bad, 20)
  391. default:
  392. panic("unknown BadValue type")
  393. }
  394. }
  395. func (ka *ecdheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  396. var curveid CurveID
  397. preferredCurves := config.curvePreferences()
  398. NextCandidate:
  399. for _, candidate := range preferredCurves {
  400. for _, c := range clientHello.supportedCurves {
  401. if candidate == c {
  402. curveid = c
  403. break NextCandidate
  404. }
  405. }
  406. }
  407. if curveid == 0 {
  408. return nil, errors.New("tls: no supported elliptic curves offered")
  409. }
  410. var ok bool
  411. if ka.curve, ok = curveForCurveID(curveid); !ok {
  412. return nil, errors.New("tls: preferredCurves includes unsupported curve")
  413. }
  414. var x, y *big.Int
  415. var err error
  416. ka.privateKey, x, y, err = elliptic.GenerateKey(ka.curve, config.rand())
  417. if err != nil {
  418. return nil, err
  419. }
  420. ecdhePublic := elliptic.Marshal(ka.curve, x, y)
  421. // http://tools.ietf.org/html/rfc4492#section-5.4
  422. serverECDHParams := make([]byte, 1+2+1+len(ecdhePublic))
  423. serverECDHParams[0] = 3 // named curve
  424. serverECDHParams[1] = byte(curveid >> 8)
  425. serverECDHParams[2] = byte(curveid)
  426. if config.Bugs.InvalidSKXCurve {
  427. serverECDHParams[2] ^= 0xff
  428. }
  429. serverECDHParams[3] = byte(len(ecdhePublic))
  430. copy(serverECDHParams[4:], ecdhePublic)
  431. return ka.auth.signParameters(config, cert, clientHello, hello, serverECDHParams)
  432. }
  433. func (ka *ecdheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  434. if len(ckx.ciphertext) == 0 || int(ckx.ciphertext[0]) != len(ckx.ciphertext)-1 {
  435. return nil, errClientKeyExchange
  436. }
  437. x, y := elliptic.Unmarshal(ka.curve, ckx.ciphertext[1:])
  438. if x == nil {
  439. return nil, errClientKeyExchange
  440. }
  441. x, _ = ka.curve.ScalarMult(x, y, ka.privateKey)
  442. preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
  443. xBytes := x.Bytes()
  444. copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
  445. return preMasterSecret, nil
  446. }
  447. func (ka *ecdheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  448. if len(skx.key) < 4 {
  449. return errServerKeyExchange
  450. }
  451. if skx.key[0] != 3 { // named curve
  452. return errors.New("tls: server selected unsupported curve")
  453. }
  454. curveid := CurveID(skx.key[1])<<8 | CurveID(skx.key[2])
  455. var ok bool
  456. if ka.curve, ok = curveForCurveID(curveid); !ok {
  457. return errors.New("tls: server selected unsupported curve")
  458. }
  459. publicLen := int(skx.key[3])
  460. if publicLen+4 > len(skx.key) {
  461. return errServerKeyExchange
  462. }
  463. ka.x, ka.y = elliptic.Unmarshal(ka.curve, skx.key[4:4+publicLen])
  464. if ka.x == nil {
  465. return errServerKeyExchange
  466. }
  467. serverECDHParams := skx.key[:4+publicLen]
  468. sig := skx.key[4+publicLen:]
  469. return ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverECDHParams, sig)
  470. }
  471. func (ka *ecdheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  472. if ka.curve == nil {
  473. return nil, nil, errors.New("missing ServerKeyExchange message")
  474. }
  475. priv, mx, my, err := elliptic.GenerateKey(ka.curve, config.rand())
  476. if err != nil {
  477. return nil, nil, err
  478. }
  479. x, _ := ka.curve.ScalarMult(ka.x, ka.y, priv)
  480. preMasterSecret := make([]byte, (ka.curve.Params().BitSize+7)>>3)
  481. xBytes := x.Bytes()
  482. copy(preMasterSecret[len(preMasterSecret)-len(xBytes):], xBytes)
  483. serialized := elliptic.Marshal(ka.curve, mx, my)
  484. ckx := new(clientKeyExchangeMsg)
  485. ckx.ciphertext = make([]byte, 1+len(serialized))
  486. ckx.ciphertext[0] = byte(len(serialized))
  487. copy(ckx.ciphertext[1:], serialized)
  488. return preMasterSecret, ckx, nil
  489. }
  490. // dheRSAKeyAgreement implements a TLS key agreement where the server generates
  491. // an ephemeral Diffie-Hellman public/private key pair and signs it. The
  492. // pre-master secret is then calculated using Diffie-Hellman.
  493. type dheKeyAgreement struct {
  494. auth keyAgreementAuthentication
  495. p, g *big.Int
  496. yTheirs *big.Int
  497. xOurs *big.Int
  498. }
  499. func (ka *dheKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  500. var q *big.Int
  501. if p := config.Bugs.DHGroupPrime; p != nil {
  502. ka.p = p
  503. ka.g = big.NewInt(2)
  504. q = p
  505. } else {
  506. // 2048-bit MODP Group with 256-bit Prime Order Subgroup (RFC
  507. // 5114, Section 2.3)
  508. ka.p, _ = new(big.Int).SetString("87A8E61DB4B6663CFFBBD19C651959998CEEF608660DD0F25D2CEED4435E3B00E00DF8F1D61957D4FAF7DF4561B2AA3016C3D91134096FAA3BF4296D830E9A7C209E0C6497517ABD5A8A9D306BCF67ED91F9E6725B4758C022E0B1EF4275BF7B6C5BFC11D45F9088B941F54EB1E59BB8BC39A0BF12307F5C4FDB70C581B23F76B63ACAE1CAA6B7902D52526735488A0EF13C6D9A51BFA4AB3AD8347796524D8EF6A167B5A41825D967E144E5140564251CCACB83E6B486F6B3CA3F7971506026C0B857F689962856DED4010ABD0BE621C3A3960A54E710C375F26375D7014103A4B54330C198AF126116D2276E11715F693877FAD7EF09CADB094AE91E1A1597", 16)
  509. ka.g, _ = new(big.Int).SetString("3FB32C9B73134D0B2E77506660EDBD484CA7B18F21EF205407F4793A1A0BA12510DBC15077BE463FFF4FED4AAC0BB555BE3A6C1B0C6B47B1BC3773BF7E8C6F62901228F8C28CBB18A55AE31341000A650196F931C77A57F2DDF463E5E9EC144B777DE62AAAB8A8628AC376D282D6ED3864E67982428EBC831D14348F6F2F9193B5045AF2767164E1DFC967C1FB3F2E55A4BD1BFFE83B9C80D052B985D182EA0ADB2A3B7313D3FE14C8484B1E052588B9B7D2BBD2DF016199ECD06E1557CD0915B3353BBB64E0EC377FD028370DF92B52C7891428CDC67EB6184B523D1DB246C32F63078490F00EF8D647D148D47954515E2327CFEF98C582664B4C0F6CC41659", 16)
  510. q, _ = new(big.Int).SetString("8CF83642A709A097B447997640129DA299B1A47D1EB3750BA308B0FE64F5FBD3", 16)
  511. }
  512. var err error
  513. ka.xOurs, err = rand.Int(config.rand(), q)
  514. if err != nil {
  515. return nil, err
  516. }
  517. yOurs := new(big.Int).Exp(ka.g, ka.xOurs, ka.p)
  518. // http://tools.ietf.org/html/rfc5246#section-7.4.3
  519. pBytes := ka.p.Bytes()
  520. gBytes := ka.g.Bytes()
  521. yBytes := yOurs.Bytes()
  522. serverDHParams := make([]byte, 0, 2+len(pBytes)+2+len(gBytes)+2+len(yBytes))
  523. serverDHParams = append(serverDHParams, byte(len(pBytes)>>8), byte(len(pBytes)))
  524. serverDHParams = append(serverDHParams, pBytes...)
  525. serverDHParams = append(serverDHParams, byte(len(gBytes)>>8), byte(len(gBytes)))
  526. serverDHParams = append(serverDHParams, gBytes...)
  527. serverDHParams = append(serverDHParams, byte(len(yBytes)>>8), byte(len(yBytes)))
  528. serverDHParams = append(serverDHParams, yBytes...)
  529. return ka.auth.signParameters(config, cert, clientHello, hello, serverDHParams)
  530. }
  531. func (ka *dheKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  532. if len(ckx.ciphertext) < 2 {
  533. return nil, errClientKeyExchange
  534. }
  535. yLen := (int(ckx.ciphertext[0]) << 8) | int(ckx.ciphertext[1])
  536. if yLen != len(ckx.ciphertext)-2 {
  537. return nil, errClientKeyExchange
  538. }
  539. yTheirs := new(big.Int).SetBytes(ckx.ciphertext[2:])
  540. if yTheirs.Sign() <= 0 || yTheirs.Cmp(ka.p) >= 0 {
  541. return nil, errClientKeyExchange
  542. }
  543. return new(big.Int).Exp(yTheirs, ka.xOurs, ka.p).Bytes(), nil
  544. }
  545. func (ka *dheKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  546. // Read dh_p
  547. k := skx.key
  548. if len(k) < 2 {
  549. return errServerKeyExchange
  550. }
  551. pLen := (int(k[0]) << 8) | int(k[1])
  552. k = k[2:]
  553. if len(k) < pLen {
  554. return errServerKeyExchange
  555. }
  556. ka.p = new(big.Int).SetBytes(k[:pLen])
  557. k = k[pLen:]
  558. // Read dh_g
  559. if len(k) < 2 {
  560. return errServerKeyExchange
  561. }
  562. gLen := (int(k[0]) << 8) | int(k[1])
  563. k = k[2:]
  564. if len(k) < gLen {
  565. return errServerKeyExchange
  566. }
  567. ka.g = new(big.Int).SetBytes(k[:gLen])
  568. k = k[gLen:]
  569. // Read dh_Ys
  570. if len(k) < 2 {
  571. return errServerKeyExchange
  572. }
  573. yLen := (int(k[0]) << 8) | int(k[1])
  574. k = k[2:]
  575. if len(k) < yLen {
  576. return errServerKeyExchange
  577. }
  578. ka.yTheirs = new(big.Int).SetBytes(k[:yLen])
  579. k = k[yLen:]
  580. if ka.yTheirs.Sign() <= 0 || ka.yTheirs.Cmp(ka.p) >= 0 {
  581. return errServerKeyExchange
  582. }
  583. sig := k
  584. serverDHParams := skx.key[:len(skx.key)-len(sig)]
  585. return ka.auth.verifyParameters(config, clientHello, serverHello, cert, serverDHParams, sig)
  586. }
  587. func (ka *dheKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  588. if ka.p == nil || ka.g == nil || ka.yTheirs == nil {
  589. return nil, nil, errors.New("missing ServerKeyExchange message")
  590. }
  591. xOurs, err := rand.Int(config.rand(), ka.p)
  592. if err != nil {
  593. return nil, nil, err
  594. }
  595. preMasterSecret := new(big.Int).Exp(ka.yTheirs, xOurs, ka.p).Bytes()
  596. yOurs := new(big.Int).Exp(ka.g, xOurs, ka.p)
  597. yBytes := yOurs.Bytes()
  598. ckx := new(clientKeyExchangeMsg)
  599. ckx.ciphertext = make([]byte, 2+len(yBytes))
  600. ckx.ciphertext[0] = byte(len(yBytes) >> 8)
  601. ckx.ciphertext[1] = byte(len(yBytes))
  602. copy(ckx.ciphertext[2:], yBytes)
  603. return preMasterSecret, ckx, nil
  604. }
  605. // nilKeyAgreement is a fake key agreement used to implement the plain PSK key
  606. // exchange.
  607. type nilKeyAgreement struct{}
  608. func (ka *nilKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  609. return nil, nil
  610. }
  611. func (ka *nilKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  612. if len(ckx.ciphertext) != 0 {
  613. return nil, errClientKeyExchange
  614. }
  615. // Although in plain PSK, otherSecret is all zeros, the base key
  616. // agreement does not access to the length of the pre-shared
  617. // key. pskKeyAgreement instead interprets nil to mean to use all zeros
  618. // of the appropriate length.
  619. return nil, nil
  620. }
  621. func (ka *nilKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  622. if len(skx.key) != 0 {
  623. return errServerKeyExchange
  624. }
  625. return nil
  626. }
  627. func (ka *nilKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  628. // Although in plain PSK, otherSecret is all zeros, the base key
  629. // agreement does not access to the length of the pre-shared
  630. // key. pskKeyAgreement instead interprets nil to mean to use all zeros
  631. // of the appropriate length.
  632. return nil, &clientKeyExchangeMsg{}, nil
  633. }
  634. // makePSKPremaster formats a PSK pre-master secret based on otherSecret from
  635. // the base key exchange and psk.
  636. func makePSKPremaster(otherSecret, psk []byte) []byte {
  637. out := make([]byte, 0, 2+len(otherSecret)+2+len(psk))
  638. out = append(out, byte(len(otherSecret)>>8), byte(len(otherSecret)))
  639. out = append(out, otherSecret...)
  640. out = append(out, byte(len(psk)>>8), byte(len(psk)))
  641. out = append(out, psk...)
  642. return out
  643. }
  644. // pskKeyAgreement implements the PSK key agreement.
  645. type pskKeyAgreement struct {
  646. base keyAgreement
  647. identityHint string
  648. }
  649. func (ka *pskKeyAgreement) generateServerKeyExchange(config *Config, cert *Certificate, clientHello *clientHelloMsg, hello *serverHelloMsg) (*serverKeyExchangeMsg, error) {
  650. // Assemble the identity hint.
  651. bytes := make([]byte, 2+len(config.PreSharedKeyIdentity))
  652. bytes[0] = byte(len(config.PreSharedKeyIdentity) >> 8)
  653. bytes[1] = byte(len(config.PreSharedKeyIdentity))
  654. copy(bytes[2:], []byte(config.PreSharedKeyIdentity))
  655. // If there is one, append the base key agreement's
  656. // ServerKeyExchange.
  657. baseSkx, err := ka.base.generateServerKeyExchange(config, cert, clientHello, hello)
  658. if err != nil {
  659. return nil, err
  660. }
  661. if baseSkx != nil {
  662. bytes = append(bytes, baseSkx.key...)
  663. } else if config.PreSharedKeyIdentity == "" {
  664. // ServerKeyExchange is optional if the identity hint is empty
  665. // and there would otherwise be no ServerKeyExchange.
  666. return nil, nil
  667. }
  668. skx := new(serverKeyExchangeMsg)
  669. skx.key = bytes
  670. return skx, nil
  671. }
  672. func (ka *pskKeyAgreement) processClientKeyExchange(config *Config, cert *Certificate, ckx *clientKeyExchangeMsg, version uint16) ([]byte, error) {
  673. // First, process the PSK identity.
  674. if len(ckx.ciphertext) < 2 {
  675. return nil, errClientKeyExchange
  676. }
  677. identityLen := (int(ckx.ciphertext[0]) << 8) | int(ckx.ciphertext[1])
  678. if 2+identityLen > len(ckx.ciphertext) {
  679. return nil, errClientKeyExchange
  680. }
  681. identity := string(ckx.ciphertext[2 : 2+identityLen])
  682. if identity != config.PreSharedKeyIdentity {
  683. return nil, errors.New("tls: unexpected identity")
  684. }
  685. if config.PreSharedKey == nil {
  686. return nil, errors.New("tls: pre-shared key not configured")
  687. }
  688. // Process the remainder of the ClientKeyExchange to compute the base
  689. // pre-master secret.
  690. newCkx := new(clientKeyExchangeMsg)
  691. newCkx.ciphertext = ckx.ciphertext[2+identityLen:]
  692. otherSecret, err := ka.base.processClientKeyExchange(config, cert, newCkx, version)
  693. if err != nil {
  694. return nil, err
  695. }
  696. if otherSecret == nil {
  697. // Special-case for the plain PSK key exchanges.
  698. otherSecret = make([]byte, len(config.PreSharedKey))
  699. }
  700. return makePSKPremaster(otherSecret, config.PreSharedKey), nil
  701. }
  702. func (ka *pskKeyAgreement) processServerKeyExchange(config *Config, clientHello *clientHelloMsg, serverHello *serverHelloMsg, cert *x509.Certificate, skx *serverKeyExchangeMsg) error {
  703. if len(skx.key) < 2 {
  704. return errServerKeyExchange
  705. }
  706. identityLen := (int(skx.key[0]) << 8) | int(skx.key[1])
  707. if 2+identityLen > len(skx.key) {
  708. return errServerKeyExchange
  709. }
  710. ka.identityHint = string(skx.key[2 : 2+identityLen])
  711. // Process the remainder of the ServerKeyExchange.
  712. newSkx := new(serverKeyExchangeMsg)
  713. newSkx.key = skx.key[2+identityLen:]
  714. return ka.base.processServerKeyExchange(config, clientHello, serverHello, cert, newSkx)
  715. }
  716. func (ka *pskKeyAgreement) generateClientKeyExchange(config *Config, clientHello *clientHelloMsg, cert *x509.Certificate) ([]byte, *clientKeyExchangeMsg, error) {
  717. // The server only sends an identity hint but, for purposes of
  718. // test code, the server always sends the hint and it is
  719. // required to match.
  720. if ka.identityHint != config.PreSharedKeyIdentity {
  721. return nil, nil, errors.New("tls: unexpected identity")
  722. }
  723. // Serialize the identity.
  724. bytes := make([]byte, 2+len(config.PreSharedKeyIdentity))
  725. bytes[0] = byte(len(config.PreSharedKeyIdentity) >> 8)
  726. bytes[1] = byte(len(config.PreSharedKeyIdentity))
  727. copy(bytes[2:], []byte(config.PreSharedKeyIdentity))
  728. // Append the base key exchange's ClientKeyExchange.
  729. otherSecret, baseCkx, err := ka.base.generateClientKeyExchange(config, clientHello, cert)
  730. if err != nil {
  731. return nil, nil, err
  732. }
  733. ckx := new(clientKeyExchangeMsg)
  734. ckx.ciphertext = append(bytes, baseCkx.ciphertext...)
  735. if config.PreSharedKey == nil {
  736. return nil, nil, errors.New("tls: pre-shared key not configured")
  737. }
  738. if otherSecret == nil {
  739. otherSecret = make([]byte, len(config.PreSharedKey))
  740. }
  741. return makePSKPremaster(otherSecret, config.PreSharedKey), ckx, nil
  742. }