Example usage for org.bouncycastle.crypto.signers ECDSASigner generateSignature

List of usage examples for org.bouncycastle.crypto.signers ECDSASigner generateSignature

Introduction

In this page you can find the example usage for org.bouncycastle.crypto.signers ECDSASigner generateSignature.

Prototype

public BigInteger[] generateSignature(byte[] message) 

Source Link

Document

generate a signature for the given message using the key we were initialised with.

Usage

From source file:co.rsk.peg.BridgeSupportTest.java

License:Open Source License

/**
 * Helper method to test addSignature() with a valid federatorPublicKey parameter and both valid/invalid signatures
 * @param privateKeysToSignWith keys used to sign the tx. Federator key when we want to produce a valid signature, a random key when we want to produce an invalid signature
 * @param numberOfInputsToSign There is just 1 input. 1 when testing the happy case, other values to test attacks/bugs.
 * @param signatureCanonical Signature should be canonical. true when testing the happy case, false to test attacks/bugs.
 * @param signTwice Sign again with the same key
 * @param expectedResult "InvalidParameters", "PartiallySigned" or "FullySigned"
 *//*  w  w  w. j ava 2s.  c  o m*/
private void addSignatureFromValidFederator(List<BtcECKey> privateKeysToSignWith, int numberOfInputsToSign,
        boolean signatureCanonical, boolean signTwice, String expectedResult) throws Exception {
    // Federation is the genesis federation ATM
    Federation federation = bridgeConstants.getGenesisFederation();
    Repository repository = createRepositoryImpl(config);

    final Keccak256 keccak256 = PegTestUtils.createHash3();

    Repository track = repository.startTracking();
    BridgeStorageProvider provider = new BridgeStorageProvider(track, PrecompiledContracts.BRIDGE_ADDR,
            config.getBlockchainConfig().getCommonConstants().getBridgeConstants(),
            bridgeStorageConfigurationAtHeightZero);

    BtcTransaction prevTx = new BtcTransaction(btcParams);
    TransactionOutput prevOut = new TransactionOutput(btcParams, prevTx, Coin.FIFTY_COINS,
            federation.getAddress());
    prevTx.addOutput(prevOut);

    BtcTransaction t = new BtcTransaction(btcParams);
    TransactionOutput output = new TransactionOutput(btcParams, t, Coin.COIN,
            new BtcECKey().toAddress(btcParams));
    t.addOutput(output);
    t.addInput(prevOut).setScriptSig(PegTestUtils.createBaseInputScriptThatSpendsFromTheFederation(federation));
    provider.getRskTxsWaitingForSignatures().put(keccak256, t);
    provider.save();
    track.commit();

    track = repository.startTracking();
    List<LogInfo> logs = new ArrayList<>();
    BridgeEventLogger eventLogger = new BridgeEventLoggerImpl(bridgeConstants, logs);
    BridgeSupport bridgeSupport = new BridgeSupport(config, track, eventLogger, contractAddress,
            mock(Block.class));

    Script inputScript = t.getInputs().get(0).getScriptSig();
    List<ScriptChunk> chunks = inputScript.getChunks();
    byte[] program = chunks.get(chunks.size() - 1).data;
    Script redeemScript = new Script(program);
    Sha256Hash sighash = t.hashForSignature(0, redeemScript, BtcTransaction.SigHash.ALL, false);

    BtcECKey.ECDSASignature sig = privateKeysToSignWith.get(0).sign(sighash);
    if (!signatureCanonical) {
        sig = new BtcECKey.ECDSASignature(sig.r, BtcECKey.CURVE.getN().subtract(sig.s));
    }
    byte[] derEncodedSig = sig.encodeToDER();

    List derEncodedSigs = new ArrayList();
    for (int i = 0; i < numberOfInputsToSign; i++) {
        derEncodedSigs.add(derEncodedSig);
    }
    bridgeSupport.addSignature(findPublicKeySignedBy(federation.getPublicKeys(), privateKeysToSignWith.get(0)),
            derEncodedSigs, keccak256.getBytes());
    if (signTwice) {
        // Create another valid signature with the same private key
        ECDSASigner signer = new ECDSASigner();
        X9ECParameters CURVE_PARAMS = CustomNamedCurves.getByName("secp256k1");
        ECDomainParameters CURVE = new ECDomainParameters(CURVE_PARAMS.getCurve(), CURVE_PARAMS.getG(),
                CURVE_PARAMS.getN(), CURVE_PARAMS.getH());
        ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(privateKeysToSignWith.get(0).getPrivKey(),
                CURVE);
        signer.init(true, privKey);
        BigInteger[] components = signer.generateSignature(sighash.getBytes());
        BtcECKey.ECDSASignature sig2 = new BtcECKey.ECDSASignature(components[0], components[1])
                .toCanonicalised();
        bridgeSupport.addSignature(
                findPublicKeySignedBy(federation.getPublicKeys(), privateKeysToSignWith.get(0)),
                Lists.newArrayList(sig2.encodeToDER()), keccak256.getBytes());
    }
    if (privateKeysToSignWith.size() > 1) {
        BtcECKey.ECDSASignature sig2 = privateKeysToSignWith.get(1).sign(sighash);
        byte[] derEncodedSig2 = sig2.encodeToDER();
        List derEncodedSigs2 = new ArrayList();
        for (int i = 0; i < numberOfInputsToSign; i++) {
            derEncodedSigs2.add(derEncodedSig2);
        }
        bridgeSupport.addSignature(
                findPublicKeySignedBy(federation.getPublicKeys(), privateKeysToSignWith.get(1)),
                derEncodedSigs2, keccak256.getBytes());
    }
    bridgeSupport.save();
    track.commit();

    provider = new BridgeStorageProvider(repository, PrecompiledContracts.BRIDGE_ADDR,
            config.getBlockchainConfig().getCommonConstants().getBridgeConstants(),
            bridgeStorageConfigurationAtHeightZero);

    if ("FullySigned".equals(expectedResult)) {
        Assert.assertTrue(provider.getRskTxsWaitingForSignatures().isEmpty());
        Assert.assertThat(logs, is(not(empty())));
        Assert.assertThat(logs, hasSize(3));
        LogInfo releaseTxEvent = logs.get(2);
        Assert.assertThat(releaseTxEvent.getTopics(), hasSize(1));
        Assert.assertThat(releaseTxEvent.getTopics(), hasItem(Bridge.RELEASE_BTC_TOPIC));
        BtcTransaction releaseTx = new BtcTransaction(bridgeConstants.getBtcParams(),
                ((RLPList) RLP.decode2(releaseTxEvent.getData()).get(0)).get(1).getRLPData());
        Script retrievedScriptSig = releaseTx.getInput(0).getScriptSig();
        Assert.assertEquals(4, retrievedScriptSig.getChunks().size());
        Assert.assertEquals(true, retrievedScriptSig.getChunks().get(1).data.length > 0);
        Assert.assertEquals(true, retrievedScriptSig.getChunks().get(2).data.length > 0);
    } else {
        Script retrievedScriptSig = provider.getRskTxsWaitingForSignatures().get(keccak256).getInput(0)
                .getScriptSig();
        Assert.assertEquals(4, retrievedScriptSig.getChunks().size());
        boolean expectSignatureToBePersisted = false; // for "InvalidParameters"
        if ("PartiallySigned".equals(expectedResult)) {
            expectSignatureToBePersisted = true;
        }
        Assert.assertEquals(expectSignatureToBePersisted,
                retrievedScriptSig.getChunks().get(1).data.length > 0);
        Assert.assertEquals(false, retrievedScriptSig.getChunks().get(2).data.length > 0);
    }
}

From source file:com.aaasec.sigserv.cscommon.xmldsig.XMLSign.java

License:EUPL

public static EcdsaSigValue ecdsaSignDigest(byte[] digest, PrivateKey privKey) {
    try {//  www  .ja v a 2 s .c  om
        ECDSASigner ecdsa = new ECDSASigner();
        CipherParameters param = ECUtil.generatePrivateKeyParameter(privKey);

        ecdsa.init(true, param);
        BigInteger[] signature = ecdsa.generateSignature(digest);
        EcdsaSigValue sigVal = new EcdsaSigValue(signature[0], signature[1]);
        return sigVal;
    } catch (InvalidKeyException ex) {
        Logger.getLogger(XMLSign.class.getName()).log(Level.SEVERE, null, ex);
    }
    return null;
}

From source file:com.bitsofproof.supernode.api.ECKeyPair.java

License:Apache License

@Override
public byte[] sign(byte[] hash) throws ValidationException {
    if (priv == null) {
        throw new ValidationException("Need private key to sign");
    }/*from www  .jav  a2s  . c  o m*/
    ECDSASigner signer = new ECDSASigner();
    signer.init(true, new ECPrivateKeyParameters(priv, domain));
    BigInteger[] signature = signer.generateSignature(hash);
    ByteArrayOutputStream s = new ByteArrayOutputStream();
    try {
        DERSequenceGenerator seq = new DERSequenceGenerator(s);
        seq.addObject(new DERInteger(signature[0]));
        seq.addObject(new DERInteger(signature[1]));
        seq.close();
        return s.toByteArray();
    } catch (IOException e) {
    }
    return null;
}

From source file:com.DSC.crypto.ECDSA.java

License:Open Source License

/**
 * Sign the data, return the signature/*from   w w w . j  av  a 2s. co m*/
 * @param priKey
 * @param data
 * @return
 */
private static BigInteger[] sign(CipherParameters priKey, byte[] data) {
    ECDSASigner ecdsa = new ECDSASigner();
    ecdsa.init(true, priKey);
    return ecdsa.generateSignature(data);
}

From source file:com.facebook.delegatedrecovery.RecoveryToken.java

License:Open Source License

private byte[] getSignature(final byte[] rawArray, final ECPrivateKey privateKey) throws IOException {
    if (this.signature != null) {
        throw new IllegalStateException("This token already has a signature.");
    }/*from  w w  w.ja  v a  2 s. com*/
    final BigInteger privatePoint = privateKey.getS();

    final SHA256Digest digest = new SHA256Digest();
    final byte[] hash = new byte[digest.getByteLength()];
    digest.update(rawArray, 0, rawArray.length);
    digest.doFinal(hash, 0);

    final ECDSASigner signer = new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest()));
    signer.init(true, new ECPrivateKeyParameters(privatePoint, DelegatedRecoveryUtils.P256_DOMAIN_PARAMS));
    final BigInteger[] signature = signer.generateSignature(hash);
    final ByteArrayOutputStream s = new ByteArrayOutputStream();
    final DERSequenceGenerator seq = new DERSequenceGenerator(s);
    seq.addObject(new ASN1Integer(signature[0]));
    seq.addObject(new ASN1Integer(signature[1]));
    seq.close();

    return s.toByteArray();
}

From source file:com.google.bitcoin.core.ECKey.java

License:Apache License

/**
 * Signs the given hash and returns the R and S components as BigIntegers. In the Bitcoin protocol, they are
 * usually encoded using DER format, so you want {@link com.google.bitcoin.core.ECKey.ECDSASignature#encodeToDER()}
 * instead. However sometimes the independent components can be useful, for instance, if you're doing to do further
 * EC maths on them./*from  www.  j  a v  a  2s .  c om*/
 *
 * @param aesKey The AES key to use for decryption of the private key. If null then no decryption is required.
 * @throws KeyCrypterException if this ECKey doesn't have a private part.
 */
public ECDSASignature sign(Sha256Hash input, @Nullable KeyParameter aesKey) throws KeyCrypterException {
    if (FAKE_SIGNATURES)
        return TransactionSignature.dummy();

    // The private key bytes to use for signing.
    BigInteger privateKeyForSigning;

    if (isEncrypted()) {
        // The private key needs decrypting before use.
        if (aesKey == null) {
            throw new KeyCrypterException("This ECKey is encrypted but no decryption key has been supplied.");
        }

        if (keyCrypter == null) {
            throw new KeyCrypterException("There is no KeyCrypter to decrypt the private key for signing.");
        }

        privateKeyForSigning = new BigInteger(1, keyCrypter.decrypt(encryptedPrivateKey, aesKey));
        // Check encryption was correct.
        if (!Arrays.equals(pub, publicKeyFromPrivate(privateKeyForSigning, isCompressed())))
            throw new KeyCrypterException("Could not decrypt bytes");
    } else {
        // No decryption of private key required.
        if (priv == null) {
            throw new KeyCrypterException("This ECKey does not have the private key necessary for signing.");
        } else {
            privateKeyForSigning = priv;
        }
    }

    ECDSASigner signer = new ECDSASigner();
    ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(privateKeyForSigning, CURVE);
    signer.init(true, privKey);
    BigInteger[] components = signer.generateSignature(input.getBytes());
    final ECDSASignature signature = new ECDSASignature(components[0], components[1]);
    signature.ensureCanonical();
    return signature;
}

From source file:COSE.SignCommon.java

byte[] computeSignature(byte[] rgbToBeSigned, CipherParameters key) throws CoseException {
    AlgorithmID alg = AlgorithmID.FromCBOR(findAttribute(HeaderKeys.Algorithm));
    Digest digest;//w  w  w.jav a  2  s . com
    CBORObject cn;
    switch (alg) {
    case ECDSA_256:
        digest = new SHA256Digest();
        break;

    case ECDSA_384:
        digest = new SHA384Digest();
        break;

    case ECDSA_512:
        digest = new SHA512Digest();
        break;

    default:
        throw new CoseException("Unsupported Algorithm Specified");
    }

    switch (alg) {
    case ECDSA_256:
    case ECDSA_384:
    case ECDSA_512: {
        digest.update(rgbToBeSigned, 0, rgbToBeSigned.length);
        byte[] rgbDigest = new byte[digest.getDigestSize()];
        digest.doFinal(rgbDigest, 0);

        ECDSASigner ecdsa = new ECDSASigner(new HMacDSAKCalculator(new SHA256Digest()));
        ecdsa.init(true, key);
        BigInteger[] sig = ecdsa.generateSignature(rgbDigest);

        int cb = (((ECPrivateKeyParameters) key).getParameters().getCurve().getFieldSize() + 7) / 8;
        byte[] r = sig[0].toByteArray();
        byte[] s = sig[1].toByteArray();

        byte[] sigs = new byte[cb * 2];
        int cbR = min(cb, r.length);
        System.arraycopy(r, r.length - cbR, sigs, cb - cbR, cbR);
        cbR = min(cb, s.length);
        System.arraycopy(s, s.length - cbR, sigs, cb + cb - cbR, cbR);

        return sigs;

    }

    default:
        throw new CoseException("Inernal error");
    }
}

From source file:COSE.SignCommon.java

byte[] computeSignature(byte[] rgbToBeSigned, OneKey cnKey) throws CoseException {
    AlgorithmID alg = AlgorithmID.FromCBOR(findAttribute(HeaderKeys.Algorithm));
    Digest digest;/*from  ww w  .ja v a2 s  . c o  m*/
    CBORObject cn;

    switch (alg) {
    case ECDSA_256:
        digest = new SHA256Digest();
        break;

    case ECDSA_384:
        digest = new SHA384Digest();
        break;

    case ECDSA_512:
        digest = new SHA512Digest();
        break;

    default:
        throw new CoseException("Unsupported Algorithm Specified");
    }

    switch (alg) {
    case ECDSA_256:
    case ECDSA_384:
    case ECDSA_512: {
        digest.update(rgbToBeSigned, 0, rgbToBeSigned.length);
        byte[] rgbDigest = new byte[digest.getDigestSize()];
        digest.doFinal(rgbDigest, 0);

        cn = cnKey.get(KeyKeys.KeyType);
        if ((cn == null) || (cn != KeyKeys.KeyType_EC2))
            throw new CoseException("Must use key with key type EC2");
        cn = cnKey.get(KeyKeys.EC2_D);
        if (cn == null)
            throw new CoseException("Private key required to sign");

        X9ECParameters p = cnKey.GetCurve();
        ECDomainParameters parameters = new ECDomainParameters(p.getCurve(), p.getG(), p.getN(), p.getH());
        ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(new BigInteger(1, cn.GetByteString()),
                parameters);

        ECDSASigner ecdsa = new ECDSASigner();
        ecdsa.init(true, privKey);
        BigInteger[] sig = ecdsa.generateSignature(rgbDigest);

        int cb = (p.getCurve().getFieldSize() + 7) / 8;
        byte[] r = sig[0].toByteArray();
        byte[] s = sig[1].toByteArray();

        byte[] sigs = new byte[cb * 2];
        int cbR = min(cb, r.length);
        System.arraycopy(r, r.length - cbR, sigs, cb - cbR, cbR);
        cbR = min(cb, s.length);
        System.arraycopy(s, s.length - cbR, sigs, cb + cb - cbR, cbR);

        return sigs;

    }

    default:
        throw new CoseException("Inernal error");
    }
}

From source file:COSE.Signer.java

static byte[] computeSignature(AlgorithmID alg, byte[] rgbToBeSigned, OneKey cnKey) throws CoseException {
    Digest digest;/*from   ww w .  j a v  a2  s.  c o  m*/
    CBORObject cn;

    switch (alg) {
    case ECDSA_256:
        digest = new SHA256Digest();
        break;

    case ECDSA_384:
        digest = new SHA384Digest();
        break;

    case ECDSA_512:
        digest = new SHA512Digest();
        break;

    default:
        throw new CoseException("Unsupported Algorithm Specified");
    }

    switch (alg) {
    case ECDSA_256:
    case ECDSA_384:
    case ECDSA_512: {
        digest.update(rgbToBeSigned, 0, rgbToBeSigned.length);
        byte[] rgbDigest = new byte[digest.getDigestSize()];
        digest.doFinal(rgbDigest, 0);

        cn = cnKey.get(KeyKeys.KeyType);
        if ((cn == null) || (cn != KeyKeys.KeyType_EC2))
            throw new CoseException("Must use key with key type EC2");
        cn = cnKey.get(KeyKeys.EC2_D);
        if (cn == null)
            throw new CoseException("Private key required to sign");

        X9ECParameters p = cnKey.GetCurve();
        ECDomainParameters parameters = new ECDomainParameters(p.getCurve(), p.getG(), p.getN(), p.getH());
        ECPrivateKeyParameters privKey = new ECPrivateKeyParameters(new BigInteger(1, cn.GetByteString()),
                parameters);

        ECDSASigner ecdsa = new ECDSASigner();
        ecdsa.init(true, privKey);
        BigInteger[] sig = ecdsa.generateSignature(rgbDigest);

        int cb = (p.getCurve().getFieldSize() + 7) / 8;
        byte[] r = sig[0].toByteArray();
        byte[] s = sig[1].toByteArray();

        byte[] sigs = new byte[cb * 2];
        int cbR = min(cb, r.length);
        System.arraycopy(r, r.length - cbR, sigs, cb - cbR, cbR);
        cbR = min(cb, s.length);
        System.arraycopy(s, s.length - cbR, sigs, cb + cb - cbR, cbR);

        return sigs;
    }

    default:
        throw new CoseException("Internal error");
    }
}

From source file:dorkbox.util.crypto.CryptoECC.java

License:Apache License

/**
 * The message will use the bytes AS THE HASHED VALUE to calculate the signature.
 * <p/>//from www  .ja va2  s. co  m
 * The returned signature is the {r,s} signature array.
 */
public static BigInteger[] generateSignatureForHash(ECPrivateKeyParameters privateKey,
        SecureRandom secureRandom, byte[] hashBytes) {

    ParametersWithRandom param = new ParametersWithRandom(privateKey, secureRandom);

    ECDSASigner ecdsa = new ECDSASigner();
    ecdsa.init(true, param);

    return ecdsa.generateSignature(hashBytes);
}