public static XECPublicKey extractX25519PublicKey(XECPrivateKey privateKey) {
        byte[] privScalar = toRawX25519PrivateKeyBytes(privateKey);
        byte[] pubPoint = new byte[X25519.POINT_SIZE];
        X25519.generatePublicKey(privScalar, 0, pubPoint, 0); // scalarMultBase => public key point
        return fromRawX25519PublicKey(pubPoint);
    }
@Test
    void can_extract_public_key_from_x25519_private_key() {
        var priv = xecPrivFromHex("77076d0a7318a57d3c16c17251b26645df4c2f87ebc0992ab177fba51db92c2a");
        var expectedPubHex = "8520f0098930a754748b7ddcb43ef75a0dbf3a0d26381af4eba4a98eaa9b4e6a";
        var pub = KeyUtils.extractX25519PublicKey(priv);
        assertEquals(expectedPubHex, xecHexFromPub(pub));

        priv = xecPrivFromHex("5dab087e624a8a4b79e17f8b83800ee66f3bb1292618b6fd1c2f8b27ff88e0eb");
        expectedPubHex = "de9edb7d7b7dc1b4d35b61c2ece435373f8343c85b78674dadfc7e146f882b4f";
        pub = KeyUtils.extractX25519PublicKey(priv);
        assertEquals(expectedPubHex, xecHexFromPub(pub));
    }