forked from TuxCoding/FastLogin
Migrate public key to record
This commit is contained in:
@ -147,8 +147,8 @@ class EncryptionUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean verifyClientKey(ClientPublicKey clientKey, Instant verifyTimstamp)
|
public static boolean verifyClientKey(ClientPublicKey clientKey, Instant verifyTimstamp)
|
||||||
throws SignatureException, NoSuchAlgorithmException, InvalidKeyException {
|
throws NoSuchAlgorithmException, InvalidKeyException, SignatureException {
|
||||||
if (!verifyTimstamp.isBefore(clientKey.getExpiry())) {
|
if (!verifyTimstamp.isBefore(clientKey.expiry())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -156,7 +156,7 @@ class EncryptionUtil {
|
|||||||
// key of the signer
|
// key of the signer
|
||||||
verifier.initVerify(mojangSessionKey);
|
verifier.initVerify(mojangSessionKey);
|
||||||
verifier.update(toSignable(clientKey).getBytes(StandardCharsets.US_ASCII));
|
verifier.update(toSignable(clientKey).getBytes(StandardCharsets.US_ASCII));
|
||||||
return verifier.verify(clientKey.getSignature());
|
return verifier.verify(clientKey.signature());
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean verifySignedNonce(byte[] nonce, PublicKey clientKey, long signatureSalt, byte[] signature)
|
public static boolean verifySignedNonce(byte[] nonce, PublicKey clientKey, long signatureSalt, byte[] signature)
|
||||||
@ -180,8 +180,8 @@ class EncryptionUtil {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private static String toSignable(ClientPublicKey clientPublicKey) {
|
private static String toSignable(ClientPublicKey clientPublicKey) {
|
||||||
long expiry = clientPublicKey.getExpiry().toEpochMilli();
|
long expiry = clientPublicKey.expiry().toEpochMilli();
|
||||||
String encoded = KEY_ENCODER.encodeToString(clientPublicKey.getKey().getEncoded());
|
String encoded = KEY_ENCODER.encodeToString(clientPublicKey.key().getEncoded());
|
||||||
return expiry + "-----BEGIN RSA PUBLIC KEY-----\n" + encoded + "\n-----END RSA PUBLIC KEY-----\n";
|
return expiry + "-----BEGIN RSA PUBLIC KEY-----\n" + encoded + "\n-----END RSA PUBLIC KEY-----\n";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -262,7 +262,7 @@ public class VerifyResponseTask implements Runnable {
|
|||||||
startPacket.getStrings().write(0, username);
|
startPacket.getStrings().write(0, username);
|
||||||
|
|
||||||
EquivalentConverter<WrappedProfileKeyData> converter = BukkitConverters.getWrappedPublicKeyDataConverter();
|
EquivalentConverter<WrappedProfileKeyData> converter = BukkitConverters.getWrappedPublicKeyDataConverter();
|
||||||
var key = new WrappedProfileKeyData(clientKey.getExpiry(), clientKey.getKey(), sharedSecret);
|
var key = new WrappedProfileKeyData(clientKey.expiry(), clientKey.key(), sharedSecret);
|
||||||
startPacket.getOptionals(converter).write(0, Optional.of(key));
|
startPacket.getOptionals(converter).write(0, Optional.of(key));
|
||||||
} else {
|
} else {
|
||||||
//uuid is ignored by the packet definition
|
//uuid is ignored by the packet definition
|
||||||
|
@ -28,27 +28,6 @@ package com.github.games647.fastlogin.bukkit.listener.protocollib.packet;
|
|||||||
import java.security.PublicKey;
|
import java.security.PublicKey;
|
||||||
import java.time.Instant;
|
import java.time.Instant;
|
||||||
|
|
||||||
public class ClientPublicKey {
|
public record ClientPublicKey(Instant expiry, PublicKey key, byte[] signature) {
|
||||||
|
|
||||||
private final Instant expiry;
|
|
||||||
private final PublicKey key;
|
|
||||||
private final byte[] signature;
|
|
||||||
|
|
||||||
public ClientPublicKey(Instant expiry, PublicKey key, byte[] signature) {
|
|
||||||
this.expiry = expiry;
|
|
||||||
this.key = key;
|
|
||||||
this.signature = signature;
|
|
||||||
}
|
|
||||||
|
|
||||||
public Instant getExpiry() {
|
|
||||||
return expiry;
|
|
||||||
}
|
|
||||||
|
|
||||||
public PublicKey getKey() {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
|
|
||||||
public byte[] getSignature() {
|
|
||||||
return signature;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
@ -90,7 +90,7 @@ public class EncryptionUtilTest {
|
|||||||
var clientKey = loadClientKey("client_keys/valid_public_key.json");
|
var clientKey = loadClientKey("client_keys/valid_public_key.json");
|
||||||
|
|
||||||
// Client expires at the exact second mentioned, so use it for verification
|
// Client expires at the exact second mentioned, so use it for verification
|
||||||
var expiredTimestamp = clientKey.getExpiry();
|
var expiredTimestamp = clientKey.expiry();
|
||||||
assertThat(EncryptionUtil.verifyClientKey(clientKey, expiredTimestamp), is(false));
|
assertThat(EncryptionUtil.verifyClientKey(clientKey, expiredTimestamp), is(false));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -100,7 +100,7 @@ public class EncryptionUtilTest {
|
|||||||
// expiration date changed should make the signature invalid
|
// expiration date changed should make the signature invalid
|
||||||
// expiration should still be valid
|
// expiration should still be valid
|
||||||
var clientKey = loadClientKey("client_keys/invalid_wrong_expiration.json");
|
var clientKey = loadClientKey("client_keys/invalid_wrong_expiration.json");
|
||||||
Instant expireTimestamp = clientKey.getExpiry().minus(5, ChronoUnit.HOURS);
|
Instant expireTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
|
||||||
|
|
||||||
assertThat(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp), is(false));
|
assertThat(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp), is(false));
|
||||||
}
|
}
|
||||||
@ -110,7 +110,7 @@ public class EncryptionUtilTest {
|
|||||||
public void testInvalidChangedKey() throws Exception {
|
public void testInvalidChangedKey() throws Exception {
|
||||||
// changed public key no longer corresponding to the signature
|
// changed public key no longer corresponding to the signature
|
||||||
var clientKey = loadClientKey("client_keys/invalid_wrong_key.json");
|
var clientKey = loadClientKey("client_keys/invalid_wrong_key.json");
|
||||||
Instant expireTimestamp = clientKey.getExpiry().minus(5, ChronoUnit.HOURS);
|
Instant expireTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
|
||||||
|
|
||||||
assertThat(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp), is(false));
|
assertThat(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp), is(false));
|
||||||
}
|
}
|
||||||
@ -119,7 +119,7 @@ public class EncryptionUtilTest {
|
|||||||
public void testInvalidChangedSignature() throws Exception {
|
public void testInvalidChangedSignature() throws Exception {
|
||||||
// signature modified no longer corresponding to key and expiration date
|
// signature modified no longer corresponding to key and expiration date
|
||||||
var clientKey = loadClientKey("client_keys/invalid_wrong_signature.json");
|
var clientKey = loadClientKey("client_keys/invalid_wrong_signature.json");
|
||||||
Instant expireTimestamp = clientKey.getExpiry().minus(5, ChronoUnit.HOURS);
|
Instant expireTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
|
||||||
|
|
||||||
assertThat(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp), is(false));
|
assertThat(EncryptionUtil.verifyClientKey(clientKey, expireTimestamp), is(false));
|
||||||
}
|
}
|
||||||
@ -127,7 +127,7 @@ public class EncryptionUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testValidClientKey() throws Exception {
|
public void testValidClientKey() throws Exception {
|
||||||
var clientKey = loadClientKey("client_keys/valid_public_key.json");
|
var clientKey = loadClientKey("client_keys/valid_public_key.json");
|
||||||
var verificationTimestamp = clientKey.getExpiry().minus(5, ChronoUnit.HOURS);
|
var verificationTimestamp = clientKey.expiry().minus(5, ChronoUnit.HOURS);
|
||||||
|
|
||||||
assertThat(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp), is(true));
|
assertThat(EncryptionUtil.verifyClientKey(clientKey, verificationTimestamp), is(true));
|
||||||
}
|
}
|
||||||
@ -135,7 +135,7 @@ public class EncryptionUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testValidSignedNonce() throws Exception {
|
public void testValidSignedNonce() throws Exception {
|
||||||
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
||||||
PublicKey clientPublicKey = clientKey.getKey();
|
PublicKey clientPublicKey = clientKey.key();
|
||||||
|
|
||||||
SignatureTestData testData = loadSignatureResource("signature/valid_signature.json");
|
SignatureTestData testData = loadSignatureResource("signature/valid_signature.json");
|
||||||
byte[] nonce = testData.getNonce();
|
byte[] nonce = testData.getNonce();
|
||||||
@ -147,7 +147,7 @@ public class EncryptionUtilTest {
|
|||||||
@Test
|
@Test
|
||||||
public void testIncorrectNonce() throws Exception {
|
public void testIncorrectNonce() throws Exception {
|
||||||
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
||||||
PublicKey clientPublicKey = clientKey.getKey();
|
PublicKey clientPublicKey = clientKey.key();
|
||||||
|
|
||||||
SignatureTestData testData = loadSignatureResource("signature/incorrect_nonce.json");
|
SignatureTestData testData = loadSignatureResource("signature/incorrect_nonce.json");
|
||||||
byte[] nonce = testData.getNonce();
|
byte[] nonce = testData.getNonce();
|
||||||
@ -160,7 +160,7 @@ public class EncryptionUtilTest {
|
|||||||
public void testIncorrectSalt() throws Exception {
|
public void testIncorrectSalt() throws Exception {
|
||||||
// client generated
|
// client generated
|
||||||
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
||||||
PublicKey clientPublicKey = clientKey.getKey();
|
PublicKey clientPublicKey = clientKey.key();
|
||||||
|
|
||||||
SignatureTestData testData = loadSignatureResource("signature/incorrect_salt.json");
|
SignatureTestData testData = loadSignatureResource("signature/incorrect_salt.json");
|
||||||
byte[] nonce = testData.getNonce();
|
byte[] nonce = testData.getNonce();
|
||||||
@ -173,7 +173,7 @@ public class EncryptionUtilTest {
|
|||||||
public void testIncorrectSignature() throws Exception {
|
public void testIncorrectSignature() throws Exception {
|
||||||
// client generated
|
// client generated
|
||||||
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
ClientPublicKey clientKey = loadClientKey("client_keys/valid_public_key.json");
|
||||||
PublicKey clientPublicKey = clientKey.getKey();
|
PublicKey clientPublicKey = clientKey.key();
|
||||||
|
|
||||||
SignatureTestData testData = loadSignatureResource("signature/incorrect_signature.json");
|
SignatureTestData testData = loadSignatureResource("signature/incorrect_signature.json");
|
||||||
byte[] nonce = testData.getNonce();
|
byte[] nonce = testData.getNonce();
|
||||||
@ -186,7 +186,7 @@ public class EncryptionUtilTest {
|
|||||||
public void testWrongPublicKeySigned() throws Exception {
|
public void testWrongPublicKeySigned() throws Exception {
|
||||||
// load a different public key
|
// load a different public key
|
||||||
ClientPublicKey clientKey = loadClientKey("client_keys/invalid_wrong_key.json");
|
ClientPublicKey clientKey = loadClientKey("client_keys/invalid_wrong_key.json");
|
||||||
PublicKey clientPublicKey = clientKey.getKey();
|
PublicKey clientPublicKey = clientKey.key();
|
||||||
|
|
||||||
SignatureTestData testData = loadSignatureResource("signature/valid_signature.json");
|
SignatureTestData testData = loadSignatureResource("signature/valid_signature.json");
|
||||||
byte[] nonce = testData.getNonce();
|
byte[] nonce = testData.getNonce();
|
||||||
|
Reference in New Issue
Block a user