| package org.bouncycastle.crypto.ec; |
| |
| import org.bouncycastle.crypto.CipherParameters; |
| import org.bouncycastle.crypto.params.ECPrivateKeyParameters; |
| import org.bouncycastle.math.ec.ECPoint; |
| |
| /** |
| * this does your basic decryption ElGamal style using EC |
| */ |
| public class ECElGamalDecryptor |
| implements ECDecryptor |
| { |
| private ECPrivateKeyParameters key; |
| |
| /** |
| * initialise the decryptor. |
| * |
| * @param param the necessary EC key parameters. |
| */ |
| public void init( |
| CipherParameters param) |
| { |
| if (!(param instanceof ECPrivateKeyParameters)) |
| { |
| throw new IllegalArgumentException("ECPrivateKeyParameters are required for decryption."); |
| } |
| |
| this.key = (ECPrivateKeyParameters)param; |
| } |
| |
| /** |
| * Decrypt an EC pair producing the original EC point. |
| * |
| * @param pair the EC point pair to process. |
| * @return the result of the Elgamal process. |
| */ |
| public ECPoint decrypt(ECPair pair) |
| { |
| if (key == null) |
| { |
| throw new IllegalStateException("ECElGamalDecryptor not initialised"); |
| } |
| |
| ECPoint tmp = pair.getX().multiply(key.getD()); |
| |
| return pair.getY().add(tmp.negate()).normalize(); |
| } |
| } |