Skip to content

Commit 70d17ec

Browse files
authored
Merge pull request #139 from preuss-adam/apreuss/split-modules
Split out core logic from library dependencies
2 parents dd197cd + ecb9212 commit 70d17ec

132 files changed

Lines changed: 381 additions & 331 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

biscuit-core/pom.xml

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
<!--
2+
~ Copyright (c) 2019 Geoffroy Couprie <contact@geoffroycouprie.com> and Contributors to the Eclipse Foundation.
3+
~ SPDX-License-Identifier: Apache-2.0
4+
-->
5+
6+
<project>
7+
<modelVersion>4.0.0</modelVersion>
8+
<artifactId>biscuit-core</artifactId>
9+
<packaging>jar</packaging>
10+
11+
<parent>
12+
<groupId>org.eclipse</groupId>
13+
<artifactId>biscuit-java</artifactId>
14+
<version>4.1.0</version>
15+
</parent>
16+
17+
<dependencies>
18+
<dependency>
19+
<groupId>com.google.protobuf</groupId>
20+
<artifactId>protobuf-java</artifactId>
21+
<version>${protobuf.version}</version>
22+
</dependency>
23+
<dependency>
24+
<groupId>com.fasterxml.jackson.core</groupId>
25+
<artifactId>jackson-databind</artifactId>
26+
<version>${jackson.version}</version>
27+
</dependency>
28+
</dependencies>
29+
</project>

src/main/java/org/eclipse/biscuit/crypto/BlockSignatureBuffer.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/BlockSignatureBuffer.java

File renamed without changes.

src/main/java/org/eclipse/biscuit/crypto/KeyDelegate.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/KeyDelegate.java

File renamed without changes.
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
/*
2+
* Copyright (c) 2019 Geoffroy Couprie <contact@geoffroycouprie.com> and Contributors to the Eclipse Foundation.
3+
* SPDX-License-Identifier: Apache-2.0
4+
*/
5+
6+
package org.eclipse.biscuit.crypto;
7+
8+
import biscuit.format.schema.Schema.PublicKey.Algorithm;
9+
import java.security.SecureRandom;
10+
import java.util.ServiceLoader;
11+
import java.util.stream.Collectors;
12+
import org.eclipse.biscuit.error.Error;
13+
import org.eclipse.biscuit.token.builder.Utils;
14+
15+
/** Private and public key. */
16+
public abstract class KeyPair implements Signer {
17+
public interface Factory {
18+
KeyPair generate(Algorithm algorithm, byte[] bytes) throws Error.FormatError;
19+
20+
KeyPair generate(Algorithm algorithm, SecureRandom rng) throws Error.FormatError;
21+
}
22+
23+
private static final Factory factory;
24+
25+
static {
26+
var factories = ServiceLoader.load(KeyPair.Factory.class).stream().collect(Collectors.toList());
27+
if (factories.size() != 1) {
28+
throw new IllegalStateException(
29+
"A single KeyPair implementation expected; found " + factories.size());
30+
}
31+
factory = factories.get(0).get();
32+
}
33+
34+
public static KeyPair generate(Algorithm algorithm) throws Error.FormatError {
35+
return generate(algorithm, new SecureRandom());
36+
}
37+
38+
public static KeyPair generate(Algorithm algorithm, String hex) throws Error.FormatError {
39+
return generate(algorithm, Utils.hexStringToByteArray(hex));
40+
}
41+
42+
public static KeyPair generate(Algorithm algorithm, byte[] bytes) throws Error.FormatError {
43+
return factory.generate(algorithm, bytes);
44+
}
45+
46+
public static KeyPair generate(Algorithm algorithm, SecureRandom rng) throws Error.FormatError {
47+
return factory.generate(algorithm, rng);
48+
}
49+
50+
public abstract byte[] toBytes();
51+
52+
public abstract String toHex();
53+
54+
@Override
55+
public abstract PublicKey getPublicKey();
56+
}

src/main/java/org/eclipse/biscuit/crypto/PublicKey.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/PublicKey.java

Lines changed: 15 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -12,34 +12,34 @@
1212
import java.security.NoSuchAlgorithmException;
1313
import java.security.SignatureException;
1414
import java.util.Optional;
15+
import java.util.ServiceLoader;
1516
import java.util.Set;
17+
import java.util.stream.Collectors;
1618
import org.eclipse.biscuit.error.Error;
1719
import org.eclipse.biscuit.token.builder.Utils;
1820

1921
public abstract class PublicKey {
2022
public interface Factory {
21-
PublicKey load(byte[] bytes) throws Error.FormatError.InvalidKey;
23+
PublicKey load(Algorithm algorithm, byte[] bytes) throws Error.FormatError;
2224
}
2325

24-
public static final Factory DEFAULT_ED25519_FACTORY =
25-
bytes -> Ed25519PublicKey.loadEd25519(bytes);
26-
public static final Factory DEFAULT_SECP256R1_FACTORY =
27-
bytes -> SECP256R1PublicKey.loadSECP256R1(bytes);
26+
private static final Factory factory;
2827

29-
private static volatile Factory ed25519Factory = DEFAULT_ED25519_FACTORY;
30-
private static volatile Factory secp256r1Factory = DEFAULT_SECP256R1_FACTORY;
28+
static {
29+
var factories =
30+
ServiceLoader.load(PublicKey.Factory.class).stream().collect(Collectors.toList());
31+
if (factories.size() != 1) {
32+
throw new IllegalStateException(
33+
"A single PublicKey implementation expected; found " + factories.size());
34+
}
35+
factory = factories.get(0).get();
36+
}
3137

3238
private static final Set<Algorithm> SUPPORTED_ALGORITHMS =
3339
Set.of(Algorithm.Ed25519, Algorithm.SECP256R1);
3440

3541
public static PublicKey load(Algorithm algorithm, byte[] data) throws Error.FormatError {
36-
if (algorithm == Algorithm.Ed25519) {
37-
return ed25519Factory.load(data);
38-
} else if (algorithm == Algorithm.SECP256R1) {
39-
return secp256r1Factory.load(data);
40-
} else {
41-
throw new IllegalArgumentException("Unsupported algorithm");
42-
}
42+
return factory.load(algorithm, data);
4343
}
4444

4545
public static PublicKey load(Algorithm algorithm, String hex) throws Error.FormatError {
@@ -66,34 +66,8 @@ public static PublicKey deserialize(Schema.PublicKey pk) throws Error.FormatErro
6666
return PublicKey.load(pk.getAlgorithm(), pk.getKey().toByteArray());
6767
}
6868

69-
public static Optional<Error> validateSignatureLength(Algorithm algorithm, int length) {
70-
Optional<Error> error = Optional.empty();
71-
if (algorithm == Algorithm.Ed25519) {
72-
if (length != Ed25519KeyPair.SIGNATURE_LENGTH) {
73-
error = Optional.of(new Error.FormatError.Signature.InvalidSignatureSize(length));
74-
}
75-
} else if (algorithm == Algorithm.SECP256R1) {
76-
if (length < SECP256R1KeyPair.MINIMUM_SIGNATURE_LENGTH
77-
|| length > SECP256R1KeyPair.MAXIMUM_SIGNATURE_LENGTH) {
78-
error = Optional.of(new Error.FormatError.Signature.InvalidSignatureSize(length));
79-
}
80-
} else {
81-
error =
82-
Optional.of(new Error.FormatError.Signature.InvalidSignature("unsupported algorithm"));
83-
}
84-
return error;
85-
}
86-
87-
public static void setEd25519Factory(Factory factory) {
88-
ed25519Factory = factory;
89-
}
90-
91-
public static void setSECP256R1Factory(Factory factory) {
92-
secp256r1Factory = factory;
93-
}
94-
9569
public abstract Algorithm getAlgorithm();
9670

97-
public abstract boolean verify(byte[] data, byte[] signature)
71+
public abstract Optional<Error> verify(byte[] data, byte[] signature)
9872
throws InvalidKeyException, SignatureException, NoSuchAlgorithmException;
9973
}

src/main/java/org/eclipse/biscuit/crypto/Signer.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/Signer.java

File renamed without changes.

src/main/java/org/eclipse/biscuit/crypto/Token.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/Token.java

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -72,13 +72,12 @@ public Result<Void, Error> verify(PublicKey root)
7272

7373
byte[] payload =
7474
BlockSignatureBuffer.generateBlockSignaturePayloadV0(block, nextKey, Optional.empty());
75-
if (currentKey.verify(payload, signature)) {
76-
currentKey = nextKey;
77-
} else {
78-
return Result.err(
79-
new Error.FormatError.Signature.InvalidSignature(
80-
"signature error: Verification equation was not satisfied"));
75+
var verificationResult = currentKey.verify(payload, signature);
76+
if (verificationResult.isPresent()) {
77+
return Result.err(verificationResult.get());
8178
}
79+
80+
currentKey = nextKey;
8281
}
8382

8483
if (this.next.getPublicKey().equals(currentKey)) {

src/main/java/org/eclipse/biscuit/crypto/TokenSignature.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/TokenSignature.java

File renamed without changes.

src/main/java/org/eclipse/biscuit/crypto/package-info.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/crypto/package-info.java

File renamed without changes.

src/main/java/org/eclipse/biscuit/datalog/Check.java renamed to biscuit-core/src/main/java/org/eclipse/biscuit/datalog/Check.java

File renamed without changes.

0 commit comments

Comments
 (0)