forked from Qortal/qortal
Update BouncyCastle Ed25519 to X25519 key conversion shim
This commit is contained in:
parent
5798c69449
commit
843aad4930
@ -14,25 +14,25 @@ import org.bouncycastle.math.ec.rfc8032.Ed25519;
|
|||||||
/** Additions to BouncyCastle providing Ed25519 to X25519 key conversion. */
|
/** Additions to BouncyCastle providing Ed25519 to X25519 key conversion. */
|
||||||
public class BouncyCastle25519 {
|
public class BouncyCastle25519 {
|
||||||
|
|
||||||
private static final Class<?> pointExtClass;
|
private static final Class<?> pointAffineClass;
|
||||||
private static final Constructor<?> pointExtCtor;
|
private static final Constructor<?> pointAffineCtor;
|
||||||
private static final Method decodePointVarMethod;
|
private static final Method decodePointVarMethod;
|
||||||
private static final Field yField;
|
private static final Field yField;
|
||||||
|
|
||||||
static {
|
static {
|
||||||
try {
|
try {
|
||||||
Class<?> ed25519Class = Ed25519.class;
|
Class<?> ed25519Class = Ed25519.class;
|
||||||
pointExtClass = Arrays.stream(ed25519Class.getDeclaredClasses()).filter(clazz -> clazz.getSimpleName().equals("PointExt")).findFirst().get();
|
pointAffineClass = Arrays.stream(ed25519Class.getDeclaredClasses()).filter(clazz -> clazz.getSimpleName().equals("PointAffine")).findFirst().get();
|
||||||
if (pointExtClass == null)
|
if (pointAffineClass == null)
|
||||||
throw new ClassNotFoundException("Can't locate PointExt inner class inside Ed25519");
|
throw new ClassNotFoundException("Can't locate PointExt inner class inside Ed25519");
|
||||||
|
|
||||||
decodePointVarMethod = ed25519Class.getDeclaredMethod("decodePointVar", byte[].class, int.class, boolean.class, pointExtClass);
|
decodePointVarMethod = ed25519Class.getDeclaredMethod("decodePointVar", byte[].class, int.class, boolean.class, pointAffineClass);
|
||||||
decodePointVarMethod.setAccessible(true);
|
decodePointVarMethod.setAccessible(true);
|
||||||
|
|
||||||
pointExtCtor = pointExtClass.getDeclaredConstructors()[0];
|
pointAffineCtor = pointAffineClass.getDeclaredConstructors()[0];
|
||||||
pointExtCtor.setAccessible(true);
|
pointAffineCtor.setAccessible(true);
|
||||||
|
|
||||||
yField = pointExtClass.getDeclaredField("y");
|
yField = pointAffineClass.getDeclaredField("y");
|
||||||
yField.setAccessible(true);
|
yField.setAccessible(true);
|
||||||
} catch (NoSuchMethodException | SecurityException | IllegalArgumentException | NoSuchFieldException | ClassNotFoundException e) {
|
} catch (NoSuchMethodException | SecurityException | IllegalArgumentException | NoSuchFieldException | ClassNotFoundException e) {
|
||||||
throw new RuntimeException("Can't initialize BouncyCastle25519 shim", e);
|
throw new RuntimeException("Can't initialize BouncyCastle25519 shim", e);
|
||||||
@ -41,7 +41,7 @@ public class BouncyCastle25519 {
|
|||||||
|
|
||||||
private static int[] obtainYFromPublicKey(byte[] ed25519PublicKey) {
|
private static int[] obtainYFromPublicKey(byte[] ed25519PublicKey) {
|
||||||
try {
|
try {
|
||||||
Object pA = pointExtCtor.newInstance();
|
Object pA = pointAffineCtor.newInstance();
|
||||||
|
|
||||||
Boolean result = (Boolean) decodePointVarMethod.invoke(null, ed25519PublicKey, 0, true, pA);
|
Boolean result = (Boolean) decodePointVarMethod.invoke(null, ed25519PublicKey, 0, true, pA);
|
||||||
if (result == null || !result)
|
if (result == null || !result)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user