All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.savl.ripple.crypto.ecdsa.EDKeyPair Maven / Gradle / Ivy

There is a newer version: 1.0.2
Show newest version
package com.savl.ripple.crypto.ecdsa;

import com.savl.ripple.encodings.common.B16;
import com.savl.ripple.utils.HashUtils;
import com.savl.ripple.utils.Utils;
import net.i2p.crypto.eddsa.EdDSAEngine;
import net.i2p.crypto.eddsa.EdDSAPrivateKey;
import net.i2p.crypto.eddsa.EdDSAPublicKey;
import net.i2p.crypto.eddsa.spec.EdDSANamedCurveSpec;
import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable;
import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec;
import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.PrivateKey;

public class EDKeyPair implements IKeyPair {

    public final EdDSAPrivateKeySpec keySpec;
    public static final EdDSANamedCurveSpec ed25519 = EdDSANamedCurveTable.getByName("ed25519-sha-512");

    public EDKeyPair(EdDSAPrivateKeySpec keySpec) {
        this.keySpec = keySpec;
    }

    public static EDKeyPair from256Seed(byte[] seedBytes) {
        EdDSAPrivateKeySpec keySpec = new EdDSAPrivateKeySpec(seedBytes,
                                                              ed25519);
        return new EDKeyPair(keySpec);
    }

    public static EDKeyPair from128Seed(byte[] seedBytes) {
        assert seedBytes.length == 16;
        return from256Seed(HashUtils.halfSha512(seedBytes));
    }

    @Override
    public String canonicalPubHex() {
        return B16.toString(canonicalPubBytes());
    }

    @Override
    public BigInteger pub() {
        return Utils.uBigInt(pubBytes_());

    }

    private byte[] pubBytes_() {
        return keySpec.getA().toByteArray();
    }

    @Override
    public String privHex() {
        return B16.toString(keySpec.geta());
    }

    @Override
    public BigInteger priv() {
        return Utils.uBigInt(keySpec.geta());
    }

    @Override
    public boolean verifySignature(byte[] message, byte[] sigBytes) {
        try {
            EdDSAEngine sgr = new EdDSAEngine(MessageDigest.getInstance("SHA-512"));
            sgr.initVerify(new EdDSAPublicKey(new EdDSAPublicKeySpec(keySpec.getA(), ed25519)));
            sgr.update(message);
            return sgr.verify(sigBytes);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public byte[] signMessage(byte[] message) {
        try {
            EdDSAEngine sgr = new EdDSAEngine(MessageDigest.getInstance("SHA-512"));
            PrivateKey sKey = new EdDSAPrivateKey(keySpec);
            sgr.initSign(sKey);
            sgr.update(message);
            return sgr.sign();
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public byte[] canonicalPubBytes() {
        byte[] pub = new byte[33];
        pub[0] = (byte) 0xed;
        System.arraycopy(this.pubBytes_(), 0, pub, 1, 32);
        return pub;
    }

    @Override
    public byte[] pub160Hash() {
        return HashUtils.SHA256_RIPEMD160(canonicalPubBytes());
    }

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy