|
18 | 18 |
|
19 | 19 | import static org.junit.Assert.assertArrayEquals; |
20 | 20 | import static org.junit.Assert.assertEquals; |
| 21 | +import static org.junit.Assert.assertFalse; |
| 22 | +import static org.junit.Assert.assertNull; |
21 | 23 | import static org.junit.Assert.assertThrows; |
22 | 24 | import static org.junit.Assert.assertTrue; |
23 | 25 | import static org.junit.Assert.fail; |
@@ -48,7 +50,6 @@ public class AdvancedTlsX509KeyManagerTest { |
48 | 50 | private static final String SERVER_0_PEM_FILE = "server0.pem"; |
49 | 51 | private static final String CLIENT_0_KEY_FILE = "client.key"; |
50 | 52 | private static final String CLIENT_0_PEM_FILE = "client.pem"; |
51 | | - private static final String ALIAS = "default"; |
52 | 53 |
|
53 | 54 | private ScheduledExecutorService executor; |
54 | 55 |
|
@@ -79,22 +80,99 @@ public void setUp() throws Exception { |
79 | 80 | public void updateTrustCredentials_replacesIssuers() throws Exception { |
80 | 81 | // Overall happy path checking of public API. |
81 | 82 | AdvancedTlsX509KeyManager serverKeyManager = new AdvancedTlsX509KeyManager(); |
| 83 | + |
82 | 84 | serverKeyManager.updateIdentityCredentials(serverCert0, serverKey0); |
83 | | - assertEquals(serverKey0, serverKeyManager.getPrivateKey(ALIAS)); |
84 | | - assertArrayEquals(serverCert0, serverKeyManager.getCertificateChain(ALIAS)); |
| 85 | + String alias1 = serverKeyManager.chooseEngineServerAlias(null, null, null); |
| 86 | + assertEquals(AdvancedTlsX509KeyManager.ALIAS_PREFIX + "1", alias1); |
| 87 | + assertEquals(serverKey0, serverKeyManager.getPrivateKey(alias1)); |
| 88 | + assertArrayEquals(serverCert0, serverKeyManager.getCertificateChain(alias1)); |
85 | 89 |
|
86 | 90 | serverKeyManager.updateIdentityCredentials(clientCert0File, clientKey0File); |
87 | | - assertEquals(clientKey0, serverKeyManager.getPrivateKey(ALIAS)); |
88 | | - assertArrayEquals(clientCert0, serverKeyManager.getCertificateChain(ALIAS)); |
89 | | - |
90 | | - serverKeyManager.updateIdentityCredentials(serverCert0File, serverKey0File,1, |
| 91 | + String alias2 = serverKeyManager.chooseEngineServerAlias(null, null, null); |
| 92 | + assertEquals(AdvancedTlsX509KeyManager.ALIAS_PREFIX + "2", alias2); |
| 93 | + assertEquals(clientKey0, serverKeyManager.getPrivateKey(alias2)); |
| 94 | + assertArrayEquals(clientCert0, serverKeyManager.getCertificateChain(alias2)); |
| 95 | + // Old alias no longer resolves — ensures alias stability contract is enforced. |
| 96 | + assertNull(serverKeyManager.getPrivateKey(alias1)); |
| 97 | + |
| 98 | + serverKeyManager.updateIdentityCredentials(serverCert0File, serverKey0File, 1, |
91 | 99 | TimeUnit.MINUTES, executor); |
92 | | - assertEquals(serverKey0, serverKeyManager.getPrivateKey(ALIAS)); |
93 | | - assertArrayEquals(serverCert0, serverKeyManager.getCertificateChain(ALIAS)); |
| 100 | + String alias3 = serverKeyManager.chooseEngineServerAlias(null, null, null); |
| 101 | + assertEquals(serverKey0, serverKeyManager.getPrivateKey(alias3)); |
| 102 | + assertArrayEquals(serverCert0, serverKeyManager.getCertificateChain(alias3)); |
94 | 103 |
|
95 | 104 | serverKeyManager.updateIdentityCredentials(serverCert0, serverKey0); |
96 | | - assertEquals(serverKey0, serverKeyManager.getPrivateKey(ALIAS)); |
97 | | - assertArrayEquals(serverCert0, serverKeyManager.getCertificateChain(ALIAS)); |
| 105 | + String alias4 = serverKeyManager.chooseEngineServerAlias(null, null, null); |
| 106 | + assertEquals(serverKey0, serverKeyManager.getPrivateKey(alias4)); |
| 107 | + assertArrayEquals(serverCert0, serverKeyManager.getCertificateChain(alias4)); |
| 108 | + } |
| 109 | + |
| 110 | + @Test |
| 111 | + public void allAliasMethods_returnNullBeforeCredentialsLoaded() { |
| 112 | + AdvancedTlsX509KeyManager keyManager = new AdvancedTlsX509KeyManager(); |
| 113 | + |
| 114 | + assertNull(keyManager.chooseClientAlias(null, null, null)); |
| 115 | + assertNull(keyManager.chooseServerAlias(null, null, null)); |
| 116 | + assertNull(keyManager.chooseEngineClientAlias(null, null, null)); |
| 117 | + assertNull(keyManager.chooseEngineServerAlias(null, null, null)); |
| 118 | + assertNull(keyManager.getClientAliases(null, null)); |
| 119 | + assertNull(keyManager.getServerAliases(null, null)); |
| 120 | + assertNull(keyManager.getPrivateKey("key-1")); |
| 121 | + assertNull(keyManager.getCertificateChain("key-1")); |
| 122 | + } |
| 123 | + |
| 124 | + @Test |
| 125 | + public void allAliasMethods_agreeAfterCredentialLoad() throws Exception { |
| 126 | + AdvancedTlsX509KeyManager keyManager = new AdvancedTlsX509KeyManager(); |
| 127 | + keyManager.updateIdentityCredentials(serverCert0, serverKey0); |
| 128 | + |
| 129 | + String expectedAlias = AdvancedTlsX509KeyManager.ALIAS_PREFIX + "1"; |
| 130 | + assertEquals(expectedAlias, keyManager.chooseClientAlias(null, null, null)); |
| 131 | + assertEquals(expectedAlias, keyManager.chooseServerAlias(null, null, null)); |
| 132 | + assertEquals(expectedAlias, keyManager.chooseEngineClientAlias(null, null, null)); |
| 133 | + assertEquals(expectedAlias, keyManager.chooseEngineServerAlias(null, null, null)); |
| 134 | + assertArrayEquals(new String[]{expectedAlias}, keyManager.getClientAliases(null, null)); |
| 135 | + assertArrayEquals(new String[]{expectedAlias}, keyManager.getServerAliases(null, null)); |
| 136 | + } |
| 137 | + |
| 138 | + @Test |
| 139 | + public void revisionWarningThreshold_logsWarningAtThreshold() throws Exception { |
| 140 | + Logger log = Logger.getLogger(AdvancedTlsX509KeyManager.class.getName()); |
| 141 | + TestHandler handler = new TestHandler(); |
| 142 | + log.addHandler(handler); |
| 143 | + log.setUseParentHandlers(false); |
| 144 | + log.setLevel(Level.ALL); |
| 145 | + |
| 146 | + try { |
| 147 | + // Custom threshold: warning when revision reaches threshold. |
| 148 | + int threshold = 3; |
| 149 | + AdvancedTlsX509KeyManager customKeyManager = new AdvancedTlsX509KeyManager(threshold); |
| 150 | + for (int i = 0; i < threshold; i++) { |
| 151 | + customKeyManager.updateIdentityCredentials(serverCert0, serverKey0); |
| 152 | + } |
| 153 | + assertFalse(hasRevisionWarning(handler)); |
| 154 | + customKeyManager.updateIdentityCredentials(serverCert0, serverKey0); |
| 155 | + assertTrue(hasRevisionWarning(handler)); |
| 156 | + |
| 157 | + // Key manager must still provide credentials correctly after soft threshold is exceeded. |
| 158 | + String alias = customKeyManager.chooseEngineServerAlias(null, null, null); |
| 159 | + assertEquals(serverKey0, customKeyManager.getPrivateKey(alias)); |
| 160 | + assertArrayEquals(serverCert0, customKeyManager.getCertificateChain(alias)); |
| 161 | + |
| 162 | + // Further credential updates must also work. |
| 163 | + customKeyManager.updateIdentityCredentials(clientCert0File, clientKey0File); |
| 164 | + String newAlias = customKeyManager.chooseEngineServerAlias(null, null, null); |
| 165 | + assertEquals(clientKey0, customKeyManager.getPrivateKey(newAlias)); |
| 166 | + assertArrayEquals(clientCert0, customKeyManager.getCertificateChain(newAlias)); |
| 167 | + } finally { |
| 168 | + log.removeHandler(handler); |
| 169 | + } |
| 170 | + } |
| 171 | + |
| 172 | + private static boolean hasRevisionWarning(TestHandler handler) { |
| 173 | + return handler.getRecords().stream() |
| 174 | + .anyMatch(r -> Level.WARNING.equals(r.getLevel()) |
| 175 | + && r.getMessage().contains("revision counter has reached")); |
98 | 176 | } |
99 | 177 |
|
100 | 178 | @Test |
|
0 commit comments