From 2845874d4c6b5e142dc229770b9456d794121194 Mon Sep 17 00:00:00 2001 From: Boris Zbarsky Date: Tue, 8 Aug 2023 22:12:21 -0400 Subject: [PATCH] Add an attestation challenge to MTROperationalCredentialsClusterAttestationResponseParams. (#28586) Not public API, for now, but is needed to make sense of the data returned by this response command. --- .../Framework/CHIP/MTRCallbackBridgeBase.h | 37 ++++++++++- .../MTRCommandPayloads_Internal.zapt | 4 ++ .../templates/partials/MTRCallbackBridge.zapt | 1 + .../CHIP/zap-generated/MTRCallbackBridge.mm | 63 +++++++++++++++++++ .../MTRCommandPayloads_Internal.h | 4 ++ 5 files changed, 108 insertions(+), 1 deletion(-) diff --git a/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h b/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h index da8772f2464ace..9f2f6170327b94 100644 --- a/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h +++ b/src/darwin/Framework/CHIP/MTRCallbackBridgeBase.h @@ -20,13 +20,18 @@ #import "MTRBaseDevice_Internal.h" #import "MTRDeviceController_Internal.h" #import "MTRError_Internal.h" +#import "NSDataSpanConversion.h" #import "zap-generated/MTRBaseClusters.h" +#import "zap-generated/MTRCommandPayloads_Internal.h" +#include #include #include #include #include +#include + NS_ASSUME_NONNULL_BEGIN /** @@ -147,7 +152,23 @@ using MTRActionBlockT = CHIP_ERROR (^)(chip::Messaging::ExchangeManager & exchan template using MTRLocalActionBlockT = CHIP_ERROR (^)(SuccessCallback successCb, MTRErrorCallback failureCb); -template class MTRCallbackBridge : public MTRCallbackBridgeBase { +class NoAttestationChallenge { +}; + +class HaveAttestationChallenge { +protected: + NSData * mAttestationChallenge; +}; + +namespace detail { +using AttestationResponseCallback + = void (*)(void *, const chip::app::Clusters::OperationalCredentials::Commands::AttestationResponse::DecodableType &); +} // namespace detail + +template +class MTRCallbackBridge : public MTRCallbackBridgeBase, + protected std::conditional, + HaveAttestationChallenge, NoAttestationChallenge>::type { public: using MTRActionBlock = MTRActionBlockT; using MTRLocalActionBlock = MTRLocalActionBlockT; @@ -232,6 +253,10 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { return; } + if constexpr (HaveAttestationChallenge()) { + this->mAttestationChallenge = AsData(session.Value()->AsSecureSession()->GetCryptoContext().GetAttestationChallenge()); + } + CHIP_ERROR err = action(*exchangeManager, session.Value(), mSuccess, mFailure, this); if (err != CHIP_NO_ERROR) { ChipLogError(Controller, "Failure performing action. C++-mangled success callback type: '%s', error: %s", @@ -252,7 +277,17 @@ template class MTRCallbackBridge : public MTRCallbackBridgeBase { static void DispatchFailure(void * context, NSError * error) { DispatchCallbackResult(context, error, nil); } + template static void SetAttestationChallengeIfNeeded(void * context, ResponseType * _Nonnull response) + { + if constexpr (HaveAttestationChallenge()) { + auto * self = static_cast(context); + response.attestationChallenge = self->mAttestationChallenge; + } + } + private: + static constexpr bool HaveAttestationChallenge() { return std::is_same_v; } + static void DispatchCallbackResult(void * context, NSError * _Nullable error, id _Nullable value) { MTRCallbackBridge * callbackBridge = static_cast(context); diff --git a/src/darwin/Framework/CHIP/templates/MTRCommandPayloads_Internal.zapt b/src/darwin/Framework/CHIP/templates/MTRCommandPayloads_Internal.zapt index 84fb84e238c07f..b17994a5da6502 100644 --- a/src/darwin/Framework/CHIP/templates/MTRCommandPayloads_Internal.zapt +++ b/src/darwin/Framework/CHIP/templates/MTRCommandPayloads_Internal.zapt @@ -6,6 +6,10 @@ NS_ASSUME_NONNULL_BEGIN +@interface MTROperationalCredentialsClusterAttestationResponseParams () +@property (nonatomic, strong) NSData * attestationChallenge; +@end + {{#zcl_clusters}} {{#zcl_commands}} {{! We only need to generate conversion functions for the server-generated commands }} diff --git a/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt b/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt index d24776d1ae5059..aea117477b3bb8 100644 --- a/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt +++ b/src/darwin/Framework/CHIP/templates/partials/MTRCallbackBridge.zapt @@ -83,6 +83,7 @@ void MTR{{> @partial-block}}Bridge::OnSuccessFn(void * context OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); {{else if (isStrEqual partial-type "CommandStatus")}} DispatchSuccess(context, nil); diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm index c6806421244642..7c1c7daec4dc44 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCallbackBridge.mm @@ -19617,6 +19617,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19629,6 +19630,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19641,6 +19643,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19653,6 +19656,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19665,6 +19669,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19677,6 +19682,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19689,6 +19695,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19701,6 +19708,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19713,6 +19721,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19725,6 +19734,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19737,6 +19747,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19749,6 +19760,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19761,6 +19773,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19773,6 +19786,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19785,6 +19799,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19797,6 +19812,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19809,6 +19825,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19821,6 +19838,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19833,6 +19851,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19845,6 +19864,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19857,6 +19877,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19869,6 +19890,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19881,6 +19903,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19893,6 +19916,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19905,6 +19929,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19917,6 +19942,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19929,6 +19955,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19941,6 +19968,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19953,6 +19981,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19965,6 +19994,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19977,6 +20007,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -19990,6 +20021,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20002,6 +20034,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20014,6 +20047,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20026,6 +20060,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20038,6 +20073,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20050,6 +20086,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20062,6 +20099,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20074,6 +20112,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20086,6 +20125,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20098,6 +20138,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20110,6 +20151,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20122,6 +20164,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20134,6 +20177,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20146,6 +20190,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20158,6 +20203,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20170,6 +20216,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20182,6 +20229,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20194,6 +20242,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20206,6 +20255,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20218,6 +20268,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20230,6 +20281,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20242,6 +20294,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20254,6 +20307,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20266,6 +20320,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20278,6 +20333,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20290,6 +20346,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20302,6 +20359,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20314,6 +20372,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20326,6 +20385,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20338,6 +20398,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20350,6 +20411,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; @@ -20362,6 +20424,7 @@ OnFailureFn(context, err); return; } + SetAttestationChallengeIfNeeded(context, response); DispatchSuccess(context, response); }; diff --git a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h index 18639dbed88eb0..16acf214e7f7b8 100644 --- a/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h +++ b/src/darwin/Framework/CHIP/zap-generated/MTRCommandPayloads_Internal.h @@ -21,6 +21,10 @@ NS_ASSUME_NONNULL_BEGIN +@interface MTROperationalCredentialsClusterAttestationResponseParams () +@property (nonatomic, strong) NSData * attestationChallenge; +@end + @interface MTRGroupsClusterAddGroupResponseParams (InternalMethods) - (CHIP_ERROR)_setFieldsFromDecodableStruct: