Index: webrtc/p2p/base/turnserver.cc |
diff --git a/webrtc/p2p/base/turnserver.cc b/webrtc/p2p/base/turnserver.cc |
index 1502cdd52eda2e71c64be059d576bb6b006ba8fc..4754574076017d00987b64a66f93645c788c4683 100644 |
--- a/webrtc/p2p/base/turnserver.cc |
+++ b/webrtc/p2p/base/turnserver.cc |
@@ -392,9 +392,8 @@ void TurnServer::HandleAllocateRequest(TurnServerConnection* conn, |
} |
} |
-std::string TurnServer::GenerateNonce() const { |
+std::string TurnServer::GenerateNonce(uint32_t now) const { |
// Generate a nonce of the form hex(now + HMAC-MD5(nonce_key_, now)) |
- uint32_t now = rtc::Time(); |
std::string input(reinterpret_cast<const char*>(&now), sizeof(now)); |
std::string nonce = rtc::hex_encode(input.c_str(), input.size()); |
nonce += rtc::ComputeHmac(rtc::DIGEST_MD5, nonce_key_, input); |
@@ -464,8 +463,14 @@ void TurnServer::SendErrorResponseWithRealmAndNonce( |
int code, const std::string& reason) { |
TurnMessage resp; |
InitErrorResponse(msg, code, reason, &resp); |
- VERIFY(resp.AddAttribute(new StunByteStringAttribute( |
- STUN_ATTR_NONCE, GenerateNonce()))); |
+ |
+ uint32_t timestamp = rtc::Time(); |
+ if (ts_for_next_nonce_) { |
+ timestamp = ts_for_next_nonce_; |
+ ts_for_next_nonce_ = 0; |
+ } |
+ VERIFY(resp.AddAttribute( |
+ new StunByteStringAttribute(STUN_ATTR_NONCE, GenerateNonce(timestamp)))); |
VERIFY(resp.AddAttribute(new StunByteStringAttribute( |
STUN_ATTR_REALM, realm_))); |
SendStun(conn, &resp); |