forked from I2P_Developers/i2p.i2p
Added EdDSA support (directly, not using Provider)
This commit is contained in:
@ -505,7 +505,11 @@ public class DSAEngine {
|
||||
if (type == SigType.DSA_SHA1)
|
||||
return altVerifySigSHA1(signature, data, offset, len, verifyingKey);
|
||||
|
||||
java.security.Signature jsig = java.security.Signature.getInstance(type.getAlgorithmName());
|
||||
java.security.Signature jsig;
|
||||
if (type == SigType.EdDSA_SHA512_25519)
|
||||
jsig = new net.i2p.crypto.eddsa.EdDSAEngine(java.security.MessageDigest.getInstance("SHA-512"));
|
||||
else
|
||||
jsig = java.security.Signature.getInstance(type.getAlgorithmName());
|
||||
PublicKey pubKey = SigUtil.toJavaKey(verifyingKey);
|
||||
jsig.initVerify(pubKey);
|
||||
jsig.update(data, offset, len);
|
||||
@ -582,7 +586,11 @@ public class DSAEngine {
|
||||
if (type == SigType.DSA_SHA1)
|
||||
return altSignSHA1(data, offset, len, privateKey);
|
||||
|
||||
java.security.Signature jsig = java.security.Signature.getInstance(type.getAlgorithmName());
|
||||
java.security.Signature jsig;
|
||||
if (type == SigType.EdDSA_SHA512_25519)
|
||||
jsig = new net.i2p.crypto.eddsa.EdDSAEngine(java.security.MessageDigest.getInstance("SHA-512"));
|
||||
else
|
||||
jsig = java.security.Signature.getInstance(type.getAlgorithmName());
|
||||
PrivateKey privKey = SigUtil.toJavaKey(privateKey);
|
||||
jsig.initSign(privKey, _context.random());
|
||||
jsig.update(data, offset, len);
|
||||
|
@ -216,8 +216,11 @@ public class KeyGenerator {
|
||||
public SimpleDataStructure[] generateSigningKeys(SigType type) throws GeneralSecurityException {
|
||||
if (type == SigType.DSA_SHA1)
|
||||
return generateSigningKeys();
|
||||
KeyPairGenerator kpg = KeyPairGenerator.getInstance(type.getBaseAlgorithm().getName());
|
||||
KeyPair kp;
|
||||
if (type == SigType.EdDSA_SHA512_25519) {
|
||||
kp = new net.i2p.crypto.eddsa.KeyPairGenerator().generateKeyPair();
|
||||
} else {
|
||||
KeyPairGenerator kpg = KeyPairGenerator.getInstance(type.getBaseAlgorithm().getName());
|
||||
try {
|
||||
kpg.initialize(type.getParams(), _context.random());
|
||||
kp = kpg.generateKeyPair();
|
||||
@ -252,6 +255,7 @@ public class KeyGenerator {
|
||||
throw new GeneralSecurityException(pname + " KPG for " + type, pe);
|
||||
}
|
||||
}
|
||||
}
|
||||
java.security.PublicKey pubkey = kp.getPublic();
|
||||
java.security.PrivateKey privkey = kp.getPrivate();
|
||||
SimpleDataStructure[] keys = new SimpleDataStructure[2];
|
||||
|
@ -9,6 +9,7 @@ public enum SigAlgo {
|
||||
|
||||
DSA("DSA"),
|
||||
EC("EC"),
|
||||
EdDSA("EdDSA"),
|
||||
RSA("RSA")
|
||||
;
|
||||
|
||||
|
@ -9,6 +9,7 @@ import java.util.HashMap;
|
||||
import java.util.Locale;
|
||||
import java.util.Map;
|
||||
|
||||
import net.i2p.crypto.eddsa.spec.EdDSANamedCurveTable;
|
||||
import net.i2p.data.Hash;
|
||||
import net.i2p.data.SimpleDataStructure;
|
||||
|
||||
@ -47,7 +48,8 @@ public enum SigType {
|
||||
|
||||
// TESTING....................
|
||||
|
||||
|
||||
/** Pubkey 32 bytes; privkey 32 bytes; hash 64 bytes; sig 64 bytes; */
|
||||
EdDSA_SHA512_25519(7, 32, 32, 64, 64, SigAlgo.EdDSA, "SHA-512", "SHA512withEdDSA", EdDSANamedCurveTable.getByName("ed25519"));
|
||||
|
||||
// others..........
|
||||
|
||||
|
@ -5,7 +5,6 @@ import java.io.File;
|
||||
import java.io.FileInputStream;
|
||||
import java.io.InputStream;
|
||||
import java.io.IOException;
|
||||
|
||||
import java.math.BigInteger;
|
||||
import java.security.GeneralSecurityException;
|
||||
import java.security.InvalidKeyException;
|
||||
@ -33,6 +32,11 @@ import java.security.spec.RSAPublicKeySpec;
|
||||
import java.security.spec.X509EncodedKeySpec;
|
||||
import java.util.Map;
|
||||
|
||||
import net.i2p.crypto.eddsa.EdDSAPrivateKey;
|
||||
import net.i2p.crypto.eddsa.EdDSAPublicKey;
|
||||
import net.i2p.crypto.eddsa.spec.EdDSAParameterSpec;
|
||||
import net.i2p.crypto.eddsa.spec.EdDSAPrivateKeySpec;
|
||||
import net.i2p.crypto.eddsa.spec.EdDSAPublicKeySpec;
|
||||
import net.i2p.data.Signature;
|
||||
import net.i2p.data.SigningPrivateKey;
|
||||
import net.i2p.data.SigningPublicKey;
|
||||
@ -62,6 +66,8 @@ public class SigUtil {
|
||||
return toJavaDSAKey(pk);
|
||||
case EC:
|
||||
return toJavaECKey(pk);
|
||||
case EdDSA:
|
||||
return toJavaEdDSAKey(pk);
|
||||
case RSA:
|
||||
return toJavaRSAKey(pk);
|
||||
default:
|
||||
@ -79,6 +85,8 @@ public class SigUtil {
|
||||
return toJavaDSAKey(pk);
|
||||
case EC:
|
||||
return toJavaECKey(pk);
|
||||
case EdDSA:
|
||||
return toJavaEdDSAKey(pk);
|
||||
case RSA:
|
||||
return toJavaRSAKey(pk);
|
||||
default:
|
||||
@ -96,6 +104,8 @@ public class SigUtil {
|
||||
return fromJavaKey((DSAPublicKey) pk);
|
||||
case EC:
|
||||
return fromJavaKey((ECPublicKey) pk, type);
|
||||
case EdDSA:
|
||||
return fromJavaKey((EdDSAPublicKey) pk, type);
|
||||
case RSA:
|
||||
return fromJavaKey((RSAPublicKey) pk, type);
|
||||
default:
|
||||
@ -113,6 +123,8 @@ public class SigUtil {
|
||||
return fromJavaKey((DSAPrivateKey) pk);
|
||||
case EC:
|
||||
return fromJavaKey((ECPrivateKey) pk, type);
|
||||
case EdDSA:
|
||||
return fromJavaKey((EdDSAPrivateKey) pk, type);
|
||||
case RSA:
|
||||
return fromJavaKey((RSAPrivateKey) pk, type);
|
||||
default:
|
||||
@ -196,6 +208,34 @@ public class SigUtil {
|
||||
return new SigningPrivateKey(type, bs);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return JAVA EdDSA public key!
|
||||
*/
|
||||
public static EdDSAPublicKey toJavaEdDSAKey(SigningPublicKey pk)
|
||||
throws GeneralSecurityException {
|
||||
return new EdDSAPublicKey(new EdDSAPublicKeySpec(
|
||||
pk.getData(), (EdDSAParameterSpec) pk.getType().getParams()));
|
||||
}
|
||||
|
||||
/**
|
||||
* @return JAVA EdDSA private key!
|
||||
*/
|
||||
public static EdDSAPrivateKey toJavaEdDSAKey(SigningPrivateKey pk)
|
||||
throws GeneralSecurityException {
|
||||
return new EdDSAPrivateKey(new EdDSAPrivateKeySpec(
|
||||
pk.getData(), (EdDSAParameterSpec) pk.getType().getParams()));
|
||||
}
|
||||
|
||||
public static SigningPublicKey fromJavaKey(EdDSAPublicKey pk, SigType type)
|
||||
throws GeneralSecurityException {
|
||||
return new SigningPublicKey(type, pk.getAbyte());
|
||||
}
|
||||
|
||||
public static SigningPrivateKey fromJavaKey(EdDSAPrivateKey pk, SigType type)
|
||||
throws GeneralSecurityException {
|
||||
return new SigningPrivateKey(type, pk.getSeed());
|
||||
}
|
||||
|
||||
public static DSAPublicKey toJavaDSAKey(SigningPublicKey pk)
|
||||
throws GeneralSecurityException {
|
||||
KeyFactory kf = KeyFactory.getInstance("DSA");
|
||||
@ -290,8 +330,8 @@ public class SigUtil {
|
||||
* @return ASN.1 representation
|
||||
*/
|
||||
public static byte[] toJavaSig(Signature sig) {
|
||||
// RSA sigs are not ASN encoded
|
||||
if (sig.getType().getBaseAlgorithm() == SigAlgo.RSA)
|
||||
// RSA and EdDSA sigs are not ASN encoded
|
||||
if (sig.getType().getBaseAlgorithm() == SigAlgo.RSA || sig.getType().getBaseAlgorithm() == SigAlgo.EdDSA)
|
||||
return sig.getData();
|
||||
return sigBytesToASN1(sig.getData());
|
||||
}
|
||||
@ -302,8 +342,8 @@ public class SigUtil {
|
||||
*/
|
||||
public static Signature fromJavaSig(byte[] asn, SigType type)
|
||||
throws SignatureException {
|
||||
// RSA sigs are not ASN encoded
|
||||
if (type.getBaseAlgorithm() == SigAlgo.RSA)
|
||||
// RSA and EdDSA sigs are not ASN encoded
|
||||
if (type.getBaseAlgorithm() == SigAlgo.RSA || type.getBaseAlgorithm() == SigAlgo.EdDSA)
|
||||
return new Signature(type, asn);
|
||||
return new Signature(type, aSN1ToSigBytes(asn, type.getSigLen()));
|
||||
}
|
||||
|
@ -33,5 +33,10 @@ public final class I2PProvider extends Provider {
|
||||
//put("Mac.HmacMD5-I2P", "net.i2p.crypto.provider.MacSpi");
|
||||
put("MessageDigest.SHA-1", "net.i2p.crypto.SHA1");
|
||||
//put("Signature.SHA1withDSA", "net.i2p.crypto.provider.SignatureSpi");
|
||||
|
||||
// EdDSA
|
||||
put("KeyFactory.EdDSA", "net.i2p.crypto.eddsa.KeyFactory");
|
||||
put("KeyPairGenerator.EdDSA", "net.i2p.crypto.eddsa.KeyPairGenerator");
|
||||
put("Signature.SHA512withEdDSA", "net.i2p.crypto.eddsa.EdDSAEngine");
|
||||
}
|
||||
}
|
||||
|
Reference in New Issue
Block a user