Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(428)

Side by Side Diff: third_party/tlslite/tlslite/TLSConnection.py

Issue 6804032: Add TLS-SRP (RFC 5054) support Base URL: http://git.chromium.org/git/chromium.git@trunk
Patch Set: remove "httpsv" scheme, minor NSS/OpenSSL changes Created 9 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « third_party/tlslite/scripts/tls.py ('k') | third_party/tlslite/tlslite/constants.py » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 """ 1 """
2 MAIN CLASS FOR TLS LITE (START HERE!). 2 MAIN CLASS FOR TLS LITE (START HERE!).
3 """ 3 """
4 from __future__ import generators 4 from __future__ import generators
5 5
6 import socket 6 import socket
7 from utils.compat import formatExceptionTrace 7 from utils.compat import formatExceptionTrace
8 from TLSRecordLayer import TLSRecordLayer 8 from TLSRecordLayer import TLSRecordLayer
9 from Session import Session 9 from Session import Session
10 from constants import * 10 from constants import *
(...skipping 496 matching lines...) Expand 10 before | Expand all | Expand 10 after
507 507
508 #Or send ClientHello (without) 508 #Or send ClientHello (without)
509 else: 509 else:
510 clientHello = ClientHello() 510 clientHello = ClientHello()
511 clientHello.create(settings.maxVersion, clientRandom, 511 clientHello.create(settings.maxVersion, clientRandom,
512 createByteArraySequence([]), cipherSuites, 512 createByteArraySequence([]), cipherSuites,
513 certificateTypes, srpUsername) 513 certificateTypes, srpUsername)
514 for result in self._sendMsg(clientHello): 514 for result in self._sendMsg(clientHello):
515 yield result 515 yield result
516 516
517 #Get ServerHello (or missing_srp_username) 517 #Get ServerHello (or unknown_psk_identity)
518 for result in self._getMsg((ContentType.handshake, 518 for result in self._getMsg((ContentType.handshake,
519 ContentType.alert), 519 ContentType.alert),
520 HandshakeType.server_hello): 520 HandshakeType.server_hello):
521 if result in (0,1): 521 if result in (0,1):
522 yield result 522 yield result
523 else: 523 else:
524 break 524 break
525 msg = result 525 msg = result
526 526
527 if isinstance(msg, ServerHello): 527 if isinstance(msg, ServerHello):
528 serverHello = msg 528 serverHello = msg
529 elif isinstance(msg, Alert): 529 elif isinstance(msg, Alert):
530 alert = msg 530 alert = msg
531 531
532 #If it's not a missing_srp_username, re-raise 532 #If it's not a unknown_psk_identity, re-raise
533 if alert.description != AlertDescription.missing_srp_username: 533 if alert.description != AlertDescription.unknown_psk_identity:
534 self._shutdown(False) 534 self._shutdown(False)
535 raise TLSRemoteAlert(alert) 535 raise TLSRemoteAlert(alert)
536 536
537 #If we're not in SRP callback mode, we won't have offered SRP 537 #Our SRP credentials were wrong, so try getting new ones.
538 #without a username, so we shouldn't get this alert 538 if srpCallback:
539 if not srpCallback: 539 srpParams = srpCallback()
540 for result in self._sendError(\ 540
541 AlertDescription.unexpected_message): 541 #If we can't get different credentials, cancel the handshake
542 yield result 542 if srpParams == None or not srpCallback:
543 srpParams = srpCallback()
544 #If the callback returns None, cancel the handshake
545 if srpParams == None:
546 for result in self._sendError(AlertDescription.user_canceled): 543 for result in self._sendError(AlertDescription.user_canceled):
547 yield result 544 yield result
548 545
549 #Recursively perform handshake 546 #Recursively perform handshake
550 for result in self._handshakeClientAsyncHelper(srpParams, 547 for result in self._handshakeClientAsyncHelper(srpParams,
551 None, None, None, None, settings, True): 548 None, None, None, None, settings, True):
552 yield result 549 yield result
553 return 550 return
554 551
555 #Get the server version. Do this before anything else, so any 552 #Get the server version. Do this before anything else, so any
(...skipping 696 matching lines...) Expand 10 before | Expand all | Expand 10 after
1252 1249
1253 #If we've selected an SRP suite, exchange keys and calculate 1250 #If we've selected an SRP suite, exchange keys and calculate
1254 #premaster secret: 1251 #premaster secret:
1255 if cipherSuite in CipherSuite.srpSuites + CipherSuite.srpRsaSuites: 1252 if cipherSuite in CipherSuite.srpSuites + CipherSuite.srpRsaSuites:
1256 1253
1257 #If there's no SRP username... 1254 #If there's no SRP username...
1258 if not clientHello.srp_username: 1255 if not clientHello.srp_username:
1259 1256
1260 #Ask the client to re-send ClientHello with one 1257 #Ask the client to re-send ClientHello with one
1261 for result in self._sendMsg(Alert().create(\ 1258 for result in self._sendMsg(Alert().create(\
1262 AlertDescription.missing_srp_username, 1259 AlertDescription.unknown_psk_identity,
1263 AlertLevel.warning)): 1260 AlertLevel.fatal)):
1264 yield result 1261 yield result
1265 1262
1266 #Get ClientHello 1263 #Get ClientHello
1267 for result in self._getMsg(ContentType.handshake, 1264 for result in self._getMsg(ContentType.handshake,
1268 HandshakeType.client_hello): 1265 HandshakeType.client_hello):
1269 if result in (0,1): 1266 if result in (0,1):
1270 yield result 1267 yield result
1271 else: 1268 else:
1272 break 1269 break
1273 clientHello = result 1270 clientHello = result
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
1316 1313
1317 1314
1318 #Get username 1315 #Get username
1319 self.allegedSrpUsername = clientHello.srp_username 1316 self.allegedSrpUsername = clientHello.srp_username
1320 1317
1321 #Get parameters from username 1318 #Get parameters from username
1322 try: 1319 try:
1323 entry = verifierDB[self.allegedSrpUsername] 1320 entry = verifierDB[self.allegedSrpUsername]
1324 except KeyError: 1321 except KeyError:
1325 for result in self._sendError(\ 1322 for result in self._sendError(\
1326 AlertDescription.unknown_srp_username): 1323 AlertDescription.unknown_psk_identity):
1327 yield result 1324 yield result
1328 (N, g, s, v) = entry 1325 (N, g, s, v) = entry
1329 1326
1330 #Calculate server's ephemeral DH values (b, B) 1327 #Calculate server's ephemeral DH values (b, B)
1331 b = bytesToNumber(getRandomBytes(32)) 1328 b = bytesToNumber(getRandomBytes(32))
1332 k = makeK(N, g) 1329 k = makeK(N, g)
1333 B = (powMod(g, b, N) + (k*v)) % N 1330 B = (powMod(g, b, N) + (k*v)) % N
1334 1331
1335 #Create ServerKeyExchange, signing it if necessary 1332 #Create ServerKeyExchange, signing it if necessary
1336 serverKeyExchange = ServerKeyExchange(cipherSuite) 1333 serverKeyExchange = ServerKeyExchange(cipherSuite)
(...skipping 266 matching lines...) Expand 10 before | Expand all | Expand 10 after
1603 if len(publicKey) < settings.minKeySize: 1600 if len(publicKey) < settings.minKeySize:
1604 for result in self._sendError(AlertDescription.handshake_failure, 1601 for result in self._sendError(AlertDescription.handshake_failure,
1605 "Other party's public key too small: %d" % len(publicKey)): 1602 "Other party's public key too small: %d" % len(publicKey)):
1606 yield result 1603 yield result
1607 if len(publicKey) > settings.maxKeySize: 1604 if len(publicKey) > settings.maxKeySize:
1608 for result in self._sendError(AlertDescription.handshake_failure, 1605 for result in self._sendError(AlertDescription.handshake_failure,
1609 "Other party's public key too large: %d" % len(publicKey)): 1606 "Other party's public key too large: %d" % len(publicKey)):
1610 yield result 1607 yield result
1611 1608
1612 yield publicKey, certChain 1609 yield publicKey, certChain
OLDNEW
« no previous file with comments | « third_party/tlslite/scripts/tls.py ('k') | third_party/tlslite/tlslite/constants.py » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698