@@ -37,16 +37,15 @@ contract SessionManagerTest is SessionTestBase {
3737 emitter = new Emitter ();
3838 }
3939
40- /// @notice Valid explicit session test.
41- function testValidExplicitSessionSignature (
40+ function _prepareTestValidExplicitSessionSignature (
4241 address wallet ,
4342 bytes4 selector ,
4443 uint256 param ,
4544 uint256 value ,
4645 address explicitTarget ,
4746 address explicitTarget2 ,
4847 bool useChainId
49- ) public {
48+ ) public returns ( bytes32 imageHash , Payload.Decoded memory payload , bytes memory encodedSig ) {
5049 vm.assume (explicitTarget != explicitTarget2);
5150 vm.assume (value > 0 );
5251 vm.assume (param > 0 );
@@ -92,7 +91,7 @@ contract SessionManagerTest is SessionTestBase {
9291 // Call 1: call not requiring incrementUsageLimit
9392 // Call 2: call requiring incrementUsageLimit
9493 // Call 0: the required incrementUsageLimit call (self–call)
95- Payload.Decoded memory payload = _buildPayload (3 );
94+ payload = _buildPayload (3 );
9695
9796 // --- Explicit Call 1 ---
9897 payload.calls[1 ] = Payload.Call ({
@@ -141,22 +140,61 @@ contract SessionManagerTest is SessionTestBase {
141140 permissionIdxs[1 ] = 0 ; // Call 1
142141 permissionIdxs[2 ] = 1 ; // Call 2
143142
144- (bytes32 imageHash , bytes memory encodedSig ) =
145- _validExplicitSessionSignature (wallet, payload, sessionPerms, permissionIdxs);
143+ (imageHash, encodedSig) = _validExplicitSessionSignature (wallet, payload, sessionPerms, permissionIdxs);
144+ }
145+
146+ /// @notice Valid explicit session test.
147+ function testValidExplicitSessionSignature (
148+ address wallet ,
149+ bytes4 selector ,
150+ uint256 param ,
151+ uint256 value ,
152+ address explicitTarget ,
153+ address explicitTarget2 ,
154+ bool useChainId
155+ ) public {
156+ (bytes32 imageHash , Payload.Decoded memory payload , bytes memory encodedSig ) =
157+ _prepareTestValidExplicitSessionSignature (
158+ wallet, selector, param, value, explicitTarget, explicitTarget2, useChainId
159+ );
146160
147161 vm.prank (wallet);
148162 bytes32 actualImageHash = sessionManager.recoverSapientSignature (payload, encodedSig);
149163 assertEq (imageHash, actualImageHash);
150164 }
151165
152- /// @notice Valid explicit session test with multiple signers .
153- function testValidExplicitSessionMixing (
166+ /// @notice Valid explicit session test, fails when padding added .
167+ function testValidExplicitSessionSignature_padded_fails (
154168 address wallet ,
155169 bytes4 selector ,
156170 uint256 param ,
171+ uint256 value ,
157172 address explicitTarget ,
158- bool useChainId
173+ address explicitTarget2 ,
174+ bool useChainId ,
175+ bytes memory padding
159176 ) public {
177+ vm.assume (padding.length > 0 );
178+
179+ (bytes32 imageHash , Payload.Decoded memory payload , bytes memory encodedSig ) =
180+ _prepareTestValidExplicitSessionSignature (
181+ wallet, selector, param, value, explicitTarget, explicitTarget2, useChainId
182+ );
183+
184+ bytes memory paddedSignature = abi.encodePacked (encodedSig, padding);
185+
186+ vm.prank (wallet);
187+ vm.expectRevert (abi.encodeWithSelector (SessionErrors.InvalidSignatureLength.selector ));
188+ sessionManager.recoverSapientSignature (payload, paddedSignature);
189+ }
190+
191+ function _prepareTestValidExplicitSessionMixing (
192+ address wallet ,
193+ bytes4 selector ,
194+ uint256 param ,
195+ address explicitTarget ,
196+ bool useChainId
197+ ) internal returns (bytes32 imageHash , Payload.Decoded memory payload , bytes memory encodedSig ) {
160198 Vm.Wallet memory sessionWallet2 = vm.createWallet ("session2 " );
161199 vm.assume (param > 0 );
162200 vm.assume (explicitTarget != wallet);
@@ -225,7 +263,7 @@ contract SessionManagerTest is SessionTestBase {
225263 // Call 1: using session 1 (non cumulative signer)
226264 // Call 2: using session 2 (cumulative signer)
227265 // Call 0: the required incrementUsageLimit call (self–call)
228- Payload.Decoded memory payload = _buildPayload (3 );
266+ payload = _buildPayload (3 );
229267
230268 // --- Explicit Call 1 ---
231269 payload.calls[1 ] = Payload.Call ({
@@ -266,7 +304,7 @@ contract SessionManagerTest is SessionTestBase {
266304 topology = PrimitivesRPC.sessionExplicitAdd (vm, sessionPermsJson, topology);
267305 sessionPermsJson = _sessionPermissionsToJSON (sessionPerms2);
268306 topology = PrimitivesRPC.sessionExplicitAdd (vm, sessionPermsJson, topology);
269- bytes32 imageHash = PrimitivesRPC.sessionImageHash (vm, topology);
307+ imageHash = PrimitivesRPC.sessionImageHash (vm, topology);
270308
271309 string [] memory callSignatures = new string [](3 );
272310 // Sign call 1 with signer 1
@@ -284,14 +322,46 @@ contract SessionManagerTest is SessionTestBase {
284322 explicitSigners[0 ] = sessionWallet.addr;
285323 explicitSigners[1 ] = sessionWallet2.addr;
286324 address [] memory implicitSigners = new address [](0 );
287- bytes memory encodedSig =
325+ encodedSig =
288326 PrimitivesRPC.sessionEncodeCallSignatures (vm, topology, callSignatures, explicitSigners, implicitSigners);
327+ }
328+
329+ /// @notice Valid explicit session test with multiple signers.
330+ function testValidExplicitSessionMixing (
331+ address wallet ,
332+ bytes4 selector ,
333+ uint256 param ,
334+ address explicitTarget ,
335+ bool useChainId
336+ ) public {
337+ (bytes32 imageHash , Payload.Decoded memory payload , bytes memory encodedSig ) =
338+ _prepareTestValidExplicitSessionMixing (wallet, selector, param, explicitTarget, useChainId);
289339
290340 vm.prank (wallet);
291341 bytes32 actualImageHash = sessionManager.recoverSapientSignature (payload, encodedSig);
292342 assertEq (imageHash, actualImageHash);
293343 }
294344
345+ /// @notice Valid explicit session test with multiple signers fails when padding added.
346+ function testValidExplicitSessionMixing_padded_fails (
347+ address wallet ,
348+ bytes4 selector ,
349+ uint256 param ,
350+ address explicitTarget ,
351+ bool useChainId ,
352+ bytes memory padding
353+ ) public {
354+ vm.assume (padding.length > 0 );
355+ (bytes32 imageHash , Payload.Decoded memory payload , bytes memory encodedSig ) =
356+ _prepareTestValidExplicitSessionMixing (wallet, selector, param, explicitTarget, useChainId);
357+
358+ bytes memory paddedSignature = abi.encodePacked (encodedSig, padding);
359+
360+ vm.prank (wallet);
361+ vm.expectRevert (abi.encodeWithSelector (SessionErrors.InvalidSignatureLength.selector ));
362+ sessionManager.recoverSapientSignature (payload, paddedSignature);
363+ }
364+
295365 function testIncrementReentrancy () external {
296366 MockERC20 token = new MockERC20 ();
297367 CanReenter canReenter = new CanReenter ();
0 commit comments