| 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/proximity_auth/device_to_device_responder_operations.h" | 5 #include "components/proximity_auth/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/proximity_auth/cryptauth/proto/cryptauth_api.pb.h" | 9 #include "components/cryptauth/proto/cryptauth_api.pb.h" |
| 10 #include "components/proximity_auth/cryptauth/proto/securemessage.pb.h" | 10 #include "components/cryptauth/proto/securemessage.pb.h" |
| 11 #include "components/proximity_auth/cryptauth/secure_message_delegate.h" | 11 #include "components/cryptauth/secure_message_delegate.h" |
| 12 #include "components/proximity_auth/logging/logging.h" | 12 #include "components/proximity_auth/logging/logging.h" |
| 13 | 13 |
| 14 namespace proximity_auth { | 14 namespace proximity_auth { |
| 15 | 15 |
| 16 namespace { | 16 namespace { |
| 17 | 17 |
| 18 // TODO(tengs): Due to a bug with the ChromeOS secure message daemon, we cannot | 18 // 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 | 19 // create SecureMessages with empty payloads. To workaround this bug, this value |
| 20 // is put into the payload if it would otherwise be empty. | 20 // is put into the payload if it would otherwise be empty. |
| 21 // See crbug.com/512894. | 21 // See crbug.com/512894. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 41 } | 41 } |
| 42 | 42 |
| 43 // Helper struct containing all the context needed to create the [Responder | 43 // Helper struct containing all the context needed to create the [Responder |
| 44 // Auth] message. | 44 // Auth] message. |
| 45 struct CreateResponderAuthMessageContext { | 45 struct CreateResponderAuthMessageContext { |
| 46 std::string hello_message; | 46 std::string hello_message; |
| 47 std::string session_public_key; | 47 std::string session_public_key; |
| 48 std::string session_private_key; | 48 std::string session_private_key; |
| 49 std::string persistent_private_key; | 49 std::string persistent_private_key; |
| 50 std::string persistent_symmetric_key; | 50 std::string persistent_symmetric_key; |
| 51 SecureMessageDelegate* secure_message_delegate; | 51 cryptauth::SecureMessageDelegate* secure_message_delegate; |
| 52 DeviceToDeviceResponderOperations::MessageCallback callback; | 52 DeviceToDeviceResponderOperations::MessageCallback callback; |
| 53 std::string hello_public_key; | 53 std::string hello_public_key; |
| 54 std::string middle_message; | 54 std::string middle_message; |
| 55 }; | 55 }; |
| 56 | 56 |
| 57 // Forward declarations of functions used to create the [Responder Auth] | 57 // Forward declarations of functions used to create the [Responder Auth] |
| 58 // message, declared in order in which they are called during the creation flow. | 58 // message, declared in order in which they are called during the creation flow. |
| 59 void OnHelloMessageValidatedForResponderAuth( | 59 void OnHelloMessageValidatedForResponderAuth( |
| 60 CreateResponderAuthMessageContext context, | 60 CreateResponderAuthMessageContext context, |
| 61 bool hello_message_validated, | 61 bool hello_message_validated, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 81 return; | 81 return; |
| 82 } | 82 } |
| 83 | 83 |
| 84 context.hello_public_key = hello_public_key; | 84 context.hello_public_key = hello_public_key; |
| 85 | 85 |
| 86 // Create the inner most wrapped message of [Responder Auth]. | 86 // Create the inner most wrapped message of [Responder Auth]. |
| 87 cryptauth::GcmMetadata gcm_metadata; | 87 cryptauth::GcmMetadata gcm_metadata; |
| 88 gcm_metadata.set_type(cryptauth::UNLOCK_KEY_SIGNED_CHALLENGE); | 88 gcm_metadata.set_type(cryptauth::UNLOCK_KEY_SIGNED_CHALLENGE); |
| 89 gcm_metadata.set_version(kGcmMetadataVersion); | 89 gcm_metadata.set_version(kGcmMetadataVersion); |
| 90 | 90 |
| 91 SecureMessageDelegate::CreateOptions create_options; | 91 cryptauth::SecureMessageDelegate::CreateOptions create_options; |
| 92 create_options.encryption_scheme = securemessage::NONE; | 92 create_options.encryption_scheme = securemessage::NONE; |
| 93 create_options.signature_scheme = securemessage::ECDSA_P256_SHA256; | 93 create_options.signature_scheme = securemessage::ECDSA_P256_SHA256; |
| 94 gcm_metadata.SerializeToString(&create_options.public_metadata); | 94 gcm_metadata.SerializeToString(&create_options.public_metadata); |
| 95 create_options.associated_data = context.hello_message; | 95 create_options.associated_data = context.hello_message; |
| 96 | 96 |
| 97 context.secure_message_delegate->CreateSecureMessage( | 97 context.secure_message_delegate->CreateSecureMessage( |
| 98 kPayloadFiller, context.persistent_private_key, create_options, | 98 kPayloadFiller, context.persistent_private_key, create_options, |
| 99 base::Bind(&OnInnerMessageCreatedForResponderAuth, context)); | 99 base::Bind(&OnInnerMessageCreatedForResponderAuth, context)); |
| 100 } | 100 } |
| 101 | 101 |
| 102 // Called after the inner-most layer of [Responder Auth] is created. | 102 // Called after the inner-most layer of [Responder Auth] is created. |
| 103 void OnInnerMessageCreatedForResponderAuth( | 103 void OnInnerMessageCreatedForResponderAuth( |
| 104 CreateResponderAuthMessageContext context, | 104 CreateResponderAuthMessageContext context, |
| 105 const std::string& inner_message) { | 105 const std::string& inner_message) { |
| 106 if (inner_message.empty()) { | 106 if (inner_message.empty()) { |
| 107 PA_LOG(INFO) << "Failed to create middle message for [Responder Auth]"; | 107 PA_LOG(INFO) << "Failed to create middle message for [Responder Auth]"; |
| 108 context.callback.Run(std::string()); | 108 context.callback.Run(std::string()); |
| 109 return; | 109 return; |
| 110 } | 110 } |
| 111 | 111 |
| 112 // Create the middle message. | 112 // Create the middle message. |
| 113 SecureMessageDelegate::CreateOptions create_options; | 113 cryptauth::SecureMessageDelegate::CreateOptions create_options; |
| 114 create_options.encryption_scheme = securemessage::AES_256_CBC; | 114 create_options.encryption_scheme = securemessage::AES_256_CBC; |
| 115 create_options.signature_scheme = securemessage::HMAC_SHA256; | 115 create_options.signature_scheme = securemessage::HMAC_SHA256; |
| 116 create_options.associated_data = context.hello_message; | 116 create_options.associated_data = context.hello_message; |
| 117 context.secure_message_delegate->CreateSecureMessage( | 117 context.secure_message_delegate->CreateSecureMessage( |
| 118 inner_message, context.persistent_symmetric_key, create_options, | 118 inner_message, context.persistent_symmetric_key, create_options, |
| 119 base::Bind(&OnMiddleMessageCreatedForResponderAuth, context)); | 119 base::Bind(&OnMiddleMessageCreatedForResponderAuth, context)); |
| 120 } | 120 } |
| 121 | 121 |
| 122 // Called after the middle layer of [Responder Auth] is created. | 122 // Called after the middle layer of [Responder Auth] is created. |
| 123 void OnMiddleMessageCreatedForResponderAuth( | 123 void OnMiddleMessageCreatedForResponderAuth( |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 161 context.callback.Run(std::string()); | 161 context.callback.Run(std::string()); |
| 162 return; | 162 return; |
| 163 } | 163 } |
| 164 | 164 |
| 165 // Create the outer most message, wrapping the other messages created | 165 // Create the outer most message, wrapping the other messages created |
| 166 // previously. | 166 // previously. |
| 167 securemessage::DeviceToDeviceMessage device_to_device_message; | 167 securemessage::DeviceToDeviceMessage device_to_device_message; |
| 168 device_to_device_message.set_message(context.middle_message); | 168 device_to_device_message.set_message(context.middle_message); |
| 169 device_to_device_message.set_sequence_number(1); | 169 device_to_device_message.set_sequence_number(1); |
| 170 | 170 |
| 171 SecureMessageDelegate::CreateOptions create_options; | 171 cryptauth::SecureMessageDelegate::CreateOptions create_options; |
| 172 create_options.encryption_scheme = securemessage::AES_256_CBC; | 172 create_options.encryption_scheme = securemessage::AES_256_CBC; |
| 173 create_options.signature_scheme = securemessage::HMAC_SHA256; | 173 create_options.signature_scheme = securemessage::HMAC_SHA256; |
| 174 create_options.public_metadata = gcm_metadata.SerializeAsString(); | 174 create_options.public_metadata = gcm_metadata.SerializeAsString(); |
| 175 responder_hello.SerializeToString(&create_options.decryption_key_id); | 175 responder_hello.SerializeToString(&create_options.decryption_key_id); |
| 176 | 176 |
| 177 context.secure_message_delegate->CreateSecureMessage( | 177 context.secure_message_delegate->CreateSecureMessage( |
| 178 device_to_device_message.SerializeAsString(), session_symmetric_key, | 178 device_to_device_message.SerializeAsString(), session_symmetric_key, |
| 179 create_options, context.callback); | 179 create_options, context.callback); |
| 180 } | 180 } |
| 181 | 181 |
| 182 // Helper struct containing all the context needed to validate the [Initiator | 182 // Helper struct containing all the context needed to validate the [Initiator |
| 183 // Auth] message. | 183 // Auth] message. |
| 184 struct ValidateInitiatorAuthMessageContext { | 184 struct ValidateInitiatorAuthMessageContext { |
| 185 std::string persistent_symmetric_key; | 185 std::string persistent_symmetric_key; |
| 186 std::string responder_auth_message; | 186 std::string responder_auth_message; |
| 187 SecureMessageDelegate* secure_message_delegate; | 187 cryptauth::SecureMessageDelegate* secure_message_delegate; |
| 188 DeviceToDeviceResponderOperations::ValidationCallback callback; | 188 DeviceToDeviceResponderOperations::ValidationCallback callback; |
| 189 }; | 189 }; |
| 190 | 190 |
| 191 // Called after the inner-most layer of [Initiator Auth] is unwrapped. | 191 // Called after the inner-most layer of [Initiator Auth] is unwrapped. |
| 192 void OnInnerMessageUnwrappedForInitiatorAuth( | 192 void OnInnerMessageUnwrappedForInitiatorAuth( |
| 193 const ValidateInitiatorAuthMessageContext& context, | 193 const ValidateInitiatorAuthMessageContext& context, |
| 194 bool verified, | 194 bool verified, |
| 195 const std::string& payload, | 195 const std::string& payload, |
| 196 const securemessage::Header& header) { | 196 const securemessage::Header& header) { |
| 197 if (!verified) | 197 if (!verified) |
| (...skipping 16 matching lines...) Expand all Loading... |
| 214 // Parse the decrypted payload. | 214 // Parse the decrypted payload. |
| 215 securemessage::DeviceToDeviceMessage device_to_device_message; | 215 securemessage::DeviceToDeviceMessage device_to_device_message; |
| 216 if (!device_to_device_message.ParseFromString(payload) || | 216 if (!device_to_device_message.ParseFromString(payload) || |
| 217 device_to_device_message.sequence_number() != 2) { | 217 device_to_device_message.sequence_number() != 2) { |
| 218 PA_LOG(INFO) << "Failed to validate DeviceToDeviceMessage payload."; | 218 PA_LOG(INFO) << "Failed to validate DeviceToDeviceMessage payload."; |
| 219 context.callback.Run(false); | 219 context.callback.Run(false); |
| 220 return; | 220 return; |
| 221 } | 221 } |
| 222 | 222 |
| 223 // Unwrap the inner message of [Initiator Auth]. | 223 // Unwrap the inner message of [Initiator Auth]. |
| 224 SecureMessageDelegate::UnwrapOptions unwrap_options; | 224 cryptauth::SecureMessageDelegate::UnwrapOptions unwrap_options; |
| 225 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; | 225 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; |
| 226 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; | 226 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; |
| 227 unwrap_options.associated_data = context.responder_auth_message; | 227 unwrap_options.associated_data = context.responder_auth_message; |
| 228 context.secure_message_delegate->UnwrapSecureMessage( | 228 context.secure_message_delegate->UnwrapSecureMessage( |
| 229 device_to_device_message.message(), context.persistent_symmetric_key, | 229 device_to_device_message.message(), context.persistent_symmetric_key, |
| 230 unwrap_options, | 230 unwrap_options, |
| 231 base::Bind(&OnInnerMessageUnwrappedForInitiatorAuth, context)); | 231 base::Bind(&OnInnerMessageUnwrappedForInitiatorAuth, context)); |
| 232 } | 232 } |
| 233 | 233 |
| 234 } // namespace | 234 } // namespace |
| 235 | 235 |
| 236 // static | 236 // static |
| 237 void DeviceToDeviceResponderOperations::ValidateHelloMessage( | 237 void DeviceToDeviceResponderOperations::ValidateHelloMessage( |
| 238 const std::string& hello_message, | 238 const std::string& hello_message, |
| 239 const std::string& persistent_symmetric_key, | 239 const std::string& persistent_symmetric_key, |
| 240 SecureMessageDelegate* secure_message_delegate, | 240 cryptauth::SecureMessageDelegate* secure_message_delegate, |
| 241 const ValidateHelloCallback& callback) { | 241 const ValidateHelloCallback& callback) { |
| 242 // The [Hello] message has the structure: | 242 // The [Hello] message has the structure: |
| 243 // { | 243 // { |
| 244 // header: <session_public_key>, | 244 // header: <session_public_key>, |
| 245 // Sig(<session_public_key>, persistent_symmetric_key) | 245 // Sig(<session_public_key>, persistent_symmetric_key) |
| 246 // payload: "" | 246 // payload: "" |
| 247 // } | 247 // } |
| 248 SecureMessageDelegate::UnwrapOptions unwrap_options; | 248 cryptauth::SecureMessageDelegate::UnwrapOptions unwrap_options; |
| 249 unwrap_options.encryption_scheme = securemessage::NONE; | 249 unwrap_options.encryption_scheme = securemessage::NONE; |
| 250 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; | 250 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; |
| 251 secure_message_delegate->UnwrapSecureMessage( | 251 secure_message_delegate->UnwrapSecureMessage( |
| 252 hello_message, persistent_symmetric_key, unwrap_options, | 252 hello_message, persistent_symmetric_key, unwrap_options, |
| 253 base::Bind(&OnHelloMessageUnwrapped, callback)); | 253 base::Bind(&OnHelloMessageUnwrapped, callback)); |
| 254 } | 254 } |
| 255 | 255 |
| 256 // static | 256 // static |
| 257 void DeviceToDeviceResponderOperations::CreateResponderAuthMessage( | 257 void DeviceToDeviceResponderOperations::CreateResponderAuthMessage( |
| 258 const std::string& hello_message, | 258 const std::string& hello_message, |
| 259 const std::string& session_public_key, | 259 const std::string& session_public_key, |
| 260 const std::string& session_private_key, | 260 const std::string& session_private_key, |
| 261 const std::string& persistent_private_key, | 261 const std::string& persistent_private_key, |
| 262 const std::string& persistent_symmetric_key, | 262 const std::string& persistent_symmetric_key, |
| 263 SecureMessageDelegate* secure_message_delegate, | 263 cryptauth::SecureMessageDelegate* secure_message_delegate, |
| 264 const MessageCallback& callback) { | 264 const MessageCallback& callback) { |
| 265 // The [Responder Auth] message has the structure: | 265 // The [Responder Auth] message has the structure: |
| 266 // { | 266 // { |
| 267 // header: <responder_public_key>, | 267 // header: <responder_public_key>, |
| 268 // Sig(<responder_public_key> + payload1, | 268 // Sig(<responder_public_key> + payload1, |
| 269 // session_symmetric_key), | 269 // session_symmetric_key), |
| 270 // payload1: Enc({ | 270 // payload1: Enc({ |
| 271 // header: Sig(payload2 + <hello_message>, persistent_symmetric_key), | 271 // header: Sig(payload2 + <hello_message>, persistent_symmetric_key), |
| 272 // payload2: { | 272 // payload2: { |
| 273 // sequence_number: 1, | 273 // sequence_number: 1, |
| (...skipping 19 matching lines...) Expand all Loading... |
| 293 hello_message, persistent_symmetric_key, secure_message_delegate, | 293 hello_message, persistent_symmetric_key, secure_message_delegate, |
| 294 base::Bind(&OnHelloMessageValidatedForResponderAuth, context)); | 294 base::Bind(&OnHelloMessageValidatedForResponderAuth, context)); |
| 295 } | 295 } |
| 296 | 296 |
| 297 // static | 297 // static |
| 298 void DeviceToDeviceResponderOperations::ValidateInitiatorAuthMessage( | 298 void DeviceToDeviceResponderOperations::ValidateInitiatorAuthMessage( |
| 299 const std::string& initiator_auth_message, | 299 const std::string& initiator_auth_message, |
| 300 const std::string& session_symmetric_key, | 300 const std::string& session_symmetric_key, |
| 301 const std::string& persistent_symmetric_key, | 301 const std::string& persistent_symmetric_key, |
| 302 const std::string& responder_auth_message, | 302 const std::string& responder_auth_message, |
| 303 SecureMessageDelegate* secure_message_delegate, | 303 cryptauth::SecureMessageDelegate* secure_message_delegate, |
| 304 const ValidationCallback& callback) { | 304 const ValidationCallback& callback) { |
| 305 // The [Initiator Auth] message has the structure: | 305 // The [Initiator Auth] message has the structure: |
| 306 // { | 306 // { |
| 307 // header: Sig(payload1, session_symmetric_key) | 307 // header: Sig(payload1, session_symmetric_key) |
| 308 // payload1: Enc({ | 308 // payload1: Enc({ |
| 309 // sequence_number: 2, | 309 // sequence_number: 2, |
| 310 // body: { | 310 // body: { |
| 311 // header: Sig(payload2 + responder_auth_message, | 311 // header: Sig(payload2 + responder_auth_message, |
| 312 // persistent_symmetric_key) | 312 // persistent_symmetric_key) |
| 313 // payload2: "" | 313 // payload2: "" |
| 314 // } | 314 // } |
| 315 // }, session_symmetric_key) | 315 // }, session_symmetric_key) |
| 316 // } | 316 // } |
| 317 ValidateInitiatorAuthMessageContext context = { | 317 ValidateInitiatorAuthMessageContext context = { |
| 318 persistent_symmetric_key, responder_auth_message, secure_message_delegate, | 318 persistent_symmetric_key, responder_auth_message, secure_message_delegate, |
| 319 callback}; | 319 callback}; |
| 320 | 320 |
| 321 SecureMessageDelegate::UnwrapOptions unwrap_options; | 321 cryptauth::SecureMessageDelegate::UnwrapOptions unwrap_options; |
| 322 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; | 322 unwrap_options.encryption_scheme = securemessage::AES_256_CBC; |
| 323 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; | 323 unwrap_options.signature_scheme = securemessage::HMAC_SHA256; |
| 324 secure_message_delegate->UnwrapSecureMessage( | 324 secure_message_delegate->UnwrapSecureMessage( |
| 325 initiator_auth_message, session_symmetric_key, unwrap_options, | 325 initiator_auth_message, session_symmetric_key, unwrap_options, |
| 326 base::Bind(&OnOuterMessageUnwrappedForInitiatorAuth, context)); | 326 base::Bind(&OnOuterMessageUnwrappedForInitiatorAuth, context)); |
| 327 } | 327 } |
| 328 | 328 |
| 329 } // proximity_auth | 329 } // proximity_auth |
| OLD | NEW |