xref: /aosp_15_r20/external/cronet/base/uuid.h (revision 6777b5387eb2ff775bb5750e3f5d96f37fb7352b)
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