Skip to content

Commit 516f0f6

Browse files
committed
Fixes #286
1 parent 1ca38de commit 516f0f6

5 files changed

Lines changed: 59 additions & 6 deletions

File tree

oidc/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
<parent>
1010
<groupId>org.openconext</groupId>
1111
<artifactId>oidcng-parent</artifactId>
12-
<version>8.1.0</version>
12+
<version>8.2.0</version>
1313
</parent>
1414

1515
<dependencyManagement>
Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,24 @@
11
package oidc.endpoints;
22

33
import com.nimbusds.oauth2.sdk.auth.PlainClientSecret;
4+
import com.nimbusds.oauth2.sdk.auth.Secret;
45
import oidc.model.OpenIDClient;
56
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
67

8+
import java.util.Arrays;
9+
710
public class SecureEndpoint {
811

912
private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
1013

11-
//See https://www.pivotaltracker.com/story/show/165565558
1214
boolean secretsMatch(PlainClientSecret clientSecret, OpenIDClient openIDClient) {
13-
return passwordEncoder.matches(clientSecret.getClientSecret().getValue(), openIDClient.getSecret());
15+
//See https://github.com/OpenConext/OpenConext-oidcng/issues/286
16+
String secret = clientSecret.getClientSecret().getValue();
17+
if (secret.getBytes().length > 72) {
18+
byte[] first72bytes = Arrays.copyOf(secret.getBytes(), 72);
19+
secret = new String(first72bytes);
20+
}
21+
return passwordEncoder.matches(secret, openIDClient.getSecret());
1422
}
1523

1624
}

oidc/src/test/java/oidc/endpoints/SecureEndpointTest.java

Lines changed: 46 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,17 @@
99
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
1010
import org.springframework.test.util.ReflectionTestUtils;
1111

12+
import java.security.SecureRandom;
13+
import java.util.Base64;
1214
import java.util.UUID;
1315

16+
import static org.junit.Assert.assertEquals;
1417
import static org.junit.Assert.assertTrue;
1518

1619
public class SecureEndpointTest {
1720

1821
private final BCryptPasswordEncoder passwordEncoder = new BCryptPasswordEncoder();
22+
private final SecureRandom secureRandom = new SecureRandom();
1923

2024
@Test
2125
public void secretsMatch() {
@@ -31,4 +35,45 @@ public void secretsMatch() {
3135
boolean matches = secureEndpoint.secretsMatch(plainClientSecret, openIDClient);
3236
assertTrue(matches);
3337
}
34-
}
38+
39+
@Test
40+
public void longSecrets() {
41+
int numBytes = 54;// Because of base64 encoding, this will become 72 bytes (54 * 4 / 3 = 72);
42+
byte[] randomBytes = new byte[numBytes];
43+
secureRandom.nextBytes(randomBytes);
44+
String secret = Base64.getUrlEncoder().withoutPadding().encodeToString(randomBytes);
45+
assertEquals(72, secret.getBytes().length);
46+
//must not be larger the 72, otherwise the encoding fails
47+
String encoded = passwordEncoder.encode(secret);
48+
OpenIDClient openIDClient = new OpenIDClient();
49+
ReflectionTestUtils.setField(openIDClient, "secret", encoded);
50+
51+
SecureEndpoint secureEndpoint = new SecureEndpoint();
52+
ClientID clientID = new ClientID("test");
53+
Secret theSecret = new Secret(secret +
54+
"does_not_matter_anymore_only_the_first_72_bytes_are used");
55+
PlainClientSecret plainClientSecret = new ClientSecretBasic(clientID, theSecret);
56+
57+
boolean matches = secureEndpoint.secretsMatch(plainClientSecret, openIDClient);
58+
assertTrue(matches);
59+
}
60+
61+
@Test
62+
public void existingLongSecrets() {
63+
String secret = "AsNZ_H_IvWj_z19o7thTO_S83MOEWWSJ_Hiwt4Ms2qMEvPpvMia7SwbsvCLcLIu9h5rdEMYHFGsJD0eTcH0sRjj4OhghMlgfJQ";
64+
assertTrue(secret.getBytes().length > 72);
65+
66+
String encoded = "$2a$10$F1eD3M74d3BS5FnI1moxme89R6rE/doNNhDpeIH9NgJWfF6lQRTd6";
67+
OpenIDClient openIDClient = new OpenIDClient();
68+
ReflectionTestUtils.setField(openIDClient, "secret", encoded);
69+
70+
SecureEndpoint secureEndpoint = new SecureEndpoint();
71+
ClientID clientID = new ClientID("test");
72+
Secret theSecret = new Secret(secret);
73+
PlainClientSecret plainClientSecret = new ClientSecretBasic(clientID, theSecret);
74+
75+
boolean matches = secureEndpoint.secretsMatch(plainClientSecret, openIDClient);
76+
assertTrue(matches);
77+
}
78+
79+
}

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111

1212
<groupId>org.openconext</groupId>
1313
<artifactId>oidcng-parent</artifactId>
14-
<version>8.1.0</version>
14+
<version>8.2.0</version>
1515
<name>oidcng</name>
1616
<packaging>pom</packaging>
1717

release/pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
<parent>
66
<groupId>org.openconext</groupId>
77
<artifactId>oidcng-parent</artifactId>
8-
<version>8.1.0</version>
8+
<version>8.2.0</version>
99
</parent>
1010

1111
<artifactId>oidcng-release</artifactId>

0 commit comments

Comments
 (0)