signature_provider.cc 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. // Copyright 2021 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 "components/policy/test_support/signature_provider.h"
  5. #include <stdint.h>
  6. #include "base/base64.h"
  7. #include "base/check.h"
  8. #include "base/containers/span.h"
  9. #include "base/hash/sha1.h"
  10. #include "crypto/rsa_private_key.h"
  11. #include "crypto/signature_creator.h"
  12. namespace policy {
  13. namespace {
  14. constexpr char kSigningKey1[] =
  15. "MIIBVQIBADANBgkqhkiG9w0BAQEFAASCAT8wggE7AgEAAkEA2c3KzcPqvnJ5HCk3OZkf1"
  16. "LMO8Ht4dw4FO2U0EmKvpo0zznj4RwUdmKobH1AFWzwZP4CDY2M67MsukE/1Jnbx1QIDAQ"
  17. "ABAkBkKcLZa/75hHVz4PR3tZaw34PATlfxEG6RiRIwXlf/FFlfGIZOSxdW/I1A3XRl0/9"
  18. "nZMuctBSKBrcTRZQWfT/hAiEA9g8xbQbMO6BEH/XCRSsQbPlvj4c9wDtVEzeAzZ/ht9kC"
  19. "IQDiml+/lXS1emqml711jJcYJNYJzdy1lL/ieKogR59oXQIhAK+Pl4xa1U2VxAWpq7r+R"
  20. "vH55wdZT03hB4p2h4gvEzXBAiAkw9kvE0eZPiBZoRrrHIFTOH7FnnHlwBmV2+/2RsiVPQ"
  21. "IhAKqx/4qisivvmoM/xbzUagfoxwsu1A/4mGjhBKiS0BCq";
  22. constexpr char kSigningKey2[] =
  23. "MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmZhreV04M3knCi6wibr49"
  24. "oDesHny1G33PKOX9ko8pcxAiu9ZqsKCj7wNW2PGqnLi81fddACwQtYn5xdhCtzB9wIDAQ"
  25. "ABAkA0z8m0cy8N08xundspoFZWO71WJLgv/peSDBYGI0RzJR1l9Np355EukQUQwRs5XrL"
  26. "3vRQZy2vDqeiR96epkAhRAiEAzJ4DVI8k3pAl7CGv5icqFkJ02viExIwehhIEXBcB6p0C"
  27. "IQDAKmzpoRpBEZRQ9xrTvPOi+Ea8Jnd478BU7CI/LFfgowIgMfLIoVWoDGRnvXKju60Hy"
  28. "xNB70oHLut9cADp64j6QMkCIDrgxN4QbmrhaAAmtiGKE1wrlgCwCIsVamiasSOKAqLhAi"
  29. "EAo/ItVcFtQPod97qG71CY/O4JzOciuU6AMhprs181vfM=";
  30. constexpr char kTestDomain1Signature1[] =
  31. "l+sT5mziei/GbmiP7VtRCCfwpZcg7uKbW2OlnK5B/TTELutjEIAMdHduNBwbO44qOn"
  32. "/5c7YrtkXbBehaaDYFPGI6bGTbDmG9KRxhS+DaB7opgfCQWLi79Gn/jytKLZhRN/VS"
  33. "y+PEbezqMi3d1/xDxlThwWZDNwnhv9ER/Nu/32ZTjzgtqonSn2CQtwXCIILm4FdV/1"
  34. "/BdmZG+Ge4i4FTqYtInir5YFe611KXU/AveGhQGBIAXo4qYg1IqbVrvKBSU9dlI6Sl"
  35. "9TJJLbJ3LGaXuljgFhyMAl3gcy7ftC9MohEmwa+sc7y2mOAgYQ5SSmyAtQwQgAkX9J"
  36. "3+tfxjmoA/dg==";
  37. constexpr char kTestDomain1Signature2[] =
  38. "cO0nQjRptkeefKDw5QpJSQDavHABxUvbR9Wvoa235OG9Whw1RFqq2ye6pKnI3ezW6/"
  39. "7b4ANcpi5a7HV5uF8K7gWyYdxY8NHLeyrbwXxg5j6HAmHmkP1UZcf/dAnWqo7cW8g4"
  40. "DIQOhC43KkveMYJ2HnelwdXt/7zqkbe8/3Yj4nhjAUeARx86Sb8Nzydwkrvqs5Jw/x"
  41. "5LG+BODExrXXcGu/ubDlW4ivJFqfNUPQysqBXSMY2XCHPJDx3eECLGVVN/fFAWWgjM"
  42. "HFObAriAt0b18cc9Nr0mAt4Qq1oDzWcAHCPHE+5dr8Uf46BUrMLJRNRKCY7rrsoIin"
  43. "9Be9gs3W+Aww==";
  44. constexpr char kTestDomain2Signature1[] =
  45. "TzBiigZKwBdr6lyP6tUDsw+Q9wYO1Yepyxm0O4JZ4RID32L27sWzC1/hwC51fRcCvP"
  46. "luEVIW6mH+BFODXMrteUFWfbbG7jgV+Wg+QdzMqgJjxhNKFXPTsZ7/286LAd1vBY/A"
  47. "nGd8Wog6AhzfrgMbLNsH794GD0xIUwRvXUWFNP8pClj5VPgQnJrIA9aZwW8FNGbteA"
  48. "HacFB0T/oqP5s7XT4Qvkj14RLmCgTwEM8Vcpqy5teJaF8yN17wniveddoOQGH6s0HC"
  49. "ocprEccrH5fP/WVAPxCfx4vVYQY5q4CZ4K3f6dTC2FV4IDelM6dugEkvSS02YCzDaO"
  50. "N+Z7IwElzTKg==";
  51. constexpr char kTestDomain2Signature2[] =
  52. "mr+9CCYvR0cTvPwlzkxqlpGYy55gY7cPiIkPAPoql51yHK1tkMTOSFru8Dy/nMt+0o"
  53. "4z7WO60F1wnIBGkQxnTj/DsO6QpCYi7oHqtLmZ2jsLQFlMyvPGUtpJEFvRwjr/TNbh"
  54. "6RqUtz1LQFuJQ848kBrx7nkte1L8SuPDExgx+Q3LtbNj4SuTdvMUBMvEERXiLuwfFL"
  55. "BefGjtsqfWETQVlJTCW7xcqOLedIX8UYgEDBpDOZ23A3GzCShuBsIut5m87R5mODht"
  56. "EUmKNDK1+OMc6SyDpf+r48Wph4Db1bVaKy8fcpSNJOwEgsrmH7/+owKPGcN7I5jYAF"
  57. "Z2PGxHTQ9JNA==";
  58. constexpr char kTestDomain3Signature1[] =
  59. "T0wXC5w3GXyovA09pyOLX7ui/NI603UfbZXYyTbHI7xtzCIaHVPH35Nx4zdqVrdsej"
  60. "ErQ12yVLDDIJokY4Yl+/fj/zrkAPxThI+TNQ+jo0i+al05PuopfpzvCzIXiZBbkbyW"
  61. "3XfedxXP3IPN2XU2/3vX+ZXUNG6pxeETem64kGezkjkUraqnHw3JVzwJYHhpMcwdLP"
  62. "PYK6V23BbEHEVBtQZd/ledXacz7gOzm1zGni4e+vxA2roAdJWyhbjU0dTKNNUsZmMv"
  63. "ryQH9Af1Jw+dqs0RAbhcJXm2i8EUWIgNv6aMn1Z2DzZwKKjXsKgcYSRo8pdYa8RZAo"
  64. "UExd9roA9a5w==";
  65. constexpr char kTestDomain3Signature2[] =
  66. "o5MVSo4bRwIJ/aooGyXpRXsEsWPG8fNA2UTG8hgwnLYhNeJCCnLs/vW2vdp0URE8jn"
  67. "qiG4N8KjbuiGw0rJtO1EygdLfpnMEtqYlFjrOie38sy92l/AwohXj6luYzMWL+FqDu"
  68. "WQeXasjgyY4s9BOLQVDEnEj3pvqhrk/mXvMwUeXGpbxTNbWAd0C8BTZrGOwU/kIXxo"
  69. "vAMGg8L+rQaDwBTEnMsMZcvlrIyqSg5v4BxCWuL3Yd2xvUqZEUWRp1aKetsHRnz5hw"
  70. "H7WK7DzvKepDn06XjPG9lchi448U3HB3PRKtCzfO3nD9YXMKTuqRpKPF8PeK11CWh1"
  71. "DBvBYwi20vbQ==";
  72. std::unique_ptr<crypto::RSAPrivateKey> DecodePrivateKey(
  73. const char* const encoded) {
  74. std::string to_decrypt;
  75. if (!base::Base64Decode(encoded, &to_decrypt))
  76. return nullptr;
  77. return crypto::RSAPrivateKey::CreateFromPrivateKeyInfo(
  78. base::as_bytes(base::make_span(to_decrypt)));
  79. }
  80. bool ExportPublicKeyAsString(const crypto::RSAPrivateKey& private_key,
  81. std::string* public_key) {
  82. std::vector<uint8_t> public_key_vec;
  83. if (!private_key.ExportPublicKey(&public_key_vec))
  84. return false;
  85. public_key->assign(reinterpret_cast<const char*>(public_key_vec.data()),
  86. public_key_vec.size());
  87. return true;
  88. }
  89. std::string Decode64(const std::string& str64) {
  90. std::string result;
  91. CHECK(base::Base64Decode(str64, &result));
  92. return result;
  93. }
  94. void InitSigningKeys(std::vector<SignatureProvider::SigningKey>* signing_keys) {
  95. signing_keys->push_back(SignatureProvider::SigningKey(
  96. DecodePrivateKey(kSigningKey1),
  97. {
  98. {SignatureProvider::kTestDomain1, Decode64(kTestDomain1Signature1)},
  99. {SignatureProvider::kTestDomain2, Decode64(kTestDomain2Signature1)},
  100. {SignatureProvider::kTestDomain3, Decode64(kTestDomain3Signature1)},
  101. }));
  102. signing_keys->push_back(SignatureProvider::SigningKey(
  103. DecodePrivateKey(kSigningKey2),
  104. {
  105. {SignatureProvider::kTestDomain1, Decode64(kTestDomain1Signature2)},
  106. {SignatureProvider::kTestDomain2, Decode64(kTestDomain2Signature2)},
  107. {SignatureProvider::kTestDomain3, Decode64(kTestDomain3Signature2)},
  108. }));
  109. }
  110. } // namespace
  111. constexpr char SignatureProvider::kTestDomain1[];
  112. constexpr char SignatureProvider::kTestDomain2[];
  113. constexpr char SignatureProvider::kTestDomain3[];
  114. SignatureProvider::SigningKey::SigningKey(
  115. std::unique_ptr<crypto::RSAPrivateKey> private_key,
  116. const std::map<std::string, std::string>& signatures)
  117. : private_key_(std::move(private_key)), signatures_(signatures) {
  118. CHECK(private_key_);
  119. CHECK(ExportPublicKeyAsString(*private_key_, &public_key_));
  120. }
  121. SignatureProvider::SigningKey::SigningKey(
  122. SignatureProvider::SigningKey&& signing_key) = default;
  123. SignatureProvider::SigningKey& SignatureProvider::SigningKey::operator=(
  124. SignatureProvider::SigningKey&& signing_key) = default;
  125. SignatureProvider::SigningKey::~SigningKey() = default;
  126. bool SignatureProvider::SigningKey::GetSignatureForDomain(
  127. const std::string& domain,
  128. std::string* signature) const {
  129. auto domain_signature = signatures_.find(domain);
  130. if (domain_signature != signatures_.end()) {
  131. signature->assign(domain_signature->second);
  132. return true;
  133. }
  134. auto wildcard_signature = signatures_.find("*");
  135. if (wildcard_signature != signatures_.end()) {
  136. signature->assign(wildcard_signature->second);
  137. return true;
  138. }
  139. return false;
  140. }
  141. bool SignatureProvider::SigningKey::Sign(const std::string& str,
  142. std::string* signature) const {
  143. std::vector<uint8_t> signature_vec;
  144. std::string sha1 = base::SHA1HashString(str);
  145. if (!crypto::SignatureCreator::Sign(
  146. private_key_.get(), crypto::SignatureCreator::SHA1,
  147. base::as_bytes(base::make_span(sha1)).data(), sha1.size(),
  148. &signature_vec)) {
  149. return false;
  150. }
  151. signature->assign(reinterpret_cast<const char*>(signature_vec.data()),
  152. signature_vec.size());
  153. return true;
  154. }
  155. SignatureProvider::SignatureProvider() {
  156. InitSigningKeys(&signing_keys_);
  157. }
  158. SignatureProvider::SignatureProvider(SignatureProvider&& signature_provider) =
  159. default;
  160. SignatureProvider& SignatureProvider::operator=(
  161. SignatureProvider&& signature_provider) = default;
  162. SignatureProvider::~SignatureProvider() = default;
  163. const SignatureProvider::SigningKey* SignatureProvider::GetKeyByVersion(
  164. int key_version) const {
  165. // |key_version| is 1-based.
  166. if (key_version < 1)
  167. return nullptr;
  168. size_t key_index = static_cast<size_t>(key_version) - 1;
  169. if (key_index >= signing_keys_.size()) {
  170. if (!rotate_keys())
  171. return nullptr;
  172. key_index %= signing_keys_.size();
  173. }
  174. return &signing_keys_[key_index];
  175. }
  176. const SignatureProvider::SigningKey* SignatureProvider::GetCurrentKey() const {
  177. return GetKeyByVersion(current_key_version());
  178. }
  179. } // namespace policy