Skip to content

Commit 9150745

Browse files
committed
refactor(common): extract signature size bounds to constants
1 parent 6d5fcce commit 9150745

13 files changed

Lines changed: 36 additions & 24 deletions

File tree

chainbase/src/main/java/org/tron/core/capsule/BlockCapsule.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -186,8 +186,9 @@ public boolean validateSignature(DynamicPropertiesStore dynamicPropertiesStore,
186186
AccountStore accountStore) throws ValidateSignatureException {
187187
try {
188188
ByteString witnessSig = block.getBlockHeader().getWitnessSignature();
189-
if (witnessSig.size() < 65 || (dynamicPropertiesStore.getAllowTvmOsaka() == 1
190-
&& witnessSig.size() != 65)) {
189+
if (witnessSig.size() < ChainConstant.MIN_SIGNATURE_SIZE
190+
|| (dynamicPropertiesStore.getAllowTvmOsaka() == 1
191+
&& witnessSig.size() > ChainConstant.MAX_SIGNATURE_SIZE)) {
191192
throw new ValidateSignatureException(
192193
"Witness signature size is " + witnessSig.size());
193194
}

chainbase/src/main/java/org/tron/core/capsule/TransactionCapsule.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
import org.tron.common.utils.Sha256Hash;
5656
import org.tron.core.actuator.TransactionFactory;
5757
import org.tron.core.config.Parameter;
58+
import org.tron.core.config.Parameter.ChainConstant;
5859
import org.tron.core.db.TransactionContext;
5960
import org.tron.core.db.TransactionTrace;
6061
import org.tron.core.exception.BadItemException;
@@ -242,8 +243,9 @@ public static long checkWeight(Permission permission, List<ByteString> sigs, byt
242243
}
243244
HashMap addMap = new HashMap();
244245
for (ByteString sig : sigs) {
245-
if (sig.size() < 65 || (dynamicPropertiesStore.getAllowTvmOsaka() == 1
246-
&& sig.size() != 65)) {
246+
if (sig.size() < ChainConstant.MIN_SIGNATURE_SIZE
247+
|| (dynamicPropertiesStore.getAllowTvmOsaka() == 1
248+
&& sig.size() > ChainConstant.MAX_SIGNATURE_SIZE)) {
247249
throw new SignatureFormatException("Signature size is " + sig.size());
248250
}
249251
String base64 = TransactionCapsule.getBase64FromByteString(sig);

common/src/main/java/org/tron/core/config/Parameter.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,8 @@ public class ChainConstant {
6969
public static final int MAX_VOTE_NUMBER = 30;
7070
public static final int SOLIDIFIED_THRESHOLD = 70; // 70%
7171
public static final int PRIVATE_KEY_LENGTH = 64;
72+
public static final int MIN_SIGNATURE_SIZE = 65;
73+
public static final int MAX_SIGNATURE_SIZE = 68;
7274
public static final int BLOCK_SIZE = 2_000_000;
7375
public static final long CLOCK_MAX_DELAY = 3600000; // 3600 * 1000 ms
7476
public static final int BLOCK_PRODUCE_TIMEOUT_PERCENT = 50; // 50%

consensus/src/main/java/org/tron/consensus/pbft/message/PbftBaseMessage.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.tron.common.utils.Sha256Hash;
1313
import org.tron.common.utils.StringUtil;
1414
import org.tron.core.capsule.TransactionCapsule;
15+
import org.tron.core.config.Parameter.ChainConstant;
1516
import org.tron.core.exception.P2pException;
1617
import org.tron.core.store.DynamicPropertiesStore;
1718
import org.tron.protos.Protocol.PBFTMessage;
@@ -99,8 +100,9 @@ public DataType getDataType() {
99100
public void analyzeSignature(DynamicPropertiesStore dynamicPropertiesStore)
100101
throws SignatureException {
101102
ByteString signature = getPbftMessage().getSignature();
102-
if (signature.size() < 65 || (dynamicPropertiesStore.getAllowTvmOsaka() == 1
103-
&& signature.size() != 65)) {
103+
if (signature.size() < ChainConstant.MIN_SIGNATURE_SIZE
104+
|| (dynamicPropertiesStore.getAllowTvmOsaka() == 1
105+
&& signature.size() > ChainConstant.MAX_SIGNATURE_SIZE)) {
104106
throw new SignatureException("PBFT signature size is " + signature.size());
105107
}
106108
byte[] hash = Sha256Hash.hash(true, getPbftMessage().getRawData().toByteArray());

framework/src/main/java/org/tron/core/Wallet.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -160,6 +160,7 @@
160160
import org.tron.core.capsule.VotesCapsule;
161161
import org.tron.core.capsule.WitnessCapsule;
162162
import org.tron.core.capsule.utils.MarketUtils;
163+
import org.tron.core.config.Parameter.ChainConstant;
163164
import org.tron.core.config.args.Args;
164165
import org.tron.core.db.BandwidthProcessor;
165166
import org.tron.core.db.BlockIndexStore;
@@ -644,8 +645,9 @@ public TransactionApprovedList getTransactionApprovedList(Transaction trx) {
644645
byte[] hash = Sha256Hash.hash(CommonParameter
645646
.getInstance().isECKeyCryptoEngine(), trx.getRawData().toByteArray());
646647
for (ByteString sig : trx.getSignatureList()) {
647-
if (sig.size() < 65 || (chainBaseManager.getDynamicPropertiesStore()
648-
.getAllowTvmOsaka() == 1 && sig.size() != 65)) {
648+
if (sig.size() < ChainConstant.MIN_SIGNATURE_SIZE
649+
|| (chainBaseManager.getDynamicPropertiesStore().getAllowTvmOsaka() == 1
650+
&& sig.size() > ChainConstant.MAX_SIGNATURE_SIZE)) {
649651
throw new SignatureFormatException(
650652
"Signature size is " + sig.size());
651653
}

framework/src/main/java/org/tron/core/net/messagehandler/PbftDataSyncHandler.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
import org.tron.core.ChainBaseManager;
2727
import org.tron.core.capsule.BlockCapsule;
2828
import org.tron.core.capsule.TransactionCapsule;
29+
import org.tron.core.config.Parameter.ChainConstant;
2930
import org.tron.core.db.PbftSignDataStore;
3031
import org.tron.core.exception.P2pException;
3132
import org.tron.core.net.message.TronMessage;
@@ -173,9 +174,9 @@ private class ValidPbftSignTask implements Callable<Boolean> {
173174
@Override
174175
public Boolean call() throws Exception {
175176
try {
176-
if (sign.size() < 65
177+
if (sign.size() < ChainConstant.MIN_SIGNATURE_SIZE
177178
|| (chainBaseManager.getDynamicPropertiesStore().getAllowTvmOsaka() == 1
178-
&& sign.size() != 65)) {
179+
&& sign.size() > ChainConstant.MAX_SIGNATURE_SIZE)) {
179180
throw new SignatureException("PBFT signature size is " + sign.size());
180181
}
181182
byte[] srAddress = ECKey.signatureToAddress(dataHash,

framework/src/main/java/org/tron/core/net/service/relay/RelayService.java

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@
2424
import org.tron.common.utils.Sha256Hash;
2525
import org.tron.core.ChainBaseManager;
2626
import org.tron.core.capsule.TransactionCapsule;
27+
import org.tron.core.config.Parameter.ChainConstant;
2728
import org.tron.core.config.args.Args;
2829
import org.tron.core.db.Manager;
2930
import org.tron.core.net.TronNetDelegate;
@@ -153,8 +154,9 @@ public boolean checkHelloMessage(HelloMessage message, Channel channel) {
153154
boolean flag;
154155
try {
155156
ByteString signature = msg.getSignature();
156-
if (signature.size() < 65 || (chainBaseManager.getDynamicPropertiesStore()
157-
.getAllowTvmOsaka() == 1 && signature.size() != 65)) {
157+
if (signature.size() < ChainConstant.MIN_SIGNATURE_SIZE
158+
|| (chainBaseManager.getDynamicPropertiesStore().getAllowTvmOsaka() == 1
159+
&& signature.size() > ChainConstant.MAX_SIGNATURE_SIZE)) {
158160
return false;
159161
}
160162
Sha256Hash hash = Sha256Hash.of(CommonParameter

framework/src/test/java/org/tron/core/actuator/utils/TransactionUtilTest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -468,7 +468,7 @@ public void getTransactionSignWeightPaddedSigOsakaRejected() {
468468
.setOwnerAddress(ByteString.copyFrom(owner))
469469
.setToAddress(ByteString.copyFrom(new byte[21]))
470470
.build();
471-
byte[] paddedSig = new byte[66];
471+
byte[] paddedSig = new byte[69];
472472
paddedSig[64] = 27;
473473
Transaction transaction = new TransactionCapsule(
474474
transferContract, ContractType.TransferContract)

framework/src/test/java/org/tron/core/capsule/TransactionCapsuleTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -165,7 +165,7 @@ public void checkWeightShortSigRejected() throws Exception {
165165
public void checkWeightPaddedSigOsakaRejected() throws Exception {
166166
dbManager.getDynamicPropertiesStore().saveAllowTvmOsaka(1);
167167
try {
168-
List<ByteString> sigs = Collections.singletonList(ByteString.copyFrom(new byte[66]));
168+
List<ByteString> sigs = Collections.singletonList(ByteString.copyFrom(new byte[69]));
169169
TransactionCapsule.checkWeight(singleKeyPermission(), sigs, DUMMY_HASH, null,
170170
dbManager.getDynamicPropertiesStore());
171171
} finally {
@@ -176,7 +176,7 @@ public void checkWeightPaddedSigOsakaRejected() throws Exception {
176176
@Test
177177
public void checkWeightPaddedSigPreOsaka() {
178178
dbManager.getDynamicPropertiesStore().saveAllowTvmOsaka(0);
179-
List<ByteString> sigs = Collections.singletonList(ByteString.copyFrom(new byte[66]));
179+
List<ByteString> sigs = Collections.singletonList(ByteString.copyFrom(new byte[69]));
180180
try {
181181
TransactionCapsule.checkWeight(singleKeyPermission(), sigs, DUMMY_HASH, null,
182182
dbManager.getDynamicPropertiesStore());

framework/src/test/java/org/tron/core/db/TransactionExpireTest.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -207,19 +207,19 @@ public void testApprovedListPaddedSigOsakaRejected() {
207207
new TransactionCapsule(transferContract, ContractType.TransferContract);
208208
capsule.sign(ByteArray.fromHexString(Args.getLocalWitnesses().getPrivateKey()));
209209

210-
// Replace the valid 65-byte sig with a 66-byte padded one
210+
// Replace the valid 65-byte sig with a 69-byte over-padded one (exceeds MAX_SIGNATURE_SIZE=68)
211211
byte[] sig65 = capsule.getInstance().getSignature(0).toByteArray();
212-
byte[] sig66 = Arrays.copyOf(sig65, 66); // extra zero byte appended
212+
byte[] sig69 = Arrays.copyOf(sig65, 69);
213213
Transaction tx = capsule.getInstance().toBuilder()
214-
.clearSignature().addSignature(ByteString.copyFrom(sig66)).build();
214+
.clearSignature().addSignature(ByteString.copyFrom(sig69)).build();
215215

216216
dbManager.getDynamicPropertiesStore().saveAllowTvmOsaka(1);
217217
try {
218218
TransactionApprovedList result = wallet.getTransactionApprovedList(tx);
219-
Assert.assertEquals("Padded sig must be rejected post-Osaka",
219+
Assert.assertEquals("Over-padded sig must be rejected post-Osaka",
220220
TransactionApprovedList.Result.response_code.SIGNATURE_FORMAT_ERROR,
221221
result.getResult().getCode());
222-
Assert.assertTrue(result.getResult().getMessage().contains("66"));
222+
Assert.assertTrue(result.getResult().getMessage().contains("69"));
223223
} finally {
224224
dbManager.getDynamicPropertiesStore().saveAllowTvmOsaka(0);
225225
}

0 commit comments

Comments
 (0)