示例#1
0
        private IKeyAgreement FromDiffieHellmanDomainParameters(KrbSubjectPublicKeyInfo clientPublicValue)
        {
            var parameters = KrbDiffieHellmanDomainParameters.DecodeSpecial(clientPublicValue.Algorithm.Parameters.Value);

            IKeyAgreement agreement;

            if (this.IsSupportedAlgorithm(KeyAgreementAlgorithm.DiffieHellmanModp14, Oakley.Group14.Prime, parameters.P))
            {
                var cachedKey = this.Service.Principals.RetrieveKeyCache(KeyAgreementAlgorithm.DiffieHellmanModp14);

                agreement = CryptoPal.Platform.DiffieHellmanModp14(cachedKey);
            }
            else if (this.IsSupportedAlgorithm(KeyAgreementAlgorithm.DiffieHellmanModp2, Oakley.Group2.Prime, parameters.P))
            {
                var cachedKey = this.Service.Principals.RetrieveKeyCache(KeyAgreementAlgorithm.DiffieHellmanModp2);

                agreement = CryptoPal.Platform.DiffieHellmanModp2(cachedKey);
            }
            else
            {
                var length = parameters.P.Length * 8;

                throw new InvalidOperationException($"Unsupported Diffie Hellman key agreement parameter with length {length}");
            }

            var publicKey = DiffieHellmanKey.ParsePublicKey(clientPublicValue.SubjectPublicKey, agreement.PublicKey.KeyLength);

            agreement.ImportPartnerKey(publicKey);

            return(agreement);
        }
示例#2
0
        private async Task <IKeyAgreement> FromDiffieHellmanDomainParametersAsync(KrbSubjectPublicKeyInfo clientPublicValue)
        {
            var parameters = KrbDiffieHellmanDomainParameters.DecodeSpecial(clientPublicValue.Algorithm.Parameters.Value);

            IKeyAgreement agreement = null;

            switch (parameters.P.Length)
            {
            case 128:
                agreement = CryptoPal.Platform.DiffieHellmanModp2(
                    await Service.Principals.RetrieveKeyCache(KeyAgreementAlgorithm.DiffieHellmanModp2)
                    );
                break;

            case 256:
                agreement = CryptoPal.Platform.DiffieHellmanModp14(
                    await Service.Principals.RetrieveKeyCache(KeyAgreementAlgorithm.DiffieHellmanModp14)
                    );
                break;

            default:
                throw new InvalidOperationException("Unknown key agreement parameter");
            }

            var publicKey = DiffieHellmanKey.ParsePublicKey(clientPublicValue.SubjectPublicKey, agreement.PublicKey.KeyLength);

            agreement.ImportPartnerKey(publicKey);

            return(agreement);
        }
        private async Task <IKeyAgreement> FromDiffieHellmanDomainParametersAsync(KrbSubjectPublicKeyInfo clientPublicValue)
        {
            var parameters = KrbDiffieHellmanDomainParameters.DecodeSpecial(clientPublicValue.Algorithm.Parameters.Value);

            var agreement = parameters.P.Length switch
            {
                128 => CryptoPal.Platform.DiffieHellmanModp2(
                    await Service.Principals.RetrieveKeyCache(KeyAgreementAlgorithm.DiffieHellmanModp2)
                    ),
                256 => CryptoPal.Platform.DiffieHellmanModp14(
                    await Service.Principals.RetrieveKeyCache(KeyAgreementAlgorithm.DiffieHellmanModp14)
                    ),
                _ => throw new InvalidOperationException("Unknown key agreement parameter"),
            };

            var publicKey = DiffieHellmanKey.ParsePublicKey(clientPublicValue.SubjectPublicKey);

            agreement.ImportPartnerKey(publicKey);

            return(agreement);
        }
 private IKeyAgreement FromEllipticCurveDomainParameters(KrbSubjectPublicKeyInfo _)
 {
     throw new NotImplementedException();
 }