1*6777b538SAndroid Build Coastguard Worker // Copyright 2012 The Chromium Authors 2*6777b538SAndroid Build Coastguard Worker // Use of this source code is governed by a BSD-style license that can be 3*6777b538SAndroid Build Coastguard Worker // found in the LICENSE file. 4*6777b538SAndroid Build Coastguard Worker 5*6777b538SAndroid Build Coastguard Worker #ifndef BASE_UUID_H_ 6*6777b538SAndroid Build Coastguard Worker #define BASE_UUID_H_ 7*6777b538SAndroid Build Coastguard Worker 8*6777b538SAndroid Build Coastguard Worker #include <stdint.h> 9*6777b538SAndroid Build Coastguard Worker 10*6777b538SAndroid Build Coastguard Worker #include <compare> 11*6777b538SAndroid Build Coastguard Worker #include <iosfwd> 12*6777b538SAndroid Build Coastguard Worker #include <string> 13*6777b538SAndroid Build Coastguard Worker #include <string_view> 14*6777b538SAndroid Build Coastguard Worker 15*6777b538SAndroid Build Coastguard Worker #include "base/base_export.h" 16*6777b538SAndroid Build Coastguard Worker #include "base/containers/span.h" 17*6777b538SAndroid Build Coastguard Worker #include "base/types/pass_key.h" 18*6777b538SAndroid Build Coastguard Worker #include "build/build_config.h" 19*6777b538SAndroid Build Coastguard Worker 20*6777b538SAndroid Build Coastguard Worker namespace content { 21*6777b538SAndroid Build Coastguard Worker class FileSystemAccessManagerImpl; 22*6777b538SAndroid Build Coastguard Worker } 23*6777b538SAndroid Build Coastguard Worker 24*6777b538SAndroid Build Coastguard Worker namespace base { 25*6777b538SAndroid Build Coastguard Worker 26*6777b538SAndroid Build Coastguard Worker class BASE_EXPORT Uuid { 27*6777b538SAndroid Build Coastguard Worker public: 28*6777b538SAndroid Build Coastguard Worker // Length in bytes of the input required to format the input as a Uuid in the 29*6777b538SAndroid Build Coastguard Worker // form of version 4. 30*6777b538SAndroid Build Coastguard Worker static constexpr size_t kGuidV4InputLength = 16; 31*6777b538SAndroid Build Coastguard Worker 32*6777b538SAndroid Build Coastguard Worker // Generate a 128-bit random Uuid in the form of version 4. see RFC 4122, 33*6777b538SAndroid Build Coastguard Worker // section 4.4. The format of Uuid version 4 must be 34*6777b538SAndroid Build Coastguard Worker // xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx, where y is one of [8, 9, a, b]. The 35*6777b538SAndroid Build Coastguard Worker // hexadecimal values "a" through "f" are output as lower case characters. 36*6777b538SAndroid Build Coastguard Worker // A cryptographically secure random source will be used, but consider using 37*6777b538SAndroid Build Coastguard Worker // UnguessableToken for greater type-safety if Uuid format is unnecessary. 38*6777b538SAndroid Build Coastguard Worker static Uuid GenerateRandomV4(); 39*6777b538SAndroid Build Coastguard Worker 40*6777b538SAndroid Build Coastguard Worker // Formats a sequence of 16 random bytes as a Uuid in the form of version 4. 41*6777b538SAndroid Build Coastguard Worker // `input` must: 42*6777b538SAndroid Build Coastguard Worker // - have been randomly generated (e.g. created from an UnguessableToken), and 43*6777b538SAndroid Build Coastguard Worker // - be of length 16 (this is checked at compile-time). 44*6777b538SAndroid Build Coastguard Worker // Despite taking 128 bits of randomness, certain bits will always be 45*6777b538SAndroid Build Coastguard Worker // masked over to adhere to the V4 Uuid format. 46*6777b538SAndroid Build Coastguard Worker // Useful in cases where an opaque identifier that is generated from stable 47*6777b538SAndroid Build Coastguard Worker // inputs needs to be formatted as a V4 Uuid. Currently only exposed to the 48*6777b538SAndroid Build Coastguard Worker // File System Access API to return a V4 Uuid for the getUniqueId() method. 49*6777b538SAndroid Build Coastguard Worker static Uuid FormatRandomDataAsV4( 50*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t, kGuidV4InputLength> input, 51*6777b538SAndroid Build Coastguard Worker base::PassKey<content::FileSystemAccessManagerImpl> pass_key); 52*6777b538SAndroid Build Coastguard Worker static Uuid FormatRandomDataAsV4ForTesting( 53*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t, kGuidV4InputLength> input); 54*6777b538SAndroid Build Coastguard Worker 55*6777b538SAndroid Build Coastguard Worker // Returns a valid Uuid if the input string conforms to the Uuid format, and 56*6777b538SAndroid Build Coastguard Worker // an invalid Uuid otherwise. Note that this does NOT check if the hexadecimal 57*6777b538SAndroid Build Coastguard Worker // values "a" through "f" are in lower case characters. 58*6777b538SAndroid Build Coastguard Worker static Uuid ParseCaseInsensitive(std::string_view input); 59*6777b538SAndroid Build Coastguard Worker static Uuid ParseCaseInsensitive(std::u16string_view input); 60*6777b538SAndroid Build Coastguard Worker 61*6777b538SAndroid Build Coastguard Worker // Similar to ParseCaseInsensitive(), but all hexadecimal values "a" through 62*6777b538SAndroid Build Coastguard Worker // "f" must be lower case characters. 63*6777b538SAndroid Build Coastguard Worker static Uuid ParseLowercase(std::string_view input); 64*6777b538SAndroid Build Coastguard Worker static Uuid ParseLowercase(std::u16string_view input); 65*6777b538SAndroid Build Coastguard Worker 66*6777b538SAndroid Build Coastguard Worker // Constructs an invalid Uuid. 67*6777b538SAndroid Build Coastguard Worker Uuid(); 68*6777b538SAndroid Build Coastguard Worker 69*6777b538SAndroid Build Coastguard Worker Uuid(const Uuid& other); 70*6777b538SAndroid Build Coastguard Worker Uuid& operator=(const Uuid& other); 71*6777b538SAndroid Build Coastguard Worker Uuid(Uuid&& other); 72*6777b538SAndroid Build Coastguard Worker Uuid& operator=(Uuid&& other); 73*6777b538SAndroid Build Coastguard Worker is_valid()74*6777b538SAndroid Build Coastguard Worker bool is_valid() const { return !lowercase_.empty(); } 75*6777b538SAndroid Build Coastguard Worker 76*6777b538SAndroid Build Coastguard Worker // Returns the Uuid in a lowercase string format if it is valid, and an empty 77*6777b538SAndroid Build Coastguard Worker // string otherwise. The returned value is guaranteed to be parsed by 78*6777b538SAndroid Build Coastguard Worker // ParseLowercase(). 79*6777b538SAndroid Build Coastguard Worker // 80*6777b538SAndroid Build Coastguard Worker // NOTE: While AsLowercaseString() is currently a trivial getter, callers 81*6777b538SAndroid Build Coastguard Worker // should not treat it as such. When the internal type of base::Uuid changes, 82*6777b538SAndroid Build Coastguard Worker // this will be a non-trivial converter. See the TODO above `lowercase_` for 83*6777b538SAndroid Build Coastguard Worker // more context. 84*6777b538SAndroid Build Coastguard Worker const std::string& AsLowercaseString() const; 85*6777b538SAndroid Build Coastguard Worker 86*6777b538SAndroid Build Coastguard Worker // Invalid Uuids are equal. 87*6777b538SAndroid Build Coastguard Worker friend bool operator==(const Uuid&, const Uuid&) = default; 88*6777b538SAndroid Build Coastguard Worker // Uuids are 128bit chunks of data so must be indistinguishable if equivalent. 89*6777b538SAndroid Build Coastguard Worker friend std::strong_ordering operator<=>(const Uuid&, const Uuid&) = default; 90*6777b538SAndroid Build Coastguard Worker 91*6777b538SAndroid Build Coastguard Worker private: 92*6777b538SAndroid Build Coastguard Worker static Uuid FormatRandomDataAsV4Impl( 93*6777b538SAndroid Build Coastguard Worker base::span<const uint8_t, kGuidV4InputLength> input); 94*6777b538SAndroid Build Coastguard Worker 95*6777b538SAndroid Build Coastguard Worker // TODO(crbug.com/1026195): Consider using a different internal type. 96*6777b538SAndroid Build Coastguard Worker // Most existing representations of Uuids in the codebase use std::string, 97*6777b538SAndroid Build Coastguard Worker // so matching the internal type will avoid inefficient string conversions 98*6777b538SAndroid Build Coastguard Worker // during the migration to base::Uuid. 99*6777b538SAndroid Build Coastguard Worker // 100*6777b538SAndroid Build Coastguard Worker // The lowercase form of the Uuid. Empty for invalid Uuids. 101*6777b538SAndroid Build Coastguard Worker std::string lowercase_; 102*6777b538SAndroid Build Coastguard Worker }; 103*6777b538SAndroid Build Coastguard Worker 104*6777b538SAndroid Build Coastguard Worker // For runtime usage only. Do not store the result of this hash, as it may 105*6777b538SAndroid Build Coastguard Worker // change in future Chromium revisions. 106*6777b538SAndroid Build Coastguard Worker struct BASE_EXPORT UuidHash { 107*6777b538SAndroid Build Coastguard Worker size_t operator()(const Uuid& uuid) const; 108*6777b538SAndroid Build Coastguard Worker }; 109*6777b538SAndroid Build Coastguard Worker 110*6777b538SAndroid Build Coastguard Worker // Stream operator so Uuid objects can be used in logging statements. 111*6777b538SAndroid Build Coastguard Worker BASE_EXPORT std::ostream& operator<<(std::ostream& out, const Uuid& uuid); 112*6777b538SAndroid Build Coastguard Worker 113*6777b538SAndroid Build Coastguard Worker } // namespace base 114*6777b538SAndroid Build Coastguard Worker 115*6777b538SAndroid Build Coastguard Worker #endif // BASE_UUID_H_ 116