mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-11-14 19:38:06 +00:00
Merge branch 'master' of github.com:kmels/bitcoinj
This commit is contained in:
@@ -156,7 +156,7 @@
|
||||
<urn>com.google.protobuf:protobuf-java:2.5.0:jar:null:compile:a10732c76bfacdbd633a7eb0f7968b1059a65dfa</urn>
|
||||
<urn>com.h2database:h2:1.3.167:jar:null:compile:d3867d586f087e53eb12fc65e5693d8ee9a5da17</urn>
|
||||
<urn>com.lambdaworks:scrypt:1.4.0:jar:null:compile:906506b74f30c8c20bccd9ed4a11112d8941fe87</urn>
|
||||
<urn>com.madgag.spongycastle:core:1.50.0.0:jar:null:compile:13e93b00ec9790315debd61fa25ab6a47d3a1c52</urn>
|
||||
<urn>com.madgag.spongycastle:core:1.51.0.0:jar:null:compile:0f642963312ea0e615ad65f28adc5a5b3a2a0862</urn>
|
||||
<urn>net.jcip:jcip-annotations:1.0:jar:null:compile:afba4942caaeaf46aab0b976afd57cc7c181467e</urn>
|
||||
<urn>org.slf4j:slf4j-api:1.7.6:jar:null:compile:562424e36df3d2327e8e9301a76027fca17d54ea</urn>
|
||||
<urn>org.slf4j:slf4j-jdk14:1.7.6:jar:null:runtime:1a3301a32ea7d90c3d33e9d60edbfdc9589fc748</urn>
|
||||
@@ -245,7 +245,7 @@
|
||||
<dependency>
|
||||
<groupId>com.madgag.spongycastle</groupId>
|
||||
<artifactId>core</artifactId>
|
||||
<version>1.50.0.0</version>
|
||||
<version>1.51.0.0</version>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>com.google.protobuf</groupId>
|
||||
|
||||
@@ -27,18 +27,19 @@ import org.bitcoinj.wallet.Protos;
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
import org.spongycastle.asn1.*;
|
||||
import org.spongycastle.asn1.sec.SECNamedCurves;
|
||||
import org.spongycastle.asn1.x9.X9ECParameters;
|
||||
import org.spongycastle.asn1.x9.X9IntegerConverter;
|
||||
import org.spongycastle.crypto.AsymmetricCipherKeyPair;
|
||||
import org.spongycastle.crypto.digests.SHA256Digest;
|
||||
import org.spongycastle.crypto.ec.CustomNamedCurves;
|
||||
import org.spongycastle.crypto.generators.ECKeyPairGenerator;
|
||||
import org.spongycastle.crypto.params.*;
|
||||
import org.spongycastle.crypto.signers.ECDSASigner;
|
||||
import org.spongycastle.crypto.signers.HMacDSAKCalculator;
|
||||
import org.spongycastle.math.ec.ECAlgorithms;
|
||||
import org.spongycastle.math.ec.ECCurve;
|
||||
import org.spongycastle.math.ec.ECPoint;
|
||||
import org.spongycastle.math.ec.FixedPointUtil;
|
||||
import org.spongycastle.math.ec.custom.sec.SecP256K1Curve;
|
||||
import org.spongycastle.util.encoders.Base64;
|
||||
|
||||
import javax.annotation.Nullable;
|
||||
@@ -51,9 +52,7 @@ import java.security.SecureRandom;
|
||||
import java.security.SignatureException;
|
||||
import java.util.Arrays;
|
||||
|
||||
import static com.google.common.base.Preconditions.checkArgument;
|
||||
import static com.google.common.base.Preconditions.checkNotNull;
|
||||
import static com.google.common.base.Preconditions.checkState;
|
||||
import static com.google.common.base.Preconditions.*;
|
||||
|
||||
// TODO: Move this class to tracking compression state itself.
|
||||
// The Bouncy Castle guys are deprecating their own tracking of the compression state.
|
||||
@@ -90,7 +89,7 @@ public class ECKey implements EncryptableItem, Serializable {
|
||||
private static final Logger log = LoggerFactory.getLogger(ECKey.class);
|
||||
|
||||
/** The parameters of the secp256k1 curve that Bitcoin uses. */
|
||||
public static final X9ECParameters CURVE_PARAMS = SECNamedCurves.getByName("secp256k1");
|
||||
public static final X9ECParameters CURVE_PARAMS = CustomNamedCurves.getByName("secp256k1");
|
||||
|
||||
/** The parameters of the secp256k1 curve that Bitcoin uses. */
|
||||
public static final ECDomainParameters CURVE;
|
||||
@@ -105,7 +104,10 @@ public class ECKey implements EncryptableItem, Serializable {
|
||||
private static final long serialVersionUID = -728224901792295832L;
|
||||
|
||||
static {
|
||||
// All clients must agree on the curve to use by agreement. Bitcoin uses secp256k1.
|
||||
// Tell Bouncy Castle to precompute data that's needed during secp256k1 calculations. Increasing the width
|
||||
// number makes calculations faster, but at a cost of extra memory usage and with decreasing returns. 12 was
|
||||
// picked after consulting with the BC team.
|
||||
FixedPointUtil.precompute(CURVE_PARAMS.getG(), 12);
|
||||
CURVE = new ECDomainParameters(CURVE_PARAMS.getCurve(), CURVE_PARAMS.getG(), CURVE_PARAMS.getN(),
|
||||
CURVE_PARAMS.getH());
|
||||
HALF_CURVE_ORDER = CURVE_PARAMS.getN().shiftRight(1);
|
||||
@@ -837,8 +839,7 @@ public class ECKey implements EncryptableItem, Serializable {
|
||||
// do another iteration of Step 1.
|
||||
//
|
||||
// More concisely, what these points mean is to use X as a compressed public key.
|
||||
ECCurve.Fp curve = (ECCurve.Fp) CURVE.getCurve();
|
||||
BigInteger prime = curve.getQ(); // Bouncy Castle is not consistent about the letter it uses for the prime.
|
||||
BigInteger prime = SecP256K1Curve.q;
|
||||
if (x.compareTo(prime) >= 0) {
|
||||
// Cannot have point co-ordinates larger than this as everything takes place modulo Q.
|
||||
return null;
|
||||
@@ -866,7 +867,7 @@ public class ECKey implements EncryptableItem, Serializable {
|
||||
BigInteger rInv = sig.r.modInverse(n);
|
||||
BigInteger srInv = rInv.multiply(sig.s).mod(n);
|
||||
BigInteger eInvrInv = rInv.multiply(eInv).mod(n);
|
||||
ECPoint.Fp q = (ECPoint.Fp) ECAlgorithms.sumOfTwoMultiplies(CURVE.getG(), eInvrInv, R, srInv);
|
||||
ECPoint q = ECAlgorithms.sumOfTwoMultiplies(CURVE.getG(), eInvrInv, R, srInv);
|
||||
return ECKey.fromPublicOnly(q.getEncoded(compressed));
|
||||
}
|
||||
|
||||
|
||||
@@ -459,7 +459,7 @@ public class Script {
|
||||
// for N of M CHECKMULTISIG redeem script we will need N signatures to spend
|
||||
ScriptChunk nChunk = redeemScript.getChunks().get(0);
|
||||
int n = Script.decodeFromOpN(nChunk.opcode);
|
||||
return n * SIG_SIZE + getProgram().length;
|
||||
return n * SIG_SIZE + redeemScript.getProgram().length;
|
||||
} else if (isSentToMultiSig()) {
|
||||
// scriptSig: OP_0 <sig> [sig] [sig...]
|
||||
// for N of M CHECKMULTISIG script we will need N signatures to spend
|
||||
|
||||
Reference in New Issue
Block a user