public_key_credential_rp_entity.cc 2.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. // Copyright 2017 The Chromium Authors. All rights reserved.
  2. // Use of this source code is governed by a BSD-style license that can be
  3. // found in the LICENSE file.
  4. #include "device/fido/public_key_credential_rp_entity.h"
  5. #include <algorithm>
  6. #include <utility>
  7. #include "device/fido/fido_constants.h"
  8. namespace device {
  9. // static
  10. absl::optional<PublicKeyCredentialRpEntity>
  11. PublicKeyCredentialRpEntity::CreateFromCBORValue(const cbor::Value& cbor) {
  12. if (!cbor.is_map() || cbor.GetMap().size() > 3) {
  13. return absl::nullopt;
  14. }
  15. const cbor::Value::MapValue& rp_map = cbor.GetMap();
  16. for (const auto& element : rp_map) {
  17. if (!element.first.is_string() || !element.second.is_string()) {
  18. return absl::nullopt;
  19. }
  20. const std::string& key = element.first.GetString();
  21. if (key != kEntityIdMapKey && key != kEntityNameMapKey &&
  22. key != kIconUrlMapKey) {
  23. return absl::nullopt;
  24. }
  25. }
  26. const auto id_it = rp_map.find(cbor::Value(kEntityIdMapKey));
  27. if (id_it == rp_map.end()) {
  28. return absl::nullopt;
  29. }
  30. PublicKeyCredentialRpEntity rp(id_it->second.GetString());
  31. const auto name_it = rp_map.find(cbor::Value(kEntityNameMapKey));
  32. if (name_it != rp_map.end()) {
  33. rp.name = name_it->second.GetString();
  34. }
  35. const auto icon_it = rp_map.find(cbor::Value(kIconUrlMapKey));
  36. if (icon_it != rp_map.end()) {
  37. rp.icon_url = GURL(icon_it->second.GetString());
  38. }
  39. return rp;
  40. }
  41. PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity() = default;
  42. PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity(std::string id_)
  43. : id(std::move(id_)) {}
  44. PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity(
  45. std::string id_,
  46. absl::optional<std::string> name_,
  47. absl::optional<GURL> icon_url_)
  48. : id(std::move(id_)),
  49. name(std::move(name_)),
  50. icon_url(std::move(icon_url_)) {}
  51. PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity(
  52. const PublicKeyCredentialRpEntity& other) = default;
  53. PublicKeyCredentialRpEntity::PublicKeyCredentialRpEntity(
  54. PublicKeyCredentialRpEntity&& other) = default;
  55. PublicKeyCredentialRpEntity& PublicKeyCredentialRpEntity::operator=(
  56. const PublicKeyCredentialRpEntity& other) = default;
  57. PublicKeyCredentialRpEntity& PublicKeyCredentialRpEntity::operator=(
  58. PublicKeyCredentialRpEntity&& other) = default;
  59. PublicKeyCredentialRpEntity::~PublicKeyCredentialRpEntity() = default;
  60. bool PublicKeyCredentialRpEntity::operator==(
  61. const PublicKeyCredentialRpEntity& other) const {
  62. return id == other.id && name == other.name && icon_url == other.icon_url;
  63. }
  64. cbor::Value AsCBOR(const PublicKeyCredentialRpEntity& entity) {
  65. cbor::Value::MapValue rp_map;
  66. rp_map.emplace(kEntityIdMapKey, entity.id);
  67. if (entity.name)
  68. rp_map.emplace(kEntityNameMapKey, *entity.name);
  69. if (entity.icon_url)
  70. rp_map.emplace(kIconUrlMapKey, entity.icon_url->spec());
  71. return cbor::Value(std::move(rp_map));
  72. }
  73. } // namespace device