OLD | NEW |
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 Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |