public_key_credential_user_entity.cc 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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_user_entity.h"
  5. #include <utility>
  6. #include "device/fido/fido_constants.h"
  7. namespace device {
  8. // static
  9. absl::optional<PublicKeyCredentialUserEntity>
  10. PublicKeyCredentialUserEntity::CreateFromCBORValue(const cbor::Value& cbor) {
  11. if (!cbor.is_map())
  12. return absl::nullopt;
  13. const cbor::Value::MapValue& cbor_map = cbor.GetMap();
  14. auto id_it = cbor_map.find(cbor::Value(kEntityIdMapKey));
  15. if (id_it == cbor_map.end() || !id_it->second.is_bytestring())
  16. return absl::nullopt;
  17. PublicKeyCredentialUserEntity user(id_it->second.GetBytestring());
  18. // Note: this code treats `name` and `displayName` fields as optional, but
  19. // they are required in the spec:
  20. // https://www.w3.org/TR/webauthn-2/#dictionary-user-credential-params
  21. auto name_it = cbor_map.find(cbor::Value(kEntityNameMapKey));
  22. if (name_it != cbor_map.end()) {
  23. if (!name_it->second.is_string()) {
  24. return absl::nullopt;
  25. }
  26. user.name = name_it->second.GetString();
  27. }
  28. auto display_name_it = cbor_map.find(cbor::Value(kDisplayNameMapKey));
  29. if (display_name_it != cbor_map.end()) {
  30. if (!display_name_it->second.is_string()) {
  31. return absl::nullopt;
  32. }
  33. user.display_name = display_name_it->second.GetString();
  34. }
  35. auto icon_it = cbor_map.find(cbor::Value(kIconUrlMapKey));
  36. if (icon_it != cbor_map.end()) {
  37. if (!icon_it->second.is_string()) {
  38. return absl::nullopt;
  39. }
  40. user.icon_url = GURL(icon_it->second.GetString());
  41. if (!user.icon_url->is_valid()) {
  42. return absl::nullopt;
  43. }
  44. }
  45. return user;
  46. }
  47. PublicKeyCredentialUserEntity::PublicKeyCredentialUserEntity() = default;
  48. PublicKeyCredentialUserEntity::PublicKeyCredentialUserEntity(
  49. std::vector<uint8_t> id_)
  50. : id(std::move(id_)) {}
  51. PublicKeyCredentialUserEntity::PublicKeyCredentialUserEntity(
  52. std::vector<uint8_t> id_,
  53. absl::optional<std::string> name_,
  54. absl::optional<std::string> display_name_,
  55. absl::optional<GURL> icon_url_)
  56. : id(std::move(id_)),
  57. name(std::move(name_)),
  58. display_name(std::move(display_name_)),
  59. icon_url(std::move(icon_url_)) {}
  60. PublicKeyCredentialUserEntity::PublicKeyCredentialUserEntity(
  61. const PublicKeyCredentialUserEntity& other) = default;
  62. PublicKeyCredentialUserEntity::PublicKeyCredentialUserEntity(
  63. PublicKeyCredentialUserEntity&& other) = default;
  64. PublicKeyCredentialUserEntity& PublicKeyCredentialUserEntity::operator=(
  65. const PublicKeyCredentialUserEntity& other) = default;
  66. PublicKeyCredentialUserEntity& PublicKeyCredentialUserEntity::operator=(
  67. PublicKeyCredentialUserEntity&& other) = default;
  68. PublicKeyCredentialUserEntity::~PublicKeyCredentialUserEntity() = default;
  69. bool PublicKeyCredentialUserEntity::operator==(
  70. const PublicKeyCredentialUserEntity& other) const {
  71. return id == other.id && name == other.name &&
  72. display_name == other.display_name && icon_url == other.icon_url;
  73. }
  74. cbor::Value AsCBOR(const PublicKeyCredentialUserEntity& user) {
  75. cbor::Value::MapValue user_map;
  76. user_map.emplace(kEntityIdMapKey, user.id);
  77. if (user.name)
  78. user_map.emplace(kEntityNameMapKey, *user.name);
  79. // Empty icon URLs result in CTAP1_ERR_INVALID_LENGTH on some security keys.
  80. if (user.icon_url && !user.icon_url->is_empty())
  81. user_map.emplace(kIconUrlMapKey, user.icon_url->spec());
  82. if (user.display_name)
  83. user_map.emplace(kDisplayNameMapKey, *user.display_name);
  84. return cbor::Value(std::move(user_map));
  85. }
  86. } // namespace device