@@ -337,6 +337,91 @@ public void testDuplicateTransactionRejected() throws Exception {
337337 }
338338 }
339339
340+ @ Test
341+ public void testInvalidSigLength () throws Exception {
342+ TransactionsMsgHandler handler = new TransactionsMsgHandler ();
343+ handler .init ();
344+ try {
345+ PeerConnection peer = Mockito .mock (PeerConnection .class );
346+
347+ BalanceContract .TransferContract transferContract = BalanceContract .TransferContract
348+ .newBuilder ()
349+ .setAmount (10 )
350+ .setOwnerAddress (ByteString .copyFrom (ByteArray .fromHexString ("121212a9cf" )))
351+ .setToAddress (ByteString .copyFrom (ByteArray .fromHexString ("232323a9cf" )))
352+ .build ();
353+
354+ // signature shorter than 65 bytes → BAD_TRX
355+ Protocol .Transaction shortSigTrx = Protocol .Transaction .newBuilder ()
356+ .setRawData (Protocol .Transaction .raw .newBuilder ()
357+ .addContract (Protocol .Transaction .Contract .newBuilder ()
358+ .setType (Protocol .Transaction .Contract .ContractType .TransferContract )
359+ .setParameter (Any .pack (transferContract )).build ())
360+ .build ())
361+ .addSignature (ByteString .copyFrom (new byte [64 ]))
362+ .build ();
363+
364+ List <Protocol .Transaction > shortList = new ArrayList <>();
365+ shortList .add (shortSigTrx );
366+ stubAdvInvRequest (peer , new TransactionsMessage (shortList ));
367+ P2pException shortEx = Assert .assertThrows (P2pException .class ,
368+ () -> handler .processMessage (peer , new TransactionsMessage (shortList )));
369+ Assert .assertEquals (TypeEnum .BAD_TRX , shortEx .getType ());
370+
371+ // signature longer than 68 bytes → BAD_TRX
372+ Protocol .Transaction longSigTrx = Protocol .Transaction .newBuilder ()
373+ .setRawData (Protocol .Transaction .raw .newBuilder ()
374+ .setRefBlockNum (1 )
375+ .addContract (Protocol .Transaction .Contract .newBuilder ()
376+ .setType (Protocol .Transaction .Contract .ContractType .TransferContract )
377+ .setParameter (Any .pack (transferContract )).build ())
378+ .build ())
379+ .addSignature (ByteString .copyFrom (new byte [69 ]))
380+ .build ();
381+
382+ List <Protocol .Transaction > longList = new ArrayList <>();
383+ longList .add (longSigTrx );
384+ stubAdvInvRequest (peer , new TransactionsMessage (longList ));
385+ P2pException longEx = Assert .assertThrows (P2pException .class ,
386+ () -> handler .processMessage (peer , new TransactionsMessage (longList )));
387+ Assert .assertEquals (TypeEnum .BAD_TRX , longEx .getType ());
388+
389+ // exactly 65 bytes → passes the length check (no P2pException from check)
390+ Protocol .Transaction validSigTrx = Protocol .Transaction .newBuilder ()
391+ .setRawData (Protocol .Transaction .raw .newBuilder ()
392+ .setRefBlockNum (2 )
393+ .addContract (Protocol .Transaction .Contract .newBuilder ()
394+ .setType (Protocol .Transaction .Contract .ContractType .TransferContract )
395+ .setParameter (Any .pack (transferContract )).build ())
396+ .build ())
397+ .addSignature (ByteString .copyFrom (new byte [65 ]))
398+ .build ();
399+
400+ List <Protocol .Transaction > validList = new ArrayList <>();
401+ validList .add (validSigTrx );
402+ stubAdvInvRequest (peer , new TransactionsMessage (validList ));
403+ handler .processMessage (peer , new TransactionsMessage (validList ));
404+
405+ // 68 bytes (upper bound) also passes the length check
406+ Protocol .Transaction paddedSigTrx = Protocol .Transaction .newBuilder ()
407+ .setRawData (Protocol .Transaction .raw .newBuilder ()
408+ .setRefBlockNum (3 )
409+ .addContract (Protocol .Transaction .Contract .newBuilder ()
410+ .setType (Protocol .Transaction .Contract .ContractType .TransferContract )
411+ .setParameter (Any .pack (transferContract )).build ())
412+ .build ())
413+ .addSignature (ByteString .copyFrom (new byte [68 ]))
414+ .build ();
415+
416+ List <Protocol .Transaction > paddedList = new ArrayList <>();
417+ paddedList .add (paddedSigTrx );
418+ stubAdvInvRequest (peer , new TransactionsMessage (paddedList ));
419+ handler .processMessage (peer , new TransactionsMessage (paddedList ));
420+ } finally {
421+ handler .close ();
422+ }
423+ }
424+
340425 @ Test
341426 public void testIsBusyWithCachedTransactions () throws Exception {
342427 TransactionsMsgHandler handler = new TransactionsMsgHandler ();
0 commit comments