Chromium Code Reviews| Index: chromeos/cryptohome/homedir_methods.cc |
| diff --git a/chromeos/cryptohome/homedir_methods.cc b/chromeos/cryptohome/homedir_methods.cc |
| index 73a741b51c111289c845252eba7f96420a89beff..e14c6de0cff39d68f26ef75394791a507dec86cf 100644 |
| --- a/chromeos/cryptohome/homedir_methods.cc |
| +++ b/chromeos/cryptohome/homedir_methods.cc |
| @@ -27,8 +27,10 @@ namespace { |
| HomedirMethods* g_homedir_methods = NULL; |
| void FillKeyProtobuf(const KeyDefinition& key_def, Key* key) { |
| - key->set_secret(key_def.key); |
| + key->set_secret(key_def.secret); |
| KeyData* data = key->mutable_data(); |
| + DCHECK_EQ(KeyDefinition::TYPE_PASSWORD, key_def.type); |
| + data->set_type(KeyData::KEY_TYPE_PASSWORD); |
| data->set_label(key_def.label); |
| if (key_def.revision > 0) |
| @@ -44,20 +46,50 @@ void FillKeyProtobuf(const KeyDefinition& key_def, Key* key) { |
| PRIV_AUTHORIZED_UPDATE); |
| } |
| - if (key_def.encryption_key.empty() && key_def.signature_key.empty()) |
| - return; |
| + for (std::vector<KeyDefinition::AuthorizationData>::const_iterator auth_it = |
| + key_def.authorization_data.begin(); |
| + auth_it != key_def.authorization_data.end(); ++auth_it) { |
| + KeyAuthorizationData* auth_data = data->add_authorization_data(); |
| + switch (auth_it->type) { |
| + case KeyDefinition::AuthorizationData::TYPE_HMACSHA256: |
| + auth_data->set_type( |
| + KeyAuthorizationData::KEY_AUTHORIZATION_TYPE_HMACSHA256); |
| + break; |
| + case KeyDefinition::AuthorizationData::TYPE_AES256CBC_HMACSHA256: |
| + auth_data->set_type( |
| + KeyAuthorizationData::KEY_AUTHORIZATION_TYPE_AES256CBC_HMACSHA256); |
| + break; |
| + default: |
| + NOTREACHED(); |
| + break; |
| + } |
| - KeyAuthorizationData* auth_data = data->add_authorization_data(); |
| - auth_data->set_type(KeyAuthorizationData::KEY_AUTHORIZATION_TYPE_HMACSHA256); |
| - if (!key_def.encryption_key.empty()) { |
| - KeyAuthorizationSecret* secret = auth_data->add_secrets(); |
| - secret->mutable_usage()->set_encrypt(true); |
| - secret->set_symmetric_key(key_def.encryption_key); |
| + for (std::vector<KeyDefinition::AuthorizationData::Secret>::const_iterator |
| + secret_it = auth_it->secrets.begin(); |
| + secret_it != auth_it->secrets.end(); ++secret_it) { |
| + KeyAuthorizationSecret* secret = auth_data->add_secrets(); |
| + secret->mutable_usage()->set_encrypt(secret_it->encrypt); |
| + secret->mutable_usage()->set_sign(secret_it->sign); |
| + if (!secret_it->symmetric_key.empty()) |
| + secret->set_symmetric_key(secret_it->symmetric_key); |
| + if (!secret_it->public_key.empty()) |
| + secret->set_public_key(secret_it->public_key); |
| + secret->set_wrapped(secret_it->wrapped); |
| + } |
| } |
| - if (!key_def.signature_key.empty()) { |
| - KeyAuthorizationSecret* secret = auth_data->add_secrets(); |
| - secret->mutable_usage()->set_sign(true); |
| - secret->set_symmetric_key(key_def.signature_key); |
| + |
| + if (!key_def.provider_data.empty()) { |
|
Darren Krahn
2014/09/02 18:21:53
nit: conditional not necessary
bartfab (slow)
2014/09/04 10:14:18
Done.
|
| + for (std::vector<KeyDefinition::ProviderData>::const_iterator it = |
| + key_def.provider_data.begin(); it != key_def.provider_data.end(); |
| + ++it) { |
| + KeyProviderData::Entry* entry = |
| + data->mutable_provider_data()->add_entry(); |
| + entry->set_name(it->name); |
| + if (it->number) |
| + entry->set_number(*it->number); |
| + if (it->bytes) |
| + entry->set_bytes(*it->bytes); |
| + } |
| } |
| } |
| @@ -77,6 +109,35 @@ void FillAuthorizationProtobuf(const Authorization& auth, |
| key->set_secret(auth.key); |
| } |
| +void ParseAuthorizationDataProtobuf( |
| + const KeyAuthorizationData& authorization_data_proto, |
| + KeyDefinition::AuthorizationData* authorization_data) { |
| + switch (authorization_data_proto.type()) { |
| + case KeyAuthorizationData::KEY_AUTHORIZATION_TYPE_HMACSHA256: |
| + authorization_data->type = |
| + KeyDefinition::AuthorizationData::TYPE_HMACSHA256; |
| + break; |
| + case KeyAuthorizationData::KEY_AUTHORIZATION_TYPE_AES256CBC_HMACSHA256: |
| + authorization_data->type = |
| + KeyDefinition::AuthorizationData::TYPE_AES256CBC_HMACSHA256; |
| + break; |
| + default: |
| + NOTREACHED(); |
| + return; |
| + } |
| + |
| + for (RepeatedPtrField<KeyAuthorizationSecret>::const_iterator it = |
| + authorization_data_proto.secrets().begin(); |
| + it != authorization_data_proto.secrets().end(); ++it) { |
| + authorization_data->secrets.push_back( |
| + KeyDefinition::AuthorizationData::Secret(it->usage().encrypt(), |
| + it->usage().sign(), |
| + it->symmetric_key(), |
| + it->public_key(), |
| + it->wrapped())); |
| + } |
| +} |
| + |
| MountError MapError(CryptohomeErrorCode code) { |
| switch (code) { |
| case CRYPTOHOME_ERROR_NOT_SET: |
| @@ -257,69 +318,60 @@ class HomedirMethodsImpl : public HomedirMethods { |
| bool result, |
| const BaseReply& reply) { |
| if (call_status != chromeos::DBUS_METHOD_CALL_SUCCESS) { |
| - callback.Run(false, MOUNT_ERROR_FATAL, ScopedVector<RetrievedKeyData>()); |
| + callback.Run(false, MOUNT_ERROR_FATAL, std::vector<KeyDefinition>()); |
| return; |
| } |
| if (reply.has_error()) { |
| if (reply.error() != CRYPTOHOME_ERROR_NOT_SET) { |
| callback.Run(false, |
| MapError(reply.error()), |
| - ScopedVector<RetrievedKeyData>()); |
| + std::vector<KeyDefinition>()); |
| return; |
| } |
| } |
| if (!reply.HasExtension(GetKeyDataReply::reply)) { |
| - callback.Run(false, MOUNT_ERROR_FATAL, ScopedVector<RetrievedKeyData>()); |
| + callback.Run(false, MOUNT_ERROR_FATAL, std::vector<KeyDefinition>()); |
| return; |
| } |
| // Extract the contents of the |KeyData| protos returned. |
| - const RepeatedPtrField<KeyData>& key_data_proto = |
| + const RepeatedPtrField<KeyData>& key_data = |
| reply.GetExtension(GetKeyDataReply::reply).key_data(); |
| - ScopedVector<RetrievedKeyData> key_data_list; |
| - for (RepeatedPtrField<KeyData>::const_iterator it = key_data_proto.begin(); |
| - it != key_data_proto.end(); ++it) { |
| + std::vector<KeyDefinition> key_definitions; |
| + for (RepeatedPtrField<KeyData>::const_iterator it = key_data.begin(); |
| + it != key_data.end(); ++it) { |
| // Extract |type|, |label| and |revision|. |
| DCHECK_EQ(KeyData::KEY_TYPE_PASSWORD, it->type()); |
| - key_data_list.push_back(new RetrievedKeyData( |
| - RetrievedKeyData::TYPE_PASSWORD, |
| - it->label(), |
| - it->revision())); |
| - RetrievedKeyData* key_data = key_data_list.back(); |
| + key_definitions.push_back(KeyDefinition(std::string() /* secret */, |
| + it->label(), |
| + 0 /* privileges */)); |
| + KeyDefinition& key_definition = key_definitions.back(); |
| + key_definition.revision = it->revision(); |
| // Extract |privileges|. |
| const KeyPrivileges& privileges = it->privileges(); |
| if (privileges.mount()) |
| - key_data->privileges |= PRIV_MOUNT; |
| + key_definition.privileges |= PRIV_MOUNT; |
| if (privileges.add()) |
| - key_data->privileges |= PRIV_ADD; |
| + key_definition.privileges |= PRIV_ADD; |
| if (privileges.remove()) |
| - key_data->privileges |= PRIV_REMOVE; |
| + key_definition.privileges |= PRIV_REMOVE; |
| if (privileges.update()) |
| - key_data->privileges |= PRIV_MIGRATE; |
| + key_definition.privileges |= PRIV_MIGRATE; |
| if (privileges.authorized_update()) |
| - key_data->privileges |= PRIV_AUTHORIZED_UPDATE; |
| + key_definition.privileges |= PRIV_AUTHORIZED_UPDATE; |
| // Extract |authorization_data|. |
| for (RepeatedPtrField<KeyAuthorizationData>::const_iterator auth_it = |
| it->authorization_data().begin(); |
| auth_it != it->authorization_data().end(); ++auth_it) { |
| - switch (auth_it->type()) { |
| - case KeyAuthorizationData::KEY_AUTHORIZATION_TYPE_HMACSHA256: |
| - key_data->authorization_types.push_back( |
| - RetrievedKeyData::AUTHORIZATION_TYPE_HMACSHA256); |
| - break; |
| - case KeyAuthorizationData:: |
| - KEY_AUTHORIZATION_TYPE_AES256CBC_HMACSHA256: |
| - key_data->authorization_types.push_back( |
| - RetrievedKeyData::AUTHORIZATION_TYPE_AES256CBC_HMACSHA256); |
| - break; |
| - default: |
| - NOTREACHED(); |
| - break; |
| - } |
| + key_definition.authorization_data.push_back( |
| + KeyDefinition::AuthorizationData()); |
| + ParseAuthorizationDataProtobuf( |
| + *auth_it, |
| + &key_definition.authorization_data.back()); |
| } |
| // Extract |provider_data|. |
| @@ -328,22 +380,22 @@ class HomedirMethodsImpl : public HomedirMethods { |
| provider_data_it != it->provider_data().entry().end(); |
| ++provider_data_it) { |
| // Extract |name|. |
| - key_data->provider_data.push_back( |
| - new RetrievedKeyData::ProviderData(provider_data_it->name())); |
| - RetrievedKeyData::ProviderData* provider_data = |
| - key_data->provider_data.back(); |
| + key_definition.provider_data.push_back( |
| + KeyDefinition::ProviderData(provider_data_it->name())); |
| + KeyDefinition::ProviderData& provider_data = |
| + key_definition.provider_data.back(); |
| int data_items = 0; |
| // Extract |number|. |
| if (provider_data_it->has_number()) { |
| - provider_data->number.reset(new int64(provider_data_it->number())); |
| + provider_data.number.reset(new int64(provider_data_it->number())); |
| ++data_items; |
| } |
| // Extract |bytes|. |
| if (provider_data_it->has_bytes()) { |
| - provider_data->bytes.reset( |
| + provider_data.bytes.reset( |
| new std::string(provider_data_it->bytes())); |
| ++data_items; |
| } |
| @@ -352,7 +404,7 @@ class HomedirMethodsImpl : public HomedirMethods { |
| } |
| } |
| - callback.Run(true, MOUNT_ERROR_NONE, key_data_list.Pass()); |
| + callback.Run(true, MOUNT_ERROR_NONE, key_definitions); |
| } |
| void OnMountExCallback(const MountCallback& callback, |