All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.bouncycastle.crypto.agreement.ECDHCBasicAgreement Maven / Gradle / Ivy

Go to download

The Bouncy Castle Crypto package is a Java implementation of cryptographic algorithms. This jar contains JCE provider and lightweight API for the Bouncy Castle Cryptography APIs for Java 1.8 and later with debug enabled.

The newest version!
package org.bouncycastle.crypto.agreement;

import java.math.BigInteger;

import org.bouncycastle.crypto.BasicAgreement;
import org.bouncycastle.crypto.CipherParameters;
import org.bouncycastle.crypto.CryptoServicesRegistrar;
import org.bouncycastle.crypto.params.ECDomainParameters;
import org.bouncycastle.crypto.params.ECPrivateKeyParameters;
import org.bouncycastle.crypto.params.ECPublicKeyParameters;
import org.bouncycastle.math.ec.ECAlgorithms;
import org.bouncycastle.math.ec.ECPoint;

/**
 * P1363 7.2.2 ECSVDP-DHC
 *
 * ECSVDP-DHC is Elliptic Curve Secret Value Derivation Primitive,
 * Diffie-Hellman version with cofactor multiplication. It is based on
 * the work of [DH76], [Mil86], [Kob87], [LMQ98] and [Kal98a]. This
 * primitive derives a shared secret value from one party's private key
 * and another party's public key, where both have the same set of EC
 * domain parameters. If two parties correctly execute this primitive,
 * they will produce the same output. This primitive can be invoked by a
 * scheme to derive a shared secret key; specifically, it may be used
 * with the schemes ECKAS-DH1 and DL/ECKAS-DH2. It does not assume the
 * validity of the input public key (see also Section 7.2.1).
 * 

* Note: As stated P1363 compatibility mode with ECDH can be preset, and * in this case the implementation doesn't have a ECDH compatibility mode * (if you want that just use ECDHBasicAgreement and note they both implement * BasicAgreement!). */ public class ECDHCBasicAgreement implements BasicAgreement { ECPrivateKeyParameters key; public void init( CipherParameters key) { this.key = (ECPrivateKeyParameters)key; CryptoServicesRegistrar.checkConstraints(Utils.getDefaultProperties("ECCDH", this.key)); } public int getFieldSize() { return (key.getParameters().getCurve().getFieldSize() + 7) / 8; } public BigInteger calculateAgreement( CipherParameters pubKey) { ECPublicKeyParameters pub = (ECPublicKeyParameters)pubKey; ECDomainParameters params = key.getParameters(); if (!params.equals(pub.getParameters())) { throw new IllegalStateException("ECDHC public key has wrong domain parameters"); } BigInteger hd = params.getH().multiply(key.getD()).mod(params.getN()); // Always perform calculations on the exact curve specified by our private key's parameters ECPoint pubPoint = ECAlgorithms.cleanPoint(params.getCurve(), pub.getQ()); if (pubPoint.isInfinity()) { throw new IllegalStateException("Infinity is not a valid public key for ECDHC"); } ECPoint P = pubPoint.multiply(hd).normalize(); if (P.isInfinity()) { throw new IllegalStateException("Infinity is not a valid agreement value for ECDHC"); } return P.getAffineXCoord().toBigInteger(); } }





© 2015 - 2024 Weber Informatics LLC | Privacy Policy