summaryrefslogtreecommitdiff
path: root/chromium/device/fido/cbor_extract.h
diff options
context:
space:
mode:
Diffstat (limited to 'chromium/device/fido/cbor_extract.h')
-rw-r--r--chromium/device/fido/cbor_extract.h57
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,