Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2015 The Chromium Authors. All rights reserved. | 1 // Copyright 2015 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "components/cryptauth/device_to_device_responder_operations.h" | 5 #include "components/cryptauth/device_to_device_responder_operations.h" |
| 6 | 6 |
| 7 #include "base/bind.h" | 7 #include "base/bind.h" |
| 8 #include "base/callback.h" | 8 #include "base/callback.h" |
| 9 #include "components/cryptauth/proto/cryptauth_api.pb.h" | 9 #include "components/cryptauth/proto/cryptauth_api.pb.h" |
| 10 #include "components/cryptauth/proto/securemessage.pb.h" | 10 #include "components/cryptauth/proto/securemessage.pb.h" |
| 11 #include "components/cryptauth/secure_message_delegate.h" | 11 #include "components/cryptauth/secure_message_delegate.h" |
| 12 #include "components/cryptauth/session_keys.h" | |
| 12 #include "components/proximity_auth/logging/logging.h" | 13 #include "components/proximity_auth/logging/logging.h" |
| 13 | 14 |
| 14 namespace cryptauth { | 15 namespace cryptauth { |
| 15 | 16 |
| 16 namespace { | 17 namespace { |
| 17 | 18 |
| 18 // TODO(tengs): Due to a bug with the ChromeOS secure message daemon, we cannot | 19 // TODO(tengs): Due to a bug with the ChromeOS secure message daemon, we cannot |
| 19 // create SecureMessages with empty payloads. To workaround this bug, this value | 20 // create SecureMessages with empty payloads. To workaround this bug, this value |
| 20 // is put into the payload if it would otherwise be empty. | 21 // is put into the payload if it would otherwise be empty. |
| 21 // See crbug.com/512894. | 22 // See crbug.com/512894. |
| 22 const char kPayloadFiller[] = "\xae"; | 23 const char kPayloadFiller[] = "\xae"; |
| 23 | 24 |
| 24 // The version to put in the GcmMetadata field. | 25 // The version to put in the GcmMetadata field. |
| 25 const int kGcmMetadataVersion = 1; | 26 const int kGcmMetadataVersion = 1; |
| 26 | 27 |
| 28 // The D2D protocol version. | |
| 29 const int kD2DProtocolVersion = 1; | |
| 30 | |
| 27 // Callback for DeviceToDeviceResponderOperations::ValidateHelloMessage(), | 31 // Callback for DeviceToDeviceResponderOperations::ValidateHelloMessage(), |
| 28 // after the [Hello] message is unwrapped. | 32 // after the [Hello] message is unwrapped. |
| 29 void OnHelloMessageUnwrapped( | 33 void OnHelloMessageUnwrapped( |
| 30 const DeviceToDeviceResponderOperations::ValidateHelloCallback& callback, | 34 const DeviceToDeviceResponderOperations::ValidateHelloCallback& callback, |
| 31 bool verified, | 35 bool verified, |
| 32 const std::string& payload, | 36 const std::string& payload, |
| 33 const securemessage::Header& header) { | 37 const securemessage::Header& header) { |
| 34 securemessage::InitiatorHello initiator_hello; | 38 securemessage::InitiatorHello initiator_hello; |
| 35 if (!verified || !initiator_hello.ParseFromString(header.public_metadata())) { | 39 if (!verified || !initiator_hello.ParseFromString(header.public_metadata()) || |
| 40 initiator_hello.protocol_version() != kD2DProtocolVersion) { | |
| 36 callback.Run(false, std::string()); | 41 callback.Run(false, std::string()); |
| 37 return; | 42 return; |
| 38 } | 43 } |
| 39 | 44 |
| 40 callback.Run(true, initiator_hello.public_dh_key().SerializeAsString()); | 45 callback.Run(true, initiator_hello.public_dh_key().SerializeAsString()); |
| 41 } | 46 } |
| 42 | 47 |
| 43 // Helper struct containing all the context needed to create the [Responder | 48 // Helper struct containing all the context needed to create the [Responder |
| 44 // Auth] message. | 49 // Auth] message. |
| 45 struct CreateResponderAuthMessageContext { | 50 struct CreateResponderAuthMessageContext { |
| (...skipping 108 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 154 | 159 |
| 155 // Store the responder's session public key in plaintext in the header. | 160 // Store the responder's session public key in plaintext in the header. |
| 156 securemessage::ResponderHello responder_hello; | 161 securemessage::ResponderHello responder_hello; |
| 157 if (!responder_hello.mutable_public_dh_key()->ParseFromString( | 162 if (!responder_hello.mutable_public_dh_key()->ParseFromString( |
| 158 context.session_public_key)) { | 163 context.session_public_key)) { |
| 159 PA_LOG(ERROR) << "Error parsing public key while creating [Responder Auth]"; | 164 PA_LOG(ERROR) << "Error parsing public key while creating [Responder Auth]"; |
| 160 PA_LOG(ERROR) << context.session_public_key; | 165 PA_LOG(ERROR) << context.session_public_key; |
| 161 context.callback.Run(std::string()); | 166 context.callback.Run(std::string()); |
| 162 return; | 167 return; |
| 163 } | 168 } |
| 169 responder_hello.set_protocol_version(kD2DProtocolVersion); | |
| 164 | 170 |
| 165 // Create the outer most message, wrapping the other messages created | 171 // Create the outer most message, wrapping the other messages created |
| 166 // previously. | 172 // previously. |
| 167 securemessage::DeviceToDeviceMessage device_to_device_message; | 173 securemessage::DeviceToDeviceMessage device_to_device_message; |
| 168 device_to_device_message.set_message(context.middle_message); | 174 device_to_device_message.set_message(context.middle_message); |
| 169 device_to_device_message.set_sequence_number(1); | 175 device_to_device_message.set_sequence_number(1); |
| 170 | 176 |
| 171 SecureMessageDelegate::CreateOptions create_options; | 177 SecureMessageDelegate::CreateOptions create_options; |
| 172 create_options.encryption_scheme = securemessage::AES_256_CBC; | 178 create_options.encryption_scheme = securemessage::AES_256_CBC; |
| 173 create_options.signature_scheme = securemessage::HMAC_SHA256; | 179 create_options.signature_scheme = securemessage::HMAC_SHA256; |
| 174 create_options.public_metadata = gcm_metadata.SerializeAsString(); | 180 create_options.public_metadata = gcm_metadata.SerializeAsString(); |
| 175 responder_hello.SerializeToString(&create_options.decryption_key_id); | 181 responder_hello.SerializeToString(&create_options.decryption_key_id); |
| 176 | 182 |
| 177 context.secure_message_delegate->CreateSecureMessage( | 183 context.secure_message_delegate->CreateSecureMessage( |
| 178 device_to_device_message.SerializeAsString(), session_symmetric_key, | 184 device_to_device_message.SerializeAsString(), |
| 179 create_options, context.callback); | 185 SessionKeys(session_symmetric_key).responder_encode_key(), create_options, |
| 186 context.callback); | |
| 180 } | 187 } |
| 181 | 188 |
| 182 // Helper struct containing all the context needed to validate the [Initiator | 189 // Helper struct containing all the context needed to validate the [Initiator |
| 183 // Auth] message. | 190 // Auth] message. |
| 184 struct ValidateInitiatorAuthMessageContext { | 191 struct ValidateInitiatorAuthMessageContext { |
| 185 std::string persistent_symmetric_key; | 192 std::string persistent_symmetric_key; |
| 186 std::string responder_auth_message; | 193 std::string responder_auth_message; |
| 187 SecureMessageDelegate* secure_message_delegate; | 194 SecureMessageDelegate* secure_message_delegate; |
| 188 DeviceToDeviceResponderOperations::ValidationCallback callback; | 195 DeviceToDeviceResponderOperations::ValidationCallback callback; |
| 189 }; | 196 }; |
| (...skipping 17 matching lines...) Expand all Loading... | |
| 207 const securemessage::Header& header) { | 214 const securemessage::Header& header) { |
| 208 if (!verified) { | 215 if (!verified) { |
| 209 PA_LOG(INFO) << "Failed to verify outer [Initiator Auth] message"; | 216 PA_LOG(INFO) << "Failed to verify outer [Initiator Auth] message"; |
| 210 context.callback.Run(false); | 217 context.callback.Run(false); |
| 211 return; | 218 return; |
| 212 } | 219 } |
| 213 | 220 |
| 214 // Parse the decrypted payload. | 221 // Parse the decrypted payload. |
| 215 securemessage::DeviceToDeviceMessage device_to_device_message; | 222 securemessage::DeviceToDeviceMessage device_to_device_message; |
| 216 if (!device_to_device_message.ParseFromString(payload) || | 223 if (!device_to_device_message.ParseFromString(payload) || |
| 217 device_to_device_message.sequence_number() != 2) { | 224 device_to_device_message.sequence_number() != 1) { |
| 218 PA_LOG(INFO) << "Failed to validate DeviceToDeviceMessage payload."; | 225 PA_LOG(INFO) << "Failed to validate DeviceToDeviceMessage payload."; |
| 219 context.callback.Run(false); | 226 context.callback.Run(false); |
| 220 return; | 227 return; |
| 221 } | 228 } |
| 222 | 229 |
| 223 // Unwrap the inner message of [Initiator Auth]. | 230 // Unwrap the inner message of [Initiator Auth]. |
| 224 SecureMessageDelegate::UnwrapOptions unwrap_options; | 231 SecureMessageDelegate::UnwrapOptions unwrap_options; |
| 225 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; | 232 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; |
| 226 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; | 233 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; |
| 227 unwrap_options.associated_data = context.responder_auth_message; | 234 unwrap_options.associated_data = context.responder_auth_message; |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 290 // To create the [Responder Auth] message, we need to first parse the | 297 // To create the [Responder Auth] message, we need to first parse the |
| 291 // initiator's [Hello] message and extract the initiator's session public key. | 298 // initiator's [Hello] message and extract the initiator's session public key. |
| 292 DeviceToDeviceResponderOperations::ValidateHelloMessage( | 299 DeviceToDeviceResponderOperations::ValidateHelloMessage( |
| 293 hello_message, persistent_symmetric_key, secure_message_delegate, | 300 hello_message, persistent_symmetric_key, secure_message_delegate, |
| 294 base::Bind(&OnHelloMessageValidatedForResponderAuth, context)); | 301 base::Bind(&OnHelloMessageValidatedForResponderAuth, context)); |
| 295 } | 302 } |
| 296 | 303 |
| 297 // static | 304 // static |
| 298 void DeviceToDeviceResponderOperations::ValidateInitiatorAuthMessage( | 305 void DeviceToDeviceResponderOperations::ValidateInitiatorAuthMessage( |
| 299 const std::string& initiator_auth_message, | 306 const std::string& initiator_auth_message, |
| 300 const std::string& session_symmetric_key, | 307 SessionKeys* session_keys, |
|
Tim Song
2017/05/22 23:18:24
You should be able to use "const SessionKey&" inst
sacomoto
2017/05/23 09:50:14
Done.
| |
| 301 const std::string& persistent_symmetric_key, | 308 const std::string& persistent_symmetric_key, |
| 302 const std::string& responder_auth_message, | 309 const std::string& responder_auth_message, |
| 303 SecureMessageDelegate* secure_message_delegate, | 310 SecureMessageDelegate* secure_message_delegate, |
| 304 const ValidationCallback& callback) { | 311 const ValidationCallback& callback) { |
| 305 // The [Initiator Auth] message has the structure: | 312 // The [Initiator Auth] message has the structure: |
| 306 // { | 313 // { |
| 307 // header: Sig(payload1, session_symmetric_key) | 314 // header: Sig(payload1, session_symmetric_key) |
| 308 // payload1: Enc({ | 315 // payload1: Enc({ |
| 309 // sequence_number: 2, | 316 // sequence_number: 2, |
| 310 // body: { | 317 // body: { |
| 311 // header: Sig(payload2 + responder_auth_message, | 318 // header: Sig(payload2 + responder_auth_message, |
| 312 // persistent_symmetric_key) | 319 // persistent_symmetric_key) |
| 313 // payload2: "" | 320 // payload2: "" |
| 314 // } | 321 // } |
| 315 // }, session_symmetric_key) | 322 // }, session_symmetric_key) |
| 316 // } | 323 // } |
| 317 ValidateInitiatorAuthMessageContext context = { | 324 ValidateInitiatorAuthMessageContext context = { |
| 318 persistent_symmetric_key, responder_auth_message, secure_message_delegate, | 325 persistent_symmetric_key, responder_auth_message, secure_message_delegate, |
| 319 callback}; | 326 callback}; |
| 320 | 327 |
| 321 SecureMessageDelegate::UnwrapOptions unwrap_options; | 328 SecureMessageDelegate::UnwrapOptions unwrap_options; |
| 322 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; | 329 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; |
| 323 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; | 330 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; |
| 324 secure_message_delegate->UnwrapSecureMessage( | 331 secure_message_delegate->UnwrapSecureMessage( |
| 325 initiator_auth_message, session_symmetric_key, unwrap_options, | 332 initiator_auth_message, session_keys->initiator_encode_key(), |
| 333 unwrap_options, | |
| 326 base::Bind(&OnOuterMessageUnwrappedForInitiatorAuth, context)); | 334 base::Bind(&OnOuterMessageUnwrappedForInitiatorAuth, context)); |
| 327 } | 335 } |
| 328 | 336 |
| 329 } // cryptauth | 337 } // cryptauth |
| OLD | NEW |