При генерации ключей ключей разных размеров (без указания провайдера и с выбранным по умолчанию Conscrypt ), а затем с использованием KeyAgreement
для генерации общего секрета, я ожидаю, что будет выдано InvalidKeyException
.
После тестирования на 3 устройствах Android я заметил, что на устройстве под управлением Android 9 InvalidKeyException
правильно выброшен .
Однако на устройствах под управлением Android 6 и Android7, InvalidKeyException
не выброшено .
Вот тест и код, выполняемый в инструментальном тесте:
Тест :
@Test
public void generateECDHSharedSecret_returnsNull_ifKeySizesDifferent() throws NoSuchAlgorithmException {
KeyPairGenerator deviceKeyGenerator = KeyPairGenerator.getInstance("EC");
deviceKeyGenerator.initialize(224);
KeyPairGenerator serverKeyGenerator = KeyPairGenerator.getInstance("EC");
serverKeyGenerator.initialize(256);
PublicKey serverPublicKey = deviceKeyGenerator.generateKeyPair().getPublic();
PrivateKey devicePrivateKey = serverKeyGenerator.generateKeyPair().getPrivate();
byte[] sharedSecret = ServerKeyAgreement.generateECDHSharedSecret(devicePrivateKey, serverPublicKey);
Assert.assertNull(sharedSecret);
}
Реализация :
package com.bla.bla;
import java.security.InvalidKeyException;
import java.security.NoSuchAlgorithmException;
import java.security.PrivateKey;
import java.security.PublicKey;
import javax.crypto.KeyAgreement;
class ServerKeyAgreement {
static byte[] generateECDHSharedSecret(PrivateKey privateKey, PublicKey publicKey) {
try {
KeyAgreement keyAgreement = KeyAgreement.getInstance("ECDH");
keyAgreement.init(privateKey);
keyAgreement.doPhase(publicKey, true);
return keyAgreement.generateSecret();
} catch (NoSuchAlgorithmException |
InvalidKeyException |
RuntimeException e) {
return null;
}
}
}
Почему InvalidKeyException
не выдается на Android 6 и 7, и является ли сгенерированный общий секрет действительно действительным