diff options
Diffstat (limited to 'src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java')
| -rw-r--r-- | src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java | 71 |
1 files changed, 52 insertions, 19 deletions
diff --git a/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java b/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java index 4ed3469..12bc354 100644 --- a/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java +++ b/src/cz/crcs/ectester/standalone/libs/jni/NativeKeyAgreementSpi.java @@ -61,12 +61,6 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { return secret.length; } - @Override - protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException { - // TODO: This is dangerous/not correct ! Need to actually implement KDF1 and KDF2 here probably. Or just pass it off to the libs through some different interface. - return new SecretKeySpec(engineGenerateSecret(), algorithm); - } - private abstract static class SimpleKeyAgreementSpi extends NativeKeyAgreementSpi { @Override @@ -78,24 +72,38 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { this.params = params; } - @Override - protected byte[] engineGenerateSecret() throws IllegalStateException { - byte[] pubkey; + private byte[] getPubkey() { if (publicKey instanceof NativeECPublicKey) { - pubkey = ((NativeECPublicKey) publicKey).getData(); + return ((NativeECPublicKey) publicKey).getData(); } else { - pubkey = ECUtil.toX962Uncompressed(publicKey.getW(), ((ECParameterSpec) params).getCurve()); + return ECUtil.toX962Uncompressed(publicKey.getW(), ((ECParameterSpec) params).getCurve()); } - byte[] privkey; + } + + private byte[] getPrivkey() { if (privateKey instanceof NativeECPrivateKey) { - privkey = ((NativeECPrivateKey) privateKey).getData(); + return ((NativeECPrivateKey) privateKey).getData(); } else { - privkey = ECUtil.toByteArray(privateKey.getS(), ((ECParameterSpec) params).getCurve().getField().getFieldSize()); + return ECUtil.toByteArray(privateKey.getS(), ((ECParameterSpec) params).getCurve().getField().getFieldSize()); } - return generateSecret(pubkey, privkey, (ECParameterSpec) params); + } + + @Override + protected byte[] engineGenerateSecret() throws IllegalStateException { + return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params); } abstract byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params); + + @Override + protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException { + if (algorithm == null) { + throw new NoSuchAlgorithmException("Algorithm must not be null"); + } + return generateSecret(getPubkey(), getPrivkey(), (ECParameterSpec) params, algorithm); + } + + abstract SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm); } private abstract static class ExtendedKeyAgreementSpi extends NativeKeyAgreementSpi { @@ -115,6 +123,16 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { } abstract byte[] generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params); + + @Override + protected SecretKey engineGenerateSecret(String algorithm) throws IllegalStateException, NoSuchAlgorithmException, InvalidKeyException { + if (algorithm == null) { + throw new NoSuchAlgorithmException("Algorithm must not be null"); + } + return generateSecret(publicKey, privateKey, params, algorithm); + } + + abstract SecretKey generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params, String algorithm); } @@ -122,6 +140,9 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { @Override native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params); + + @Override + native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm); } public abstract static class Botan extends SimpleKeyAgreementSpi { @@ -133,6 +154,9 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { @Override native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params); + + @Override + native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm); } public static class BotanECDH extends Botan { @@ -180,6 +204,9 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { @Override native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params); + + @Override + native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm); } public static class CryptoppECDH extends Cryptopp { @@ -197,6 +224,9 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { @Override native byte[] generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params); + + @Override + native SecretKey generateSecret(byte[] pubkey, byte[] privkey, ECParameterSpec params, String algorithm); } public static class OpensslECDH extends Openssl { @@ -214,29 +244,32 @@ public abstract class NativeKeyAgreementSpi extends KeyAgreementSpi { @Override native byte[] generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params); + + @Override + native SecretKey generateSecret(ECPublicKey pubkey, ECPrivateKey privkey, AlgorithmParameterSpec params, String algorithm); } public static class MscngECDHwithSHA1KDF extends Mscng { public MscngECDHwithSHA1KDF() { - super("ECDHwithSHA1KDF"); + super("ECDHwithSHA1KDF(CNG)"); } } public static class MscngECDHwithSHA256KDF extends Mscng { public MscngECDHwithSHA256KDF() { - super("ECDHwithSHA256KDF"); + super("ECDHwithSHA256KDF(CNG)"); } } public static class MscngECDHwithSHA384KDF extends Mscng { public MscngECDHwithSHA384KDF() { - super("ECDHwithSHA384KDF"); + super("ECDHwithSHA384KDF(CNG)"); } } public static class MscngECDHwithSHA512KDF extends Mscng { public MscngECDHwithSHA512KDF() { - super("ECDHwithSHA512KDF"); + super("ECDHwithSHA512KDF(CNG)"); } } } |
