Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 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 "base/json/json_string_value_serializer.h" | |
| 6 #include "base/strings/stringprintf.h" | |
| 5 #include "chromeos/dbus/fake_easy_unlock_client.h" | 7 #include "chromeos/dbus/fake_easy_unlock_client.h" |
| 6 | 8 |
| 9 namespace { | |
| 10 | |
| 11 // Keys generated using |GenerateEcP256KeyPair| are in the following format: | |
| 12 // "{<key_type>: <key_pair_index>}". | |
| 13 // <key_pair_index> is an integer identifying | |
| 14 // the key pair. | |
| 15 // <key_type> specifies whether the key is public or private. It can have one | |
| 16 // of the following valies: | |
| 17 const char kEc256PrivateKeyKey[] = "ec_p256_private_key"; | |
| 18 const char kEc256PublicKeyKey[] = "ec_p256_public_key"; | |
| 19 | |
| 20 // Extracts key pair index from a key in format "<key_type>: <key_pair_index>}". | |
| 21 int ExtractKeyPairIndexFromKey(const std::string& key, | |
| 22 const std::string& key_type) { | |
| 23 JSONStringValueSerializer serializer(key); | |
| 24 scoped_ptr<base::Value> json_value(serializer.Deserialize(NULL, NULL)); | |
| 25 if (!json_value) | |
| 26 return -1; | |
| 27 | |
| 28 base::DictionaryValue* json_dictionary = NULL; | |
| 29 if (!json_value->GetAsDictionary(&json_dictionary)) | |
| 30 return -1; | |
| 31 | |
| 32 int key_pair_index = -1; | |
| 33 if (!json_dictionary->GetInteger(key_type, &key_pair_index)) | |
| 34 return -1; | |
| 35 return key_pair_index; | |
| 36 } | |
| 37 | |
| 38 } // namespace | |
| 39 | |
| 7 namespace chromeos { | 40 namespace chromeos { |
| 8 | 41 |
| 9 FakeEasyUnlockClient::FakeEasyUnlockClient() {} | 42 // static |
| 43 bool FakeEasyUnlockClient::IsEcP256KeyPair(const std::string& private_key, | |
| 44 const std::string& public_key) { | |
| 45 int private_key_index = | |
| 46 ExtractKeyPairIndexFromKey(private_key, kEc256PrivateKeyKey); | |
| 47 int public_key_index = | |
| 48 ExtractKeyPairIndexFromKey(public_key, kEc256PublicKeyKey); | |
| 49 | |
| 50 return private_key_index > 0 && public_key_index == private_key_index; | |
| 51 } | |
| 52 | |
| 53 FakeEasyUnlockClient::FakeEasyUnlockClient() : generated_keys_count_(0) {} | |
| 10 | 54 |
| 11 FakeEasyUnlockClient::~FakeEasyUnlockClient() {} | 55 FakeEasyUnlockClient::~FakeEasyUnlockClient() {} |
| 12 | 56 |
| 13 void FakeEasyUnlockClient::Init(dbus::Bus* bus) {} | 57 void FakeEasyUnlockClient::Init(dbus::Bus* bus) {} |
| 14 | 58 |
| 15 void FakeEasyUnlockClient::GenerateEcP256KeyPair( | 59 void FakeEasyUnlockClient::GenerateEcP256KeyPair( |
| 16 const KeyPairCallback& callback) { | 60 const KeyPairCallback& callback) { |
| 61 ++generated_keys_count_; | |
| 62 | |
| 63 callback.Run( | |
| 64 base::StringPrintf("{\"%s\": %d}", | |
| 65 kEc256PrivateKeyKey, | |
| 66 generated_keys_count_), | |
| 67 base::StringPrintf("{\"%s\": %d}", | |
| 68 kEc256PublicKeyKey, | |
| 69 generated_keys_count_)); | |
| 17 } | 70 } |
| 18 | 71 |
| 19 void FakeEasyUnlockClient::PerformECDHKeyAgreement( | 72 void FakeEasyUnlockClient::PerformECDHKeyAgreement( |
| 20 const std::string& private_key, | 73 const std::string& private_key, |
| 21 const std::string& public_key, | 74 const std::string& public_key, |
| 22 const DataCallback& callback) { | 75 const DataCallback& callback) { |
| 76 int private_key_index = | |
| 77 ExtractKeyPairIndexFromKey(private_key, kEc256PrivateKeyKey); | |
| 78 int public_key_index = | |
| 79 ExtractKeyPairIndexFromKey(public_key, kEc256PublicKeyKey); | |
| 80 if (private_key_index < 0 || public_key_index < 0) { | |
| 81 callback.Run(""); | |
| 82 return; | |
| 83 } | |
| 84 | |
| 85 // The secret key should stay the same if key pairs to which private and | |
| 86 // public key belong to are changed. To achieve this, identify the key by | |
| 87 // sum and product of key pairs. | |
| 88 callback.Run(base::StringPrintf( | |
| 89 "{\"secret_key\": [%d, %d]}", | |
|
Tim Song
2014/08/29 17:38:58
Why not just [private_key, public_key]? Is the ECD
tbarzic
2014/08/29 17:43:39
Yes, in respect to the key pairs the used keys com
Tim Song
2014/08/29 17:46:00
Good to know. Can you mention this explicitly in t
tbarzic
2014/08/29 18:29:46
Done.
| |
| 90 private_key_index + public_key_index, | |
| 91 private_key_index * public_key_index)); | |
| 23 } | 92 } |
| 24 | 93 |
| 25 void FakeEasyUnlockClient::CreateSecureMessage( | 94 void FakeEasyUnlockClient::CreateSecureMessage( |
| 26 const std::string& payload, | 95 const std::string& payload, |
| 27 const std::string& secret_key, | 96 const std::string& key, |
| 28 const std::string& associated_data, | 97 const std::string& associated_data, |
| 29 const std::string& public_metadata, | 98 const std::string& public_metadata, |
| 30 const std::string& verification_key_id, | 99 const std::string& verification_key_id, |
| 31 const std::string& encryption_type, | 100 const std::string& encryption_type, |
| 32 const std::string& signature_type, | 101 const std::string& signature_type, |
| 33 const DataCallback& callback) { | 102 const DataCallback& callback) { |
| 103 callback.Run(base::StringPrintf( | |
| 104 "{\"securemessage\": {" | |
| 105 "\"payload\": \"%s\"," | |
| 106 "\"key\": \"%s\"," | |
| 107 "\"associated_data\": \"%s\"," | |
| 108 "\"public_metadata\": \"%s\"," | |
| 109 "\"verification_key_id\": \"%s\"," | |
| 110 "\"encryption_type\": \"%s\"," | |
| 111 "\"signature_type\": \"%s\"" | |
| 112 "}}", | |
| 113 payload.c_str(), | |
| 114 key.c_str(), | |
| 115 associated_data.c_str(), | |
| 116 public_metadata.c_str(), | |
| 117 verification_key_id.c_str(), | |
| 118 encryption_type.c_str(), | |
| 119 signature_type.c_str())); | |
| 34 } | 120 } |
| 35 | 121 |
| 36 void FakeEasyUnlockClient::UnwrapSecureMessage( | 122 void FakeEasyUnlockClient::UnwrapSecureMessage( |
| 37 const std::string& message, | 123 const std::string& message, |
| 38 const std::string& secret_key, | 124 const std::string& key, |
| 39 const std::string& associated_data, | 125 const std::string& associated_data, |
| 40 const std::string& encryption_type, | 126 const std::string& encryption_type, |
| 41 const std::string& signature_type, | 127 const std::string& signature_type, |
| 42 const DataCallback& callback) { | 128 const DataCallback& callback) { |
| 129 // TODO(tbarzic): Verify that |message| is in the format returned by | |
| 130 // |CreateSecureMessage| and extract payload, metadata and | |
| 131 // verification_key_id from there. | |
| 132 callback.Run(base::StringPrintf( | |
| 133 "{\"unwrapped_securemessage\": {" | |
| 134 "\"message\": \"%s\"," | |
| 135 "\"key\": \"%s\"," | |
| 136 "\"associated_data\": \"%s\"," | |
| 137 "\"encryption_type\": \"%s\"," | |
| 138 "\"signature_type\": \"%s\"" | |
| 139 "}}", | |
| 140 message.c_str(), | |
| 141 key.c_str(), | |
| 142 associated_data.c_str(), | |
| 143 encryption_type.c_str(), | |
| 144 signature_type.c_str())); | |
| 43 } | 145 } |
| 44 | 146 |
| 45 } // namespace chromeos | 147 } // namespace chromeos |
| OLD | NEW |