Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Blake2b hashing #60

Open
schott12521 opened this issue May 7, 2018 · 2 comments
Open

Blake2b hashing #60

schott12521 opened this issue May 7, 2018 · 2 comments

Comments

@schott12521
Copy link

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
Copy link
Author

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:

  • Blake2bProvider, which was similar to EdDSASecurityProvider, except that it added this line to the map:
    put("MessageDigest.Blake2b", "com.package.name.Blake2bMessageDigest")
  • Blake2bMessageDigest, which was basically a MessageDigest wrapper for Blake2b
  • Ed25519Blake2bCurveSpec, which extended EdDSANamedCurveTable, and defined the hashing algorithm to be Blake2b where everything else was the same as a normal Ed25519CurveSpec

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
Copy link

rotilho commented May 9, 2018

Based in @schott12521 implementation I wrote this.

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

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants