use of com.github.zhenwei.core.crypto.params.MQVPublicParameters in project LinLong-Java by zhenwei1108.
the class KeyAgreementSpi method engineDoPhase.
protected Key engineDoPhase(Key key, boolean lastPhase) throws InvalidKeyException, IllegalStateException {
if (parameters == null) {
throw new IllegalStateException(kaAlgorithm + " not initialised.");
}
if (!lastPhase) {
throw new IllegalStateException(kaAlgorithm + " can only be between two parties.");
}
CipherParameters pubKey;
if (agreement instanceof ECMQVBasicAgreement) {
if (!(key instanceof MQVPublicKey)) {
ECPublicKeyParameters staticKey = (ECPublicKeyParameters) ECUtils.generatePublicKeyParameter((PublicKey) key);
ECPublicKeyParameters ephemKey = (ECPublicKeyParameters) ECUtils.generatePublicKeyParameter(mqvParameters.getOtherPartyEphemeralKey());
pubKey = new MQVPublicParameters(staticKey, ephemKey);
} else {
MQVPublicKey mqvPubKey = (MQVPublicKey) key;
ECPublicKeyParameters staticKey = (ECPublicKeyParameters) ECUtils.generatePublicKeyParameter(mqvPubKey.getStaticKey());
ECPublicKeyParameters ephemKey = (ECPublicKeyParameters) ECUtils.generatePublicKeyParameter(mqvPubKey.getEphemeralKey());
pubKey = new MQVPublicParameters(staticKey, ephemKey);
}
} else if (agreement instanceof ECDHCUnifiedAgreement) {
ECPublicKeyParameters staticKey = (ECPublicKeyParameters) ECUtils.generatePublicKeyParameter((PublicKey) key);
ECPublicKeyParameters ephemKey = (ECPublicKeyParameters) ECUtils.generatePublicKeyParameter(dheParameters.getOtherPartyEphemeralKey());
pubKey = new ECDHUPublicParameters(staticKey, ephemKey);
} else {
if (!(key instanceof PublicKey)) {
throw new InvalidKeyException(kaAlgorithm + " key agreement requires " + getSimpleName(ECPublicKey.class) + " for doPhase");
}
pubKey = ECUtils.generatePublicKeyParameter((PublicKey) key);
}
try {
if (agreement instanceof BasicAgreement) {
result = bigIntToBytes(((BasicAgreement) agreement).calculateAgreement(pubKey));
} else {
result = ((ECDHCUnifiedAgreement) agreement).calculateAgreement(pubKey);
}
} catch (final Exception e) {
throw new InvalidKeyException("calculation failed: " + e.getMessage()) {
public Throwable getCause() {
return e;
}
};
}
return null;
}
use of com.github.zhenwei.core.crypto.params.MQVPublicParameters in project LinLong-Java by zhenwei1108.
the class ECMQVBasicAgreement method calculateAgreement.
public BigInteger calculateAgreement(CipherParameters pubKey) {
if (Properties.isOverrideSet("org.bouncycastle.ec.disable_mqv")) {
throw new IllegalStateException("ECMQV explicitly disabled");
}
MQVPublicParameters pubParams = (MQVPublicParameters) pubKey;
ECPrivateKeyParameters staticPrivateKey = privParams.getStaticPrivateKey();
ECDomainParameters parameters = staticPrivateKey.getParameters();
if (!parameters.equals(pubParams.getStaticPublicKey().getParameters())) {
throw new IllegalStateException("ECMQV public key components have wrong domain parameters");
}
ECPoint agreement = calculateMqvAgreement(parameters, staticPrivateKey, privParams.getEphemeralPrivateKey(), privParams.getEphemeralPublicKey(), pubParams.getStaticPublicKey(), pubParams.getEphemeralPublicKey()).normalize();
if (agreement.isInfinity()) {
throw new IllegalStateException("Infinity is not a valid agreement value for MQV");
}
return agreement.getAffineXCoord().toBigInteger();
}
Aggregations