str4d / ed25519-java

Pure Java implementation of EdDSA
Creative Commons Zero v1.0 Universal
220 stars 73 forks source link

Blake2b hashing #60

Open schott12521 opened 6 years ago

schott12521 commented 6 years ago

I was using this library: https://github.com/k3d3/ed25519-java but its using BitIntegers and was very slow. I want to use a Blake2b hash with ED25519 to sign some keys, and I was wondering how I can do this? I'm thinking I make a Blake2b MessageDigest class and then define an EdDsaNamedCurve spec using this hash, correct? Sorry, I could not find any example code doing this.

schott12521 commented 6 years ago

Damn, well that was fun. I was able to get it to work using a variety of documentation ranging from:

Basically, this lead me into realizing what I needed to do in order to get an Ed25519 signing algorithm to play nicely with a Blake2b hashing algorithm. I used alphazero's Java port of Blake2b (here) in order to create a MessageDigest implementation and a Provider, I created three classes:

Once I created all of those, all I had to do was:

val provider = Blake2bProvider()
Security.addProvider(provider)

val blake2bMessageDigest = MessageDigest.getInstance("Blake2b")

val spec = Ed25519Blake2bCurveSpec().ed25519Blake2bCurveSpec
EdDSANamedCurveTable.defineCurve(spec)
val specAfterDefine = EdDSANamedCurveTable.getByName(spec.name)

For reference, I am working a nanocurrency mobile wallet written natively in Java/Kotlin. My work will soon be shared on my github account and I can share more progress / implementation details as I clean up my code. Thanks for the fast EdDSA library to work with!

rotilho commented 6 years ago

Based in @schott12521 implementation I wrote this.

It would be really nice to have a easier way to achieve the same.