Skip to content

Basically a first implementation of the chacha20 Poly1305 algorithm #90

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

Open
wants to merge 17 commits into
base: master
Choose a base branch
from

Conversation

mikerabat
Copy link

Hope this works as intendent....

Basically I implemented the base chacha20 algorithm and a poly1305 mode following the GCM mode implementation.
I need to say I did quite some rewriting on the base class (don't be mad...) to have a more leaner interface in the
cipher classes.

In addtion I rewrote the GCM part such that it works on streams too - multiple encode/decode calls are now allowed.
This was a rewrite of bug #87 based on the new base authenticator class.

I did not rewrite teh CCM stuff - simply I didn't knew how...

There are also SSE, AVX version of the chacha algorithm so I hope I managed to put it correctly in there - unfortunately I was not
successfull with a SSE/AVX version of the Poly1305 algorithm, this one is way more complicated that chacha...

Let me know what you think of the code...

MHumm and others added 14 commits April 22, 2025 21:46
Fixed the crash of issue MHumm#86 by changing GCM to use poitners instead ot TBytes and added unit test to verify the change
Same kind of change as already done to EncodeGCM
Changed GCM part of EncodeBytes as well
Added name of the CCM implementation sponsor
* Fixed bugs to get stream functions working - not yet tested
* shrinking base classes to get the extended aead functions working
  (ccm, gcm, poly1305) - not yet tested
Minor: removed debug idx variable.
@mikerabat
Copy link
Author

Added code to implement XChaCha20 as well

@MHumm
Copy link
Owner

MHumm commented Jul 22, 2025

I need to find the time to look at this over the next few weeks. Please be a bit patient! I value your contribution. Thanks for the warning about the changes in the base class. Yes, they need to be evaluated carefully.

Does your code contain unit tests?
If so did you specify the source of the test data? Best would be an official source e.g. from the original developers or from a standards body?

@mikerabat
Copy link
Author

Yes.. at least the two vectors from the original RFC. I found a bunch of test vectors here:
https://github.com/C2SP/wycheproof/blob/main/testvectors/chacha20_poly1305_test.json
do you think it is a good idea to implement them here? I would try to convert them into your own format (if possible).

This commit would also tackle the problems with the encodings - I changed the base class so it could be used in such a way. The chacha and GCM modules are already converted. Let me know what you think of that.

@MHumm
Copy link
Owner

MHumm commented Jul 22, 2025

We should try to have unit tests for as many areas of the library as possible.

@MHumm
Copy link
Owner

MHumm commented Jul 24, 2025

Refering to this one: "do you think it is a good idea to implement them here?"
Would it be possible to check if their collection also contains those or at least some of those test vectors you found from the RFC? That way it should be safe to assume that their vectors really test the same thing etc. and are trustworthy.
Everybody can implement some algorithm and claim it is "algorithm X" and make up test vectors...
But with your tests we would be as safe as we can currently check.

@mikerabat
Copy link
Author

They actually include the RFC test in their test suit. It is even the first test....
The RFC test vector is actually already in my unit test....
I'm wondering ... how do you crreate your test vectors - what sources do you use?

@MHumm
Copy link
Owner

MHumm commented Jul 26, 2025

I try to find original test vectors. Ok, when I took the library over there was some "crude" automatic test program which worked on a text file which contained the test vectors. And there were about a dozend unit tests for some newer date helper functions (from DECUtil). I started to implement unit tests for those test vectors in the text file, without questioning where they came from.

Later on somebody reported a few flaws and fixes for them and that made me start to look for original test vectors for all the hash algorithms. After all those years I couldn't find them for all the hash algorithms but for those where I found them I added them.

For KDF it was like this: the original author had implemented KDF2. At least that's what he had claimed. I found there were no tests yet and found the KDF specification and the test vectors for KDF2 didn't match the results produced by DEC. So I started to investigate and found out, that the original author had implemented KDF1 and KDF2 and 3 are only small deviations from that. The only difference is the order of 2-3 lines of code in their main method.

So I implemented these two as well and added tests from that specification.

=> I try to find the original specification of the algorithm, be it some PDF, an RFC whatever and check if that contains test vectors. Also NIST is sometimes a source for test vectors or other standard bodies.

Does this answer your question?

@mikerabat
Copy link
Author

I see... thanks for the info.
I checked the sources and the test vectors are mainly from:
https://github.com/C2SP/wycheproof
which seems to be a reliable source I guess.

Removed dll reference
Fixed a crucial bug in the poly1305 generation - the ConstTimeCarray32 had wrong brackets applied.
@mikerabat
Copy link
Author

These two last commits include the found test vector - about 300 tests.
I added these in these commits. The tests include some edge cases and also some tests that actually "need" to fail...

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

Successfully merging this pull request may close these issues.

2 participants
pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy