Skip to content

Add ECDSA key support (SECP256R1) again #108

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

Merged
merged 28 commits into from
Jan 17, 2025

Conversation

itstheceo
Copy link
Contributor

@itstheceo itstheceo commented Nov 26, 2024

Supersedes #101

Had some difficulties syncing latest on the other PR, because the fork got disconnected from upstream when my organisation did a bulk visibility change across all repositories. Have just done in my personal account, same branch as before but synced with upstream.

Uses BouncyCastle for the provider. Any feedback greatly appreciated. Thanks!

I also have a follow up PR for adding remote signing capabilities, for when the private key is not directly accessible. I'll open that later, once these changes (hopefully) get accepted 🤞 . I understand you have other implementations to coordinate so no rush.

itstheceo and others added 24 commits May 20, 2024 13:44
just want to get plumbed in and existing tests passing
…cuit#4)

This implements 3rd party block generation and appending to existing tokens. It also fixes existing issues with public key interning which made deserialization of tokens with 3rd party blocks incorrect in some cases.

Co-authored-by: Geoffroy Couprie <contact@geoffroycouprie.com>
# Conflicts:
#	src/main/java/org/biscuitsec/biscuit/crypto/KeyPair.java
#	src/main/java/org/biscuitsec/biscuit/crypto/PublicKey.java
#	src/main/java/org/biscuitsec/biscuit/token/Biscuit.java
#	src/main/java/org/biscuitsec/biscuit/token/UnverifiedBiscuit.java
#	src/main/java/org/biscuitsec/biscuit/token/builder/parser/Parser.java
#	src/main/java/org/biscuitsec/biscuit/token/format/SerializedBiscuit.java
#	src/test/java/org/biscuitsec/biscuit/token/BiscuitTest.java
# Conflicts:
#	src/main/java/org/biscuitsec/biscuit/token/UnverifiedBiscuit.java
Copy link
Contributor

@Korbik Korbik left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I will try to use the sample from the new specification

pom.xml Outdated
<dependency>
<groupId>org.bouncycastle</groupId>
<artifactId>bcprov-jdk18on</artifactId>
<version>1.78.1</version>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
<version>1.78.1</version>
<version>1.79</version>

Do we bump the version of Bouncy ?

import java.security.Security;
import java.security.Signature;

class SECP256R1KeyPair extends KeyPair {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Suggested change
class SECP256R1KeyPair extends KeyPair {
final class SECP256R1KeyPair extends KeyPair {

return Either.left(new Error.FormatError.Signature.InvalidSignatureSize(signature.length));

if (publicKey.algorithm == Schema.PublicKey.Algorithm.Ed25519) {
if (signature.length != 64) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could be an improvement to replace it by a constant.

return Either.left(new Error.FormatError.Signature.InvalidSignatureSize(signature.length));
}
} else if (publicKey.algorithm == Schema.PublicKey.Algorithm.SECP256R1) {
if (signature.length < 68 || signature.length > 72) {
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Could be an improvement to replace it by a constant.

@@ -335,20 +337,25 @@ public UnverifiedBiscuit copy() throws Error {

public Biscuit verify(PublicKey publicKey) throws Error, NoSuchAlgorithmException, SignatureException, InvalidKeyException {
SerializedBiscuit serializedBiscuit = this.serializedBiscuit;
serializedBiscuit.verify(publicKey);
var result = serializedBiscuit.verify(publicKey);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Good catch, I will check the impact to remove vavr in the future. It is not the best fit for our purpose.

@Korbik
Copy link
Contributor

Korbik commented Jan 15, 2025

The failing test from the specification is linked to this PR eclipse-biscuit/biscuit#175

@itstheceo
Copy link
Contributor Author

The failing test from the specification is linked to this PR biscuit-auth/biscuit#175

Thanks for the review, will address those comments 🚀

Regarding the test you updated; is that test036_secp256r1.bc signed with the v1 signature format, and the implementation needs updating to handle that?

@Korbik
Copy link
Contributor

Korbik commented Jan 16, 2025

The failing test from the specification is linked to this PR biscuit-auth/biscuit#175

Thanks for the review, will address those comments 🚀

Regarding the test you updated; is that test036_secp256r1.bc signed with the v1 signature format, and the implementation needs updating to handle that?

Yes, it is necessary to update the signature and verification of the signature. We have also a new format of protobuf message. Let me know if you want me to care of it or prefer to implement it yourself.

@itstheceo
Copy link
Contributor Author

The failing test from the specification is linked to this PR biscuit-auth/biscuit#175

Thanks for the review, will address those comments 🚀
Regarding the test you updated; is that test036_secp256r1.bc signed with the v1 signature format, and the implementation needs updating to handle that?

Yes, it is necessary to update the signature and verification of the signature. We have also a new format of protobuf message. Let me know if you want me to care of it or prefer to implement it yourself.

Updating the Java implementation to the latest Biscuit spec feels like a separate task from adding support for ECDSA keys, and should be in it's own PR. I have updated test036_secp256r1.bc from the rust PR equivalent for ECDSA key support eclipse-biscuit/biscuit-rust#108

@divarvel
Copy link
Contributor

agreed that is a separate task. we will need to carry it out right away because as of now in biscuit-rust, the use of P256 triggers the use of v1 signatures.

@Korbik Korbik merged commit 20f3907 into eclipse-biscuit:master Jan 17, 2025
1 check passed
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.

3 participants