| package org.mariadb.jdbc.plugin.authentication.standard.ed25519.spec; |
| |
| import java.util.HashMap; |
| import java.util.Locale; |
| import org.mariadb.jdbc.plugin.authentication.standard.ed25519.Utils; |
| import org.mariadb.jdbc.plugin.authentication.standard.ed25519.math.Curve; |
| import org.mariadb.jdbc.plugin.authentication.standard.ed25519.math.Field; |
| import org.mariadb.jdbc.plugin.authentication.standard.ed25519.math.ed25519.Ed25519LittleEndianEncoding; |
| import org.mariadb.jdbc.plugin.authentication.standard.ed25519.math.ed25519.Ed25519ScalarOps; |
| |
| /** |
| * The named EdDSA curves. |
| * |
| * @author str4d |
| */ |
| public class EdDSANamedCurveTable { |
| public static final String ED_25519 = "Ed25519"; |
| |
| private static final Field ed25519field = |
| new Field( |
| 256, // b |
| Utils.hexToBytes("edffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff7f"), // q |
| new Ed25519LittleEndianEncoding()); |
| |
| private static final Curve ed25519curve = |
| new Curve( |
| ed25519field, |
| Utils.hexToBytes("a3785913ca4deb75abd841414d0a700098e879777940c78c73fe6f2bee6c0352"), // d |
| ed25519field.fromByteArray( |
| Utils.hexToBytes( |
| "b0a00e4a271beec478e42fad0618432fa7d7fb3d99004d2b0bdfc14f8024832b"))); // I |
| |
| public static final EdDSANamedCurveSpec ED_25519_CURVE_SPEC = |
| new EdDSANamedCurveSpec( |
| ED_25519, |
| ed25519curve, |
| "SHA-512", // H |
| new Ed25519ScalarOps(), // l |
| ed25519curve.createPoint( // B |
| Utils.hexToBytes("5866666666666666666666666666666666666666666666666666666666666666"), |
| true)); // Precompute tables for B |
| |
| private static volatile HashMap<String, EdDSANamedCurveSpec> curves = new HashMap<>(); |
| |
| private static synchronized void putCurve(String name, EdDSANamedCurveSpec curve) { |
| HashMap<String, EdDSANamedCurveSpec> newCurves = new HashMap<>(curves); |
| newCurves.put(name, curve); |
| curves = newCurves; |
| } |
| |
| public static void defineCurve(EdDSANamedCurveSpec curve) { |
| putCurve(curve.getName().toLowerCase(Locale.ENGLISH), curve); |
| } |
| |
| static { |
| // RFC 8032 |
| defineCurve(ED_25519_CURVE_SPEC); |
| } |
| |
| public static EdDSANamedCurveSpec getByName(String name) { |
| return curves.get(name.toLowerCase(Locale.ENGLISH)); |
| } |
| } |