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

Add ECDSA key support (SECP256R1) again #108

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

Conversation

itstheceo
Copy link

@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
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
Collaborator

@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

import java.security.SecureRandom;
import java.security.Signature;

class Ed25519KeyPair extends KeyPair {
Copy link
Collaborator

Choose a reason for hiding this comment

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

Suggested change
class Ed25519KeyPair extends KeyPair {
final class Ed25519KeyPair extends KeyPair {

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

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
Collaborator

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
Collaborator

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
Collaborator

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
Collaborator

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
Collaborator

Korbik commented Jan 15, 2025

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

@itstheceo
Copy link
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?

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