diff options
Diffstat (limited to 'pg/src/main/java/org/spongycastle/bcpg/ECDHPublicBCPGKey.java')
-rw-r--r-- | pg/src/main/java/org/spongycastle/bcpg/ECDHPublicBCPGKey.java | 113 |
1 files changed, 113 insertions, 0 deletions
diff --git a/pg/src/main/java/org/spongycastle/bcpg/ECDHPublicBCPGKey.java b/pg/src/main/java/org/spongycastle/bcpg/ECDHPublicBCPGKey.java new file mode 100644 index 00000000..a1ddfffb --- /dev/null +++ b/pg/src/main/java/org/spongycastle/bcpg/ECDHPublicBCPGKey.java @@ -0,0 +1,113 @@ +package org.spongycastle.bcpg; + +import java.io.IOException; + +import org.spongycastle.asn1.ASN1ObjectIdentifier; +import org.spongycastle.math.ec.ECPoint; + +/** + * base class for an ECDH Public Key. + */ +public class ECDHPublicBCPGKey + extends ECPublicBCPGKey +{ + private byte reserved; + private byte hashFunctionId; + private byte symAlgorithmId; + + /** + * @param in the stream to read the packet from. + */ + public ECDHPublicBCPGKey( + BCPGInputStream in) + throws IOException + { + super(in); + + int length = in.read(); + byte[] kdfParameters = new byte[length]; + if (kdfParameters.length != 3) + { + throw new IllegalStateException("kdf parameters size of 3 expected."); + } + + in.read(kdfParameters); + + reserved = kdfParameters[0]; + hashFunctionId = kdfParameters[1]; + symAlgorithmId = kdfParameters[2]; + + verifyHashAlgorithm(); + verifySymmetricKeyAlgorithm(); + } + + public ECDHPublicBCPGKey( + ASN1ObjectIdentifier oid, + ECPoint point, + int hashAlgorithm, + int symmetricKeyAlgorithm) + { + super(oid, point); + + reserved = 1; + hashFunctionId = (byte)hashAlgorithm; + symAlgorithmId = (byte)symmetricKeyAlgorithm; + + verifyHashAlgorithm(); + verifySymmetricKeyAlgorithm(); + } + + public byte getReserved() + { + return reserved; + } + + public byte getHashAlgorithm() + { + return hashFunctionId; + } + + public byte getSymmetricKeyAlgorithm() + { + return symAlgorithmId; + } + + public void encode( + BCPGOutputStream out) + throws IOException + { + super.encode(out); + out.write(0x3); + out.write(reserved); + out.write(hashFunctionId); + out.write(symAlgorithmId); + } + + private void verifyHashAlgorithm() + { + switch (hashFunctionId) + { + case HashAlgorithmTags.SHA256: + case HashAlgorithmTags.SHA384: + case HashAlgorithmTags.SHA512: + break; + + default: + throw new IllegalStateException("Hash algorithm must be SHA-256 or stronger."); + } + } + + private void verifySymmetricKeyAlgorithm() + { + switch (symAlgorithmId) + { + case SymmetricKeyAlgorithmTags.AES_128: + case SymmetricKeyAlgorithmTags.AES_192: + case SymmetricKeyAlgorithmTags.AES_256: + break; + + default: + throw new IllegalStateException("Symmetric key algorithm must be AES-128 or stronger."); + } + } +} |