package com.beowulfe.hap.impl.crypto; import java.security.InvalidKeyException; import java.security.MessageDigest; import java.security.NoSuchAlgorithmException; import java.security.Signature; import java.security.SignatureException; import net.i2p.crypto.eddsa.EdDSAEngine; import net.i2p.crypto.eddsa.EdDSAPrivateKey; import net.i2p.crypto.eddsa.EdDSAPublicKey; import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable; import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec; import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec; import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec; public class EdsaSigner { private final EdDSAPublicKey publicKey; private final EdDSAPrivateKey privateKey; public EdsaSigner(byte[] privateKeyBytes) { EdDSAParameterSpec spec = EdDSANamedCurveTable.getByName("ed25519-sha-512"); EdDSAPrivateKeySpec privateKeySpec = new EdDSAPrivateKeySpec(privateKeyBytes, spec); EdDSAPublicKeySpec pubKeySpec = new EdDSAPublicKeySpec(privateKeySpec.getA(), spec); publicKey = new EdDSAPublicKey(pubKeySpec); privateKey = new EdDSAPrivateKey(privateKeySpec); } public byte[] getPublicKey() { return publicKey.getAbyte(); } public byte[] sign(byte[] material) throws NoSuchAlgorithmException, InvalidKeyException, SignatureException { Signature sgr = new EdDSAEngine(MessageDigest.getInstance("SHA-512")); sgr.initSign(privateKey); sgr.update(material); return sgr.sign(); } }