diff options
Diffstat (limited to 'chromium/device/fido/cbor_extract.h')
-rw-r--r-- | chromium/device/fido/cbor_extract.h | 57 |
1 files changed, 52 insertions, 5 deletions
diff --git a/chromium/device/fido/cbor_extract.h b/chromium/device/fido/cbor_extract.h index c24f8310533..5a99ac6d0c9 100644 --- a/chromium/device/fido/cbor_extract.h +++ b/chromium/device/fido/cbor_extract.h @@ -8,6 +8,7 @@ #include "base/callback_forward.h" #include "base/component_export.h" #include "base/containers/span.h" +#include "base/memory/checked_ptr.h" #include "components/cbor/values.h" namespace device { @@ -51,8 +52,8 @@ namespace cbor_extract { // Output values are also pointers into the input cbor::Value, so that cannot // be destroyed until processing is complete. // -// Keys for the element are either specified by IntKey<S>(x), where x < 255, or -// StringKey<S>() followed by a NUL-terminated string: +// Keys for the element are either specified by IntKey<S>(x), where -128 <= x < +// 127, or StringKey<S>() followed by a NUL-terminated string: // // static constexpr StepOrByte<MyObj> kSteps[] = { // ELEMENT(Is::kRequired, MyObj, value), @@ -124,7 +125,7 @@ template <typename S> struct StepOrByte { // STRING_KEY is the magic value of |u8| that indicates that this is not an // integer key, but the a NUL-terminated string follows. - static constexpr uint8_t STRING_KEY = 255; + static constexpr uint8_t STRING_KEY = 127; constexpr explicit StepOrByte(const internal::Step& in_step) : step(in_step) {} @@ -145,8 +146,10 @@ struct StepOrByte { offsetof(clas, member)) template <typename S> -constexpr StepOrByte<S> IntKey(unsigned key) { - if (key >= 256 || key == StepOrByte<S>::STRING_KEY) { +constexpr StepOrByte<S> IntKey(int key) { + if (key > std::numeric_limits<int8_t>::max() || + key < std::numeric_limits<int8_t>::min() || + key == StepOrByte<S>::STRING_KEY) { // It's a compile-time error if __builtin_unreachable is reachable. __builtin_unreachable(); } @@ -214,6 +217,14 @@ constexpr StepOrByte<S> Element(const Is required, } template <typename S> +constexpr StepOrByte<S> Element( + const Is required, + CheckedPtr<const std::vector<uint8_t>> S::*member, + uintptr_t offset) { + return ElementImpl<S>(required, offset, internal::Type::kBytestring); +} + +template <typename S> constexpr StepOrByte<S> Element(const Is required, const std::string* S::*member, uintptr_t offset) { @@ -222,6 +233,13 @@ constexpr StepOrByte<S> Element(const Is required, template <typename S> constexpr StepOrByte<S> Element(const Is required, + CheckedPtr<const std::string> S::*member, + uintptr_t offset) { + return ElementImpl<S>(required, offset, internal::Type::kString); +} + +template <typename S> +constexpr StepOrByte<S> Element(const Is required, const int64_t* S::*member, uintptr_t offset) { return ElementImpl<S>(required, offset, internal::Type::kInt); @@ -229,12 +247,27 @@ constexpr StepOrByte<S> Element(const Is required, template <typename S> constexpr StepOrByte<S> Element(const Is required, + CheckedPtr<const int64_t> S::*member, + uintptr_t offset) { + return ElementImpl<S>(required, offset, internal::Type::kInt); +} + +template <typename S> +constexpr StepOrByte<S> Element(const Is required, const std::vector<cbor::Value>* S::*member, uintptr_t offset) { return ElementImpl<S>(required, offset, internal::Type::kArray); } template <typename S> +constexpr StepOrByte<S> Element( + const Is required, + CheckedPtr<const std::vector<cbor::Value>> S::*member, + uintptr_t offset) { + return ElementImpl<S>(required, offset, internal::Type::kArray); +} + +template <typename S> constexpr StepOrByte<S> Element(const Is required, const cbor::Value* S::*member, uintptr_t offset) { @@ -243,11 +276,25 @@ constexpr StepOrByte<S> Element(const Is required, template <typename S> constexpr StepOrByte<S> Element(const Is required, + CheckedPtr<const cbor::Value> S::*member, + uintptr_t offset) { + return ElementImpl<S>(required, offset, internal::Type::kValue); +} + +template <typename S> +constexpr StepOrByte<S> Element(const Is required, const bool* S::*member, uintptr_t offset) { return ElementImpl<S>(required, offset, internal::Type::kBoolean); } +template <typename S> +constexpr StepOrByte<S> Element(const Is required, + CheckedPtr<const bool> S::*member, + uintptr_t offset) { + return ElementImpl<S>(required, offset, internal::Type::kBoolean); +} + COMPONENT_EXPORT(DEVICE_FIDO) bool Extract(base::span<const void*> outputs, base::span<const StepOrByte<void>> steps, |