Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.
 
 
 
 
 
 

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