private KeyParameter CalculateAgreedWrapKey( string wrapAlg, AsymmetricKeyParameter senderPublicKey, AsymmetricKeyParameter receiverPrivateKey) { DerObjectIdentifier agreeAlgID = keyEncAlg.Algorithm; ICipherParameters senderPublicParams = senderPublicKey; ICipherParameters receiverPrivateParams = receiverPrivateKey; if (agreeAlgID.Id.Equals(CmsEnvelopedGenerator.ECMqvSha1Kdf)) { byte[] ukmEncoding = info.UserKeyingMaterial.GetOctets(); MQVuserKeyingMaterial ukm = MQVuserKeyingMaterial.GetInstance( Asn1Object.FromByteArray(ukmEncoding)); AsymmetricKeyParameter ephemeralKey = GetPublicKeyFromOriginatorPublicKey( receiverPrivateKey, ukm.EphemeralPublicKey); senderPublicParams = new MqvPublicParameters( (ECPublicKeyParameters)senderPublicParams, (ECPublicKeyParameters)ephemeralKey); receiverPrivateParams = new MqvPrivateParameters( (ECPrivateKeyParameters)receiverPrivateParams, (ECPrivateKeyParameters)receiverPrivateParams); } IBasicAgreement agreement = AgreementUtilities.GetBasicAgreementWithKdf( agreeAlgID, wrapAlg); agreement.Init(receiverPrivateParams); BigInteger agreedValue = agreement.CalculateAgreement(senderPublicParams); int wrapKeySize = GeneratorUtilities.GetDefaultKeySize(wrapAlg) / 8; byte[] wrapKeyBytes = X9IntegerConverter.IntegerToBytes(agreedValue, wrapKeySize); return(ParameterUtilities.CreateKeyParameter(wrapAlg, wrapKeyBytes)); }
private KeyParameter CalculateAgreedWrapKey(string wrapAlg, AsymmetricKeyParameter senderPublicKey, AsymmetricKeyParameter receiverPrivateKey) { DerObjectIdentifier objectID = this.keyEncAlg.ObjectID; ICipherParameters cipherParameters = senderPublicKey; ICipherParameters cipherParameters2 = receiverPrivateKey; if (objectID.Id.Equals(CmsEnvelopedGenerator.ECMqvSha1Kdf)) { byte[] octets = this.info.UserKeyingMaterial.GetOctets(); MQVuserKeyingMaterial instance = MQVuserKeyingMaterial.GetInstance(Asn1Object.FromByteArray(octets)); AsymmetricKeyParameter publicKeyFromOriginatorPublicKey = this.GetPublicKeyFromOriginatorPublicKey(receiverPrivateKey, instance.EphemeralPublicKey); cipherParameters = new MqvPublicParameters((ECPublicKeyParameters)cipherParameters, (ECPublicKeyParameters)publicKeyFromOriginatorPublicKey); cipherParameters2 = new MqvPrivateParameters((ECPrivateKeyParameters)cipherParameters2, (ECPrivateKeyParameters)cipherParameters2); } IBasicAgreement basicAgreementWithKdf = AgreementUtilities.GetBasicAgreementWithKdf(objectID, wrapAlg); basicAgreementWithKdf.Init(cipherParameters2); BigInteger s = basicAgreementWithKdf.CalculateAgreement(cipherParameters); int qLength = GeneratorUtilities.GetDefaultKeySize(wrapAlg) / 8; byte[] keyBytes = X9IntegerConverter.IntegerToBytes(s, qLength); return(ParameterUtilities.CreateKeyParameter(wrapAlg, keyBytes)); }