public RecipientOperator GetRecipientOperator(AlgorithmIdentifier keyEncAlg, AlgorithmIdentifier contentEncryptionAlgorithm, byte[] encryptedContentKey)
        {
            byte[] keyBytes = null;
            AsymmetricRsaPrivateKey rsaKey = privKey as AsymmetricRsaPrivateKey;

            if (rsaKey != null)
            {
                // random required for blinding operations
                keyBytes = CryptoServicesRegistrar.CreateService(rsaKey, random != null ? random: CryptoServicesRegistrar.GetSecureRandom()).CreateKeyUnwrapper(FipsRsa.WrapOaep.WithDigest(FipsShs.Sha1)).Unwrap(encryptedContentKey, 0, encryptedContentKey.Length).Collect();
            }
            IParameters <Algorithm> cipherParams = Utils.GetCipherParameters(contentEncryptionAlgorithm);

            ICipherBuilder <AlgorithmIdentifier> decryptor;

            if (Utils.IsBlockMode(cipherParams.Algorithm))
            {
                decryptor = new PkixBlockCipherBuilder(contentEncryptionAlgorithm, Utils.CreateBlockDecryptorBuilder(contentEncryptionAlgorithm, keyBytes, cipherParams));
            }
            else if (Utils.IsAeadMode(cipherParams.Algorithm))
            {
                decryptor = new PkixAeadCipherBuilder(contentEncryptionAlgorithm, Utils.CreateAeadDecryptorBuilder(contentEncryptionAlgorithm, keyBytes, cipherParams));
            }
            else
            {
                decryptor = new PkixCipherBuilder(contentEncryptionAlgorithm, Utils.CreateDecryptorBuilder(contentEncryptionAlgorithm, keyBytes, cipherParams));
            }

            return(new RecipientOperator(decryptor));
        }
        /// <summary>
        /// Build a MAC factory based on the current configuration, keyed using password.
        /// </summary>
        /// <param name="password">the password to derive the MAC key from.</param>
        /// <returns>a new MAC factory for PKCS#12</returns>
        public IMacFactory <Pkcs12MacAlgDescriptor> Build(char[] password)
        {
            IPasswordBasedDeriver <Pbkd.PbkdParameters> deriver = CryptoServicesRegistrar.CreateService(Pbkd.Pkcs12).From(PasswordConverter.PKCS12, password)
                                                                  .WithPrf(prf).WithSalt(salt).WithIterationCount(iterationCount).Build();

            return(new Pkcs12MacFactory(new Pkcs12MacAlgDescriptor((AlgorithmIdentifier)Utils.pkcs12MacAlgIds[prf], salt, iterationCount), password));
        }
            internal SecretKeyDecryptor(SymmetricKeyAlgorithmTag symAlg, byte[] key, byte[] iv, S2k s2k, IDigestFactory <PgpDigestTypeIdentifier> checksumCalculatorFactory)
            {
                FipsTripleDes.ParametersWithIV parameters;

                parameters = FipsTripleDes.Cfb64.WithIV(iv);


                this.s2k      = s2k;
                cipherBuilder = CryptoServicesRegistrar.CreateService(new FipsTripleDes.Key(key)).CreateDecryptorBuilder(FipsTripleDes.Cfb64.WithIV(iv));
            }
            public SigWithDigestFactory(PublicKeyAlgorithmTag keyAlg, HashAlgorithmTag hashAlg, long keyId, AsymmetricRsaPrivateKey privateKey)
            {
                this.keyAlg     = keyAlg;
                this.hashAlg    = hashAlg;
                this.keyId      = keyId;
                this.privateKey = privateKey;

                sigFact = CryptoServicesRegistrar.CreateService(privateKey, new SecureRandom()).CreateSignatureFactory(FipsRsa.Pkcs1v15.WithDigest((FipsDigestAlgorithm)PgpUtils.digests[hashAlg]));
                digFact = CryptoServicesRegistrar.CreateService((FipsShs.Parameters)PgpUtils.digests[hashAlg]);
            }
예제 #5
0
        internal Pkcs12MacFactory(Pkcs12MacAlgDescriptor algDetails, char[] password)
        {
            this.algDetails = algDetails;

            DigestAlgorithm prf = (DigestAlgorithm)Utils.digestTable[algDetails.DigestAlgorithm.Algorithm];

            IPasswordBasedDeriver <Pbkd.PbkdParameters> deriver = CryptoServicesRegistrar.CreateService(Pbkd.Pkcs12).From(PasswordConverter.PKCS12, password)
                                                                  .WithPrf(prf).WithSalt(algDetails.GetIV()).WithIterationCount(algDetails.IterationCount).Build();

            this.baseFactory = CryptoServicesRegistrar.CreateService(new FipsShs.Key(FipsShs.Sha1HMac, deriver.DeriveKey(TargetKeyType.MAC, (int)Utils.digestSize[prf]))).CreateMacFactory((FipsShs.AuthenticationParameters)Utils.pkcs12MacIds[prf]);
        }
        public byte[] CalculateFingerprint(PublicKeyPacket publicPk)
        {
            IBcpgKey key = publicPk.Key;

            if (publicPk.Version <= 3)
            {
                RsaPublicBcpgKey rK = (RsaPublicBcpgKey)key;

                try
                {
                    // TODO: MD5 needs to go in the main API...
                    MD5Digest digest = new MD5Digest();

                    byte[] bytes = new MPInteger(rK.Modulus).GetEncoded();
                    digest.BlockUpdate(bytes, 2, bytes.Length - 2);

                    bytes = new MPInteger(rK.PublicExponent).GetEncoded();
                    digest.BlockUpdate(bytes, 2, bytes.Length - 2);

                    byte[] digBuf = new byte[digest.GetDigestSize()];

                    digest.DoFinal(digBuf, 0);

                    return(digBuf);
                }
                catch (IOException e)
                {
                    throw new PgpException("can't encode key components: " + e.Message, e);
                }
            }
            else
            {
                try
                {
                    byte[] kBytes = publicPk.GetEncodedContents();

                    IStreamCalculator <IBlockResult> hashCalc = CryptoServicesRegistrar.CreateService(FipsShs.Sha1).CreateCalculator();
                    Stream hStream = hashCalc.Stream;

                    hStream.WriteByte((byte)0x99);
                    hStream.WriteByte((byte)(kBytes.Length >> 8));
                    hStream.WriteByte((byte)kBytes.Length);
                    hStream.Write(kBytes, 0, kBytes.Length);

                    hStream.Close();

                    return(hashCalc.GetResult().Collect());
                }
                catch (IOException e)
                {
                    throw new PgpException("can't encode key components: " + e.Message, e);
                }
            }
        }
예제 #7
0
        protected override byte[] GenerateWrappedKey(ISymmetricKey contentKey)
        {
            AsymmetricRsaPublicKey rsaKey = asymmetricPublicKey as AsymmetricRsaPublicKey;

            if (rsaKey != null)
            {
                IKeyWrapper <FipsRsa.OaepWrapParameters> wrapper = CryptoServicesRegistrar.CreateService(rsaKey, new Security.SecureRandom()).CreateKeyWrapper(FipsRsa.WrapOaep.WithDigest(FipsShs.Sha1));

                byte[] encKey = wrapper.Wrap(contentKey.GetKeyBytes()).Collect();

                return(encKey);
            }

            throw new InvalidOperationException("algorithm for public key not matched");
        }
예제 #8
0
        internal static IBlockCipherBuilder <IParameters <Algorithm> > CreateBlockEncryptorBuilder(AlgorithmIdentifier encScheme, byte[] derivedKey, byte[] iv)
        {
            DerObjectIdentifier encSchemeAlg = encScheme.Algorithm;

            if (encSchemeAlg.Equals(PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc))
            {
                IBlockCipherService service = CryptoServicesRegistrar.CreateService(new FipsTripleDes.Key(derivedKey));

                return(service.CreateBlockEncryptorBuilder(FipsTripleDes.Cbc.WithIV(iv)));
            }
            if (encSchemeAlg.Equals(PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc))
            {
                IBlockCipherService service = CryptoServicesRegistrar.CreateService(new FipsTripleDes.Key(derivedKey));

                return(service.CreateBlockEncryptorBuilder(FipsTripleDes.Cbc.WithIV(iv)));
            }
            throw new ArgumentException("cannot match decryption algorithm");
        }
예제 #9
0
        internal static IAeadCipherBuilder <IParameters <Algorithm> > CreateAeadEncryptorBuilder(DerObjectIdentifier keyEncAlgorithm, byte[] derivedKey, IParameters <Algorithm> parameters)
        {
            DerObjectIdentifier encSchemeAlg = keyEncAlgorithm;

            if (encSchemeAlg.On(NistObjectIdentifiers.Aes))
            {
                IAeadBlockCipherService service = CryptoServicesRegistrar.CreateService(new FipsAes.Key(derivedKey));

                if (encSchemeAlg.Equals(NistObjectIdentifiers.IdAes128Ccm) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes192Ccm) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes256Ccm))
                {
                    return(service.CreateAeadEncryptorBuilder((FipsAes.AuthenticationParametersWithIV)parameters));
                }
                if (encSchemeAlg.Equals(NistObjectIdentifiers.IdAes128Gcm) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes192Gcm) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes256Gcm))
                {
                    return(service.CreateAeadEncryptorBuilder((FipsAes.AuthenticationParametersWithIV)parameters));
                }
            }

            throw new ArgumentException("cannot match encryption algorithm");
        }
예제 #10
0
        internal static ICipherBuilder <IParameters <Algorithm> > CreateDecryptorBuilder(AlgorithmIdentifier encScheme, byte[] derivedKey, IParameters <Algorithm> parameters)
        {
            DerObjectIdentifier encSchemeAlg = encScheme.Algorithm;

            if (encSchemeAlg.On(NistObjectIdentifiers.Aes))
            {
                IAeadBlockCipherService service = CryptoServicesRegistrar.CreateService(new FipsAes.Key(derivedKey));

                if (encSchemeAlg.Equals(NistObjectIdentifiers.IdAes128Cfb) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes192Cfb) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes256Cfb))
                {
                    return(service.CreateDecryptorBuilder(parameters));
                }
                if (encSchemeAlg.Equals(NistObjectIdentifiers.IdAes128Ofb) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes192Ofb) || encSchemeAlg.Equals(NistObjectIdentifiers.IdAes256Ofb))
                {
                    return(service.CreateDecryptorBuilder(parameters));
                }
            }

            throw new ArgumentException("cannot match decryption algorithm");
        }
        public IVerifierFactory <AlgorithmIdentifier> CreateVerifierFactory(AlgorithmIdentifier signatureAlgorithmID, AlgorithmIdentifier digestAlgorithmID)
        {
            IVerifierFactory <IParameters <Algorithm> > baseVerifier;

            AsymmetricRsaPublicKey rsaKey = publicKey as AsymmetricRsaPublicKey;

            if (rsaKey != null)
            {
                IVerifierFactoryService verifierService = CryptoServicesRegistrar.CreateService(rsaKey);

                if (signatureAlgorithmID.Algorithm.Equals(PkcsObjectIdentifiers.IdRsassaPss))
                {
                    FipsRsa.PssSignatureParameters pssParams = FipsRsa.Pss;
                    RsassaPssParameters            sigParams = RsassaPssParameters.GetInstance(signatureAlgorithmID.Parameters);

                    pssParams = pssParams.WithDigest((FipsDigestAlgorithm)Utils.digestTable[sigParams.HashAlgorithm.Algorithm]);
                    AlgorithmIdentifier mgfDigAlg = AlgorithmIdentifier.GetInstance(AlgorithmIdentifier.GetInstance(sigParams.MaskGenAlgorithm).Parameters);
                    pssParams = pssParams.WithMgfDigest((FipsDigestAlgorithm)Utils.digestTable[mgfDigAlg.Algorithm]);

                    pssParams = pssParams.WithSaltLength(sigParams.SaltLength.Value.IntValue);

                    return(CreateVerifierFactory(signatureAlgorithmID, verifierService.CreateVerifierFactory(pssParams), certificate));
                }
                else if (PkixVerifierFactoryProvider.pkcs1Table.Contains(signatureAlgorithmID.Algorithm))
                {
                    FipsRsa.SignatureParameters rsaParams = FipsRsa.Pkcs1v15.WithDigest((FipsDigestAlgorithm)PkixVerifierFactoryProvider.pkcs1Table[signatureAlgorithmID.Algorithm]);

                    return(CreateVerifierFactory(signatureAlgorithmID, verifierService.CreateVerifierFactory(rsaParams), certificate));
                }
                else if (signatureAlgorithmID.Algorithm.Equals(PkcsObjectIdentifiers.RsaEncryption))
                {
                    FipsRsa.SignatureParameters rsaParams = FipsRsa.Pkcs1v15.WithDigest((FipsDigestAlgorithm)Utils.digestTable[digestAlgorithmID.Algorithm]);

                    return(CreateVerifierFactory(signatureAlgorithmID, verifierService.CreateVerifierFactory(rsaParams), certificate));
                }
            }

            throw new ArgumentException("cannot match signature algorithm: " + signatureAlgorithmID.Algorithm);
        }
예제 #12
0
        private static byte[] getKey(
            char[] password,
            int keyLength,
            byte[] salt,
            bool des2)
        {
            IPasswordBasedDeriver <Pbkd.OpenSslParameters> paramsGen = CryptoServicesRegistrar.CreateService(Pbkd.OpenSsl).From(PasswordConverter.ASCII.Convert(password)).WithSalt(salt).Build();

            byte[] derivedKey = paramsGen.DeriveKey(TargetKeyType.CIPHER, keyLength);

            if (des2 && derivedKey.Length == 24)
            {
                // For DES2, we must copy first 8 bytes into the last 8 bytes.
                byte[] key = derivedKey;

                Array.Copy(key, 0, key, 16, 8);

                return(key);
            }

            return(derivedKey);
        }
예제 #13
0
            internal SecretKeyEncryptor(SymmetricKeyAlgorithmTag symAlg, byte[] key, byte[] iv, S2k s2k, IDigestFactory <PgpDigestTypeIdentifier> checksumCalculatorFactory)
            {
                FipsTripleDes.ParametersWithIV parameters;
                if (iv != null)
                {
                    parameters = FipsTripleDes.Cfb64.WithIV(iv);
                    this.iv    = iv;
                }
                else
                {
                    if (this.random == null)
                    {
                        this.random = new SecureRandom();
                    }

                    parameters = FipsTripleDes.Cfb64.WithIV(random);

                    this.iv = parameters.GetIV();
                }
                this.s2k = s2k;

                cipherBuilder = CryptoServicesRegistrar.CreateService(new FipsTripleDes.Key(key)).CreateEncryptorBuilder(FipsTripleDes.Cfb64.WithIV(iv));
            }
        public ICipherBuilder <AlgorithmIdentifier> Build(char[] password)
        {
            if (algorithm.Equals(PkcsObjectIdentifiers.IdPbeS2))
            {
                IPasswordBasedDeriverBuilder <FipsPbkd.Parameters> pbeDeriverBuilder = CryptoServicesRegistrar.CreateService(FipsPbkd.PbkdF2).From(converter, password);

                IPasswordBasedDeriver <FipsPbkd.Parameters> pbeDeriver = pbeDeriverBuilder
                                                                         .WithPrf(digestAlgorithm)
                                                                         .WithSalt(salt)
                                                                         .WithIterationCount(iterationCount)
                                                                         .Build();

                byte[] keyEnc = pbeDeriver.DeriveKey(TargetKeyType.CIPHER, (int)Utils.keySizesInBytes[keyEncAlgorithm]);

                EncryptionScheme encScheme = Utils.GetEncryptionSchemeIdentifier(keyEncAlgorithm, random);

                PbeS2Parameters algParams = new PbeS2Parameters(
                    new KeyDerivationFunc(PkcsObjectIdentifiers.IdPbkdf2, new Pbkdf2Params(salt, iterationCount,
                                                                                           new AlgorithmIdentifier((DerObjectIdentifier)Utils.digestTable[digestAlgorithm], DerNull.Instance))),
                    encScheme);


                IParameters <Algorithm> cipherParams = Utils.GetCipherParameters(encScheme);

                if (Utils.IsBlockMode(cipherParams.Algorithm))
                {
                    return(new PbeBlockCipherBuilder(new AlgorithmIdentifier(PkcsObjectIdentifiers.IdPbeS2, algParams), Utils.CreateBlockEncryptorBuilder(keyEncAlgorithm, keyEnc, cipherParams)));
                }
                else if (Utils.IsAeadMode(cipherParams.Algorithm))
                {
                    return(new PkixAeadCipherBuilder(new AlgorithmIdentifier(PkcsObjectIdentifiers.IdPbeS2, algParams), Utils.CreateAeadEncryptorBuilder(keyEncAlgorithm, keyEnc, cipherParams)));
                }
                else
                {
                    return(new PkixCipherBuilder(new AlgorithmIdentifier(PkcsObjectIdentifiers.IdPbeS2, algParams), Utils.CreateEncryptorBuilder(keyEncAlgorithm, keyEnc, cipherParams)));
                }
            }
            else if (algorithm.Equals(PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc) ||
                     algorithm.Equals(PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc))
            {
                int             keySize   = algorithm.Equals(PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc) ? 16 : 24;
                Pkcs12PbeParams pbeParams = new Pkcs12PbeParams(salt, iterationCount);
                // we ignore converter as it's specified by the algorithm
                IPasswordBasedDeriverBuilder <Pbkd.PbkdParameters> pbeDeriverBuilder = CryptoServicesRegistrar.CreateService(Pbkd.Pkcs12).From(PasswordConverter.PKCS12, password);

                IPasswordBasedDeriver <Pbkd.PbkdParameters> pbeDeriver = pbeDeriverBuilder
                                                                         .WithPrf(FipsShs.Sha1)
                                                                         .WithSalt(pbeParams.GetIV())
                                                                         .WithIterationCount(pbeParams.Iterations.IntValue)
                                                                         .Build();

                byte[][]            keyIV      = pbeDeriver.DeriveKeyAndIV(TargetKeyType.CIPHER, keySize, 8);
                AlgorithmIdentifier algDetails = new AlgorithmIdentifier(algorithm, pbeParams);

                return(new PbeBlockCipherBuilder(algDetails, Utils.CreateBlockEncryptorBuilder(algDetails, keyIV[0], keyIV[1])));
            }

            throw new InvalidOperationException("cannot match algorithm: " + algorithm);
        }
예제 #15
0
 public PkixDigestFactory(AlgorithmIdentifier algorithmID)
 {
     this.algorithmID = algorithmID;
     this.digestFact  = CryptoServicesRegistrar.CreateService((FipsShs.Parameters)Utils.digestTable[algorithmID.Algorithm]);
 }
            public ICipherBuilder <AlgorithmIdentifier> CreateDecryptorBuilder(AlgorithmIdentifier algorithmDetails)
            {
                if (algorithmDetails.Algorithm.Equals(PkcsObjectIdentifiers.IdPbeS2))
                {
                    IPasswordBasedDeriverBuilder <FipsPbkd.Parameters> pbeDeriverBuilder = CryptoServicesRegistrar.CreateService(FipsPbkd.PbkdF2).From(converter.Convert(password));
                    PbeS2Parameters     pbeParams   = PbeS2Parameters.GetInstance(algorithmDetails.Parameters);
                    Pbkdf2Params        pbkdfParams = Pbkdf2Params.GetInstance(pbeParams.KeyDerivationFunc.Parameters);
                    AlgorithmIdentifier encScheme   = pbeParams.EncryptionScheme;
                    IPasswordBasedDeriver <FipsPbkd.Parameters> pbeDeriver = pbeDeriverBuilder
                                                                             .WithPrf((DigestAlgorithm)Utils.digestTable[pbkdfParams.Prf.Algorithm])
                                                                             .WithSalt(pbkdfParams.GetSalt())
                                                                             .WithIterationCount(pbkdfParams.IterationCount.IntValue)
                                                                             .Build();

                    byte[] keyEnc = pbeDeriver.DeriveKey(TargetKeyType.CIPHER, (pbkdfParams.KeyLength != null ? pbkdfParams.KeyLength.IntValue : (int)Utils.keySizesInBytes[encScheme.Algorithm]));
                    IParameters <Algorithm> cipherParams = Utils.GetCipherParameters(encScheme);

                    if (Utils.IsBlockMode(cipherParams.Algorithm))
                    {
                        return(new PbeBlockCipherBuilder(algorithmDetails, Utils.CreateBlockDecryptorBuilder(encScheme, keyEnc, cipherParams)));
                    }
                    else if (Utils.IsAeadMode(cipherParams.Algorithm))
                    {
                        return(new PkixAeadCipherBuilder(algorithmDetails, Utils.CreateAeadDecryptorBuilder(encScheme, keyEnc, cipherParams)));
                    }
                    else
                    {
                        return(new PkixCipherBuilder(algorithmDetails, Utils.CreateDecryptorBuilder(encScheme, keyEnc, cipherParams)));
                    }
                }
                else if (algorithmDetails.Algorithm.Equals(PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc) ||
                         algorithmDetails.Algorithm.Equals(PkcsObjectIdentifiers.PbeWithShaAnd3KeyTripleDesCbc))
                {
                    int             keySize   = algorithmDetails.Algorithm.Equals(PkcsObjectIdentifiers.PbeWithShaAnd2KeyTripleDesCbc) ? 16 : 24;
                    Pkcs12PbeParams pbeParams = Pkcs12PbeParams.GetInstance(algorithmDetails.Parameters);
                    // we ignore converter as it's specified by the algorithm
                    IPasswordBasedDeriverBuilder <Pbkd.PbkdParameters> pbeDeriverBuilder = CryptoServicesRegistrar.CreateService(Pbkd.Pkcs12).From(PasswordConverter.PKCS12, password);

                    IPasswordBasedDeriver <Pbkd.PbkdParameters> pbeDeriver = pbeDeriverBuilder
                                                                             .WithPrf(FipsShs.Sha1)
                                                                             .WithSalt(pbeParams.GetIV())
                                                                             .WithIterationCount(pbeParams.Iterations.IntValue)
                                                                             .Build();

                    byte[][] keyIV = pbeDeriver.DeriveKeyAndIV(TargetKeyType.CIPHER, keySize, 8);

                    return(new PbeBlockCipherBuilder(algorithmDetails, Utils.CreateDecryptorBuilder(algorithmDetails, keyIV[0], keyIV[1])));
                }

                throw new InvalidOperationException("cannot match algorithm: " + algorithmDetails.Algorithm);
            }
예제 #17
0
        /// <summary>
        /// Return a verifier factory that produces verifiers conforming to algorithmDetails.
        /// </summary>
        /// <param name="algorithmDetails">The configuration parameters for verifiers produced by the resulting factory.</param>
        /// <returns>A new verifier factory.</returns>
        public IVerifierFactory <AlgorithmIdentifier> CreateVerifierFactory(AlgorithmIdentifier algorithmDetails)
        {
            AsymmetricRsaPublicKey rsaKey = publicKey as AsymmetricRsaPublicKey;

            if (rsaKey != null)
            {
                IVerifierFactoryService verifierService = CryptoServicesRegistrar.CreateService(rsaKey);

                if (algorithmDetails.Algorithm.Equals(PkcsObjectIdentifiers.IdRsassaPss))
                {
                    FipsRsa.PssSignatureParameters pssParams = FipsRsa.Pss;
                    RsassaPssParameters            sigParams = RsassaPssParameters.GetInstance(algorithmDetails.Parameters);

                    pssParams = pssParams.WithDigest((FipsDigestAlgorithm)Utils.digestTable[sigParams.HashAlgorithm.Algorithm]);
                    AlgorithmIdentifier mgfDigAlg = AlgorithmIdentifier.GetInstance(AlgorithmIdentifier.GetInstance(sigParams.MaskGenAlgorithm).Parameters);
                    pssParams = pssParams.WithMgfDigest((FipsDigestAlgorithm)Utils.digestTable[mgfDigAlg.Algorithm]);

                    pssParams = pssParams.WithSaltLength(sigParams.SaltLength.Value.IntValue);

                    return(CreateVerifierFactory(algorithmDetails, verifierService.CreateVerifierFactory(pssParams), certificate));
                }
                else if (pkcs1Table.Contains(algorithmDetails.Algorithm))
                {
                    FipsRsa.SignatureParameters rsaParams = FipsRsa.Pkcs1v15.WithDigest((FipsDigestAlgorithm)pkcs1Table[algorithmDetails.Algorithm]);

                    return(CreateVerifierFactory(algorithmDetails, verifierService.CreateVerifierFactory(rsaParams), certificate));
                }
            }

            AsymmetricDsaPublicKey dsaKey = publicKey as AsymmetricDsaPublicKey;

            if (dsaKey != null)
            {
                IVerifierFactoryService verifierService = CryptoServicesRegistrar.CreateService(dsaKey);

                FipsDsa.SignatureParameters sigParams = (FipsDsa.SignatureParameters)dsaTable[algorithmDetails.Algorithm];

                return(CreateVerifierFactory(algorithmDetails, verifierService.CreateVerifierFactory(sigParams), certificate));
            }

            AsymmetricECPublicKey ecdsaKey = publicKey as AsymmetricECPublicKey;

            if (ecdsaKey != null)
            {
                IVerifierFactoryService verifierService = CryptoServicesRegistrar.CreateService(ecdsaKey);

                FipsEC.SignatureParameters sigParams = (FipsEC.SignatureParameters)ecdsaTable[algorithmDetails.Algorithm];

                return(CreateVerifierFactory(algorithmDetails, verifierService.CreateVerifierFactory(sigParams), certificate));
            }

            AsymmetricSphincsPublicKey sphincsKey = publicKey as AsymmetricSphincsPublicKey;

            if (sphincsKey != null)
            {
                IVerifierFactoryService verifierService = CryptoServicesRegistrar.CreateService(sphincsKey);
                if (algorithmDetails.Algorithm.Equals(BCObjectIdentifiers.sphincs256_with_SHA512))
                {
                    return(CreateVerifierFactory(algorithmDetails, verifierService.CreateVerifierFactory(Sphincs.Sphincs256), certificate));
                }
                else
                {
                    return(CreateVerifierFactory(algorithmDetails, verifierService.CreateVerifierFactory(Sphincs.Sphincs256.WithDigest(FipsShs.Sha3_512)), certificate));
                }
            }

            throw new ArgumentException("cannot match signature algorithm");
        }
예제 #18
0
        internal static ICipherBuilder <DekInfo> Crypt(
            bool encrypt,
            char[] password,
            String dekAlgName,
            byte[] iv)
        {
            byte[] ivValue   = iv;
            String blockMode = "CBC";

            byte[] sKey;
            IBlockCipherService cipherService = null;
            IBlockCipherBuilder <IParameters <Algorithm> > blockCipherBuilder = null;
            ICipherBuilder <IParameters <Algorithm> >      cipherBuilder      = null;

            DekInfo dekInfo;

            if (iv != null && iv.Length != 0)
            {
                dekInfo = new DekInfo(dekAlgName + "," + Hex.ToHexString(iv));
            }
            else
            {
                dekInfo = new DekInfo(dekAlgName);
            }
            // Figure out block mode and padding.
            if (dekAlgName.EndsWith("-CFB"))
            {
                blockMode = "CFB";
            }
            if (dekAlgName.EndsWith("-ECB") ||
                "DES-EDE".Equals(dekAlgName) ||
                "DES-EDE3".Equals(dekAlgName))
            {
                // ECB is actually the default (though seldom used) when OpenSSL
                // uses DES-EDE (des2) or DES-EDE3 (des3).
                blockMode = "ECB";
            }
            if (dekAlgName.EndsWith("-OFB"))
            {
                blockMode = "OFB";
            }

            // Figure out algorithm and key size.
            if (dekAlgName.StartsWith("DES-EDE"))
            {
                // "DES-EDE" is actually des2 in OpenSSL-speak!
                // "DES-EDE3" is des3.
                bool des2 = !dekAlgName.StartsWith("DES-EDE3");

                FipsTripleDes.Key tdesKey = new FipsTripleDes.Key(getKey(password, 24, iv, des2));
                cipherService = CryptoServicesRegistrar.CreateService(tdesKey);

                if (blockMode.Equals("CBC"))
                {
                    if (encrypt)
                    {
                        blockCipherBuilder = cipherService.CreateBlockEncryptorBuilder(FipsTripleDes.Cbc.WithIV(ivValue));
                    }
                    else
                    {
                        blockCipherBuilder = cipherService.CreateBlockDecryptorBuilder(FipsTripleDes.Cbc.WithIV(ivValue));
                    }
                }
                else if (blockMode.Equals("CFB"))
                {
                    if (encrypt)
                    {
                        cipherBuilder = cipherService.CreateEncryptorBuilder(FipsTripleDes.Cfb64.WithIV(ivValue));
                    }
                    else
                    {
                        cipherBuilder = cipherService.CreateDecryptorBuilder(FipsTripleDes.Cfb64.WithIV(ivValue));
                    }
                }
                else if (blockMode.Equals("OFB"))
                {
                    if (encrypt)
                    {
                        cipherBuilder = cipherService.CreateEncryptorBuilder(FipsTripleDes.Ofb.WithIV(ivValue));
                    }
                    else
                    {
                        cipherBuilder = cipherService.CreateDecryptorBuilder(FipsTripleDes.Ofb.WithIV(ivValue));
                    }
                }
                else
                {
                    if (encrypt)
                    {
                        blockCipherBuilder = cipherService.CreateBlockEncryptorBuilder(FipsTripleDes.Ecb);
                    }
                    else
                    {
                        blockCipherBuilder = cipherService.CreateBlockDecryptorBuilder(FipsTripleDes.Ecb);
                    }
                }
            }
            else if (dekAlgName.StartsWith("DES-"))
            {
                sKey = getKey(password, 8, iv);
                throw new InvalidOperationException("no support for DES");
            }
            else if (dekAlgName.StartsWith("BF-"))
            {
                sKey = getKey(password, 16, iv);
                throw new InvalidOperationException("no support for Blowfish");
            }
            else if (dekAlgName.StartsWith("RC2-"))
            {
                int keyBits = 128;
                if (dekAlgName.StartsWith("RC2-40-"))
                {
                    keyBits = 40;
                }
                else if (dekAlgName.StartsWith("RC2-64-"))
                {
                    keyBits = 64;
                }
                //sKey = new RC2Parameters(getKey(password, keyBits / 8, iv).getKey(), keyBits);
                throw new InvalidOperationException("no support for RC2");
            }
            else if (dekAlgName.StartsWith("AES-"))
            {
                byte[] salt = iv;
                if (salt.Length > 8)
                {
                    salt = new byte[8];
                    Array.Copy(iv, 0, salt, 0, 8);
                }

                int keyBits;
                if (dekAlgName.StartsWith("AES-128-"))
                {
                    keyBits = 128;
                }
                else if (dekAlgName.StartsWith("AES-192-"))
                {
                    keyBits = 192;
                }
                else if (dekAlgName.StartsWith("AES-256-"))
                {
                    keyBits = 256;
                }
                else
                {
                    throw new InvalidOperationException("unknown AES encryption with private key: " + dekAlgName);
                }

                FipsAes.Key aesKey = new FipsAes.Key(getKey(password, keyBits / 8, salt));
                cipherService = CryptoServicesRegistrar.CreateService(aesKey);

                if (blockMode.Equals("CBC"))
                {
                    if (encrypt)
                    {
                        blockCipherBuilder = cipherService.CreateBlockEncryptorBuilder(FipsAes.Cbc.WithIV(ivValue));
                    }
                    else
                    {
                        blockCipherBuilder = cipherService.CreateBlockDecryptorBuilder(FipsAes.Cbc.WithIV(ivValue));
                    }
                }
                else if (blockMode.Equals("CFB"))
                {
                    if (encrypt)
                    {
                        cipherBuilder = cipherService.CreateEncryptorBuilder(FipsAes.Cfb128.WithIV(ivValue));
                    }
                    else
                    {
                        cipherBuilder = cipherService.CreateDecryptorBuilder(FipsAes.Cfb128.WithIV(ivValue));
                    }
                }
                else if (blockMode.Equals("OFB"))
                {
                    if (encrypt)
                    {
                        cipherBuilder = cipherService.CreateEncryptorBuilder(FipsAes.Ofb.WithIV(ivValue));
                    }
                    else
                    {
                        cipherBuilder = cipherService.CreateDecryptorBuilder(FipsAes.Ofb.WithIV(ivValue));
                    }
                }
                else
                {
                    if (encrypt)
                    {
                        blockCipherBuilder = cipherService.CreateBlockEncryptorBuilder(FipsAes.Ecb);
                    }
                    else
                    {
                        blockCipherBuilder = cipherService.CreateBlockDecryptorBuilder(FipsAes.Ecb);
                    }
                }
            }
            else
            {
                throw new InvalidOperationException("unknown encryption with private key: " + dekAlgName);
            }

            if (blockMode.Equals("CBC") || blockMode.Equals("ECB"))
            {
                if (encrypt)
                {
                    return(new PemBlockCipherImpl(encrypt, dekInfo, blockCipherBuilder));
                }
                else
                {
                    return(new PemBlockCipherImpl(encrypt, dekInfo, blockCipherBuilder));
                }
            }
            else
            {
                if (encrypt)
                {
                    return(new PemCipherImpl(dekInfo, cipherBuilder));
                }
                else
                {
                    return(new PemCipherImpl(dekInfo, cipherBuilder));
                }
            }
        }
 private static IVerifierFactory <IParameters <Algorithm> > getVerifier(PgpPublicKey key, HashAlgorithmTag hashAlg)
 {
     return(CryptoServicesRegistrar.CreateService((AsymmetricRsaPublicKey)KeyFactory.ConvertPublic(key)).CreateVerifierFactory(FipsRsa.Pkcs1v15.WithDigest((FipsDigestAlgorithm)PgpUtils.digests[hashAlg])));
 }
예제 #20
0
 /// <summary>
 /// Construct a KDF using the given PRF to process the agreed value with. The outputSize parameter determines how many bytes
 /// will be generated.
 /// </summary>
 /// <param name="kdfBuilder">KDF algorithm builder to use for parameter creation.</param>
 /// <param name="prf">The PRF to use in the KDF.</param>
 /// <param name="iv">The iv parameter for KDF initialization.</param>
 /// <param name="outputSize">The size of the output to be generated from the KDF.</param>
 public FipsKdfKmg(FipsKdf.AgreementKdfBuilderService kdfBuilder, FipsPrfAlgorithm prf, byte[] iv, int outputSize)
 {
     this.kdfBuilder = CryptoServicesRegistrar.CreateService(kdfBuilder).WithPrf(prf);
     this.iv         = Arrays.Clone(iv);
     this.outputSize = outputSize;
 }
예제 #21
0
        static Utils()
        {
            algorithms.Add("SHA1WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha1WithRsaEncryption);
            algorithms.Add("SHA1WITHRSA", PkcsObjectIdentifiers.Sha1WithRsaEncryption);
            algorithms.Add("SHA224WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha224WithRsaEncryption);
            algorithms.Add("SHA224WITHRSA", PkcsObjectIdentifiers.Sha224WithRsaEncryption);
            algorithms.Add("SHA256WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha256WithRsaEncryption);
            algorithms.Add("SHA256WITHRSA", PkcsObjectIdentifiers.Sha256WithRsaEncryption);
            algorithms.Add("SHA384WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha384WithRsaEncryption);
            algorithms.Add("SHA384WITHRSA", PkcsObjectIdentifiers.Sha384WithRsaEncryption);
            algorithms.Add("SHA512WITHRSAENCRYPTION", PkcsObjectIdentifiers.Sha512WithRsaEncryption);
            algorithms.Add("SHA512WITHRSA", PkcsObjectIdentifiers.Sha512WithRsaEncryption);
            algorithms.Add("SHA1WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
            algorithms.Add("SHA224WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
            algorithms.Add("SHA256WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
            algorithms.Add("SHA384WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
            algorithms.Add("SHA512WITHRSAANDMGF1", PkcsObjectIdentifiers.IdRsassaPss);
            algorithms.Add("SHA1WITHDSA", X9ObjectIdentifiers.IdDsaWithSha1);
            algorithms.Add("DSAWITHSHA1", X9ObjectIdentifiers.IdDsaWithSha1);
            algorithms.Add("SHA224WITHDSA", NistObjectIdentifiers.DsaWithSha224);
            algorithms.Add("SHA256WITHDSA", NistObjectIdentifiers.DsaWithSha256);
            algorithms.Add("SHA384WITHDSA", NistObjectIdentifiers.DsaWithSha384);
            algorithms.Add("SHA512WITHDSA", NistObjectIdentifiers.DsaWithSha512);
            algorithms.Add("SHA1WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha1);
            algorithms.Add("ECDSAWITHSHA1", X9ObjectIdentifiers.ECDsaWithSha1);
            algorithms.Add("SHA224WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha224);
            algorithms.Add("SHA256WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha256);
            algorithms.Add("SHA384WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha384);
            algorithms.Add("SHA512WITHECDSA", X9ObjectIdentifiers.ECDsaWithSha512);

            //
            // According to RFC 3279, the ASN.1 encoding SHALL (id-dsa-with-sha1) or MUST (ecdsa-with-SHA*) omit the parameters field.
            // The parameters field SHALL be NULL for RSA based signature algorithms.
            //
            noParams.Add(X9ObjectIdentifiers.ECDsaWithSha1);
            noParams.Add(X9ObjectIdentifiers.ECDsaWithSha224);
            noParams.Add(X9ObjectIdentifiers.ECDsaWithSha256);
            noParams.Add(X9ObjectIdentifiers.ECDsaWithSha384);
            noParams.Add(X9ObjectIdentifiers.ECDsaWithSha512);
            noParams.Add(X9ObjectIdentifiers.IdDsaWithSha1);
            noParams.Add(NistObjectIdentifiers.DsaWithSha224);
            noParams.Add(NistObjectIdentifiers.DsaWithSha256);
            noParams.Add(NistObjectIdentifiers.DsaWithSha384);
            noParams.Add(NistObjectIdentifiers.DsaWithSha512);

            //
            // explicit params
            //
            AlgorithmIdentifier sha1AlgId = new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance);

            exParams.Add("SHA1WITHRSAANDMGF1", CreatePssParams(sha1AlgId, 20));
            pssTable.Add(FipsShs.Sha1, sha1AlgId);

            AlgorithmIdentifier sha224AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha224, DerNull.Instance);

            exParams.Add("SHA224WITHRSAANDMGF1", CreatePssParams(sha224AlgId, 28));
            pssTable.Add(FipsShs.Sha224, sha224AlgId);

            AlgorithmIdentifier sha256AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance);

            exParams.Add("SHA256WITHRSAANDMGF1", CreatePssParams(sha256AlgId, 32));
            pssTable.Add(FipsShs.Sha256, sha256AlgId);

            AlgorithmIdentifier sha384AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance);

            exParams.Add("SHA384WITHRSAANDMGF1", CreatePssParams(sha384AlgId, 48));
            pssTable.Add(FipsShs.Sha384, sha384AlgId);

            AlgorithmIdentifier sha512AlgId = new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance);

            exParams.Add("SHA512WITHRSAANDMGF1", CreatePssParams(sha512AlgId, 64));
            pssTable.Add(FipsShs.Sha512, sha512AlgId);

            rsaPkcs1Table.Add(FipsShs.Sha1, new AlgorithmIdentifier(PkcsObjectIdentifiers.Sha1WithRsaEncryption, DerNull.Instance));
            rsaPkcs1Table.Add(FipsShs.Sha224, new AlgorithmIdentifier(PkcsObjectIdentifiers.Sha224WithRsaEncryption, DerNull.Instance));
            rsaPkcs1Table.Add(FipsShs.Sha256, new AlgorithmIdentifier(PkcsObjectIdentifiers.Sha256WithRsaEncryption, DerNull.Instance));
            rsaPkcs1Table.Add(FipsShs.Sha384, new AlgorithmIdentifier(PkcsObjectIdentifiers.Sha384WithRsaEncryption, DerNull.Instance));
            rsaPkcs1Table.Add(FipsShs.Sha512, new AlgorithmIdentifier(PkcsObjectIdentifiers.Sha512WithRsaEncryption, DerNull.Instance));

            dsaTable.Add(FipsShs.Sha1, new AlgorithmIdentifier(X9ObjectIdentifiers.IdDsaWithSha1));
            dsaTable.Add(FipsShs.Sha224, new AlgorithmIdentifier(NistObjectIdentifiers.DsaWithSha224));
            dsaTable.Add(FipsShs.Sha256, new AlgorithmIdentifier(NistObjectIdentifiers.DsaWithSha256));
            dsaTable.Add(FipsShs.Sha384, new AlgorithmIdentifier(NistObjectIdentifiers.DsaWithSha384));
            dsaTable.Add(FipsShs.Sha512, new AlgorithmIdentifier(NistObjectIdentifiers.DsaWithSha512));

            ecdsaTable.Add(FipsShs.Sha1, new AlgorithmIdentifier(X9ObjectIdentifiers.ECDsaWithSha1));
            ecdsaTable.Add(FipsShs.Sha224, new AlgorithmIdentifier(X9ObjectIdentifiers.ECDsaWithSha224));
            ecdsaTable.Add(FipsShs.Sha256, new AlgorithmIdentifier(X9ObjectIdentifiers.ECDsaWithSha256));
            ecdsaTable.Add(FipsShs.Sha384, new AlgorithmIdentifier(X9ObjectIdentifiers.ECDsaWithSha384));
            ecdsaTable.Add(FipsShs.Sha512, new AlgorithmIdentifier(X9ObjectIdentifiers.ECDsaWithSha512));

            digestTable.Add(FipsShs.Sha512_256, NistObjectIdentifiers.IdSha512_256);
            digestTable.Add(FipsShs.Sha3_256, NistObjectIdentifiers.IdSha3_256);
            digestTable.Add(FipsShs.Sha1HMac, PkcsObjectIdentifiers.IdHmacWithSha1);
            digestTable.Add(FipsShs.Sha224HMac, PkcsObjectIdentifiers.IdHmacWithSha224);
            digestTable.Add(FipsShs.Sha256HMac, PkcsObjectIdentifiers.IdHmacWithSha256);
            digestTable.Add(FipsShs.Sha384HMac, PkcsObjectIdentifiers.IdHmacWithSha384);
            digestTable.Add(FipsShs.Sha512HMac, PkcsObjectIdentifiers.IdHmacWithSha512);

            digestTable.Add(OiwObjectIdentifiers.IdSha1, FipsShs.Sha1);
            digestTable.Add(NistObjectIdentifiers.IdSha224, FipsShs.Sha224);
            digestTable.Add(NistObjectIdentifiers.IdSha256, FipsShs.Sha256);
            digestTable.Add(NistObjectIdentifiers.IdSha384, FipsShs.Sha384);
            digestTable.Add(NistObjectIdentifiers.IdSha512, FipsShs.Sha512);
            digestTable.Add(NistObjectIdentifiers.IdSha512_224, FipsShs.Sha512_224);
            digestTable.Add(NistObjectIdentifiers.IdSha512_256, FipsShs.Sha512_256);

            digestTable.Add(PkcsObjectIdentifiers.IdHmacWithSha1, FipsShs.Sha1HMac);
            digestTable.Add(PkcsObjectIdentifiers.IdHmacWithSha224, FipsShs.Sha224HMac);
            digestTable.Add(PkcsObjectIdentifiers.IdHmacWithSha256, FipsShs.Sha256HMac);
            digestTable.Add(PkcsObjectIdentifiers.IdHmacWithSha384, FipsShs.Sha384HMac);
            digestTable.Add(PkcsObjectIdentifiers.IdHmacWithSha512, FipsShs.Sha512HMac);

            digestSize.Add(FipsShs.Sha1, 20);
            digestSize.Add(FipsShs.Sha224, 28);
            digestSize.Add(FipsShs.Sha256, 32);
            digestSize.Add(FipsShs.Sha384, 48);
            digestSize.Add(FipsShs.Sha512, 64);

            pkcs12MacAlgIds.Add(FipsShs.Sha1, new AlgorithmIdentifier(OiwObjectIdentifiers.IdSha1, DerNull.Instance));
            pkcs12MacAlgIds.Add(FipsShs.Sha224, new AlgorithmIdentifier(NistObjectIdentifiers.IdSha224, DerNull.Instance));
            pkcs12MacAlgIds.Add(FipsShs.Sha256, new AlgorithmIdentifier(NistObjectIdentifiers.IdSha256, DerNull.Instance));
            pkcs12MacAlgIds.Add(FipsShs.Sha384, new AlgorithmIdentifier(NistObjectIdentifiers.IdSha384, DerNull.Instance));
            pkcs12MacAlgIds.Add(FipsShs.Sha512, new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512, DerNull.Instance));
            pkcs12MacAlgIds.Add(FipsShs.Sha512_224, new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512_224, DerNull.Instance));
            pkcs12MacAlgIds.Add(FipsShs.Sha512_256, new AlgorithmIdentifier(NistObjectIdentifiers.IdSha512_256, DerNull.Instance));

            pkcs12MacIds.Add(FipsShs.Sha1, FipsShs.Sha1HMac);
            pkcs12MacIds.Add(FipsShs.Sha224, FipsShs.Sha224HMac);
            pkcs12MacIds.Add(FipsShs.Sha256, FipsShs.Sha256HMac);
            pkcs12MacIds.Add(FipsShs.Sha384, FipsShs.Sha384HMac);
            pkcs12MacIds.Add(FipsShs.Sha512, FipsShs.Sha512HMac);
            pkcs12MacIds.Add(FipsShs.Sha512_224, FipsShs.Sha512_224HMac);
            pkcs12MacIds.Add(FipsShs.Sha512_256, FipsShs.Sha512_256HMac);

            keySizesInBytes.Add(NistObjectIdentifiers.IdAes128Ecb, 16);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes192Ecb, 24);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes256Ecb, 32);

            keySizesInBytes.Add(NistObjectIdentifiers.IdAes128Cbc, 16);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes192Cbc, 24);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes256Cbc, 32);

            keySizesInBytes.Add(NistObjectIdentifiers.IdAes128Cfb, 16);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes192Cfb, 24);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes256Cfb, 32);

            keySizesInBytes.Add(NistObjectIdentifiers.IdAes128Ofb, 16);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes192Ofb, 24);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes256Ofb, 32);

            keySizesInBytes.Add(NistObjectIdentifiers.IdAes128Ccm, 16);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes192Ccm, 24);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes256Ccm, 32);

            keySizesInBytes.Add(NistObjectIdentifiers.IdAes128Gcm, 16);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes192Gcm, 24);
            keySizesInBytes.Add(NistObjectIdentifiers.IdAes256Gcm, 32);

            keySizesInBytes.Add(PkcsObjectIdentifiers.DesEde3Cbc, 24);

            keySizesInBytes.Add(NttObjectIdentifiers.IdCamellia128Cbc, 16);
            keySizesInBytes.Add(NttObjectIdentifiers.IdCamellia192Cbc, 24);
            keySizesInBytes.Add(NttObjectIdentifiers.IdCamellia256Cbc, 32);

            keySizesInBytes.Add(KisaObjectIdentifiers.IdSeedCbc, 16);

            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes128Ecb, 0);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes192Ecb, 0);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes256Ecb, 0);

            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes128Cbc, 16);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes192Cbc, 16);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes256Cbc, 16);

            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes128Cfb, 16);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes192Cfb, 16);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes256Cfb, 16);

            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes128Ofb, 16);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes192Ofb, 16);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes256Ofb, 16);

            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes128Ccm, 12);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes192Ccm, 12);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes256Ccm, 12);

            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes128Gcm, 12);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes192Gcm, 12);
            ivSizesInBytes.Add(NistObjectIdentifiers.IdAes256Gcm, 12);

            ivSizesInBytes.Add(PkcsObjectIdentifiers.DesEde3Cbc, 8);

            ivSizesInBytes.Add(KisaObjectIdentifiers.IdSeedCbc, 16);

            aeadModes.Add(NistObjectIdentifiers.IdAes128Ccm, true);
            aeadModes.Add(NistObjectIdentifiers.IdAes192Ccm, true);
            aeadModes.Add(NistObjectIdentifiers.IdAes256Ccm, true);
            aeadModes.Add(NistObjectIdentifiers.IdAes128Gcm, true);
            aeadModes.Add(NistObjectIdentifiers.IdAes192Gcm, true);
            aeadModes.Add(NistObjectIdentifiers.IdAes256Gcm, true);

            blockDecryptor.Add(PkcsObjectIdentifiers.DesEde3Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsTripleDes.Key(key)).CreateBlockDecryptorBuilder((FipsTripleDes.ParametersWithIV)cipherParams)); });

            blockDecryptor.Add(NistObjectIdentifiers.IdAes128Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockDecryptorBuilder((FipsAes.ParametersWithIV)cipherParams)); });
            blockDecryptor.Add(NistObjectIdentifiers.IdAes128Ecb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockDecryptorBuilder((FipsAes.Parameters)cipherParams)); });
            blockDecryptor.Add(NistObjectIdentifiers.IdAes192Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockDecryptorBuilder((FipsAes.ParametersWithIV)cipherParams)); });
            blockDecryptor.Add(NistObjectIdentifiers.IdAes192Ecb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockDecryptorBuilder((FipsAes.Parameters)cipherParams)); });
            blockDecryptor.Add(NistObjectIdentifiers.IdAes256Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockDecryptorBuilder((FipsAes.ParametersWithIV)cipherParams)); });
            blockDecryptor.Add(NistObjectIdentifiers.IdAes256Ecb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockDecryptorBuilder((FipsAes.Parameters)cipherParams)); });

            blockDecryptor.Add(NttObjectIdentifiers.IdCamellia128Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Camellia.Key(key)).CreateBlockDecryptorBuilder((Camellia.ParametersWithIV)cipherParams)); });
            blockDecryptor.Add(NttObjectIdentifiers.IdCamellia192Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Camellia.Key(key)).CreateBlockDecryptorBuilder((Camellia.ParametersWithIV)cipherParams)); });
            blockDecryptor.Add(NttObjectIdentifiers.IdCamellia256Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Camellia.Key(key)).CreateBlockDecryptorBuilder((Camellia.ParametersWithIV)cipherParams)); });

            blockDecryptor.Add(KisaObjectIdentifiers.IdSeedCbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Seed.Key(key)).CreateBlockDecryptorBuilder((Seed.ParametersWithIV)cipherParams)); });

            blockEncryptor.Add(PkcsObjectIdentifiers.DesEde3Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsTripleDes.Key(key)).CreateBlockEncryptorBuilder((FipsTripleDes.ParametersWithIV)cipherParams)); });

            blockEncryptor.Add(NistObjectIdentifiers.IdAes128Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.ParametersWithIV)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes128Ecb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes192Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.ParametersWithIV)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes192Ecb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes256Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.ParametersWithIV)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes256Ecb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });

            blockEncryptor.Add(NttObjectIdentifiers.IdCamellia128Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Camellia.Key(key)).CreateBlockEncryptorBuilder((Camellia.ParametersWithIV)cipherParams)); });
            blockEncryptor.Add(NttObjectIdentifiers.IdCamellia192Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Camellia.Key(key)).CreateBlockEncryptorBuilder((Camellia.ParametersWithIV)cipherParams)); });
            blockEncryptor.Add(NttObjectIdentifiers.IdCamellia256Cbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Camellia.Key(key)).CreateBlockEncryptorBuilder((Camellia.ParametersWithIV)cipherParams)); });

            blockEncryptor.Add(KisaObjectIdentifiers.IdSeedCbc, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new Seed.Key(key)).CreateBlockEncryptorBuilder((Seed.ParametersWithIV)cipherParams)); });

            blockEncryptor.Add(NistObjectIdentifiers.IdAes128Ccm, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes128Cfb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });

            blockEncryptor.Add(NistObjectIdentifiers.IdAes128Gcm, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });
            blockEncryptor.Add(NistObjectIdentifiers.IdAes128Ofb, (key, cipherParams) => { return(CryptoServicesRegistrar.CreateService(new FipsAes.Key(key)).CreateBlockEncryptorBuilder((FipsAes.Parameters)cipherParams)); });
        }